import requests import os import re from datetime import datetime HUGGINGFACE_API_KEY = os.getenv("HUGGINGFACE_API_KEY") BRAVE_API_KEY = os.getenv("BRAVE_API_KEY") MODEL_ID = os.getenv("HUGGINGFACE_MODEL", "deepseek/deepseek-v3-0324") HF_API_URL = "https://router.huggingface.co/novita/v3/openai/chat/completions" BRAVE_URL = "https://api.search.brave.com/res/v1/web/search" HEADERS_HF = { "Authorization": f"Bearer {HUGGINGFACE_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): 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_huggingface(pregunta, resultados_web=None): if not HUGGINGFACE_API_KEY: return "⚠️ Falta la variable HUGGINGFACE_API_KEY." fecha_actual = datetime.now().strftime("%d de %B de %Y") system_prompt = ( "Eres un asistente útil que responde siempre en español claro y natural. " "Responde con base únicamente en los datos proporcionados. Si no hay información clara, di que no puedes confirmarlo." ) 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": MODEL_ID, "messages": [ {"role": "system", "content": system_prompt}, {"role": "user", "content": user_prompt} ], "temperature": 0.7, "max_tokens": 400 } try: res = requests.post(HF_API_URL, headers=HEADERS_HF, 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 Hugging Face: {e}" def procesar_consulta(prompt): resultados = buscar_en_brave(prompt) respuesta = inferir_con_huggingface(prompt, resultados if resultados else None) return respuesta or "No se encontró información disponible." def run(sender, *args): if not args: return "Uso: .ai " consulta = " ".join(args).strip() return procesar_consulta(consulta) def help(): return "Uso: .ai - Responde con Hugging Face y contexto de Brave Search si es necesario."