Spaces:
Runtime error
Runtime error
Update my_tools.py
Browse files- 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 |
-
|
| 268 |
-
|
| 269 |
-
|
| 270 |
-
|
| 271 |
-
|
| 272 |
-
|
| 273 |
-
|
| 274 |
-
|
| 275 |
-
|
| 276 |
-
|
| 277 |
-
|
| 278 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 279 |
|
| 280 |
search_tool = FunctionTool.from_defaults(
|
| 281 |
fn=buscar_web,
|
| 282 |
name="web_search",
|
| 283 |
-
description="
|
| 284 |
)
|
| 285 |
|
| 286 |
def get_wikipedia_summary(query: str) -> str:
|
| 287 |
-
"""Busca un resumen
|
|
|
|
|
|
|
|
|
|
| 288 |
try:
|
| 289 |
-
wikipedia.set_lang("es")
|
| 290 |
-
|
|
|
|
| 291 |
except wikipedia.exceptions.PageError:
|
| 292 |
-
|
| 293 |
-
|
| 294 |
-
|
| 295 |
-
|
| 296 |
-
|
| 297 |
-
|
| 298 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 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
|
| 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
|
| 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,
|
| 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 ---
|