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) 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 ) 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'}