From c1b7bbc2d315eed6b639280d6f696db33debf57f Mon Sep 17 00:00:00 2001 From: Askhz <1361267452@qq.com> Date: Wed, 22 Apr 2026 11:17:28 +0800 Subject: [PATCH] fix: restrict ANTHROPIC_MODEL to anthropic-compatible providers in model picker - Only show ANTHROPIC_MODEL env var model for firstParty/bedrock/vertex/foundry - Do not leak it into OpenAI/Gemini/Grok/CoStrict pickers - Remove settings.model from custom model options Co-Authored-By: Claude Opus 4.6 --- src/utils/model/modelOptions.ts | 52 ++++++++++++--------------------- 1 file changed, 18 insertions(+), 34 deletions(-) diff --git a/src/utils/model/modelOptions.ts b/src/utils/model/modelOptions.ts index 55a5c2fde..e3b10576d 100644 --- a/src/utils/model/modelOptions.ts +++ b/src/utils/model/modelOptions.ts @@ -1,5 +1,4 @@ // biome-ignore-all assist/source/organizeImports: ANT-ONLY import markers must not be reordered -import { getInitialMainLoopModel } from '../../bootstrap/state.js' import { isClaudeAISubscriber, isMaxSubscriber, @@ -25,7 +24,6 @@ import { getDefaultHaikuModel, getDefaultMainLoopModelSetting, getMarketingNameForModel, - getUserSpecifiedModelSetting, isOpus1mMergeEnabled, getOpus46PricingSuffix, renderDefaultModelSetting, @@ -542,45 +540,31 @@ export function getModelOptions(fastMode = false): ModelOption[] { } } - // Add custom model from either the current model value or the initial one - // if it is not already in the options. - let customModel: ModelSetting = null - const currentMainLoopModel = getUserSpecifiedModelSetting() - const initialMainLoopModel = getInitialMainLoopModel() - if (currentMainLoopModel !== undefined && currentMainLoopModel !== null) { - customModel = currentMainLoopModel - } else if (initialMainLoopModel !== null) { - customModel = initialMainLoopModel - } - if (customModel === null || options.some(opt => opt.value === customModel)) { - return filterModelOptionsByAllowlist(options) - } else if (customModel === 'opusplan') { - return filterModelOptionsByAllowlist([...options, getOpusPlanOption()]) - } else if (customModel === 'opus' && getAPIProvider() === 'firstParty') { - return filterModelOptionsByAllowlist([ - ...options, - getMaxOpusOption(fastMode), - ]) - } else if (customModel === 'opus[1m]' && getAPIProvider() === 'firstParty') { - return filterModelOptionsByAllowlist([ - ...options, - getMergedOpus1MOption(fastMode), - ]) - } else { - // Try to show a human-readable label for known Anthropic models, with an - // upgrade hint if the alias now resolves to a newer version. - const knownOption = getKnownModelOption(customModel) + // Add ANTHROPIC_MODEL env var model as a custom option, but only for + // anthropic-compatible providers. settings.model is NOT added here. + const provider = getAPIProvider() + const envModel = + provider === 'firstParty' || + provider === 'bedrock' || + provider === 'vertex' || + provider === 'foundry' + ? process.env.ANTHROPIC_MODEL + : undefined + + if (envModel && !options.some(opt => opt.value === envModel)) { + const knownOption = getKnownModelOption(envModel) if (knownOption) { options.push(knownOption) } else { options.push({ - value: customModel, - label: customModel, - description: 'Custom model', + value: envModel, + label: envModel, + description: 'Custom model (ANTHROPIC_MODEL)', }) } - return filterModelOptionsByAllowlist(options) } + + return filterModelOptionsByAllowlist(options) } /**