Spaces:
Runtime error
Runtime error
| import openai | |
| import requests | |
| import logging | |
| import os | |
| from typing import Optional, Dict, Any | |
| logging.basicConfig(level=logging.INFO) | |
| logger = logging.getLogger(__name__) | |
| class APIAgent: | |
| def __init__(self): | |
| self.config = {} | |
| def set_config(self, config: Dict[str, Any]): | |
| """Configura las claves API desde Gradio""" | |
| self.config = config or {} | |
| def call_openai(self, prompt: str, is_code: bool = False) -> Optional[str]: | |
| """Intenta llamar a OpenAI API""" | |
| api_key = self.config.get("openai_api_key") | |
| if not api_key: | |
| return None | |
| try: | |
| openai.api_key = api_key | |
| model = "gpt-3.5-turbo" | |
| max_tokens = self.config.get("max_tokens", 400) # Reducido para HF | |
| temperature = self.config.get("temperature", 0.7) | |
| response = openai.ChatCompletion.create( | |
| model=model, | |
| messages=[{"role": "user", "content": prompt}], | |
| max_tokens=max_tokens, | |
| temperature=temperature, | |
| timeout=15 # Timeout reducido | |
| ) | |
| return response.choices[0].message.content.strip() | |
| except Exception as e: | |
| logger.error(f"❌ Error llamando a OpenAI: {e}") | |
| return None | |
| def call_deepseek(self, prompt: str, is_code: bool = False) -> Optional[str]: | |
| """Intenta llamar a DeepSeek API""" | |
| api_key = self.config.get("deepseek_api_key") | |
| if not api_key: | |
| return None | |
| try: | |
| url = "https://api.deepseek.com/v1/chat/completions" | |
| headers = { | |
| "Content-Type": "application/json", | |
| "Authorization": f"Bearer {api_key}" | |
| } | |
| max_tokens = self.config.get("max_tokens", 400) | |
| temperature = self.config.get("temperature", 0.7) | |
| data = { | |
| "model": "deepseek-chat", | |
| "messages": [{"role": "user", "content": prompt}], | |
| "max_tokens": max_tokens, | |
| "temperature": temperature, | |
| "stream": False | |
| } | |
| response = requests.post(url, json=data, headers=headers, timeout=20) | |
| response.raise_for_status() | |
| result = response.json() | |
| return result["choices"][0]["message"]["content"].strip() | |
| except Exception as e: | |
| logger.error(f"❌ Error llamando a DeepSeek: {e}") | |
| return None | |
| def generate_response(self, prompt: str, is_code: bool = False) -> Dict[str, Any]: | |
| """ | |
| Intenta generar respuesta usando APIs en orden de preferencia | |
| Returns: dict con response y source | |
| """ | |
| # Verificar si hay claves configuradas | |
| has_deepseek = bool(self.config.get("deepseek_api_key")) | |
| has_openai = bool(self.config.get("openai_api_key")) | |
| if has_deepseek: | |
| deepseek_response = self.call_deepseek(prompt, is_code) | |
| if deepseek_response: | |
| return {"response": deepseek_response, "source": "deepseek"} | |
| if has_openai: | |
| openai_response = self.call_openai(prompt, is_code) | |
| if openai_response: | |
| return {"response": openai_response, "source": "openai"} | |
| # Si no hay APIs disponibles o fallan, retornar None para usar modelo local | |
| return {"response": None, "source": "none"} |