From b62519b401a61731397519f8482ca082163e2fac Mon Sep 17 00:00:00 2001 From: YeonGyu-Kim Date: Tue, 3 Feb 2026 12:11:42 +0900 Subject: [PATCH] feat(agents): respect uiSelectedModel in Atlas model resolution (#1410) Atlas now respects uiSelectedModel when resolving model in createBuiltinAgents. Added test coverage for this behavior. --- src/agents/utils.test.ts | 30 ++++++++++++++++++++++++++++++ src/agents/utils.ts | 22 +++++++++++----------- 2 files changed, 41 insertions(+), 11 deletions(-) diff --git a/src/agents/utils.test.ts b/src/agents/utils.test.ts index 6e480e5a..98c740c3 100644 --- a/src/agents/utils.test.ts +++ b/src/agents/utils.test.ts @@ -49,6 +49,36 @@ describe("createBuiltinAgents with model overrides", () => { expect(agents.sisyphus.thinking).toBeUndefined() }) + test("Atlas uses uiSelectedModel when provided", async () => { + // #given + const fetchSpy = spyOn(shared, "fetchAvailableModels").mockResolvedValue( + new Set(["openai/gpt-5.2", "anthropic/claude-sonnet-4-5"]) + ) + const uiSelectedModel = "openai/gpt-5.2" + + try { + // #when + const agents = await createBuiltinAgents( + [], + {}, + undefined, + TEST_DEFAULT_MODEL, + undefined, + undefined, + [], + undefined, + undefined, + uiSelectedModel + ) + + // #then + expect(agents.atlas).toBeDefined() + expect(agents.atlas.model).toBe("openai/gpt-5.2") + } finally { + fetchSpy.mockRestore() + } + }) + test("Sisyphus is created on first run when no availableModels or cache exist", async () => { // #given const systemDefaultModel = "anthropic/claude-opus-4-5" diff --git a/src/agents/utils.ts b/src/agents/utils.ts index c9d99ffb..7c1a236d 100644 --- a/src/agents/utils.ts +++ b/src/agents/utils.ts @@ -446,17 +446,17 @@ export async function createBuiltinAgents( result[name] = config } - if (!disabledAgents.includes("atlas")) { - const orchestratorOverride = agentOverrides["atlas"] - const atlasRequirement = AGENT_MODEL_REQUIREMENTS["atlas"] - - const atlasResolution = applyModelResolution({ - // NOTE: Atlas does NOT use uiSelectedModel - respects its own fallbackChain (k2p5 primary) - userModel: orchestratorOverride?.model, - requirement: atlasRequirement, - availableModels, - systemDefaultModel, - }) + if (!disabledAgents.includes("atlas")) { + const orchestratorOverride = agentOverrides["atlas"] + const atlasRequirement = AGENT_MODEL_REQUIREMENTS["atlas"] + + const atlasResolution = applyModelResolution({ + uiSelectedModel, + userModel: orchestratorOverride?.model, + requirement: atlasRequirement, + availableModels, + systemDefaultModel, + }) if (atlasResolution) { const { model: atlasModel, variant: atlasResolvedVariant } = atlasResolution