zcbot/core/provider_credentials/registry.py

84 lines
3.7 KiB
Python

"""静态可信 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