Rivalcoder commited on
Commit
fc94374
·
1 Parent(s): 641e531

[Edit] Key Rotate

Browse files
Files changed (1) hide show
  1. llm.py +34 -39
llm.py CHANGED
@@ -14,6 +14,8 @@ api_keys = [k.strip() for k in api_keys.split(",") if k.strip()]
14
  print(f"Loaded {len(api_keys)} Gemini API key(s)")
15
 
16
  def query_gemini(questions, contexts, max_retries=3):
 
 
17
  context = "\n\n".join(contexts)
18
  questions_text = "\n".join([f"{i+1}. {q}" for i, q in enumerate(questions)])
19
 
@@ -77,43 +79,36 @@ Your task: For each question, provide a complete, professional, and clearly writ
77
  """
78
 
79
  last_exception = None
80
-
81
- for key_idx, key in enumerate(api_keys):
82
- for attempt in range(max_retries):
83
- try:
84
- genai.configure(api_key=key)
85
- model = genai.GenerativeModel("gemini-2.5-flash-lite")
86
- response = model.generate_content(prompt)
87
- response_text = getattr(response, "text", "").strip()
88
-
89
- if not response_text:
90
- raise ValueError("Empty response received from Gemini API.")
91
-
92
- # Clean JSON from wrapped code blocks
93
- if response_text.startswith("```json"):
94
- response_text = response_text.replace("```json", "").replace("```", "").strip()
95
- elif response_text.startswith("```"):
96
- response_text = response_text.replace("```", "").strip()
97
-
98
- # Optional debug log:
99
- # print(f"[Gemini Response]: {response_text[:300]}")
100
-
101
- parsed = json.loads(response_text)
102
- if "answers" in parsed and isinstance(parsed["answers"], list):
103
- return parsed
104
- else:
105
- raise ValueError("Invalid response format received from Gemini.")
106
-
107
- except Exception as e:
108
- msg = str(e).lower()
109
- if "429" in msg or "quota" in msg or "rate limit" in msg or "exceeded" in msg:
110
- print(f"Gemini key {key[:8]}... quota/rate limited. Trying next key ({key_idx+1}/{len(api_keys)}).")
111
- last_exception = e
112
- break # Try next key
113
- else:
114
- print(f"Retry {attempt+1}/{max_retries} failed using Gemini key {key[:8]}...: {e}")
115
- last_exception = e
116
- continue # Retry same key
117
-
118
- print(f"All Gemini API keys failed. Last error: {last_exception}")
119
  return {"answers": [f"Error generating response: {str(last_exception)}"] * len(questions)}
 
14
  print(f"Loaded {len(api_keys)} Gemini API key(s)")
15
 
16
  def query_gemini(questions, contexts, max_retries=3):
17
+ import itertools
18
+
19
  context = "\n\n".join(contexts)
20
  questions_text = "\n".join([f"{i+1}. {q}" for i, q in enumerate(questions)])
21
 
 
79
  """
80
 
81
  last_exception = None
82
+ total_attempts = len(api_keys) * max_retries
83
+ key_cycle = itertools.cycle(api_keys)
84
+
85
+ for attempt in range(total_attempts):
86
+ key = next(key_cycle)
87
+ try:
88
+ genai.configure(api_key=key)
89
+ model = genai.GenerativeModel("gemini-2.5-flash-lite")
90
+ response = model.generate_content(prompt)
91
+ response_text = getattr(response, "text", "").strip()
92
+
93
+ if not response_text:
94
+ raise ValueError("Empty response received from Gemini API.")
95
+
96
+ if response_text.startswith("```json"):
97
+ response_text = response_text.replace("```json", "").replace("```", "").strip()
98
+ elif response_text.startswith("```"):
99
+ response_text = response_text.replace("```", "").strip()
100
+
101
+ parsed = json.loads(response_text)
102
+ if "answers" in parsed and isinstance(parsed["answers"], list):
103
+ return parsed
104
+ else:
105
+ raise ValueError("Invalid response format received from Gemini.")
106
+
107
+ except Exception as e:
108
+ last_exception = e
109
+ msg = str(e).lower()
110
+ print(f"[Retry {attempt+1}/{total_attempts}] Gemini key {key[:8]}... failed: {e}")
111
+ continue
112
+
113
+ print(f"All Gemini API attempts failed. Last error: {last_exception}")
 
 
 
 
 
 
 
114
  return {"answers": [f"Error generating response: {str(last_exception)}"] * len(questions)}