"""HTTP LLM providers for the CS Kiosk.""" from __future__ import annotations from typing import Any, Dict, Type from .base import ( BaseLLM, ChatMessage, LLMResponse, MessageRole, ProviderConfig, ToolCall, ) from .echo import EchoProvider from .gpt import OpenAIChat from .claude import ClaudeProvider from .gemini import GeminiGenerative _PROVIDER_REGISTRY: Dict[str, Dict[str, Any]] = { "claude": { "id": "claude", "name": "Anthropic Claude", "cls": ClaudeProvider, "default_model": "claude-haiku-4-5", "supports_tools": True, }, "gpt": { "id": "gpt", "name": "OpenAI GPT", "cls": OpenAIChat, "default_model": "gpt-4.1-mini", "supports_tools": True, }, "gemini": { "id": "gemini", "name": "Google Gemini", "cls": GeminiGenerative, "default_model": "gemini-2.0-flash", "supports_tools": True, }, "echo": { "id": "echo", "name": "Echo (development)", "cls": EchoProvider, "default_model": "echo", "supports_tools": True, }, } _PROVIDER_ALIASES: Dict[str, str] = { "anthropic": "claude", "claude": "claude", "openai": "gpt", "gpt": "gpt", "google": "gemini", "gemini": "gemini", "echo": "echo", "mock": "echo", } def normalize_provider_name(name: str) -> str: """Return the canonical provider id for a user-supplied name.""" return _PROVIDER_ALIASES.get(name.lower(), name.lower()) def available_providers() -> Dict[str, Dict[str, Any]]: """Metadata describing the providers registered with the backend.""" providers: Dict[str, Dict[str, Any]] = {} for key, meta in _PROVIDER_REGISTRY.items(): exported = {k: v for k, v in meta.items() if k != "cls"} providers[key] = exported return providers def get_provider(name: str, config: ProviderConfig) -> BaseLLM: """Instantiate a provider client by name.""" canonical = normalize_provider_name(name) entry = _PROVIDER_REGISTRY.get(canonical) if not entry: raise ValueError(f"Unsupported provider '{name}'.") provider_cls: Type[BaseLLM] = entry["cls"] return provider_cls(config) __all__ = [ "BaseLLM", "ChatMessage", "LLMResponse", "MessageRole", "ProviderConfig", "ToolCall", "EchoProvider", "OpenAIChat", "ClaudeProvider", "GeminiGenerative", "available_providers", "get_provider", "normalize_provider_name", ]