diff --git a/README.md b/README.md index 3b67831e..e4e758e8 100644 --- a/README.md +++ b/README.md @@ -193,7 +193,7 @@ MCP Server 需要配置 API 密钥才能正常工作。主要的 MCP 专属配 ```bash # MCP 服务器配置 -MCP_DEFAULT_MODEL_PROVIDER=openai # 可选值:openai, gemini, deepseek, siliconflow, zhipu, custom +MCP_DEFAULT_MODEL_PROVIDER=openai # 可选值:openai, gemini, anthropic, deepseek, siliconflow, zhipu, dashscope, openrouter, modelscope, custom MCP_LOG_LEVEL=info # 日志级别 ``` @@ -469,4 +469,4 @@ xattr -rd com.apple.quarantine ~/Downloads/PromptOptimizer-*.dmg - 提交 Issue - 发起 Pull Request -- 加入讨论组 \ No newline at end of file +- 加入讨论组 diff --git a/README_EN.md b/README_EN.md index fb1094ba..eec53db6 100644 --- a/README_EN.md +++ b/README_EN.md @@ -196,7 +196,7 @@ MCP Server requires API key configuration to function properly. Main MCP-specifi ```bash # MCP Server Configuration -MCP_DEFAULT_MODEL_PROVIDER=openai # Options: openai, gemini, deepseek, siliconflow, zhipu, custom +MCP_DEFAULT_MODEL_PROVIDER=openai # Options: openai, gemini, anthropic, deepseek, siliconflow, zhipu, dashscope, openrouter, modelscope, custom MCP_LOG_LEVEL=info # Log level ``` @@ -471,4 +471,4 @@ If this project is helpful to you, please consider giving it a Star ⭐️ - Submit an Issue - Create a Pull Request -- Join the discussion group \ No newline at end of file +- Join the discussion group diff --git a/docs/user/mcp-server.md b/docs/user/mcp-server.md index c0950170..1a0a2623 100644 --- a/docs/user/mcp-server.md +++ b/docs/user/mcp-server.md @@ -72,7 +72,7 @@ VITE_CUSTOM_API_MODEL=qwen2.5:0.5b ```bash # 首选模型提供商(当配置了多个 API 密钥时) -# 可选值:openai, gemini, deepseek, siliconflow, zhipu, custom +# 可选值:openai, gemini, anthropic, deepseek, siliconflow, zhipu, dashscope, openrouter, modelscope, custom MCP_DEFAULT_MODEL_PROVIDER=openai # 日志级别(可选,默认 debug) diff --git a/docs/user/mcp-server_en.md b/docs/user/mcp-server_en.md index 35c2b915..ca3f5611 100644 --- a/docs/user/mcp-server_en.md +++ b/docs/user/mcp-server_en.md @@ -72,7 +72,7 @@ VITE_CUSTOM_API_MODEL=qwen2.5:0.5b ```bash # Preferred model provider (when multiple API keys are configured) -# Options: openai, gemini, deepseek, siliconflow, zhipu, custom +# Options: openai, gemini, anthropic, deepseek, siliconflow, zhipu, dashscope, openrouter, modelscope, custom MCP_DEFAULT_MODEL_PROVIDER=openai # Log level (optional, default: debug) diff --git a/env.local.example b/env.local.example index dc20979b..0ba57415 100644 --- a/env.local.example +++ b/env.local.example @@ -11,6 +11,9 @@ # Google Gemini API 配置 # VITE_GEMINI_API_KEY=your-gemini-api-key-here +# Anthropic Claude API 配置 +# VITE_ANTHROPIC_API_KEY=your-anthropic-api-key-here + # ===== 图像生成 API 密钥配置 ===== # Gemini 图像生成复用 VITE_GEMINI_API_KEY(无需单独配置) # Seedream (Doubao) / 火山方舟 ARK API Key(任选其一变量,优先级从上到下) @@ -70,7 +73,7 @@ # 以下配置仅在使用 MCP 服务器时需要 # 首选模型提供商(当配置了多个 API 密钥时) -# 可选值:openai, gemini, deepseek, siliconflow, zhipu, custom, custom_ +# 可选值:openai, gemini, anthropic, deepseek, siliconflow, zhipu, dashscope, openrouter, modelscope, custom, custom_ # 注意:必须与上面配置的 API 密钥对应 # 示例:如果配置了 VITE_CUSTOM_API_KEY_qwen3,可以使用 custom_qwen3 # MCP_DEFAULT_MODEL_PROVIDER=openai diff --git a/mkdocs/docs/zh/user/mcp-server.md b/mkdocs/docs/zh/user/mcp-server.md index 24393046..8b4d6972 100644 --- a/mkdocs/docs/zh/user/mcp-server.md +++ b/mkdocs/docs/zh/user/mcp-server.md @@ -76,7 +76,7 @@ VITE_CUSTOM_API_MODEL=qwen2.5:0.5b ```bash # 首选模型提供商(当配置了多个 API 密钥时) -# 可选值:openai, gemini, deepseek, siliconflow, zhipu, custom +# 可选值:openai, gemini, anthropic, deepseek, siliconflow, zhipu, dashscope, openrouter, modelscope, custom MCP_DEFAULT_MODEL_PROVIDER=openai # 日志级别(可选,默认 debug) @@ -190,4 +190,3 @@ MCP_DEFAULT_MODEL_PROVIDER=openai # 不是 OpenAI 2. 检查 URL 是否正确 3. 确认防火墙设置 4. 查看 Claude Desktop 日志 - diff --git a/packages/core/src/services/model/defaults.ts b/packages/core/src/services/model/defaults.ts index 35cac51e..8787a9f0 100644 --- a/packages/core/src/services/model/defaults.ts +++ b/packages/core/src/services/model/defaults.ts @@ -11,6 +11,7 @@ import { generateDynamicModels } from './model-utils'; const PROVIDER_ENV_KEYS = { openai: 'VITE_OPENAI_API_KEY', gemini: 'VITE_GEMINI_API_KEY', + anthropic: 'VITE_ANTHROPIC_API_KEY', deepseek: 'VITE_DEEPSEEK_API_KEY', siliconflow: 'VITE_SILICONFLOW_API_KEY', zhipu: 'VITE_ZHIPU_API_KEY', diff --git a/packages/core/tests/unit/model/defaults.test.ts b/packages/core/tests/unit/model/defaults.test.ts new file mode 100644 index 00000000..2e39930d --- /dev/null +++ b/packages/core/tests/unit/model/defaults.test.ts @@ -0,0 +1,40 @@ +import { getBuiltinModelIds, getDefaultTextModels } from '../../../src/services/model/defaults' +import { afterAll, beforeEach, describe, expect, it } from 'vitest' + +describe('model defaults provider env mapping', () => { + const originalAnthropicApiKey = process.env.VITE_ANTHROPIC_API_KEY + + beforeEach(() => { + delete process.env.VITE_ANTHROPIC_API_KEY + }) + + afterAll(() => { + if (originalAnthropicApiKey === undefined) { + delete process.env.VITE_ANTHROPIC_API_KEY + return + } + process.env.VITE_ANTHROPIC_API_KEY = originalAnthropicApiKey + }) + + it('should include anthropic in builtin model ids', () => { + const builtinModelIds = getBuiltinModelIds() + expect(builtinModelIds).toContain('anthropic') + }) + + it('should include anthropic config and keep it disabled when api key is empty', () => { + const models = getDefaultTextModels() + + expect(models.anthropic).toBeDefined() + expect(models.anthropic.providerMeta.id).toBe('anthropic') + expect(models.anthropic.enabled).toBe(false) + }) + + it('should enable anthropic when VITE_ANTHROPIC_API_KEY is provided', () => { + process.env.VITE_ANTHROPIC_API_KEY = 'test-anthropic-key' + + const models = getDefaultTextModels() + + expect(models.anthropic.enabled).toBe(true) + expect(models.anthropic.connectionConfig.apiKey).toBe('test-anthropic-key') + }) +}) diff --git a/packages/desktop/main.js b/packages/desktop/main.js index 2c29b926..d288f9ac 100644 --- a/packages/desktop/main.js +++ b/packages/desktop/main.js @@ -537,9 +537,13 @@ async function initializeServices() { const staticEnvVars = [ 'VITE_OPENAI_API_KEY', 'VITE_GEMINI_API_KEY', + 'VITE_ANTHROPIC_API_KEY', 'VITE_DEEPSEEK_API_KEY', 'VITE_SILICONFLOW_API_KEY', 'VITE_ZHIPU_API_KEY', + 'VITE_DASHSCOPE_API_KEY', + 'VITE_OPENROUTER_API_KEY', + 'VITE_MODELSCOPE_API_KEY', 'VITE_CUSTOM_API_KEY', 'VITE_CUSTOM_API_BASE_URL', 'VITE_CUSTOM_API_MODEL' diff --git a/packages/mcp-server/src/config/models.ts b/packages/mcp-server/src/config/models.ts index e5d45050..2b0e62a0 100644 --- a/packages/mcp-server/src/config/models.ts +++ b/packages/mcp-server/src/config/models.ts @@ -27,9 +27,15 @@ export async function setupDefaultModel( // 1. 如果指定了 preferredProvider,尝试匹配 if (preferredProvider) { + const normalizedPreferred = preferredProvider.toLowerCase(); + selectedModel = availableModels.find(([key, config]) => - config.provider === preferredProvider.toLowerCase() || - config.name.toLowerCase().includes(preferredProvider.toLowerCase()) + // 直接匹配模型 key(支持 custom_) + key.toLowerCase() === normalizedPreferred || + // 匹配 provider id + String(config.providerMeta?.id || config.modelMeta?.providerId || config.provider || '').toLowerCase() === normalizedPreferred || + // 兼容通过名称模糊匹配 + String(config.name || '').toLowerCase().includes(normalizedPreferred) ); }