diff --git a/packages/opencode/src/session/message-v2.ts b/packages/opencode/src/session/message-v2.ts index 2dff17a5efa..d8cc8686882 100644 --- a/packages/opencode/src/session/message-v2.ts +++ b/packages/opencode/src/session/message-v2.ts @@ -169,6 +169,7 @@ export namespace MessageV2 { description: z.string(), agent: z.string(), command: z.string().optional(), + model: z.object({ providerID: z.string(), modelID: z.string() }).optional(), }) export type SubtaskPart = z.infer diff --git a/packages/opencode/src/session/prompt.ts b/packages/opencode/src/session/prompt.ts index f891612272c..db9efba39af 100644 --- a/packages/opencode/src/session/prompt.ts +++ b/packages/opencode/src/session/prompt.ts @@ -316,6 +316,11 @@ export namespace SessionPrompt { // TODO: centralize "invoke tool" logic if (task?.type === "subtask") { const taskTool = await TaskTool.init() + const taskAgent = await Agent.get(task.agent) + + const resolveModel = task.model ?? taskAgent.model ?? lastUser.model + const taskModel = await Provider.getModel(resolveModel.providerID, resolveModel.modelID) + const assistantMessage = (await Session.updateMessage({ id: Identifier.ascending("message"), role: "assistant", @@ -334,8 +339,8 @@ export namespace SessionPrompt { reasoning: 0, cache: { read: 0, write: 0 }, }, - modelID: model.id, - providerID: model.providerID, + modelID: taskModel.id, + providerID: taskModel.providerID, time: { created: Date.now(), }, @@ -376,7 +381,6 @@ export namespace SessionPrompt { { args: taskArgs }, ) let executionError: Error | undefined - const taskAgent = await Agent.get(task.agent) const taskCtx: Tool.Context = { agent: task.agent, messageID: assistantMessage.id, @@ -1545,6 +1549,7 @@ export namespace SessionPrompt { } const templateParts = await resolvePromptParts(template) +<<<<<<< HEAD const parts = (agent.mode === "subagent" && command.subtask !== false) || command.subtask === true ? [ @@ -1558,12 +1563,40 @@ export namespace SessionPrompt { }, ] : [...templateParts, ...(input.parts ?? [])] +======= + const isSubtask = (agent.mode === "subagent" && command.subtask !== false) || command.subtask === true + const parts = isSubtask + ? [ + { + type: "subtask" as const, + agent: agent.name, + model: { providerID: model.providerID, modelID: model.modelID }, + description: command.description ?? "", + command: input.command, + // TODO: how can we make task tool accept a more complex input? + prompt: templateParts.find((y) => y.type === "text")?.text ?? "", + }, + ] + : [...templateParts, ...(input.parts ?? [])] + + const userAgent = isSubtask ? (input.agent ?? (await Agent.defaultAgent())) : agentName + const userModel = isSubtask + ? input.model + ? Provider.parseModel(input.model) + : await lastModel(input.sessionID) + : model +>>>>>>> 4c0b95417 (fix: restore main session model on subtask completion) const result = (await prompt({ sessionID: input.sessionID, messageID: input.messageID, +<<<<<<< HEAD model, agent: agentName, +======= + model: userModel, + agent: userAgent, +>>>>>>> 4c0b95417 (fix: restore main session model on subtask completion) parts, variant: input.variant, })) as MessageV2.WithParts diff --git a/packages/sdk/js/src/v2/gen/types.gen.ts b/packages/sdk/js/src/v2/gen/types.gen.ts index e423fecea42..c97eb80ca0d 100644 --- a/packages/sdk/js/src/v2/gen/types.gen.ts +++ b/packages/sdk/js/src/v2/gen/types.gen.ts @@ -430,6 +430,10 @@ export type Part = description: string agent: string command?: string + model?: { + providerID: string + modelID: string + } } | ReasoningPart | FilePart @@ -1832,6 +1836,10 @@ export type SubtaskPartInput = { description: string agent: string command?: string + model?: { + providerID: string + modelID: string + } } export type Command = {