From d774a6b5092e56462a7c06e67cba389cc6ab77c0 Mon Sep 17 00:00:00 2001 From: Juan Date: Sun, 10 May 2026 10:30:40 +0200 Subject: [PATCH] =?UTF-8?q?feat(llm):=20a=C3=B1ade=20factory=20que=20selec?= =?UTF-8?q?ciona=20proveedor=20seg=C3=BAn=20settings?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-Authored-By: Claude Opus 4.7 --- core/src/agentforge_core/llm/factory.py | 28 +++++++++++++++++++++++++ tests/unit/test_llm_factory.py | 20 ++++++++++++++++++ 2 files changed, 48 insertions(+) create mode 100644 core/src/agentforge_core/llm/factory.py create mode 100644 tests/unit/test_llm_factory.py 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)