import requests import os import re from datetime import datetime OPENAI_API_KEY = os.getenv("OPENAI_API_KEY") BRAVE_API_KEY = os.getenv("BRAVE_API_KEY") OPENAI_MODEL = os.getenv("OPENAI_MODEL", "gpt-4o") OPENAI_API_URL = "https://api.openai.com/v1/chat/completions" BRAVE_URL = "https://api.search.brave.com/res/v1/web/search" HEADERS_OPENAI = { "Authorization": f"Bearer {OPENAI_API_KEY}", "Content-Type": "application/json" } HEADERS_BRAVE = { "Accept": "application/json", "X-Subscription-Token": BRAVE_API_KEY } def buscar_en_brave(consulta, max_results=3): """Busca en Brave Search y devuelve los mejores resultados web.""" params = {"q": consulta, "count": max_results, "safesearch": "moderate"} try: res = requests.get(BRAVE_URL, headers=HEADERS_BRAVE, params=params, timeout=10) res.raise_for_status() data = res.json() resultados = data.get("web", {}).get("results", []) return [ f"{r.get('title', '').strip()}: {r.get('description', '').strip()}" for r in resultados if r.get("description") ] except Exception as e: return [f"⚠️ Error al consultar Brave: {e}"] def inferir_con_openai(pregunta, resultados_web=None): """Genera una respuesta usando OpenAI, con contexto opcional.""" fecha_actual = datetime.now().strftime("%d de %B de %Y") system_prompt = ( "Eres un asistente que responde preguntas basándote en resultados web proporcionados. " "Debes analizar cuidadosamente si hay suficiente información para confirmar una respuesta. " "Si encuentras frases como 'X ganó Y', 'X venció a Y', 'X es campeón', considera que eso es suficiente para afirmar el resultado, " "siempre que provenga de una fuente confiable. " "Si los resultados son vagos o contradictorios, di que no puedes confirmarlo aún." ) user_prompt = f"Fecha actual: {fecha_actual}.\nPregunta: {pregunta}" if resultados_web: contexto = "\n".join(f"{i+1}. {r}" for i, r in enumerate(resultados_web)) user_prompt += f"\n\nResultados web:\n{contexto}" payload = { "model": OPENAI_MODEL, "messages": [ {"role": "system", "content": system_prompt}, {"role": "user", "content": user_prompt} ], "temperature": 0.7, "max_tokens": 400 } try: res = requests.post(OPENAI_API_URL, headers=HEADERS_OPENAI, json=payload, timeout=60) res.raise_for_status() return res.json()["choices"][0]["message"]["content"].strip() except Exception as e: return f"⚠️ Error al consultar OpenAI: {e}" def procesar_consulta(prompt): """Busca en Brave y deja que OpenAI razone libremente con esos resultados.""" resultados = buscar_en_brave(prompt) # Aunque no haya resultados útiles, seguimos con OpenAI para que juzgue respuesta = inferir_con_openai(prompt, resultados if resultados else None) return respuesta or "No se encontró información disponible." def help(): return ( "Uso: .chatgpt \n" "Consulta la IA de OpenAI con contexto de Brave Search si está disponible.\n" "Ejemplo: .chatgpt ¿Quién ganó la Champions League 2025?" ) def run(sender, *args): if not args: return "Uso: .ai " consulta = " ".join(args).strip() return procesar_consulta(consulta)