From 44854919130f2995c2ecbcbcf8820b6d620db69c Mon Sep 17 00:00:00 2001 From: Felix <24791380+vcfgv@users.noreply.github.com> Date: Fri, 13 Mar 2026 16:16:01 +0800 Subject: [PATCH] fix: allow configuring SiliconFlow model ID like OpenRouter (#471) --- src/lib/providers.ts | 2 +- tests/unit/providers.test.ts | 9 ++++----- 2 files changed, 5 insertions(+), 6 deletions(-) diff --git a/src/lib/providers.ts b/src/lib/providers.ts index cf6a332cb..2d0e4d8a3 100644 --- a/src/lib/providers.ts +++ b/src/lib/providers.ts @@ -148,7 +148,7 @@ export const PROVIDER_TYPE_INFO: ProviderTypeInfo[] = [ { id: 'openrouter', name: 'OpenRouter', icon: '🌐', placeholder: 'sk-or-v1-...', model: 'Multi-Model', requiresApiKey: true, showModelId: true, modelIdPlaceholder: 'anthropic/claude-opus-4.6', defaultModelId: 'anthropic/claude-opus-4.6' }, { id: 'ark', name: 'ByteDance Ark', icon: 'A', placeholder: 'your-ark-api-key', model: 'Doubao', requiresApiKey: true, defaultBaseUrl: 'https://ark.cn-beijing.volces.com/api/v3', showBaseUrl: true, showModelId: true, modelIdPlaceholder: 'ep-20260228000000-xxxxx' }, { id: 'moonshot', name: 'Moonshot (CN)', icon: '🌙', placeholder: 'sk-...', model: 'Kimi', requiresApiKey: true, defaultBaseUrl: 'https://api.moonshot.cn/v1', defaultModelId: 'kimi-k2.5' }, - { id: 'siliconflow', name: 'SiliconFlow (CN)', icon: '🌊', placeholder: 'sk-...', model: 'Multi-Model', requiresApiKey: true, defaultBaseUrl: 'https://api.siliconflow.cn/v1', showModelId: true, showModelIdInDevModeOnly: true, modelIdPlaceholder: 'deepseek-ai/DeepSeek-V3', defaultModelId: 'deepseek-ai/DeepSeek-V3' }, + { id: 'siliconflow', name: 'SiliconFlow (CN)', icon: '🌊', placeholder: 'sk-...', model: 'Multi-Model', requiresApiKey: true, defaultBaseUrl: 'https://api.siliconflow.cn/v1', showModelId: true, modelIdPlaceholder: 'deepseek-ai/DeepSeek-V3', defaultModelId: 'deepseek-ai/DeepSeek-V3' }, { id: 'minimax-portal', name: 'MiniMax (Global)', icon: '☁️', placeholder: 'sk-...', model: 'MiniMax', requiresApiKey: false, isOAuth: true, supportsApiKey: true, defaultModelId: 'MiniMax-M2.5', apiKeyUrl: 'https://intl.minimaxi.com/' }, { id: 'minimax-portal-cn', name: 'MiniMax (CN)', icon: '☁️', placeholder: 'sk-...', model: 'MiniMax', requiresApiKey: false, isOAuth: true, supportsApiKey: true, defaultModelId: 'MiniMax-M2.5', apiKeyUrl: 'https://platform.minimaxi.com/' }, { id: 'qwen-portal', name: 'Qwen', icon: '☁️', placeholder: 'sk-...', model: 'Qwen', requiresApiKey: false, isOAuth: true, defaultModelId: 'coder-model' }, diff --git a/tests/unit/providers.test.ts b/tests/unit/providers.test.ts index ea5929e46..ce22b7197 100644 --- a/tests/unit/providers.test.ts +++ b/tests/unit/providers.test.ts @@ -72,7 +72,7 @@ describe('provider metadata', () => { ); }); - it('exposes OpenRouter model overrides by default and keeps SiliconFlow developer-only', () => { + it('exposes OpenRouter and SiliconFlow model overrides by default', () => { const openrouter = PROVIDER_TYPE_INFO.find((provider) => provider.id === 'openrouter'); const siliconflow = PROVIDER_TYPE_INFO.find((provider) => provider.id === 'siliconflow'); @@ -82,23 +82,22 @@ describe('provider metadata', () => { }); expect(siliconflow).toMatchObject({ showModelId: true, - showModelIdInDevModeOnly: true, defaultModelId: 'deepseek-ai/DeepSeek-V3', }); expect(shouldShowProviderModelId(openrouter, false)).toBe(true); - expect(shouldShowProviderModelId(siliconflow, false)).toBe(false); + expect(shouldShowProviderModelId(siliconflow, false)).toBe(true); expect(shouldShowProviderModelId(openrouter, true)).toBe(true); expect(shouldShowProviderModelId(siliconflow, true)).toBe(true); }); - it('saves OpenRouter model overrides by default and keeps SiliconFlow developer-only', () => { + it('saves OpenRouter and SiliconFlow model overrides by default', () => { const openrouter = PROVIDER_TYPE_INFO.find((provider) => provider.id === 'openrouter'); const siliconflow = PROVIDER_TYPE_INFO.find((provider) => provider.id === 'siliconflow'); const ark = PROVIDER_TYPE_INFO.find((provider) => provider.id === 'ark'); expect(resolveProviderModelForSave(openrouter, 'openai/gpt-5', false)).toBe('openai/gpt-5'); - expect(resolveProviderModelForSave(siliconflow, 'Qwen/Qwen3-Coder-480B-A35B-Instruct', false)).toBeUndefined(); + expect(resolveProviderModelForSave(siliconflow, 'Qwen/Qwen3-Coder-480B-A35B-Instruct', false)).toBe('Qwen/Qwen3-Coder-480B-A35B-Instruct'); expect(resolveProviderModelForSave(openrouter, 'openai/gpt-5', true)).toBe('openai/gpt-5'); expect(resolveProviderModelForSave(siliconflow, 'Qwen/Qwen3-Coder-480B-A35B-Instruct', true)).toBe('Qwen/Qwen3-Coder-480B-A35B-Instruct');