From 0b9cc80ecfc740135d256905613cd70e8e95bace Mon Sep 17 00:00:00 2001 From: x-x-gpu <1411950413@qq.com> Date: Fri, 8 May 2026 20:41:05 +0800 Subject: [PATCH] fix: pass resolved model to session.create so sub-agent sessions use the correct model Sub-agent sessions created via the task tool or call_omo_agent tool were being created without a model. The resolved model was only passed as a promptAsync body override, which opencode core ignores, causing fallback to the client's system default model (often a reasoning model that hangs). OpenCode's session.create API supports model: { id, providerID, variant } at creation time. This fix ensures the resolved category/agent model is passed during session creation across all paths: - createSyncSession() (delegate task / category-based) - createOrGetSession() (call_omo_agent / direct agent calls) - BackgroundManager.startTask() (background tasks) This guarantees each sub-agent session is created with the correct model regardless of whether promptAsync honors its model override. --- src/features/background-agent/manager.ts | 9 +++++++++ src/tools/call-omo-agent/session-creator.ts | 13 ++++++++++++- src/tools/call-omo-agent/sync-executor.ts | 2 +- .../delegate-task/sync-session-creator.ts | 18 +++++++++++++++++- src/tools/delegate-task/sync-task.ts | 2 ++ 5 files changed, 41 insertions(+), 3 deletions(-) diff --git a/src/features/background-agent/manager.ts b/src/features/background-agent/manager.ts index 10dce905d..9d9b3362e 100644 --- a/src/features/background-agent/manager.ts +++ b/src/features/background-agent/manager.ts @@ -567,6 +567,15 @@ export class BackgroundManager { parentID: input.parentSessionId, title: `${input.description} (@${input.agent} subagent)`, ...(input.sessionPermission ? { permission: input.sessionPermission } : {}), + ...(input.model + ? { + model: { + id: input.model.modelID, + providerID: input.model.providerID, + ...(input.model.variant ? { variant: input.model.variant } : {}), + }, + } + : {}), } as Record, query: { directory: parentDirectory, diff --git a/src/tools/call-omo-agent/session-creator.ts b/src/tools/call-omo-agent/session-creator.ts index 1273b9216..96831d61e 100644 --- a/src/tools/call-omo-agent/session-creator.ts +++ b/src/tools/call-omo-agent/session-creator.ts @@ -1,5 +1,6 @@ import type { CallOmoAgentArgs } from "./types" import type { PluginInput } from "@opencode-ai/plugin" +import type { DelegatedModelConfig } from "../../shared/model-resolution-types" import { subagentSessions, syncSubagentSessions } from "../../features/claude-code-session-state" import { log } from "../../shared" @@ -12,7 +13,8 @@ export async function createOrGetSession( abort: AbortSignal metadata?: (input: { title?: string; metadata?: Record }) => void }, - ctx: PluginInput + ctx: PluginInput, + model?: DelegatedModelConfig, ): Promise<{ sessionID: string; isNew: boolean }> { if (args.session_id) { log(`[call_omo_agent] Using existing session: ${args.session_id}`) @@ -39,6 +41,15 @@ export async function createOrGetSession( body: { parentID: toolContext.sessionID, title: `${args.description} (@${args.subagent_type} subagent)`, + ...(model + ? { + model: { + id: model.modelID, + providerID: model.providerID, + ...(model.variant ? { variant: model.variant } : {}), + }, + } + : {}), } as Record, query: { directory: parentDirectory, diff --git a/src/tools/call-omo-agent/sync-executor.ts b/src/tools/call-omo-agent/sync-executor.ts index 56e22a80a..e7294577c 100644 --- a/src/tools/call-omo-agent/sync-executor.ts +++ b/src/tools/call-omo-agent/sync-executor.ts @@ -73,7 +73,7 @@ export async function executeSync( let appliedFallbackChain = false try { - const session = await deps.createOrGetSession(args, toolContext, ctx) + const session = await deps.createOrGetSession(args, toolContext, ctx, model) sessionID = session.sessionID createdSessionForExecution = session.isNew subagentSessions.add(sessionID) diff --git a/src/tools/delegate-task/sync-session-creator.ts b/src/tools/delegate-task/sync-session-creator.ts index 7c463db33..744e151cf 100644 --- a/src/tools/delegate-task/sync-session-creator.ts +++ b/src/tools/delegate-task/sync-session-creator.ts @@ -1,9 +1,16 @@ import type { OpencodeClient } from "./types" +import type { DelegatedModelConfig } from "../../shared/model-resolution-types" import { QUESTION_DENIED_SESSION_PERMISSION } from "../../shared/question-denied-session-permission" export async function createSyncSession( client: OpencodeClient, - input: { parentSessionID: string; agentToUse: string; description: string; defaultDirectory: string } + input: { + parentSessionID: string + agentToUse: string + description: string + defaultDirectory: string + categoryModel?: DelegatedModelConfig + } ): Promise<{ ok: true; sessionID: string; parentDirectory: string } | { ok: false; error: string }> { const parentSession = client.session.get ? await client.session.get({ path: { id: input.parentSessionID } }).catch(() => null) @@ -15,6 +22,15 @@ export async function createSyncSession( parentID: input.parentSessionID, title: `${input.description} (@${input.agentToUse} subagent)`, permission: QUESTION_DENIED_SESSION_PERMISSION, + ...(input.categoryModel + ? { + model: { + id: input.categoryModel.modelID, + providerID: input.categoryModel.providerID, + ...(input.categoryModel.variant ? { variant: input.categoryModel.variant } : {}), + }, + } + : {}), } as Record, query: { directory: parentDirectory, diff --git a/src/tools/delegate-task/sync-task.ts b/src/tools/delegate-task/sync-task.ts index 5601247b7..06537af49 100644 --- a/src/tools/delegate-task/sync-task.ts +++ b/src/tools/delegate-task/sync-task.ts @@ -64,6 +64,7 @@ export async function executeSyncTask( agentToUse, description: args.description, defaultDirectory: directory, + categoryModel, }) if (!createSessionResult.ok) { @@ -227,6 +228,7 @@ export async function executeSyncTask( agentToUse, description: args.description, defaultDirectory: directory, + categoryModel: nextFallbackModel, }) if (!retrySessionResult.ok) { return retrySessionResult.error