from .models import LLMProviderConfig # ponytail: wrapper ultra-fino para litellm. Si falla, boom. def chat_completion(messages): config = LLMProviderConfig.objects.filter(is_active=True, is_embedding=False).first() if not config: raise Exception("No active LLM provider configured.") if config.provider_type == 'ollama': import litellm endpoint = config.api_key if config.api_key else "http://127.0.0.1:11434" return litellm.completion( model=f"ollama/{config.model}", messages=messages, api_base=endpoint ) elif config.provider_type == 'talentai': # Para TalentAI (HuggingFace Space microservicio), usamos formato OpenAI # config.endpoint tiene la URL del Space, config.api_key tiene la clave secreta ep = config.endpoint.strip().rstrip("/") if config.endpoint else "" import litellm return litellm.completion( model=f"openai/{config.model}", messages=messages, api_base=ep, api_key=config.api_key if config.api_key else "no-key-needed", custom_llm_provider="openai" ) elif config.provider_type == 'openai': import litellm return litellm.completion( model=config.model, messages=messages, api_key=config.api_key ) elif config.provider_type == 'anthropic': import litellm return litellm.completion( model=config.model, messages=messages, api_key=config.api_key ) elif config.provider_type == 'nvidia': import openai client = openai.OpenAI( base_url="https://integrate.api.nvidia.com/v1", api_key=config.api_key ) return client.chat.completions.create( model=config.model, messages=messages, temperature=1, top_p=0.95, max_tokens=4000 ) else: # Fallback genĂ©rico para Litellm (que se encarga de rutear segĂșn el modelo) import litellm return litellm.completion( model=config.model, messages=messages, api_key=config.api_key, api_base=config.endpoint if config.endpoint else None )