From 524eed93016971f6d956da8a7f551878bdaa350f Mon Sep 17 00:00:00 2001 From: regisksc <41172158+regisksc@users.noreply.github.com> Date: Wed, 8 Apr 2026 05:34:15 -0300 Subject: [PATCH 1/7] feat: add Alibaba Coding Plan provider presets --- src/utils/model/openaiContextWindows.ts | 30 +++++++++++++++++++++++++ src/utils/providerProfiles.ts | 20 +++++++++++++++++ 2 files changed, 50 insertions(+) diff --git a/src/utils/model/openaiContextWindows.ts b/src/utils/model/openaiContextWindows.ts index fc815f30c7..40c836c041 100644 --- a/src/utils/model/openaiContextWindows.ts +++ b/src/utils/model/openaiContextWindows.ts @@ -202,6 +202,19 @@ const OPENAI_CONTEXT_WINDOWS: Record = { 'llama3.2:1b': 128_000, 'qwen3:8b': 128_000, 'codestral': 32_768, + + // Alibaba DashScope (Coding Plan) + // Model context windows from DashScope API /models endpoint + 'qwen3.5-plus': 1_000_000, + 'qwen3-coder-plus': 1_000_000, + 'qwen3-coder-next': 262_144, + 'qwen3-max': 262_144, + 'qwen3-max-2026-01-23': 262_144, + 'kimi-k2.5': 262_144, + 'MiniMax-M2.5': 196_608, + 'minimax-m2.5': 196_608, + 'glm-5': 202_752, + 'glm-4.7': 202_752, } /** @@ -330,6 +343,11 @@ const OPENAI_MAX_OUTPUT_TOKENS: Record = { 'deepseek-r1:14b': 8_192, 'mistral:7b': 4_096, 'phi4:14b': 4_096, + 'gemma2:27b': 4_096, + 'codellama:13b': 4_096, + 'llama3.2:1b': 4_096, + 'qwen3:8b': 8_192, + 'codestral': 8_192, // NVIDIA NIM models 'nvidia/llama-3.1-nemotron-70b-instruct': 32_768, @@ -356,6 +374,18 @@ const OPENAI_MAX_OUTPUT_TOKENS: Record = { 'databricks/dbrx-instruct': 32_768, 'ai21labs/jamba-1.5-large-instruct': 32_768, '01-ai/yi-large': 8_192, + + // Alibaba DashScope (Coding Plan) + 'qwen3.5-plus': 65_536, + 'qwen3-coder-plus': 65_536, + 'qwen3-coder-next': 65_536, + 'qwen3-max': 32_768, + 'qwen3-max-2026-01-23': 32_768, + 'kimi-k2.5': 32_768, + 'MiniMax-M2.5': 24_576, + 'minimax-m2.5': 24_576, + 'glm-5': 16_384, + 'glm-4.7': 16_384, } function lookupByModel(table: Record, model: string): T | undefined { diff --git a/src/utils/providerProfiles.ts b/src/utils/providerProfiles.ts index b2b2549fe2..0cbf102a51 100644 --- a/src/utils/providerProfiles.ts +++ b/src/utils/providerProfiles.ts @@ -20,6 +20,8 @@ export type ProviderPreset = | 'azure-openai' | 'openrouter' | 'lmstudio' + | 'dashscope-cn' + | 'dashscope-intl' | 'custom' | 'nvidia-nim' | 'minimax' @@ -220,6 +222,24 @@ export function getProviderPresetDefaults( apiKey: '', requiresApiKey: false, } + case 'dashscope-cn': + return { + provider: 'openai', + name: 'Alibaba Coding Plan (China)', + baseUrl: 'https://coding.dashscope.aliyuncs.com/v1', + model: 'qwen3.5-plus', + apiKey: '', + requiresApiKey: true, + } + case 'dashscope-intl': + return { + provider: 'openai', + name: 'Alibaba Coding Plan', + baseUrl: 'https://coding-intl.dashscope.aliyuncs.com/v1', + model: 'qwen3.5-plus', + apiKey: '', + requiresApiKey: true, + } case 'custom': return { provider: 'openai', From 355844afb1e0d4a731b3ebdf925231e1491d3904 Mon Sep 17 00:00:00 2001 From: regisksc <41172158+regisksc@users.noreply.github.com> Date: Wed, 8 Apr 2026 06:06:44 -0300 Subject: [PATCH 2/7] fix: add DashScope presets to ProviderManager UI selection list --- src/components/ProviderManager.tsx | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/src/components/ProviderManager.tsx b/src/components/ProviderManager.tsx index 681cd1a256..0fe8a8a711 100644 --- a/src/components/ProviderManager.tsx +++ b/src/components/ProviderManager.tsx @@ -1032,6 +1032,16 @@ export function ProviderManager({ mode, onDone }: Props): React.ReactNode { label: 'LM Studio', description: 'Local LM Studio endpoint', }, + { + value: 'dashscope-cn', + label: 'Alibaba Coding Plan (China)', + description: 'Alibaba DashScope China endpoint', + }, + { + value: 'dashscope-intl', + label: 'Alibaba Coding Plan', + description: 'Alibaba DashScope International endpoint', + }, { value: 'custom', label: 'Custom', From 499ea29e7d145fc8900b87cabdfa7befcb53daca Mon Sep 17 00:00:00 2001 From: regisksc <41172158+regisksc@users.noreply.github.com> Date: Wed, 8 Apr 2026 14:09:25 -0300 Subject: [PATCH 3/7] feat: read DASHSCOPE_API_KEY env var for DashScope provider presets --- src/utils/providerProfiles.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/utils/providerProfiles.ts b/src/utils/providerProfiles.ts index 0cbf102a51..4919efcaf8 100644 --- a/src/utils/providerProfiles.ts +++ b/src/utils/providerProfiles.ts @@ -228,7 +228,7 @@ export function getProviderPresetDefaults( name: 'Alibaba Coding Plan (China)', baseUrl: 'https://coding.dashscope.aliyuncs.com/v1', model: 'qwen3.5-plus', - apiKey: '', + apiKey: process.env.DASHSCOPE_API_KEY ?? '', requiresApiKey: true, } case 'dashscope-intl': @@ -237,7 +237,7 @@ export function getProviderPresetDefaults( name: 'Alibaba Coding Plan', baseUrl: 'https://coding-intl.dashscope.aliyuncs.com/v1', model: 'qwen3.5-plus', - apiKey: '', + apiKey: process.env.DASHSCOPE_API_KEY ?? '', requiresApiKey: true, } case 'custom': From 32d6a643113da4569b73460669fe82828d334141 Mon Sep 17 00:00:00 2001 From: regisksc <41172158+regisksc@users.noreply.github.com> Date: Fri, 10 Apr 2026 07:28:47 -0300 Subject: [PATCH 4/7] adds regression testing for alibaba models --- src/utils/context.test.ts | 123 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 123 insertions(+) diff --git a/src/utils/context.test.ts b/src/utils/context.test.ts index 3ce3fde78b..4877bae93a 100644 --- a/src/utils/context.test.ts +++ b/src/utils/context.test.ts @@ -141,3 +141,126 @@ test('MiniMax-M2.5 and M2.1 use explicit provider-specific context and output ca upperLimit: 131_072, }) }) + +test('DashScope qwen3.5-plus uses provider-specific context and output caps', () => { + process.env.CLAUDE_CODE_USE_OPENAI = '1' + delete process.env.CLAUDE_CODE_MAX_OUTPUT_TOKENS + + expect(getContextWindowForModel('qwen3.5-plus')).toBe(1_000_000) + expect(getModelMaxOutputTokens('qwen3.5-plus')).toEqual({ + default: 65_536, + upperLimit: 65_536, + }) + expect(getMaxOutputTokensForModel('qwen3.5-plus')).toBe(65_536) +}) + +test('DashScope qwen3-coder-plus uses provider-specific context and output caps', () => { + process.env.CLAUDE_CODE_USE_OPENAI = '1' + delete process.env.CLAUDE_CODE_MAX_OUTPUT_TOKENS + + expect(getContextWindowForModel('qwen3-coder-plus')).toBe(1_000_000) + expect(getModelMaxOutputTokens('qwen3-coder-plus')).toEqual({ + default: 65_536, + upperLimit: 65_536, + }) +}) + +test('DashScope qwen3-coder-next uses provider-specific context and output caps', () => { + process.env.CLAUDE_CODE_USE_OPENAI = '1' + delete process.env.CLAUDE_CODE_MAX_OUTPUT_TOKENS + + expect(getContextWindowForModel('qwen3-coder-next')).toBe(262_144) + expect(getModelMaxOutputTokens('qwen3-coder-next')).toEqual({ + default: 65_536, + upperLimit: 65_536, + }) +}) + +test('DashScope qwen3-max uses provider-specific context and output caps', () => { + process.env.CLAUDE_CODE_USE_OPENAI = '1' + delete process.env.CLAUDE_CODE_MAX_OUTPUT_TOKENS + + expect(getContextWindowForModel('qwen3-max')).toBe(262_144) + expect(getModelMaxOutputTokens('qwen3-max')).toEqual({ + default: 32_768, + upperLimit: 32_768, + }) +}) + +test('DashScope qwen3-max dated variant resolves to base entry via prefix match', () => { + process.env.CLAUDE_CODE_USE_OPENAI = '1' + delete process.env.CLAUDE_CODE_MAX_OUTPUT_TOKENS + + expect(getContextWindowForModel('qwen3-max-2026-01-23')).toBe(262_144) + expect(getModelMaxOutputTokens('qwen3-max-2026-01-23')).toEqual({ + default: 32_768, + upperLimit: 32_768, + }) +}) + +test('DashScope kimi-k2.5 uses provider-specific context and output caps', () => { + process.env.CLAUDE_CODE_USE_OPENAI = '1' + delete process.env.CLAUDE_CODE_MAX_OUTPUT_TOKENS + + expect(getContextWindowForModel('kimi-k2.5')).toBe(262_144) + expect(getModelMaxOutputTokens('kimi-k2.5')).toEqual({ + default: 32_768, + upperLimit: 32_768, + }) +}) + +test('DashScope MiniMax-M2.5 uses provider-specific context and output caps', () => { + process.env.CLAUDE_CODE_USE_OPENAI = '1' + delete process.env.CLAUDE_CODE_MAX_OUTPUT_TOKENS + + expect(getContextWindowForModel('MiniMax-M2.5')).toBe(196_608) + expect(getModelMaxOutputTokens('MiniMax-M2.5')).toEqual({ + default: 24_576, + upperLimit: 24_576, + }) +}) + +test('DashScope MiniMax-M2.5 lowercase variant resolves via prefix match', () => { + process.env.CLAUDE_CODE_USE_OPENAI = '1' + delete process.env.CLAUDE_CODE_MAX_OUTPUT_TOKENS + + expect(getContextWindowForModel('minimax-m2.5')).toBe(196_608) + expect(getModelMaxOutputTokens('minimax-m2.5')).toEqual({ + default: 24_576, + upperLimit: 24_576, + }) +}) + +test('DashScope glm-5 uses provider-specific context and output caps', () => { + process.env.CLAUDE_CODE_USE_OPENAI = '1' + delete process.env.CLAUDE_CODE_MAX_OUTPUT_TOKENS + + expect(getContextWindowForModel('glm-5')).toBe(202_752) + expect(getModelMaxOutputTokens('glm-5')).toEqual({ + default: 16_384, + upperLimit: 16_384, + }) +}) + +test('DashScope glm-4.7 uses provider-specific context and output caps', () => { + process.env.CLAUDE_CODE_USE_OPENAI = '1' + delete process.env.CLAUDE_CODE_MAX_OUTPUT_TOKENS + + expect(getContextWindowForModel('glm-4.7')).toBe(202_752) + expect(getModelMaxOutputTokens('glm-4.7')).toEqual({ + default: 16_384, + upperLimit: 16_384, + }) +}) + +test('DashScope models clamp oversized max output overrides to the provider limit', () => { + process.env.CLAUDE_CODE_USE_OPENAI = '1' + process.env.CLAUDE_CODE_MAX_OUTPUT_TOKENS = '100000' + + expect(getMaxOutputTokensForModel('qwen3.5-plus')).toBe(65_536) + expect(getMaxOutputTokensForModel('qwen3-coder-next')).toBe(65_536) + expect(getMaxOutputTokensForModel('qwen3-max')).toBe(32_768) + expect(getMaxOutputTokensForModel('kimi-k2.5')).toBe(32_768) + expect(getMaxOutputTokensForModel('MiniMax-M2.5')).toBe(24_576) + expect(getMaxOutputTokensForModel('glm-5')).toBe(16_384) +}) From 67b33cb45c1165acc63b1e11f6aeff6371213c02 Mon Sep 17 00:00:00 2001 From: regisksc <41172158+regisksc@users.noreply.github.com> Date: Fri, 10 Apr 2026 13:54:02 -0300 Subject: [PATCH 5/7] docs: add time descriptive comment --- src/utils/model/openaiContextWindows.ts | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/utils/model/openaiContextWindows.ts b/src/utils/model/openaiContextWindows.ts index 40c836c041..75dcf5699f 100644 --- a/src/utils/model/openaiContextWindows.ts +++ b/src/utils/model/openaiContextWindows.ts @@ -204,7 +204,10 @@ const OPENAI_CONTEXT_WINDOWS: Record = { 'codestral': 32_768, // Alibaba DashScope (Coding Plan) - // Model context windows from DashScope API /models endpoint + // Model context windows from DashScope API /models endpoint (April 2026). + // Values sourced from: qwen3.5-plus/qwen3-coder-plus (1M), qwen3-coder-next/max (256K), + // kimi-k2.5 (256K), MiniMax-M2.5 (192K), glm-5/glm-4.7 (198K). + // Max output tokens: Qwen variants (64K/32K), MiniMax (24K), GLM (16K). 'qwen3.5-plus': 1_000_000, 'qwen3-coder-plus': 1_000_000, 'qwen3-coder-next': 262_144, From 33c14e943f70fe80c763da7e53c3f4f462187ebb Mon Sep 17 00:00:00 2001 From: regisksc <41172158+regisksc@users.noreply.github.com> Date: Sat, 11 Apr 2026 01:37:01 -0300 Subject: [PATCH 6/7] feat(dashscope): add qwen3.6-plus model support --- src/utils/context.test.ts | 13 +++++++++++++ src/utils/model/openaiContextWindows.ts | 2 ++ src/utils/providerProfiles.ts | 4 ++-- 3 files changed, 17 insertions(+), 2 deletions(-) diff --git a/src/utils/context.test.ts b/src/utils/context.test.ts index 4877bae93a..9c7e56b883 100644 --- a/src/utils/context.test.ts +++ b/src/utils/context.test.ts @@ -142,6 +142,18 @@ test('MiniMax-M2.5 and M2.1 use explicit provider-specific context and output ca }) }) +test('DashScope qwen3.6-plus uses provider-specific context and output caps', () => { + process.env.CLAUDE_CODE_USE_OPENAI = '1' + delete process.env.CLAUDE_CODE_MAX_OUTPUT_TOKENS + + expect(getContextWindowForModel('qwen3.6-plus')).toBe(1_000_000) + expect(getModelMaxOutputTokens('qwen3.6-plus')).toEqual({ + default: 65_536, + upperLimit: 65_536, + }) + expect(getMaxOutputTokensForModel('qwen3.6-plus')).toBe(65_536) +}) + test('DashScope qwen3.5-plus uses provider-specific context and output caps', () => { process.env.CLAUDE_CODE_USE_OPENAI = '1' delete process.env.CLAUDE_CODE_MAX_OUTPUT_TOKENS @@ -257,6 +269,7 @@ test('DashScope models clamp oversized max output overrides to the provider limi process.env.CLAUDE_CODE_USE_OPENAI = '1' process.env.CLAUDE_CODE_MAX_OUTPUT_TOKENS = '100000' + expect(getMaxOutputTokensForModel('qwen3.6-plus')).toBe(65_536) expect(getMaxOutputTokensForModel('qwen3.5-plus')).toBe(65_536) expect(getMaxOutputTokensForModel('qwen3-coder-next')).toBe(65_536) expect(getMaxOutputTokensForModel('qwen3-max')).toBe(32_768) diff --git a/src/utils/model/openaiContextWindows.ts b/src/utils/model/openaiContextWindows.ts index 75dcf5699f..da49948806 100644 --- a/src/utils/model/openaiContextWindows.ts +++ b/src/utils/model/openaiContextWindows.ts @@ -208,6 +208,7 @@ const OPENAI_CONTEXT_WINDOWS: Record = { // Values sourced from: qwen3.5-plus/qwen3-coder-plus (1M), qwen3-coder-next/max (256K), // kimi-k2.5 (256K), MiniMax-M2.5 (192K), glm-5/glm-4.7 (198K). // Max output tokens: Qwen variants (64K/32K), MiniMax (24K), GLM (16K). + 'qwen3.6-plus': 1_000_000, 'qwen3.5-plus': 1_000_000, 'qwen3-coder-plus': 1_000_000, 'qwen3-coder-next': 262_144, @@ -379,6 +380,7 @@ const OPENAI_MAX_OUTPUT_TOKENS: Record = { '01-ai/yi-large': 8_192, // Alibaba DashScope (Coding Plan) + 'qwen3.6-plus': 65_536, 'qwen3.5-plus': 65_536, 'qwen3-coder-plus': 65_536, 'qwen3-coder-next': 65_536, diff --git a/src/utils/providerProfiles.ts b/src/utils/providerProfiles.ts index 4919efcaf8..540f7e7ff7 100644 --- a/src/utils/providerProfiles.ts +++ b/src/utils/providerProfiles.ts @@ -227,7 +227,7 @@ export function getProviderPresetDefaults( provider: 'openai', name: 'Alibaba Coding Plan (China)', baseUrl: 'https://coding.dashscope.aliyuncs.com/v1', - model: 'qwen3.5-plus', + model: 'qwen3.6-plus', apiKey: process.env.DASHSCOPE_API_KEY ?? '', requiresApiKey: true, } @@ -236,7 +236,7 @@ export function getProviderPresetDefaults( provider: 'openai', name: 'Alibaba Coding Plan', baseUrl: 'https://coding-intl.dashscope.aliyuncs.com/v1', - model: 'qwen3.5-plus', + model: 'qwen3.6-plus', apiKey: process.env.DASHSCOPE_API_KEY ?? '', requiresApiKey: true, } From 0db7ab121b7485620b2d4b3c24487727799a4c53 Mon Sep 17 00:00:00 2001 From: regisksc <41172158+regisksc@users.noreply.github.com> Date: Thu, 16 Apr 2026 22:22:55 -0300 Subject: [PATCH 7/7] fix(dashscope): remove MiniMax-M2.5 entries to prevent future key conflicts --- src/utils/context.test.ts | 23 ----------------------- src/utils/model/openaiContextWindows.ts | 8 ++------ 2 files changed, 2 insertions(+), 29 deletions(-) diff --git a/src/utils/context.test.ts b/src/utils/context.test.ts index 9c7e56b883..3d6c96ec07 100644 --- a/src/utils/context.test.ts +++ b/src/utils/context.test.ts @@ -221,28 +221,6 @@ test('DashScope kimi-k2.5 uses provider-specific context and output caps', () => }) }) -test('DashScope MiniMax-M2.5 uses provider-specific context and output caps', () => { - process.env.CLAUDE_CODE_USE_OPENAI = '1' - delete process.env.CLAUDE_CODE_MAX_OUTPUT_TOKENS - - expect(getContextWindowForModel('MiniMax-M2.5')).toBe(196_608) - expect(getModelMaxOutputTokens('MiniMax-M2.5')).toEqual({ - default: 24_576, - upperLimit: 24_576, - }) -}) - -test('DashScope MiniMax-M2.5 lowercase variant resolves via prefix match', () => { - process.env.CLAUDE_CODE_USE_OPENAI = '1' - delete process.env.CLAUDE_CODE_MAX_OUTPUT_TOKENS - - expect(getContextWindowForModel('minimax-m2.5')).toBe(196_608) - expect(getModelMaxOutputTokens('minimax-m2.5')).toEqual({ - default: 24_576, - upperLimit: 24_576, - }) -}) - test('DashScope glm-5 uses provider-specific context and output caps', () => { process.env.CLAUDE_CODE_USE_OPENAI = '1' delete process.env.CLAUDE_CODE_MAX_OUTPUT_TOKENS @@ -274,6 +252,5 @@ test('DashScope models clamp oversized max output overrides to the provider limi expect(getMaxOutputTokensForModel('qwen3-coder-next')).toBe(65_536) expect(getMaxOutputTokensForModel('qwen3-max')).toBe(32_768) expect(getMaxOutputTokensForModel('kimi-k2.5')).toBe(32_768) - expect(getMaxOutputTokensForModel('MiniMax-M2.5')).toBe(24_576) expect(getMaxOutputTokensForModel('glm-5')).toBe(16_384) }) diff --git a/src/utils/model/openaiContextWindows.ts b/src/utils/model/openaiContextWindows.ts index da49948806..8af1ffb5bc 100644 --- a/src/utils/model/openaiContextWindows.ts +++ b/src/utils/model/openaiContextWindows.ts @@ -206,8 +206,8 @@ const OPENAI_CONTEXT_WINDOWS: Record = { // Alibaba DashScope (Coding Plan) // Model context windows from DashScope API /models endpoint (April 2026). // Values sourced from: qwen3.5-plus/qwen3-coder-plus (1M), qwen3-coder-next/max (256K), - // kimi-k2.5 (256K), MiniMax-M2.5 (192K), glm-5/glm-4.7 (198K). - // Max output tokens: Qwen variants (64K/32K), MiniMax (24K), GLM (16K). + // kimi-k2.5 (256K), glm-5/glm-4.7 (198K). + // Max output tokens: Qwen variants (64K/32K), GLM (16K). 'qwen3.6-plus': 1_000_000, 'qwen3.5-plus': 1_000_000, 'qwen3-coder-plus': 1_000_000, @@ -215,8 +215,6 @@ const OPENAI_CONTEXT_WINDOWS: Record = { 'qwen3-max': 262_144, 'qwen3-max-2026-01-23': 262_144, 'kimi-k2.5': 262_144, - 'MiniMax-M2.5': 196_608, - 'minimax-m2.5': 196_608, 'glm-5': 202_752, 'glm-4.7': 202_752, } @@ -387,8 +385,6 @@ const OPENAI_MAX_OUTPUT_TOKENS: Record = { 'qwen3-max': 32_768, 'qwen3-max-2026-01-23': 32_768, 'kimi-k2.5': 32_768, - 'MiniMax-M2.5': 24_576, - 'minimax-m2.5': 24_576, 'glm-5': 16_384, 'glm-4.7': 16_384, }