"""静态可信 Provider 注册表;网络目标和协议不可由 Admin 修改。""" from __future__ import annotations from dataclasses import dataclass @dataclass(frozen=True) class CredentialField: name: str label: str env: str secret: bool = True @dataclass(frozen=True) class ProviderDefinition: provider_id: str display_name: str category: str fields: tuple[CredentialField, ...] test_kind: str test_url: str = "" test_url_env: str = "" billable: bool = False balance_supported: bool = False check_interval_seconds: int = 86400 low_balance_threshold: float | None = None def _key(env: str, label: str = "API Key") -> CredentialField: return CredentialField("api_key", label, env) PROVIDERS: tuple[ProviderDefinition, ...] = ( ProviderDefinition("deepseek", "DeepSeek", "模型", (_key("DEEPSEEK_API_KEY"),), "deepseek_balance", "https://api.deepseek.com/user/balance", balance_supported=True, check_interval_seconds=1800, low_balance_threshold=30.0), ProviderDefinition("zhipuai", "智谱开放平台", "模型", (_key("ZHIPUAI_API_KEY"),), "bearer_get", "https://open.bigmodel.cn/api/paas/v4/models"), ProviderDefinition("ark", "火山方舟", "模型与媒体", (_key("ARK_API_KEY"),), "bearer_get", "https://ark.cn-beijing.volces.com/api/v3/models"), ProviderDefinition("unifyllm", "国际旗舰模型网关", "模型与媒体", (_key("UNIFYLLM_API_KEY"),), "bearer_get", "https://unifyllm.ai/v1/models"), ProviderDefinition("local_llm", "内网本地模型", "模型", (_key("LOCAL_LLM_API_KEY"),), "bearer_get", "http://182.54.21.126:9000/v1/models"), ProviderDefinition("bocha", "博查搜索", "搜索与平台数据", (_key("BOCHA_API_KEY"),), "bocha_search", "https://api.bochaai.com/v1/web-search", billable=True), ProviderDefinition("document_search", "内部材料库", "搜索与平台数据", (_key("DOCUMENT_SEARCH_API_KEY"),), "bearer_get", "https://ai.ctc-zc.com:8100/api/document_search/list_knowledge_bases", test_url_env="DOCUMENT_SEARCH_URL"), ProviderDefinition("paper_server", "论文服务", "搜索与平台数据", (_key("PAPER_SERVER_API_KEY"),), "query_get", "http://paper.xxhhcty.xyz:8080/api/resm/paper/", test_url_env="PAPER_SERVER_URL"), ProviderDefinition("materials_project", "Materials Project", "搜索与平台数据", (_key("MP_API_KEY"),), "mp_get", "https://api.materialsproject.org/materials/summary/?_limit=1"), ProviderDefinition( "xfyun_iat", "讯飞语音听写 IAT", "语音", (CredentialField("appid", "APPID", "XFYUN_APPID"), CredentialField("api_key", "API Key", "XFYUN_API_KEY"), CredentialField("api_secret", "API Secret", "XFYUN_API_SECRET")), "xfyun_iat", billable=True, ), ProviderDefinition( "xfyun_lfasr", "讯飞录音转写 LFASR", "语音", (CredentialField("appid", "APPID", "XFYUN_APPID"), CredentialField("secret_key", "Secret Key", "XFYUN_LFASR_SECRET_KEY")), "xfyun_lfasr", "https://raasr.xfyun.cn/v2/api/getResult", billable=False, ), ) BY_ID = {provider.provider_id: provider for provider in PROVIDERS} BY_ENV = { field.env: (provider.provider_id, field.name) for provider in PROVIDERS for field in provider.fields } def get_provider(provider_id: str) -> ProviderDefinition: try: return BY_ID[provider_id] except KeyError as exc: raise ValueError("unknown provider") from exc