Spaces:
Sleeping
Sleeping
Commit ·
fda70b8
1
Parent(s): dacd073
Update Groq API keys with rotation logic
Browse files- app.py +5 -0
- 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 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 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
|
| 28 |
-
raise ValueError("No
|
| 29 |
-
|
| 30 |
-
client = Groq(api_key=GROQ_API_KEY)
|
| 31 |
|
| 32 |
max_attempts = 3
|
| 33 |
base_backoff = 1.0
|
|
|
|
| 34 |
|
| 35 |
-
|
|
|
|
| 36 |
try:
|
| 37 |
-
|
| 38 |
-
|
| 39 |
-
|
| 40 |
-
|
| 41 |
-
|
| 42 |
-
|
| 43 |
-
|
| 44 |
-
|
| 45 |
-
|
| 46 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 47 |
except Exception as e:
|
| 48 |
-
|
| 49 |
-
|
| 50 |
-
|
| 51 |
-
|
|
|
|
|
|
|
| 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 |
|