diff --git a/packages/coding-agent/src/config/model-resolver.ts b/packages/coding-agent/src/config/model-resolver.ts index 15b0df376..f09310b51 100644 --- a/packages/coding-agent/src/config/model-resolver.ts +++ b/packages/coding-agent/src/config/model-resolver.ts @@ -864,7 +864,7 @@ function getModelRoleAlias(value: string): ModelRole | undefined { function normalizeModelPatternList(value: string | string[] | undefined): string[] { if (!value) return []; - const patterns = Array.isArray(value) ? value : value.split(","); + const patterns = Array.isArray(value) ? value.flatMap(pattern => pattern.split(",")) : value.split(","); return patterns.map(pattern => pattern.trim()).filter(Boolean); } diff --git a/packages/coding-agent/src/sdk.ts b/packages/coding-agent/src/sdk.ts index 42557f405..bca73c40e 100644 --- a/packages/coding-agent/src/sdk.ts +++ b/packages/coding-agent/src/sdk.ts @@ -41,6 +41,7 @@ import { parseModelString, pickDefaultAvailableModel, resolveAllowedModels, + resolveConfiguredModelPatterns, resolveModelRoleValue, } from "./config/model-resolver"; import { loadPromptTemplates as loadPromptTemplatesInternal, type PromptTemplate } from "./config/prompt-templates"; @@ -1969,12 +1970,16 @@ export async function createAgentSession(options: CreateAgentSessionOptions = {} } } } - // Resolve deferred --model/subagent patterns now that extension models are registered. + // Resolve deferred --model/subagent patterns now that extension models are + // registered. Expand role aliases (`pi/smol`) and comma chains to concrete + // selectors first so deferred resolution accepts everything the immediate + // path (resolveModelOverride → resolveModelRoleValue) accepts. if (!model && deferredModelPatterns.length > 0) { + const expandedModelPatterns = resolveConfiguredModelPatterns(deferredModelPatterns, settings); const availableModels = modelRegistry.getAll(); const matchPreferences = getModelMatchPreferences(settings); - for (let patternIndex = 0; patternIndex < deferredModelPatterns.length; patternIndex += 1) { - const pattern = deferredModelPatterns[patternIndex]; + for (let patternIndex = 0; patternIndex < expandedModelPatterns.length; patternIndex += 1) { + const pattern = expandedModelPatterns[patternIndex]; const primary = parseModelPattern(pattern, availableModels, matchPreferences); if (!primary.model) continue; let selectedModel = primary.model; @@ -2007,7 +2012,7 @@ export async function createAgentSession(options: CreateAgentSessionOptions = {} ); const seenSelectors = new Set([primarySelector]); const fallbackSelectors: string[] = []; - for (const fallbackPattern of deferredModelPatterns.slice(patternIndex + 1)) { + for (const fallbackPattern of expandedModelPatterns.slice(patternIndex + 1)) { const fallback = parseModelPattern(fallbackPattern, availableModels, matchPreferences); if (!fallback.model) continue; const fallbackSelector = formatModelSelectorValue(