From 5fc279dcf55bc6bd666160ed7183ff9097eacc04 Mon Sep 17 00:00:00 2001 From: naveen9036 Date: Fri, 10 Jul 2026 15:49:48 +0530 Subject: [PATCH] fix(session): respect agent.model and agent.variant in handleSubtask - Move taskAgent fetch before taskModel resolution so the agent's configured model is available when deciding which model to use - Add taskAgent.model as middle tier in the fallback chain: task.model > agent.model > parent session model - Use taskAgent.variant as preference over parent session variant Closes #21632 Re-fixes #21952 --- packages/opencode/src/session/prompt.ts | 26 ++++++++++++++----------- 1 file changed, 15 insertions(+), 11 deletions(-) diff --git a/packages/opencode/src/session/prompt.ts b/packages/opencode/src/session/prompt.ts index eb116f6b960f..07467b5dc92f 100644 --- a/packages/opencode/src/session/prompt.ts +++ b/packages/opencode/src/session/prompt.ts @@ -264,7 +264,20 @@ const layer = Layer.effect( const ctx = yield* InstanceState.context const promptOps = yield* ops() const { task: taskTool } = yield* registry.named() - const taskModel = task.model ? yield* getModel(task.model.providerID, task.model.modelID, sessionID) : model + const taskAgent = yield* agents.get(task.agent) + if (!taskAgent) { + const available = (yield* agents.list()).filter((a) => !a.hidden).map((a) => a.name) + const hint = available.length ? ` Available agents: ${available.join(", ")}` : "" + const error = new NamedError.Unknown({ message: `Agent not found: "${task.agent}".${hint}` }) + yield* events.publish(Session.Event.Error, { sessionID, error: error.toObject() }) + throw error + } + + const taskModel = task.model + ? yield* getModel(task.model.providerID, task.model.modelID, sessionID) + : taskAgent.model + ? yield* getModel(taskAgent.model.providerID, taskAgent.model.modelID, sessionID) + : model const assistantMessage: SessionV1.Assistant = yield* sessions.updateMessage({ id: MessageID.ascending(), role: "assistant", @@ -272,7 +285,7 @@ const layer = Layer.effect( sessionID, mode: task.agent, agent: task.agent, - variant: lastUser.model.variant, + variant: taskAgent.variant ?? lastUser.model.variant, path: { cwd: ctx.directory, root: ctx.worktree }, cost: 0, tokens: { input: 0, output: 0, reasoning: 0, cache: { read: 0, write: 0 } }, @@ -310,15 +323,6 @@ const layer = Layer.effect( { args: taskArgs }, ) - const taskAgent = yield* agents.get(task.agent) - if (!taskAgent) { - const available = (yield* agents.list()).filter((a) => !a.hidden).map((a) => a.name) - const hint = available.length ? ` Available agents: ${available.join(", ")}` : "" - const error = new NamedError.Unknown({ message: `Agent not found: "${task.agent}".${hint}` }) - yield* events.publish(Session.Event.Error, { sessionID, error: error.toObject() }) - throw error - } - let error: Error | undefined const taskAbort = new AbortController() const result = yield* taskTool