111 lines
3.6 KiB
Python
111 lines
3.6 KiB
Python
"""
|
|
Módulo que implementa el contexto del patrón Strategy para modelos de lenguaje.
|
|
|
|
Este módulo contiene la clase LLMContext que mantiene una referencia a la
|
|
estrategia actual y delega en ella la creación del modelo de lenguaje.
|
|
"""
|
|
|
|
from typing import Dict, Any, Optional
|
|
from .strategies import (
|
|
LLMStrategy,
|
|
OpenAIO4MiniStrategy,
|
|
OpenAIGPT41MiniStrategy,
|
|
AnthropicHaikuStrategy,
|
|
AnthropicSonnet37Strategy,
|
|
AnthropicHaiku45Strategy,
|
|
)
|
|
from .config import LLMConfig
|
|
|
|
|
|
class LLMContext:
|
|
"""
|
|
Contexto que utiliza diferentes estrategias para crear modelos de lenguaje.
|
|
|
|
Esta clase es el punto central de interacción con el sistema de modelos.
|
|
Mantiene una referencia a la estrategia actual y delega la creación
|
|
del modelo a dicha estrategia.
|
|
"""
|
|
|
|
def __init__(self):
|
|
"""
|
|
Inicializa el contexto con las estrategias disponibles.
|
|
"""
|
|
# Mapeo de proveedores y modelos a estrategias
|
|
self._strategies = {
|
|
"openai": {
|
|
"o4-mini": OpenAIO4MiniStrategy(),
|
|
"gpt-4.1-mini": OpenAIGPT41MiniStrategy(),
|
|
},
|
|
"anthropic": {
|
|
"claude-3-5-haiku-20241022": AnthropicHaikuStrategy(),
|
|
"claude-sonnet-4-5": AnthropicSonnet37Strategy(),
|
|
"claude-haiku-4-5": AnthropicHaiku45Strategy(),
|
|
},
|
|
}
|
|
self._current_strategy: Optional[LLMStrategy] = None
|
|
self._config: Optional[Dict[str, Any]] = None
|
|
|
|
def set_strategy(self, config: LLMConfig) -> None:
|
|
"""
|
|
Establece la estrategia actual basada en la configuración.
|
|
|
|
Args:
|
|
config: Configuración del modelo
|
|
|
|
Raises:
|
|
ValueError: Si el proveedor o modelo no están soportados
|
|
"""
|
|
provider = config.provider.lower()
|
|
|
|
# Verificar que el proveedor es válido
|
|
if provider not in self._strategies:
|
|
raise ValueError(f"Proveedor no soportado: {provider}")
|
|
|
|
# Si se especificó un modelo, usarlo
|
|
if config.model_name:
|
|
model_name = config.model_name
|
|
if model_name not in self._strategies[provider]:
|
|
raise ValueError(f"Modelo no soportado para {provider}: {model_name}")
|
|
self._current_strategy = self._strategies[provider][model_name]
|
|
else:
|
|
# Si no se especificó un modelo, usar el primero disponible
|
|
self._current_strategy = next(iter(self._strategies[provider].values()))
|
|
|
|
# Guardar la configuración
|
|
self._config = config.as_dict()
|
|
|
|
def get_llm(self):
|
|
"""
|
|
Crea y devuelve un modelo de lenguaje usando la estrategia actual.
|
|
|
|
Returns:
|
|
Instancia del modelo de lenguaje
|
|
|
|
Raises:
|
|
ValueError: Si no se ha establecido una estrategia
|
|
"""
|
|
if not self._current_strategy:
|
|
raise ValueError("No se ha establecido una estrategia")
|
|
|
|
return self._current_strategy.create_llm(self._config)
|
|
|
|
def register_strategy(
|
|
self, provider: str, model_name: str, strategy: LLMStrategy
|
|
) -> None:
|
|
"""
|
|
Registra una nueva estrategia.
|
|
|
|
Args:
|
|
provider: Nombre del proveedor (openai, anthropic)
|
|
model_name: Nombre del modelo
|
|
strategy: Instancia de la estrategia a registrar
|
|
"""
|
|
provider = provider.lower()
|
|
|
|
# Crear el diccionario del proveedor si no existe
|
|
if provider not in self._strategies:
|
|
self._strategies[provider] = {}
|
|
|
|
# Registrar la estrategia
|
|
self._strategies[provider][model_name] = strategy
|