import os import gradio as gr from tavily import TavilyClient from openai import OpenAI import requests # Para MCP fallback # ======================================================= # CONFIGURACIÓN (Secrets) # ======================================================= TAVILY_API_KEY = os.getenv("TAVILY_API_KEY") OPENAI_API_KEY = os.getenv("OPENAI_API_KEY") if not TAVILY_API_KEY: raise gr.Error("Falta TAVILY_API_KEY en Secrets (usa tvly-...)") if not OPENAI_API_KEY: raise gr.Error("Falta OPENAI_API_KEY en Secrets (obtén en openai.com)") # Cliente Tavily (tu ejemplo exacto) tavily_client = TavilyClient(api_key=TAVILY_API_KEY) # Cliente OpenAI openai_client = OpenAI(api_key=OPENAI_API_KEY) # MCP endpoint de Tavily (de tu paste, para queries expert) MCP_URL = "https://mcp.tavily.com/mcp/?tavilyApiKey=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" # Tu dev key; cambia si es prod # ======================================================= # Función LLM: OpenAI GPT-3.5-turbo (sustituye HF) # ======================================================= def query_openai(prompt): try: response = openai_client.chat.completions.create( model="gpt-3.5-turbo", messages=[{"role": "user", "content": prompt}], max_tokens=500, temperature=0.7 ) return response.choices[0].message.content.strip() except Exception as e: return f"[Error OpenAI] {str(e)}" # ======================================================= # Fallback MCP: Usa Tavily Expert via endpoint (de tu paste) # ======================================================= def query_mcp(query, instructions="Summarize key facts"): try: payload = {"query": query, "instructions": instructions} response = requests.post(MCP_URL, json=payload, timeout=30) if response.status_code == 200: return response.json().get("summary", "[MCP vacío]") return "[Error MCP 404/500]" except Exception as e: return f"[Error MCP] {str(e)}" # ======================================================= # Agente: Búsqueda Tavily + LLM OpenAI # ======================================================= def agente_inteligente(pregunta): if not pregunta.strip(): return "Escribe una pregunta." # 1. Búsqueda con Tavily (tu ejemplo: como "Who is Leo Messi?") try: resultados = tavily_client.search(query=pregunta, max_results=3) contexto = "\n\n".join([ f"Título: {r['title']}\nContenido: {r['content'][:600]}...\nURL: {r['url']}" for r in resultados.get("results", []) ]) except Exception as e: # Fallback a MCP si Tavily falla contexto = query_mcp(pregunta, "Extrae hechos clave de búsqueda web") if "Error" in contexto: return f"No se pudo buscar: {contexto}\n\nPregunta: {pregunta}" # 2. Prompt para OpenAI (claro, emocional, basado en búsqueda) prompt = f"""Eres un asistente experto y carismático. Usa SOLO la información de los resultados de búsqueda para responder de forma clara, interesante y emocionalmente rica. Hazlo vívido, como si contaras una historia cautivadora. Pregunta del usuario: {pregunta} Resultados de búsqueda: {contexto} Respuesta:""" # 3. Genera respuesta con OpenAI respuesta = query_openai(prompt) return respuesta # ======================================================= # Interfaz Gradio # ======================================================= with gr.Blocks(theme=gr.themes.Soft(), title="Bat_Tavily_OpenAI") as demo: gr.Markdown("# Bat_Tavily_OpenAI\n**Tavily + GPT-3.5. Sin HF. Respuestas correctas y rápidas.**") inp = gr.Textbox( label="Tu pregunta", placeholder="Ej: ¿Quién es Leo Messi? (prueba tu ejemplo de Tavily)", lines=3 ) out = gr.Textbox( label="Respuesta", interactive=False, lines=12, show_copy_button=True ) gr.Examples( examples=[ "¿Quién es Leo Messi?", # Tu ejemplo exacto "¿Cuáles son las últimas noticias sobre inteligencia artificial?", "Explica la relatividad de Einstein" ], inputs=inp ) gr.Row([ gr.Button("Enviar").click(agente_inteligente, inputs=inp, outputs=out), gr.Button("Limpiar").click(lambda: ("", ""), outputs=[inp, out]) ]) if __name__ == "__main__": demo.launch(debug=True)