Nancy1906 commited on
Commit
18f8f98
·
verified ·
1 Parent(s): 768d211

Update my_tools.py

Browse files
Files changed (1) hide show
  1. my_tools.py +56 -27
my_tools.py CHANGED
@@ -13,6 +13,7 @@ import google.generativeai as genai
13
  import asyncio
14
  from pydantic import Field # Para declarar campos si fuera necesario, aunque no para _generation_config
15
  from llama_index.core.llms import ChatMessage
 
16
 
17
  # --- Intento mejorado para obtener la versión de LlamaIndex ---
18
  try:
@@ -264,43 +265,72 @@ class GeminiLLM(LLM):
264
 
265
  llm = GeminiLLM()
266
 
267
- # --- HERRAMIENTAS RESTAURADAS ---
268
- def buscar_web(query: str) -> str:
269
- """Busca en la web utilizando DuckDuckGo y devuelve los 3 primeros resultados."""
270
- try:
271
- with DDGS() as ddgs:
272
- # Nota: ddgs.text devuelve un generador. Convertir a lista para obtener resultados.
273
- results = list(ddgs.text(query, region='es-es', safesearch='moderate', timelimit='y', max_results=3))
274
- if results:
275
- return "\n".join([f"Título: {r['title']}, Cuerpo: {r['body']}" for r in results])
276
- return "No se encontraron resultados en la web."
277
- except Exception as e:
278
- return f"Error al buscar en la web: {e}"
 
 
 
 
 
 
 
 
 
 
 
 
 
 
279
 
280
  search_tool = FunctionTool.from_defaults(
281
  fn=buscar_web,
282
  name="web_search",
283
- description="Útil para buscar información actual o general en internet. Proporciona un resumen de los resultados de búsqueda."
284
  )
285
 
286
  def get_wikipedia_summary(query: str) -> str:
287
- """Busca un resumen breve de un tema en Wikipedia (primeras 3 frases)."""
 
 
 
288
  try:
289
- wikipedia.set_lang("es") # Asegurar el idioma
290
- return wikipedia.summary(query, sentences=3, auto_suggest=False)
 
291
  except wikipedia.exceptions.PageError:
292
- return f"La página '{query}' no existe en Wikipedia en español."
293
- except wikipedia.exceptions.DisambiguationError as e:
294
- # Devolver algunas opciones para que el LLM pueda refinar la búsqueda si es necesario
295
- options_str = ", ".join(e.options[:3])
296
- return f"La búsqueda '{query}' es ambigua. Posibles opciones: {options_str}. Por favor, más específico."
297
- except Exception as e:
298
- return f"Error al buscar en Wikipedia: {e}"
 
 
 
 
 
 
 
 
 
 
 
299
 
300
  wikipedia_tool = FunctionTool.from_defaults(
301
  fn=get_wikipedia_summary,
302
  name="wikipedia_lookup",
303
- description="Busca un resumen conciso de un tema específico en Wikipedia. Ideal para definiciones, hechos históricos, biografías, etc."
304
  )
305
 
306
  def calcular_expresion(expr: str) -> str:
@@ -338,10 +368,9 @@ Sigue estrictamente el formato Thought/Action/Action Input/Observation.
338
  Cuando respondas, hazlo en el mismo idioma que la pregunta original del usuario.
339
  Piensa paso a paso. Considera si la información necesaria ya está en la pregunta o en el historial de conversación antes de usar una herramienta.
340
  Si la pregunta contiene datos tabulares o listas directamente en el prompt, analiza esos datos cuidadosamente para responder. No necesitas herramientas para información ya proporcionada.
341
- Si una herramienta no te da la respuesta, considera reformular tu consulta a la herramienta o si otra herramienta podría ser más útil.
342
- Si después de varios intentos razonables no puedes encontrar una respuesta definitiva, indícalo claramente.
343
  No inventes respuestas si no tienes la información.
344
- Para tareas de clasificación que requieren conocimiento especializado (ej. botánica), si no estás seguro de una clasificación, usa herramientas de búsqueda para verificar cada ítem antes de dar la respuesta final.
345
  """
346
 
347
  # --- AGENTE RESTAURADO ---
 
13
  import asyncio
14
  from pydantic import Field # Para declarar campos si fuera necesario, aunque no para _generation_config
15
  from llama_index.core.llms import ChatMessage
16
+ import time # Para reintentos
17
 
18
  # --- Intento mejorado para obtener la versión de LlamaIndex ---
19
  try:
 
265
 
266
  llm = GeminiLLM()
267
 
268
+ HEADERS = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36'}
269
+
270
+ def buscar_web(query: str, max_attempts: int = 2) -> str: # Añadido max_attempts
271
+ """Busca en la web utilizando DuckDuckGo y devuelve los 3 primeros resultados.
272
+ Intenta ser robusto contra errores de red o rate limits de DDG."""
273
+ print(f"Herramienta buscar_web: Buscando '{query}'")
274
+ for attempt in range(max_attempts):
275
+ try:
276
+ # Aumentar timeout y añadir headers
277
+ with DDGS(headers=HEADERS, timeout=25) as ddgs: # Timeout de 25 segundos
278
+ results = list(ddgs.text(query, region='es-es', safesearch='moderate', timelimit='y', max_results=3))
279
+ if results:
280
+ return "\n".join([f"Título: {r['title']}, Cuerpo: {r['body']}" for r in results])
281
+ return "No se encontraron resultados en la web."
282
+ except Exception as e:
283
+ print(f"Error en herramienta buscar_web (intento {attempt + 1}/{max_attempts}): {type(e).__name__} - {e}")
284
+ if "ratelimit" in str(e).lower() or "timed out" in str(e).lower():
285
+ if attempt < max_attempts - 1: # Si no es el último intento
286
+ wait_time = (attempt + 1) * 5 # Backoff simple: 5s, 10s
287
+ print(f"Esperando {wait_time}s antes de reintentar búsqueda web...")
288
+ time.sleep(wait_time)
289
+ else: # Último intento fallido
290
+ return f"Error persistente al buscar en la web después de {max_attempts} intentos: {e}"
291
+ else: # Otro tipo de error, no reintentar
292
+ return f"Error al buscar en la web: {e}"
293
+ return f"La búsqueda web falló después de {max_attempts} intentos." # Si el bucle termina
294
 
295
  search_tool = FunctionTool.from_defaults(
296
  fn=buscar_web,
297
  name="web_search",
298
+ description="Busca en la web utilizando DuckDuckGo para obtener información actualizada o temas generales. Devuelve pequeños snippets de texto de los resultados. Úsalo cuando Wikipedia no sea suficiente o la información sea muy reciente."
299
  )
300
 
301
  def get_wikipedia_summary(query: str) -> str:
302
+ """Busca un resumen conciso de un tema específico en Wikipedia.
303
+ Intenta primero en español, y si no encuentra la página, intenta en inglés.
304
+ Devuelve las primeras 3 frases del artículo. Ideal para definiciones, hechos históricos."""
305
+ print(f"Herramienta wikipedia_lookup: Buscando '{query}'")
306
  try:
307
+ wikipedia.set_lang("es")
308
+ summary = wikipedia.summary(query, sentences=3, auto_suggest=False, redirect=True)
309
+ return summary
310
  except wikipedia.exceptions.PageError:
311
+ print(f"Página '{query}' no encontrada en Wikipedia en español. Intentando en inglés...")
312
+ try:
313
+ wikipedia.set_lang("en")
314
+ summary_en = wikipedia.summary(query, sentences=3, auto_suggest=False, redirect=True)
315
+ # Indicar que la info es de Wikipedia en inglés puede ser útil para el LLM
316
+ return f"[Información de Wikipedia en Inglés]: {summary_en}"
317
+ except wikipedia.exceptions.PageError:
318
+ return f"La página '{query}' no se encontró ni en Wikipedia en español ni en inglés."
319
+ except wikipedia.exceptions.DisambiguationError as e_en:
320
+ options_str_en = ", ".join(e_en.options[:3])
321
+ return f"La búsqueda '{query}' en Wikipedia en inglés es ambigua. Opciones posibles: {options_str_en}. Por favor, sé más específico."
322
+ except Exception as e_gen_en:
323
+ return f"Error al buscar '{query}' en Wikipedia en inglés: {type(e_gen_en).__name__} {e_gen_en}"
324
+ except wikipedia.exceptions.DisambiguationError as e_es:
325
+ options_str_es = ", ".join(e_es.options[:3])
326
+ return f"La búsqueda '{query}' en Wikipedia en español es ambigua. Opciones posibles: {options_str_es}. Por favor, sé más específico."
327
+ except Exception as e_gen_es:
328
+ return f"Error al buscar '{query}' en Wikipedia en español: {type(e_gen_es).__name__} {e_gen_es}"
329
 
330
  wikipedia_tool = FunctionTool.from_defaults(
331
  fn=get_wikipedia_summary,
332
  name="wikipedia_lookup",
333
+ description="Busca un resumen conciso de un tema específico en Wikipedia (primero en español, luego en inglés si es necesario). Ideal para definiciones, hechos históricos, biografías. Ejemplo de input: {'query': 'Albert Einstein'}"
334
  )
335
 
336
  def calcular_expresion(expr: str) -> str:
 
368
  Cuando respondas, hazlo en el mismo idioma que la pregunta original del usuario.
369
  Piensa paso a paso. Considera si la información necesaria ya está en la pregunta o en el historial de conversación antes de usar una herramienta.
370
  Si la pregunta contiene datos tabulares o listas directamente en el prompt, analiza esos datos cuidadosamente para responder. No necesitas herramientas para información ya proporcionada.
371
+ Si una herramienta devuelve un error o no encuentra información útil después de un par de intentos, considera si puedes responder de otra manera o si debes indicar que no puedes obtener la respuesta.
 
372
  No inventes respuestas si no tienes la información.
373
+ Para tareas de clasificación que requieren conocimiento especializado (ej. botánica), si no estás seguro de una clasificación, indica que necesitas más información o que la clasificación puede ser compleja.
374
  """
375
 
376
  # --- AGENTE RESTAURADO ---