From fbc62c4976d3a588100ea015a02d1c35b4e39ce6 Mon Sep 17 00:00:00 2001 From: MarsDoge Date: Tue, 17 Mar 2026 23:31:19 +0800 Subject: [PATCH 1/2] fix(agents): prefer agent model for subagent spawns --- src/agents/model-selection.test.ts | 19 +++++++++++++++++++ src/agents/model-selection.ts | 4 ++-- ...ols.subagents.sessions-spawn.model.test.ts | 18 ++++++++++++++++++ 3 files changed, 39 insertions(+), 2 deletions(-) diff --git a/src/agents/model-selection.test.ts b/src/agents/model-selection.test.ts index e7d583d106f..c95940e0208 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 = { @@ -826,3 +827,21 @@ describe("normalizeModelSelection", () => { expect(normalizeModelSelection(42)).toBeUndefined(); }); }); + +describe("resolveSubagentConfiguredModelSelection", () => { + it("prefers the target agent primary model over the global subagent default", () => { + 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( + "opencode/claude", + ); + }); +}); diff --git a/src/agents/model-selection.ts b/src/agents/model-selection.ts index acc29a32bf9..78b911909ba 100644 --- a/src/agents/model-selection.ts +++ b/src/agents/model-selection.ts @@ -381,8 +381,8 @@ export function resolveSubagentConfiguredModelSelection(params: { const agentConfig = resolveAgentConfig(params.cfg, params.agentId); return ( normalizeModelSelection(agentConfig?.subagents?.model) ?? - normalizeModelSelection(params.cfg.agents?.defaults?.subagents?.model) ?? - normalizeModelSelection(agentConfig?.model) + normalizeModelSelection(agentConfig?.model) ?? + normalizeModelSelection(params.cfg.agents?.defaults?.subagents?.model) ); } 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 042f479d5e4..0587024a511 100644 --- a/src/agents/openclaw-tools.subagents.sessions-spawn.model.test.ts +++ b/src/agents/openclaw-tools.subagents.sessions-spawn.model.test.ts @@ -230,6 +230,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: "opencode/claude", + }); + }); + it("sessions_spawn prefers target agent primary model over global default", async () => { await expectSpawnUsesConfiguredModel({ config: { From 90af2e7e675d5557ed3afe66dd9e52b01dd42287 Mon Sep 17 00:00:00 2001 From: MarsDoge Date: Wed, 18 Mar 2026 16:14:50 +0800 Subject: [PATCH 2/2] fix(agents): restore correct precedence: subagents.model > defaults.subagents.model > agent.primary --- src/agents/model-selection.test.ts | 4 ++-- src/agents/model-selection.ts | 4 ++-- .../openclaw-tools.subagents.sessions-spawn.model.test.ts | 2 +- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/src/agents/model-selection.test.ts b/src/agents/model-selection.test.ts index c95940e0208..008a87a3c57 100644 --- a/src/agents/model-selection.test.ts +++ b/src/agents/model-selection.test.ts @@ -829,7 +829,7 @@ describe("normalizeModelSelection", () => { }); describe("resolveSubagentConfiguredModelSelection", () => { - it("prefers the target agent primary model over the global subagent default", () => { + it("prefers the target agent subagents.model over global defaults.subagents.model and agent.primary", () => { const cfg = { agents: { defaults: { @@ -841,7 +841,7 @@ describe("resolveSubagentConfiguredModelSelection", () => { } as OpenClawConfig; expect(resolveSubagentConfiguredModelSelection({ cfg, agentId: "research" })).toBe( - "opencode/claude", + "minimax/MiniMax-M2.5", ); }); }); diff --git a/src/agents/model-selection.ts b/src/agents/model-selection.ts index 78b911909ba..acc29a32bf9 100644 --- a/src/agents/model-selection.ts +++ b/src/agents/model-selection.ts @@ -381,8 +381,8 @@ export function resolveSubagentConfiguredModelSelection(params: { const agentConfig = resolveAgentConfig(params.cfg, params.agentId); return ( normalizeModelSelection(agentConfig?.subagents?.model) ?? - normalizeModelSelection(agentConfig?.model) ?? - normalizeModelSelection(params.cfg.agents?.defaults?.subagents?.model) + normalizeModelSelection(params.cfg.agents?.defaults?.subagents?.model) ?? + normalizeModelSelection(agentConfig?.model) ); } 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 0587024a511..786c1c033a6 100644 --- a/src/agents/openclaw-tools.subagents.sessions-spawn.model.test.ts +++ b/src/agents/openclaw-tools.subagents.sessions-spawn.model.test.ts @@ -244,7 +244,7 @@ describe("openclaw-tools: subagents (sessions_spawn model + thinking)", () => { }, runId: "run-agent-primary-over-subagent-default", callId: "call-agent-primary-over-subagent-default", - expectedModel: "opencode/claude", + expectedModel: "minimax/MiniMax-M2.5", }); });