claude-code-proxy / config /provider_catalog.py
Yash030's picture
Add Cerebras, Silicon Flow, and Groq providers with debug logging.
db83b53
"""Neutral provider catalog: IDs, credentials, defaults, proxy and capability metadata.
Adapter factories live in :mod:`providers.registry`; this module stays free of
provider implementation imports (see contract tests).
"""
from __future__ import annotations
from dataclasses import dataclass
from typing import Literal
TransportType = Literal["openai_chat", "anthropic_messages"]
# Default upstream base URLs (also re-exported via :mod:`providers.defaults`)
NVIDIA_NIM_DEFAULT_BASE = "https://integrate.api.nvidia.com/v1"
ZEN_DEFAULT_BASE = "https://opencode.ai/zen"
CEREBRAS_DEFAULT_BASE = "https://api.cerebras.ai/v1"
SILICON_DEFAULT_BASE = "https://api.siliconflow.com/v1"
GROQ_DEFAULT_BASE = "https://api.groq.com/openai/v1"
@dataclass(frozen=True, slots=True)
class ProviderDescriptor:
"""Metadata for building :class:`~providers.base.ProviderConfig` and factory wiring."""
provider_id: str
transport_type: TransportType
capabilities: tuple[str, ...]
credential_env: str | None = None
credential_url: str | None = None
credential_attr: str | None = None
static_credential: str | None = None
default_base_url: str | None = None
base_url_attr: str | None = None
proxy_attr: str | None = None
PROVIDER_CATALOG: dict[str, ProviderDescriptor] = {
"nvidia_nim": ProviderDescriptor(
provider_id="nvidia_nim",
transport_type="openai_chat",
credential_env="NVIDIA_NIM_API_KEY_QWEN",
credential_url="https://build.nvidia.com/settings/api-keys",
credential_attr="nvidia_nim_api_key_qwen",
default_base_url=NVIDIA_NIM_DEFAULT_BASE,
proxy_attr="nvidia_nim_proxy",
capabilities=("chat", "streaming", "tools", "thinking", "rate_limit"),
),
"zen": ProviderDescriptor(
provider_id="zen",
transport_type="openai_chat",
credential_env="ZEN_API_KEY",
credential_url="https://opencode.ai/settings",
credential_attr="zen_api_key",
default_base_url=ZEN_DEFAULT_BASE,
base_url_attr="zen_base_url",
capabilities=("chat", "streaming", "tools", "thinking"),
),
"cerebras": ProviderDescriptor(
provider_id="cerebras",
transport_type="openai_chat",
credential_env="CEREBRAS_API_KEY",
credential_url="https://cerebras.ai/labs",
credential_attr="cerebras_api_key",
default_base_url=CEREBRAS_DEFAULT_BASE,
capabilities=("chat", "streaming", "tools", "thinking"),
),
"silicon": ProviderDescriptor(
provider_id="silicon",
transport_type="openai_chat",
credential_env="SILICON_API_KEY",
credential_url="https://siliconflow.cn",
credential_attr="silicon_api_key",
default_base_url=SILICON_DEFAULT_BASE,
capabilities=("chat", "streaming", "tools", "thinking"),
),
"groq": ProviderDescriptor(
provider_id="groq",
transport_type="openai_chat",
credential_env="GROQ_API_KEY",
credential_url="https://console.groq.com/keys",
credential_attr="groq_api_key",
default_base_url=GROQ_DEFAULT_BASE,
capabilities=("chat", "streaming", "tools", "thinking"),
),
}
# Order matches docs; must match PROVIDER_CATALOG keys.
SUPPORTED_PROVIDER_IDS: tuple[str, ...] = (
"nvidia_nim",
"zen",
"cerebras",
"silicon",
"groq",
)
if len(set(SUPPORTED_PROVIDER_IDS)) != len(SUPPORTED_PROVIDER_IDS):
raise AssertionError("Duplicate provider ids in PROVIDER_CATALOG key order")