File size: 1,516 Bytes
cd7c282 32fc7aa cd7c282 32fc7aa cd7c282 32fc7aa cd7c282 32fc7aa cd7c282 32fc7aa cd7c282 32fc7aa cd7c282 32fc7aa cd7c282 32fc7aa cd7c282 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 |
"""Chat Client Factory for unified provider selection."""
from typing import Any
import structlog
from agent_framework import BaseChatClient
from src.clients.providers import HuggingFaceProvider, OpenAIProvider
from src.clients.registry import ProviderRegistry
from src.utils.config import settings
logger = structlog.get_logger()
# Register strategies in order of priority
# 1. OpenAI (Specific key or Env)
ProviderRegistry.register(OpenAIProvider())
# 2. HuggingFace (Free Fallback)
ProviderRegistry.register(HuggingFaceProvider())
def get_chat_client(
provider: str | None = None,
api_key: str | None = None,
model_id: str | None = None,
**kwargs: Any,
) -> BaseChatClient:
"""
Factory for creating chat clients.
Delegates to ProviderRegistry for strategy selection.
Auto-detection priority (via Registry):
1. Explicit provider parameter
2. API key prefix detection (sk- β OpenAI)
3. OpenAI key from env
4. HuggingFace (Free Fallback)
Args:
provider: Force specific provider ("openai", "huggingface")
api_key: Override API key
model_id: Override default model ID
**kwargs: Additional arguments for the client
Returns:
Configured BaseChatClient instance
Raises:
ValueError: If an unsupported provider is requested
"""
return ProviderRegistry.get_client(
settings=settings,
provider=provider,
api_key=api_key,
model_id=model_id,
**kwargs,
)
|