diff --git a/app/agent/llm/provider.py b/app/agent/llm/provider.py index b0fd0435..9c423435 100644 --- a/app/agent/llm/provider.py +++ b/app/agent/llm/provider.py @@ -334,7 +334,7 @@ class LLMProviderManager(metaclass=Singleton): provider_id="anthropic", name="Anthropic", default_base_url="https://api.anthropic.com/v1", - sort_order=25, + sort_order=30, api_key_hint="填写 Anthropic API Key。", description="Anthropic Claude 官方端点。", ), @@ -346,15 +346,7 @@ class LLMProviderManager(metaclass=Singleton): default_base_url="https://api.deepseek.com", api_key_hint="填写 DeepSeek API Key。", description="DeepSeek 官方平台。", - sort_order=30, - ), - catalog_openai_provider( - provider_id="groq", - name="Groq", - default_base_url="https://api.groq.com/openai/v1", - sort_order=35, - api_key_hint="填写 Groq API Key。", - description="Groq 官方 OpenAI-compatible 端点。", + sort_order=40, ), ProviderSpec( id="openrouter", @@ -364,15 +356,7 @@ class LLMProviderManager(metaclass=Singleton): default_base_url="https://openrouter.ai/api/v1", api_key_hint="填写 OpenRouter API Key。", description="OpenRouter 聚合模型平台。", - sort_order=40, - ), - catalog_openai_provider( - provider_id="xai", - name="xAI", - default_base_url="https://api.x.ai/v1", - sort_order=45, - api_key_hint="填写 xAI API Key。", - description="xAI 官方 OpenAI-compatible 端点。", + sort_order=50, ), ProviderSpec( id="github-copilot", @@ -391,45 +375,22 @@ class LLMProviderManager(metaclass=Singleton): ), model_list_strategy="github_copilot", description="通过 GitHub Copilot 订阅接入。", - sort_order=50, + sort_order=60, ), catalog_openai_provider( provider_id="github-models", name="GitHub Models", default_base_url="https://models.github.ai/inference", - sort_order=55, + sort_order=70, api_key_label="GitHub Token", api_key_hint="填写具有 GitHub Models 访问权限的 GitHub Token。", description="GitHub Models 推理端点。", ), - openai_provider( - provider_id="siliconflow", - name="硅基流动", - default_base_url="https://api.siliconflow.cn/v1", - sort_order=60, - models_dev_provider_id="siliconflow-cn", - base_url_presets=( - url_preset( - id="siliconflow-cn", - label="中国大陆", - value="https://api.siliconflow.cn/v1", - models_dev_provider_id="siliconflow-cn", - ), - url_preset( - id="siliconflow-global", - label="Global", - value="https://api.siliconflow.com/v1", - models_dev_provider_id="siliconflow", - ), - ), - api_key_hint="填写硅基流动 API Key,可在中国大陆与 Global 端点间切换。", - description="SiliconFlow 官方兼容端点。", - ), catalog_openai_provider( provider_id="moonshot", name="Moonshot / Kimi", default_base_url="https://api.moonshot.cn/v1", - sort_order=62, + sort_order=80, models_dev_provider_id="moonshotai-cn", base_url_presets=( url_preset( @@ -456,11 +417,80 @@ class LLMProviderManager(metaclass=Singleton): api_key_hint="填写 Moonshot / Kimi API Key,可在中国站、国际站与 Kimi for Coding 端点间切换。", description="Moonshot / Kimi 官方端点,支持通用 API 与 Kimi for Coding 预设。", ), + anthropic_provider( + provider_id="minimax", + name="MiniMax", + default_base_url="https://api.minimaxi.com/anthropic/v1", + sort_order=90, + models_dev_provider_id="minimax-cn", + base_url_presets=( + url_preset( + id="minimax-cn-general", + label="中国内地 / 通用", + value="https://api.minimaxi.com/anthropic/v1", + models_dev_provider_id="minimax-cn", + ), + url_preset( + id="minimax-global-general", + label="国际站 / 通用", + value="https://api.minimax.io/anthropic/v1", + models_dev_provider_id="minimax", + ), + url_preset( + id="minimax-cn-coding", + label="中国内地 / Coding Plan", + value="https://api.minimaxi.com/anthropic/v1", + models_dev_provider_id="minimax-cn-coding-plan", + ), + url_preset( + id="minimax-global-coding", + label="国际站 / Coding Plan", + value="https://api.minimax.io/anthropic/v1", + models_dev_provider_id="minimax-coding-plan", + ), + ), + api_key_hint="填写 MiniMax API Key,可在中国内地、国际站、通用与 Coding Plan 目录间切换。", + description="MiniMax Anthropic-compatible 端点,支持通用与 Coding Plan 目录预设。", + ), + catalog_openai_provider( + provider_id="xiaomi", + name="Xiaomi", + default_base_url="https://api.xiaomimimo.com/v1", + sort_order=100, + base_url_presets=( + url_preset( + id="xiaomi-standard", + label="标准端点", + value="https://api.xiaomimimo.com/v1", + models_dev_provider_id="xiaomi", + ), + url_preset( + id="xiaomi-token-plan-cn", + label="Token Plan / 中国", + value="https://token-plan-cn.xiaomimimo.com/v1", + models_dev_provider_id="xiaomi-token-plan-cn", + ), + url_preset( + id="xiaomi-token-plan-sgp", + label="Token Plan / 新加坡", + value="https://token-plan-sgp.xiaomimimo.com/v1", + models_dev_provider_id="xiaomi-token-plan-sgp", + ), + url_preset( + id="xiaomi-token-plan-ams", + label="Token Plan / 欧洲", + value="https://token-plan-ams.xiaomimimo.com/v1", + models_dev_provider_id="xiaomi-token-plan-ams", + ), + ), + api_key_hint="填写 Xiaomi API Key,可在标准端点与各区域 Token Plan 端点间切换。", + description="小米 Mimo 兼容端点。", + ), openai_provider( provider_id="zhipu", name="智谱 GLM", default_base_url="https://open.bigmodel.cn/api/paas/v4", - sort_order=65, + sort_order=110, models_dev_provider_id="zhipuai", base_url_presets=( url_preset( @@ -480,33 +510,34 @@ class LLMProviderManager(metaclass=Singleton): api_key_hint="填写智谱开放平台 API Key,可在 Token Plan / 通用 API 与 Coding Plan 端点间切换。", description="智谱开放平台国内站,支持通用 API 与 GLM Coding Plan 端点。", ), - catalog_openai_provider( - provider_id="zai", - name="Z.AI", - default_base_url="https://api.z.ai/api/paas/v4", - sort_order=66, + openai_provider( + provider_id="siliconflow", + name="硅基流动", + default_base_url="https://api.siliconflow.cn/v1", + sort_order=120, + models_dev_provider_id="siliconflow-cn", base_url_presets=( url_preset( - id="zai-general", - label="Token Plan / 通用 API", - value="https://api.z.ai/api/paas/v4", - models_dev_provider_id="zai", + id="siliconflow-cn", + label="中国大陆", + value="https://api.siliconflow.cn/v1", + models_dev_provider_id="siliconflow-cn", ), url_preset( - id="zai-coding", - label="Coding Plan", - value="https://api.z.ai/api/coding/paas/v4", - models_dev_provider_id="zai-coding-plan", + id="siliconflow-global", + label="Global", + value="https://api.siliconflow.com/v1", + models_dev_provider_id="siliconflow", ), ), - api_key_hint="填写 Z.AI API Key,可在通用 API 与 Coding Plan 端点间切换。", - description="Z.AI 官方端点。", + api_key_hint="填写硅基流动 API Key,可在中国大陆与 Global 端点间切换。", + description="SiliconFlow 官方兼容端点。", ), openai_provider( provider_id="alibaba", name="阿里云百炼", default_base_url="https://dashscope.aliyuncs.com/compatible-mode/v1", - sort_order=70, + sort_order=130, models_dev_provider_id="alibaba-cn", base_url_presets=( url_preset( @@ -559,7 +590,7 @@ class LLMProviderManager(metaclass=Singleton): api_key_hint="填写百度千帆 API Key,可在通用 API 与 Coding Plan 端点间切换。通用 API 请使用 https://qianfan.baidubce.com/v2;Coding Plan 请切换到 https://qianfan.baidubce.com/v2/coding。", supports_model_refresh=False, description="百度千帆 OpenAI-compatible V2 端点,支持通用 API 与 Coding Plan 地址预设。", - sort_order=72, + sort_order=140, ), ProviderSpec( id="jdcloud", @@ -581,7 +612,7 @@ class LLMProviderManager(metaclass=Singleton): api_key_hint="填写京东云 JoyBuilder API Key。通用 API 请使用 https://modelservice.jdcloud.com/v1;Coding Plan 请切换到 https://modelservice.jdcloud.com/coding/openai/v1,不要把 /v1 当成 Coding Plan 地址。", supports_model_refresh=False, description="京东云 JoyBuilder OpenAI-compatible 端点,支持通用 API 与 Coding Plan 地址预设。", - sort_order=74, + sort_order=150, ), ProviderSpec( id="volcengine", @@ -590,7 +621,7 @@ class LLMProviderManager(metaclass=Singleton): default_base_url="https://ark.cn-beijing.volces.com/api/v3", api_key_hint="填写火山方舟 API Key。", description="字节跳动火山引擎兼容端点。", - sort_order=80, + sort_order=160, ), ProviderSpec( id="tencent", @@ -615,7 +646,7 @@ class LLMProviderManager(metaclass=Singleton): api_key_hint="填写 Tencent API Key,可在 TokenHub 与 Coding Plan 端点间切换。", model_list_strategy="models_dev_only", description="腾讯兼容端点。", - sort_order=90, + sort_order=170, ), ProviderSpec( id="ollama-cloud", @@ -625,7 +656,7 @@ class LLMProviderManager(metaclass=Singleton): default_base_url="https://ollama.com/v1", api_key_hint="填写 Ollama Cloud API Key。", description="Ollama Cloud 云端模型服务。", - sort_order=100, + sort_order=180, ), ProviderSpec( id="nvidia", @@ -635,13 +666,13 @@ class LLMProviderManager(metaclass=Singleton): default_base_url="https://integrate.api.nvidia.com/v1", api_key_hint="填写 Nvidia API Key。", description="Nvidia 集成推理平台。", - sort_order=110, + sort_order=190, ), catalog_openai_provider( provider_id="opencode", name="OpenCode", default_base_url="https://opencode.ai/zen/v1", - sort_order=115, + sort_order=200, base_url_presets=( url_preset( id="opencode-zen", @@ -659,80 +690,49 @@ class LLMProviderManager(metaclass=Singleton): api_key_hint="填写 OpenCode API Key,可在 Zen 与 Go 端点间切换。", description="OpenCode Zen / Go 端点。", ), - anthropic_provider( - provider_id="minimax", - name="MiniMax", - default_base_url="https://api.minimaxi.com/anthropic/v1", - sort_order=120, - models_dev_provider_id="minimax-cn", - base_url_presets=( - url_preset( - id="minimax-cn-general", - label="中国内地 / 通用", - value="https://api.minimaxi.com/anthropic/v1", - models_dev_provider_id="minimax-cn", - ), - url_preset( - id="minimax-global-general", - label="国际站 / 通用", - value="https://api.minimax.io/anthropic/v1", - models_dev_provider_id="minimax", - ), - url_preset( - id="minimax-cn-coding", - label="中国内地 / Coding Plan", - value="https://api.minimaxi.com/anthropic/v1", - models_dev_provider_id="minimax-cn-coding-plan", - ), - url_preset( - id="minimax-global-coding", - label="国际站 / Coding Plan", - value="https://api.minimax.io/anthropic/v1", - models_dev_provider_id="minimax-coding-plan", - ), - ), - api_key_hint="填写 MiniMax API Key,可在中国内地、国际站、通用与 Coding Plan 目录间切换。", - description="MiniMax Anthropic-compatible 端点,支持通用与 Coding Plan 目录预设。", + catalog_openai_provider( + provider_id="groq", + name="Groq", + default_base_url="https://api.groq.com/openai/v1", + sort_order=210, + api_key_hint="填写 Groq API Key。", + description="Groq 官方 OpenAI-compatible 端点。", ), catalog_openai_provider( - provider_id="xiaomi", - name="Xiaomi", - default_base_url="https://api.xiaomimimo.com/v1", - sort_order=130, + provider_id="xai", + name="xAI", + default_base_url="https://api.x.ai/v1", + sort_order=220, + api_key_hint="填写 xAI API Key。", + description="xAI 官方 OpenAI-compatible 端点。", + ), + catalog_openai_provider( + provider_id="zai", + name="Z.AI", + default_base_url="https://api.z.ai/api/paas/v4", + sort_order=230, base_url_presets=( url_preset( - id="xiaomi-standard", - label="标准端点", - value="https://api.xiaomimimo.com/v1", - models_dev_provider_id="xiaomi", + id="zai-general", + label="Token Plan / 通用 API", + value="https://api.z.ai/api/paas/v4", + models_dev_provider_id="zai", ), url_preset( - id="xiaomi-token-plan-cn", - label="Token Plan / 中国", - value="https://token-plan-cn.xiaomimimo.com/v1", - models_dev_provider_id="xiaomi-token-plan-cn", - ), - url_preset( - id="xiaomi-token-plan-sgp", - label="Token Plan / 新加坡", - value="https://token-plan-sgp.xiaomimimo.com/v1", - models_dev_provider_id="xiaomi-token-plan-sgp", - ), - url_preset( - id="xiaomi-token-plan-ams", - label="Token Plan / 欧洲", - value="https://token-plan-ams.xiaomimimo.com/v1", - models_dev_provider_id="xiaomi-token-plan-ams", + id="zai-coding", + label="Coding Plan", + value="https://api.z.ai/api/coding/paas/v4", + models_dev_provider_id="zai-coding-plan", ), ), - api_key_hint="填写 Xiaomi API Key,可在标准端点与各区域 Token Plan 端点间切换。", - description="小米 Mimo 兼容端点。", + api_key_hint="填写 Z.AI API Key,可在通用 API 与 Coding Plan 端点间切换。", + description="Z.AI 官方端点。", ), ] for sort_order, provider_entry in enumerate( catalog_openai_providers, - start=200, + start=1000, ): provider_id = provider_entry["id"] overrides = provider_patches.get(provider_id, {})