103 lines
3.4 KiB
Python
103 lines
3.4 KiB
Python
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 <pregunta>\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 <pregunta>"
|
|
|
|
consulta = " ".join(args).strip()
|
|
return procesar_consulta(consulta)
|
|
|
|
|