diff --git a/core/src/agentforge_core/llm/factory.py b/core/src/agentforge_core/llm/factory.py new file mode 100644 index 0000000..687b34c --- /dev/null +++ b/core/src/agentforge_core/llm/factory.py @@ -0,0 +1,28 @@ +"""Factory que selecciona el LLMProvider segĂșn settings.""" + +from __future__ import annotations + +from agentforge_core.config import Settings +from agentforge_core.llm.azure import AzureOpenAIProvider +from agentforge_core.llm.base import LLMProvider +from agentforge_core.llm.mock import MockProvider +from agentforge_core.llm.openai import OpenAIProvider + + +def build_llm_provider(settings: Settings) -> LLMProvider: + """Materializa el proveedor activo. Falla en arranque si la config es inconsistente.""" + match settings.llm_provider: + case "mock": + return MockProvider() + case "azure": + return AzureOpenAIProvider( + endpoint=settings.azure_openai_endpoint, + api_key=settings.azure_openai_api_key, + deployment=settings.azure_openai_deployment, + api_version=settings.azure_openai_api_version, + ) + case "openai": + return OpenAIProvider( + api_key=settings.openai_api_key, + model=settings.openai_model, + ) diff --git a/tests/unit/test_llm_factory.py b/tests/unit/test_llm_factory.py new file mode 100644 index 0000000..5419df8 --- /dev/null +++ b/tests/unit/test_llm_factory.py @@ -0,0 +1,20 @@ +"""Tests del factory LLM.""" + +import pytest + +from agentforge_core.config import Settings +from agentforge_core.llm.factory import build_llm_provider +from agentforge_core.llm.mock import MockProvider + + +def test_factory_devuelve_mock_por_defecto() -> None: + s = Settings(llm_provider="mock", _env_file=None) # type: ignore[call-arg] + p = build_llm_provider(s) + assert isinstance(p, MockProvider) + assert p.name == "mock" + + +def test_factory_azure_requiere_credenciales() -> None: + s = Settings(llm_provider="azure", _env_file=None) # type: ignore[call-arg] + with pytest.raises(ValueError): + build_llm_provider(s)