Kackle commited on
Commit
d82dae3
·
verified ·
1 Parent(s): 420ce0f

Update gemini_agent.py

Browse files
Files changed (1) hide show
  1. gemini_agent.py +43 -22
gemini_agent.py CHANGED
@@ -19,7 +19,7 @@ class GeminiAgent:
19
  api_key = os.getenv('GOOGLE_API_KEY')
20
  genai.configure(api_key=api_key)
21
 
22
- self.model = genai.GenerativeModel('gemini-2.0-flash')
23
  self.last_request_time = 0
24
  self.min_request_interval = 8.0 # 7 seconds between requests (10 per minute limit, with margin)
25
 
@@ -163,27 +163,43 @@ Provide only the direct answer. If it's a quote, give just the quoted text. If i
163
  async def _handle_text_question(self, question: str) -> str:
164
  """Handle regular text-based questions"""
165
  prompt = ""
166
- # Only use retrieval for explicit web/Wikipedia questions
167
  def is_explicit_retrieval_question(question):
168
  q = question.lower()
169
- return (
170
- "according to wikipedia" in q or
171
- "from wikipedia" in q or
172
- "search the web" in q or
173
- "duckduckgo" in q or
174
- "web search" in q
175
- )
 
 
 
 
 
 
 
 
 
 
176
  wiki_context = ""
177
  ddg_context = ""
178
  if is_explicit_retrieval_question(question):
179
- if "wikipedia" in question.lower():
180
- try:
181
- wiki_context = self.wiki_tool.run(question)
182
- except Exception as e:
183
- print(f"Wikipedia tool failed: {e}")
184
- if "duckduckgo" in question.lower() or "web search" in question.lower():
 
 
 
 
 
185
  try:
186
  ddg_context = self.ddg_tool.run(question)
 
187
  except Exception as e:
188
  print(f"DuckDuckGo tool failed: {e}")
189
  # Handle attached file questions with enhanced prompts
@@ -225,9 +241,12 @@ Provide only the direct answer. If it's a quote, give just the quoted text. If i
225
 
226
  # Prepend context to the prompt if available and likely relevant
227
  def is_good_context(context):
228
- return context and not any(x in context.lower() for x in ["not found", "no results", "does not contain information"])
229
  if wiki_context and is_good_context(wiki_context):
230
- prompt = f"Use the following Wikipedia context to answer the question:\n{wiki_context}\n\n{prompt}"
 
 
 
231
  elif ddg_context and is_good_context(ddg_context):
232
  prompt = f"Use the following web search context to answer the question:\n{ddg_context}\n\n{prompt}"
233
 
@@ -260,11 +279,13 @@ Provide only the direct answer. If it's a quote, give just the quoted text. If i
260
  answer = sentences[0] + '.'
261
 
262
  # If the question expects a single value, extract it
263
- if any(kw in question.lower() for kw in ["how many", "what is the", "who", "where", "give only", "provide only"]):
264
- # Extract the first number, word, or phrase (tweak regex as needed)
265
- match = re.search(r'^[A-Za-z0-9 ,+-]+', answer)
266
- if match:
267
- answer = match.group(0).strip()
 
 
268
 
269
  # Post-processing for chess move extraction
270
  if 'chess position' in question.lower() and 'image' in question.lower():
 
19
  api_key = os.getenv('GOOGLE_API_KEY')
20
  genai.configure(api_key=api_key)
21
 
22
+ self.model = genai.GenerativeModel('gemini-2.5-flash')
23
  self.last_request_time = 0
24
  self.min_request_interval = 8.0 # 7 seconds between requests (10 per minute limit, with margin)
25
 
 
163
  async def _handle_text_question(self, question: str) -> str:
164
  """Handle regular text-based questions"""
165
  prompt = ""
166
+ # Use retrieval for explicit web/Wikipedia questions and factual queries
167
  def is_explicit_retrieval_question(question):
168
  q = question.lower()
169
+ # Explicit retrieval requests
170
+ explicit_triggers = [
171
+ "according to wikipedia", "from wikipedia", "search the web",
172
+ "duckduckgo", "web search"
173
+ ]
174
+ # Factual question patterns that benefit from Wikipedia
175
+ factual_triggers = [
176
+ "who played", "actor who", "actress who", "cast of", "starred in",
177
+ "tv show", "television", "movie", "film", "character in",
178
+ "version of", "adaptation of", "remake of",
179
+ # New triggers for entity-relationship/role questions
180
+ "who did the actor", "who did the actress", "role in", "portrayed in", "played in", "give only the first name"
181
+ ]
182
+ # Also trigger if question starts with 'who' and mentions 'actor', 'actress', 'role', or 'character'
183
+ if q.startswith('who') and any(x in q for x in ["actor", "actress", "role", "character"]):
184
+ return True
185
+ return any(trigger in q for trigger in explicit_triggers + factual_triggers)
186
  wiki_context = ""
187
  ddg_context = ""
188
  if is_explicit_retrieval_question(question):
189
+ try:
190
+ wiki_context = self.wiki_tool.run(question)
191
+ print(f"Wiki context: {wiki_context[:200]}...") # Debug
192
+ except Exception as e:
193
+ print(f"Wikipedia tool failed: {e}")
194
+
195
+ # Use DuckDuckGo as fallback if Wikipedia context is poor or for web search requests
196
+ def is_poor_context(context):
197
+ return not context or any(x in context.lower() for x in ["not found", "no results", "does not contain", "disambiguation"])
198
+
199
+ if "duckduckgo" in question.lower() or "web search" in question.lower() or is_poor_context(wiki_context):
200
  try:
201
  ddg_context = self.ddg_tool.run(question)
202
+ print(f"DDG context: {ddg_context[:200]}...") # Debug
203
  except Exception as e:
204
  print(f"DuckDuckGo tool failed: {e}")
205
  # Handle attached file questions with enhanced prompts
 
241
 
242
  # Prepend context to the prompt if available and likely relevant
243
  def is_good_context(context):
244
+ return context and not any(x in context.lower() for x in ["not found", "no results", "does not contain", "disambiguation"])
245
  if wiki_context and is_good_context(wiki_context):
246
+ if "first name" in question.lower() or "give only the first name" in question.lower():
247
+ prompt = f"Based on this Wikipedia information, answer the question and give only the first name as the answer.\n{wiki_context}\n\n{question}\n\nAnswer:"
248
+ else:
249
+ prompt = f"Use the following Wikipedia context to answer the question:\n{wiki_context}\n\n{prompt}"
250
  elif ddg_context and is_good_context(ddg_context):
251
  prompt = f"Use the following web search context to answer the question:\n{ddg_context}\n\n{prompt}"
252
 
 
279
  answer = sentences[0] + '.'
280
 
281
  # If the question expects a single value, extract it
282
+ if any(kw in question.lower() for kw in ["how many", "what is the", "who", "where", "give only", "provide only", "first name"]):
283
+ # Special handling for "give only the first name"
284
+ if "give only the first name" in question.lower() or "first name" in question.lower():
285
+ # Extract first name from full name (robust: first capitalized word, allow Polish chars)
286
+ name_match = re.search(r'\b([A-ZĄĆĘŁŃÓŚŹŻ][a-ząćęłńóśźż]+)', answer)
287
+ if name_match:
288
+ answer = name_match.group(1)
289
 
290
  # Post-processing for chess move extraction
291
  if 'chess position' in question.lower() and 'image' in question.lower():