84 lines
3.7 KiB
Python
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
|