Aniket2006 commited on
Commit
fda70b8
·
1 Parent(s): dacd073

Update Groq API keys with rotation logic

Browse files
Files changed (2) hide show
  1. app.py +5 -0
  2. llm_analysis.py +54 -21
app.py CHANGED
@@ -478,10 +478,15 @@ def generate_heatmap_image(data: np.ndarray, index_type: str, gaussian_sigma: fl
478
 
479
  # Groq API keys with cascading fallback
480
  GROQ_API_KEYS = [
 
481
  "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",
482
  "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",
483
  "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",
484
  "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",
 
 
 
 
485
  ]
486
 
487
  def run_llm_analysis(metric: str, stress_context: dict, indices_data: dict,
 
478
 
479
  # Groq API keys with cascading fallback
480
  GROQ_API_KEYS = [
481
+ "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",
482
  "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",
483
  "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",
484
  "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",
485
  "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",
486
+ "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",
487
+ "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",
488
+ "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",
489
+ "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"
490
  ]
491
 
492
  def run_llm_analysis(metric: str, stress_context: dict, indices_data: dict,
llm_analysis.py CHANGED
@@ -16,39 +16,72 @@ from typing import Dict, Any, List, Optional
16
  # GROQ API CONFIGURATION
17
  # ============================================================================
18
 
19
- GROQ_API_KEY = os.environ.get("GROQ_API_KEY", "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")
 
 
 
 
 
 
 
 
 
 
 
 
 
 
20
  GROQ_MODEL = "llama-3.3-70b-versatile"
21
 
22
 
23
  def call_groq(prompt: str) -> str:
24
- """Call Groq API for LLM completion."""
25
  from groq import Groq
26
 
27
- if not GROQ_API_KEY:
28
- raise ValueError("No GROQ_API_KEY configured")
29
-
30
- client = Groq(api_key=GROQ_API_KEY)
31
 
32
  max_attempts = 3
33
  base_backoff = 1.0
 
34
 
35
- for attempt in range(1, max_attempts + 1):
 
36
  try:
37
- chat_completion = client.chat.completions.create(
38
- messages=[
39
- {"role": "system", "content": "You are an expert agricultural AI. Respond with valid JSON only."},
40
- {"role": "user", "content": prompt}
41
- ],
42
- model=GROQ_MODEL,
43
- temperature=0.7,
44
- max_tokens=2048,
45
- )
46
- return chat_completion.choices[0].message.content
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
47
  except Exception as e:
48
- if attempt < max_attempts:
49
- time.sleep(base_backoff * (2 ** (attempt - 1)))
50
- else:
51
- raise ValueError(f"Groq API failed: {str(e)}")
 
 
52
 
53
  raise ValueError("All Groq API attempts failed")
54
 
 
16
  # GROQ API CONFIGURATION
17
  # ============================================================================
18
 
19
+ # ============================================================================
20
+ # GROQ API CONFIGURATION
21
+ # ============================================================================
22
+
23
+ GROQ_API_KEYS = [
24
+ "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",
25
+ "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",
26
+ "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",
27
+ "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",
28
+ "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",
29
+ "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",
30
+ "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",
31
+ "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",
32
+ "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"
33
+ ]
34
  GROQ_MODEL = "llama-3.3-70b-versatile"
35
 
36
 
37
  def call_groq(prompt: str) -> str:
38
+ """Call Groq API for LLM completion with Key Rotation."""
39
  from groq import Groq
40
 
41
+ if not GROQ_API_KEYS:
42
+ raise ValueError("No GROQ_API_KEYS configured")
 
 
43
 
44
  max_attempts = 3
45
  base_backoff = 1.0
46
+ last_error = None
47
 
48
+ # Iterate through all available keys
49
+ for key_idx, api_key in enumerate(GROQ_API_KEYS):
50
  try:
51
+ client = Groq(api_key=api_key)
52
+ print(f"[LLM Analysis] Trying key {key_idx+1}/{len(GROQ_API_KEYS)}")
53
+
54
+ # Retry logic for EACH key (networking/timeout issues)
55
+ for attempt in range(1, max_attempts + 1):
56
+ try:
57
+ chat_completion = client.chat.completions.create(
58
+ messages=[
59
+ {"role": "system", "content": "You are an expert agricultural AI. Respond with valid JSON only."},
60
+ {"role": "user", "content": prompt}
61
+ ],
62
+ model=GROQ_MODEL,
63
+ temperature=0.7,
64
+ max_tokens=2048,
65
+ )
66
+ return chat_completion.choices[0].message.content
67
+ except Exception as e:
68
+ # If it's a rate limit (429), break inner loop to try next key immediately
69
+ if "429" in str(e) or "rate_limit" in str(e).lower():
70
+ print(f"[LLM Analysis] Key {key_idx+1} rate limited. Switching to next key...")
71
+ break
72
+
73
+ if attempt < max_attempts:
74
+ time.sleep(base_backoff * (2 ** (attempt - 1)))
75
+ else:
76
+ raise e # Propagate to outer loop to try next key
77
+
78
  except Exception as e:
79
+ last_error = str(e)
80
+ print(f"[LLM Analysis] Key {key_idx+1} failed: {e}")
81
+ continue
82
+
83
+ # If all keys fail
84
+ raise ValueError(f"All {len(GROQ_API_KEYS)} Groq API keys failed. Last error: {last_error}")
85
 
86
  raise ValueError("All Groq API attempts failed")
87