Spaces:
Sleeping
Sleeping
| """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", | |
| ] | |