diff --git a/src/agents/model-selection.test.ts b/src/agents/model-selection.test.ts index 5d81afc4970..4c789215e4a 100644 --- a/src/agents/model-selection.test.ts +++ b/src/agents/model-selection.test.ts @@ -14,6 +14,7 @@ import { resolveConfiguredModelRef, resolveThinkingDefault, resolveModelRefFromString, + resolveSubagentConfiguredModelSelection, } from "./model-selection.js"; const EXPLICIT_ALLOWLIST_CONFIG = { @@ -835,3 +836,21 @@ describe("normalizeModelSelection", () => { expect(normalizeModelSelection(42)).toBeUndefined(); }); }); + +describe("resolveSubagentConfiguredModelSelection", () => { + it("prefers the target agent subagents.model over global defaults.subagents.model and agent.primary", () => { + const cfg = { + agents: { + defaults: { + subagents: { model: "minimax/MiniMax-M2.5" }, + model: { primary: "openai/gpt-5.4" }, + }, + list: [{ id: "research", model: { primary: "opencode/claude" } }], + }, + } as OpenClawConfig; + + expect(resolveSubagentConfiguredModelSelection({ cfg, agentId: "research" })).toBe( + "minimax/MiniMax-M2.5", + ); + }); +}); diff --git a/src/agents/openclaw-tools.subagents.sessions-spawn.model.test.ts b/src/agents/openclaw-tools.subagents.sessions-spawn.model.test.ts index a8d8c8b2d58..b2886cce91c 100644 --- a/src/agents/openclaw-tools.subagents.sessions-spawn.model.test.ts +++ b/src/agents/openclaw-tools.subagents.sessions-spawn.model.test.ts @@ -229,6 +229,24 @@ describe("openclaw-tools: subagents (sessions_spawn model + thinking)", () => { }); }); + it("sessions_spawn prefers target agent primary model over global subagent default", async () => { + await expectSpawnUsesConfiguredModel({ + config: { + session: { mainKey: "main", scope: "per-sender" }, + agents: { + defaults: { + subagents: { model: "minimax/MiniMax-M2.5" }, + model: { primary: "openai/gpt-5.4" }, + }, + list: [{ id: "research", model: { primary: "opencode/claude" } }], + }, + }, + runId: "run-agent-primary-over-subagent-default", + callId: "call-agent-primary-over-subagent-default", + expectedModel: "minimax/MiniMax-M2.5", + }); + }); + it("sessions_spawn prefers target agent primary model over global default", async () => { await expectSpawnUsesConfiguredModel({ config: {