feat(sessions_spawn): add model parameter for sub-agent model override

This commit is contained in:
Azade
2026-01-06 22:30:29 +00:00
committed by Peter Steinberger
parent 02c9cf0ff4
commit 274f408e6f
2 changed files with 14 additions and 1 deletions

View File

@@ -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<string, unknown>;
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 {

View File

@@ -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({