Skip to content
← How we build

backend/src/llm/factory.py

from llm.providers.base_provider import BaseProvider
from llm.providers.ollama_provider import OllamaProvider
from llm.providers.openrouter_provider import OpenRouterProvider
from llm.providers.openai_provider import OpenAIProvider
from llm.providers.anthropic_provider import AnthropicProvider

# Registry: add new providers here — nowhere else needs to change.
_REGISTRY: dict[str, type[BaseProvider]] = {
    "ollama": OllamaProvider,
    "openrouter": OpenRouterProvider,
    "openai": OpenAIProvider,
    "anthropic": AnthropicProvider,
}

# Providers exposed in the UI provider picker.
UI_PROVIDERS = ("ollama", "openrouter")


class LLMFactory:
    @staticmethod
    def create(provider_name: str, model: str) -> BaseProvider:
        provider_cls = _REGISTRY.get(provider_name.lower())
        if provider_cls is None:
            available = ", ".join(_REGISTRY.keys())
            raise ValueError(
                f"Unknown provider '{provider_name}'. Available: {available}"
            )
        return provider_cls(model=model)

    @staticmethod
    def available_providers() -> list[str]:
        return list(_REGISTRY.keys())

    @staticmethod
    def ui_providers() -> list[str]:
        return list(UI_PROVIDERS)

Follow the work.

Occasional updates on SignalFoundry, MarketCompass, and what we are building at CompassFoundry Labs.

No spam. Unsubscribe anytime.