diff --git a/src/agents/tools/sessions-spawn-tool.ts b/src/agents/tools/sessions-spawn-tool.ts index f29569f47..091772d13 100644 --- a/src/agents/tools/sessions-spawn-tool.ts +++ b/src/agents/tools/sessions-spawn-tool.ts @@ -23,6 +23,7 @@ import { isAnnounceSkip } from "./sessions-send-helpers.js"; const SessionsSpawnToolSchema = Type.Object({ task: Type.String(), label: Type.Optional(Type.String()), + model: Type.Optional(Type.String()), timeoutSeconds: Type.Optional(Type.Integer({ minimum: 0 })), cleanup: Type.Optional( Type.Union([Type.Literal("delete"), Type.Literal("keep")]), @@ -178,6 +179,7 @@ export function createSessionsSpawnTool(opts?: { const params = args as Record; const task = readStringParam(params, "task", { required: true }); const label = typeof params.label === "string" ? params.label.trim() : ""; + const model = readStringParam(params, "model"); const cleanup = params.cleanup === "keep" || params.cleanup === "delete" ? (params.cleanup as "keep" | "delete") @@ -218,11 +220,20 @@ export function createSessionsSpawnTool(opts?: { parseAgentSessionKey(requesterInternalKey)?.agentId, ); const childSessionKey = `agent:${requesterAgentId}:subagent:${crypto.randomUUID()}`; + const patchParams: { key: string; spawnedBy?: string; model?: string } = { + key: childSessionKey, + }; if (opts?.sandboxed === true) { + patchParams.spawnedBy = requesterInternalKey; + } + if (model) { + patchParams.model = model; + } + if (patchParams.spawnedBy || patchParams.model) { try { await callGateway({ method: "sessions.patch", - params: { key: childSessionKey, spawnedBy: requesterInternalKey }, + params: patchParams, timeoutMs: 10_000, }); } catch { diff --git a/src/gateway/server-methods/agent.ts b/src/gateway/server-methods/agent.ts index 432b8336e..6cddd0c01 100644 --- a/src/gateway/server-methods/agent.ts +++ b/src/gateway/server-methods/agent.ts @@ -87,6 +87,8 @@ export const agentHandlers: GatewayRequestHandlers = { skillsSnapshot: entry?.skillsSnapshot, lastProvider: entry?.lastProvider, lastTo: entry?.lastTo, + modelOverride: entry?.modelOverride, + providerOverride: entry?.providerOverride, }; sessionEntry = nextEntry; const sendPolicy = resolveSendPolicy({