Source code for agent.providers.registry

"""
Provider registry.

Manages registration and instantiation of provider adapters.
"""

import threading
from typing import Any

from agent.errors import ProviderError
from agent.providers.base import BaseProvider

_registry_lock = threading.Lock()


[docs] class ProviderRegistry: """Registry for provider adapters.""" _providers: dict[str, type[BaseProvider]] = {} _aliases: dict[str, str] = {}
[docs] @classmethod def register( cls, name: str, provider_class: type[BaseProvider], aliases: list[str] | None = None, ) -> None: """ Register a provider adapter. Args: name: Provider name (e.g., "openai") provider_class: Provider class aliases: Optional list of aliases """ cls._providers[name] = provider_class if aliases: for alias in aliases: cls._aliases[alias] = name
[docs] @classmethod def get_class(cls, name: str) -> type[BaseProvider]: """ Get a provider class by name. Args: name: Provider name or alias Returns: Provider class Raises: ProviderError: If provider not found """ # Resolve alias resolved_name = cls._aliases.get(name, name) if resolved_name not in cls._providers: available = ", ".join(sorted(cls._providers.keys())) raise ProviderError( f"Provider '{name}' not found. Available: {available}", provider=name, ) return cls._providers[resolved_name]
[docs] @classmethod def create(cls, name: str, **kwargs: Any) -> BaseProvider: """ Create a provider instance. Args: name: Provider name or alias **kwargs: Provider configuration Returns: Provider instance """ provider_class = cls.get_class(name) return provider_class(**kwargs)
[docs] @classmethod def list_providers(cls) -> list[str]: """List all registered provider names.""" return sorted(cls._providers.keys())
[docs] @classmethod def is_registered(cls, name: str) -> bool: """Check if a provider is registered.""" resolved_name = cls._aliases.get(name, name) return resolved_name in cls._providers
[docs] def get_provider(name: str, **kwargs: Any) -> BaseProvider: """ Get a provider instance. This is the main entry point for getting providers. Automatically loads provider modules on first access. Args: name: Provider name (e.g., "openai", "anthropic") **kwargs: Provider configuration Returns: Provider instance """ # Lazy load providers _ensure_providers_loaded() return ProviderRegistry.create(name, **kwargs)
_providers_loaded = False def _ensure_providers_loaded() -> None: """Ensure all built-in providers are loaded.""" global _providers_loaded if _providers_loaded: return with _registry_lock: # Double-check after acquiring lock if _providers_loaded: return # Import provider modules to trigger registration import contextlib with contextlib.suppress(ImportError): from agent.providers import openai as _ # noqa: F401 with contextlib.suppress(ImportError): from agent.providers import anthropic as _ # noqa: F401 with contextlib.suppress(ImportError): from agent.providers import gemini as _ # noqa: F401 with contextlib.suppress(ImportError): from agent.providers import deepseek as _ # noqa: F401 _providers_loaded = True