Agents: align onPayload callback and OAuth imports

This commit is contained in:
joshavant
2026-03-10 08:50:00 -05:00
parent 3508b4821b
commit 59bc3c6630
17 changed files with 60 additions and 71 deletions

View File

@@ -29,7 +29,7 @@ describe("createAnthropicPayloadLogger", () => {
], ],
}; };
const streamFn: StreamFn = ((model, __, options) => { const streamFn: StreamFn = ((model, __, options) => {
options?.onPayload?.(payload, model); options?.onPayload?.(payload);
return {} as never; return {} as never;
}) as StreamFn; }) as StreamFn;

View File

@@ -136,7 +136,7 @@ export function createAnthropicPayloadLogger(params: {
if (!isAnthropicModel(model)) { if (!isAnthropicModel(model)) {
return streamFn(model, context, options); return streamFn(model, context, options);
} }
const nextOnPayload = (payload: unknown, payloadModel: Parameters<StreamFn>[0]) => { const nextOnPayload = (payload: unknown) => {
const redactedPayload = redactImageDataForDiagnostics(payload); const redactedPayload = redactImageDataForDiagnostics(payload);
record({ record({
...base, ...base,
@@ -145,7 +145,7 @@ export function createAnthropicPayloadLogger(params: {
payload: redactedPayload, payload: redactedPayload,
payloadDigest: digest(redactedPayload), payloadDigest: digest(redactedPayload),
}); });
return options?.onPayload?.(payload, payloadModel); return options?.onPayload?.(payload);
}; };
return streamFn(model, context, { return streamFn(model, context, {
...options, ...options,

View File

@@ -1,5 +1,5 @@
import type { OAuthCredentials, OAuthProvider } from "@mariozechner/pi-ai/oauth"; import type { OAuthCredentials, OAuthProvider } from "@mariozechner/pi-ai";
import { getOAuthApiKey, getOAuthProviders } from "@mariozechner/pi-ai/oauth"; import { getOAuthApiKey, getOAuthProviders } from "@mariozechner/pi-ai";
import { loadConfig, type OpenClawConfig } from "../../config/config.js"; import { loadConfig, type OpenClawConfig } from "../../config/config.js";
import { coerceSecretRef } from "../../config/types.secrets.js"; import { coerceSecretRef } from "../../config/types.secrets.js";
import { withFileLock } from "../../infra/file-lock.js"; import { withFileLock } from "../../infra/file-lock.js";

View File

@@ -604,7 +604,7 @@ export function createOpenAIWebSocketStreamFn(
...(prevResponseId ? { previous_response_id: prevResponseId } : {}), ...(prevResponseId ? { previous_response_id: prevResponseId } : {}),
...extraParams, ...extraParams,
}; };
options?.onPayload?.(payload, model); options?.onPayload?.(payload);
try { try {
session.manager.send(payload as Parameters<OpenAIWebSocketManager["send"]>[0]); session.manager.send(payload as Parameters<OpenAIWebSocketManager["send"]>[0]);

View File

@@ -101,7 +101,7 @@ describeGeminiLive("pi embedded extra params (gemini live)", () => {
oneByOneRedPngBase64: string; oneByOneRedPngBase64: string;
includeImage?: boolean; includeImage?: boolean;
prompt: string; prompt: string;
onPayload?: (payload: Record<string, unknown>, model: Model<"google-generative-ai">) => void; onPayload?: (payload: Record<string, unknown>) => void;
}): Promise<{ sawDone: boolean; stopReason?: string; errorMessage?: string }> { }): Promise<{ sawDone: boolean; stopReason?: string; errorMessage?: string }> {
const userContent: Array< const userContent: Array<
{ type: "text"; text: string } | { type: "image"; mimeType: string; data: string } { type: "text"; text: string } | { type: "image"; mimeType: string; data: string }
@@ -129,11 +129,8 @@ describeGeminiLive("pi embedded extra params (gemini live)", () => {
apiKey: params.apiKey, apiKey: params.apiKey,
reasoning: "high", reasoning: "high",
maxTokens: 64, maxTokens: 64,
onPayload: (payload, streamModel) => { onPayload: (payload) => {
params.onPayload?.( params.onPayload?.(payload as Record<string, unknown>);
payload as Record<string, unknown>,
streamModel as Model<"google-generative-ai">,
);
}, },
}, },
); );

View File

@@ -208,7 +208,7 @@ describe("applyExtraParamsToAgent", () => {
}) { }) {
const payload = params.payload ?? { store: false }; const payload = params.payload ?? { store: false };
const baseStreamFn: StreamFn = (model, _context, options) => { const baseStreamFn: StreamFn = (model, _context, options) => {
options?.onPayload?.(payload, model); options?.onPayload?.(payload);
return {} as ReturnType<StreamFn>; return {} as ReturnType<StreamFn>;
}; };
const agent = { streamFn: baseStreamFn }; const agent = { streamFn: baseStreamFn };
@@ -233,7 +233,7 @@ describe("applyExtraParamsToAgent", () => {
}) { }) {
const payload = params.payload ?? {}; const payload = params.payload ?? {};
const baseStreamFn: StreamFn = (model, _context, options) => { const baseStreamFn: StreamFn = (model, _context, options) => {
options?.onPayload?.(payload, model); options?.onPayload?.(payload);
return {} as ReturnType<StreamFn>; return {} as ReturnType<StreamFn>;
}; };
const agent = { streamFn: baseStreamFn }; const agent = { streamFn: baseStreamFn };
@@ -276,7 +276,7 @@ describe("applyExtraParamsToAgent", () => {
const payloads: Record<string, unknown>[] = []; const payloads: Record<string, unknown>[] = [];
const baseStreamFn: StreamFn = (_model, _context, options) => { const baseStreamFn: StreamFn = (_model, _context, options) => {
const payload: Record<string, unknown> = { model: "deepseek/deepseek-r1" }; const payload: Record<string, unknown> = { model: "deepseek/deepseek-r1" };
options?.onPayload?.(payload, model); options?.onPayload?.(payload);
payloads.push(payload); payloads.push(payload);
return {} as ReturnType<StreamFn>; return {} as ReturnType<StreamFn>;
}; };
@@ -308,7 +308,7 @@ describe("applyExtraParamsToAgent", () => {
const payloads: Record<string, unknown>[] = []; const payloads: Record<string, unknown>[] = [];
const baseStreamFn: StreamFn = (_model, _context, options) => { const baseStreamFn: StreamFn = (_model, _context, options) => {
const payload: Record<string, unknown> = {}; const payload: Record<string, unknown> = {};
options?.onPayload?.(payload, model); options?.onPayload?.(payload);
payloads.push(payload); payloads.push(payload);
return {} as ReturnType<StreamFn>; return {} as ReturnType<StreamFn>;
}; };
@@ -332,7 +332,7 @@ describe("applyExtraParamsToAgent", () => {
const payloads: Record<string, unknown>[] = []; const payloads: Record<string, unknown>[] = [];
const baseStreamFn: StreamFn = (_model, _context, options) => { const baseStreamFn: StreamFn = (_model, _context, options) => {
const payload: Record<string, unknown> = { reasoning_effort: "high" }; const payload: Record<string, unknown> = { reasoning_effort: "high" };
options?.onPayload?.(payload, model); options?.onPayload?.(payload);
payloads.push(payload); payloads.push(payload);
return {} as ReturnType<StreamFn>; return {} as ReturnType<StreamFn>;
}; };
@@ -357,7 +357,7 @@ describe("applyExtraParamsToAgent", () => {
const payloads: Record<string, unknown>[] = []; const payloads: Record<string, unknown>[] = [];
const baseStreamFn: StreamFn = (_model, _context, options) => { const baseStreamFn: StreamFn = (_model, _context, options) => {
const payload: Record<string, unknown> = { reasoning: { max_tokens: 256 } }; const payload: Record<string, unknown> = { reasoning: { max_tokens: 256 } };
options?.onPayload?.(payload, model); options?.onPayload?.(payload);
payloads.push(payload); payloads.push(payload);
return {} as ReturnType<StreamFn>; return {} as ReturnType<StreamFn>;
}; };
@@ -381,7 +381,7 @@ describe("applyExtraParamsToAgent", () => {
const payloads: Record<string, unknown>[] = []; const payloads: Record<string, unknown>[] = [];
const baseStreamFn: StreamFn = (_model, _context, options) => { const baseStreamFn: StreamFn = (_model, _context, options) => {
const payload: Record<string, unknown> = { reasoning_effort: "medium" }; const payload: Record<string, unknown> = { reasoning_effort: "medium" };
options?.onPayload?.(payload, model); options?.onPayload?.(payload);
payloads.push(payload); payloads.push(payload);
return {} as ReturnType<StreamFn>; return {} as ReturnType<StreamFn>;
}; };
@@ -588,7 +588,7 @@ describe("applyExtraParamsToAgent", () => {
const payloads: Record<string, unknown>[] = []; const payloads: Record<string, unknown>[] = [];
const baseStreamFn: StreamFn = (_model, _context, options) => { const baseStreamFn: StreamFn = (_model, _context, options) => {
const payload: Record<string, unknown> = { thinking: "off" }; const payload: Record<string, unknown> = { thinking: "off" };
options?.onPayload?.(payload, model); options?.onPayload?.(payload);
payloads.push(payload); payloads.push(payload);
return {} as ReturnType<StreamFn>; return {} as ReturnType<StreamFn>;
}; };
@@ -619,7 +619,7 @@ describe("applyExtraParamsToAgent", () => {
const payloads: Record<string, unknown>[] = []; const payloads: Record<string, unknown>[] = [];
const baseStreamFn: StreamFn = (_model, _context, options) => { const baseStreamFn: StreamFn = (_model, _context, options) => {
const payload: Record<string, unknown> = { thinking: "off" }; const payload: Record<string, unknown> = { thinking: "off" };
options?.onPayload?.(payload, model); options?.onPayload?.(payload);
payloads.push(payload); payloads.push(payload);
return {} as ReturnType<StreamFn>; return {} as ReturnType<StreamFn>;
}; };
@@ -650,7 +650,7 @@ describe("applyExtraParamsToAgent", () => {
const payloads: Record<string, unknown>[] = []; const payloads: Record<string, unknown>[] = [];
const baseStreamFn: StreamFn = (_model, _context, options) => { const baseStreamFn: StreamFn = (_model, _context, options) => {
const payload: Record<string, unknown> = {}; const payload: Record<string, unknown> = {};
options?.onPayload?.(payload, model); options?.onPayload?.(payload);
payloads.push(payload); payloads.push(payload);
return {} as ReturnType<StreamFn>; return {} as ReturnType<StreamFn>;
}; };
@@ -674,7 +674,7 @@ describe("applyExtraParamsToAgent", () => {
const payloads: Record<string, unknown>[] = []; const payloads: Record<string, unknown>[] = [];
const baseStreamFn: StreamFn = (_model, _context, options) => { const baseStreamFn: StreamFn = (_model, _context, options) => {
const payload: Record<string, unknown> = { tool_choice: "required" }; const payload: Record<string, unknown> = { tool_choice: "required" };
options?.onPayload?.(payload, model); options?.onPayload?.(payload);
payloads.push(payload); payloads.push(payload);
return {} as ReturnType<StreamFn>; return {} as ReturnType<StreamFn>;
}; };
@@ -699,7 +699,7 @@ describe("applyExtraParamsToAgent", () => {
const payloads: Record<string, unknown>[] = []; const payloads: Record<string, unknown>[] = [];
const baseStreamFn: StreamFn = (_model, _context, options) => { const baseStreamFn: StreamFn = (_model, _context, options) => {
const payload: Record<string, unknown> = {}; const payload: Record<string, unknown> = {};
options?.onPayload?.(payload, model); options?.onPayload?.(payload);
payloads.push(payload); payloads.push(payload);
return {} as ReturnType<StreamFn>; return {} as ReturnType<StreamFn>;
}; };
@@ -749,7 +749,7 @@ describe("applyExtraParamsToAgent", () => {
], ],
tool_choice: { type: "tool", name: "read" }, tool_choice: { type: "tool", name: "read" },
}; };
options?.onPayload?.(payload, model); options?.onPayload?.(payload);
payloads.push(payload); payloads.push(payload);
return {} as ReturnType<StreamFn>; return {} as ReturnType<StreamFn>;
}; };
@@ -793,7 +793,7 @@ describe("applyExtraParamsToAgent", () => {
}, },
], ],
}; };
options?.onPayload?.(payload, model); options?.onPayload?.(payload);
payloads.push(payload); payloads.push(payload);
return {} as ReturnType<StreamFn>; return {} as ReturnType<StreamFn>;
}; };
@@ -832,7 +832,7 @@ describe("applyExtraParamsToAgent", () => {
}, },
], ],
}; };
options?.onPayload?.(payload, model); options?.onPayload?.(payload);
payloads.push(payload); payloads.push(payload);
return {} as ReturnType<StreamFn>; return {} as ReturnType<StreamFn>;
}; };
@@ -896,7 +896,7 @@ describe("applyExtraParamsToAgent", () => {
}, },
}, },
}; };
options?.onPayload?.(payload, model); options?.onPayload?.(payload);
payloads.push(payload); payloads.push(payload);
return {} as ReturnType<StreamFn>; return {} as ReturnType<StreamFn>;
}; };
@@ -943,7 +943,7 @@ describe("applyExtraParamsToAgent", () => {
}, },
}, },
}; };
options?.onPayload?.(payload, model); options?.onPayload?.(payload);
payloads.push(payload); payloads.push(payload);
return {} as ReturnType<StreamFn>; return {} as ReturnType<StreamFn>;
}; };

View File

@@ -277,7 +277,7 @@ export function createAnthropicToolPayloadCompatibilityWrapper(
const originalOnPayload = options?.onPayload; const originalOnPayload = options?.onPayload;
return underlying(model, context, { return underlying(model, context, {
...options, ...options,
onPayload: (payload, payloadModel) => { onPayload: (payload) => {
if ( if (
payload && payload &&
typeof payload === "object" && typeof payload === "object" &&
@@ -298,7 +298,7 @@ export function createAnthropicToolPayloadCompatibilityWrapper(
); );
} }
} }
return originalOnPayload?.(payload, payloadModel); return originalOnPayload?.(payload);
}, },
}); });
}; };

View File

@@ -19,7 +19,7 @@ function applyAndCapture(params: {
const baseStreamFn: StreamFn = (_model, _context, options) => { const baseStreamFn: StreamFn = (_model, _context, options) => {
captured.headers = options?.headers; captured.headers = options?.headers;
options?.onPayload?.({}, model); options?.onPayload?.({});
return createAssistantMessageEventStream(); return createAssistantMessageEventStream();
}; };
const agent = { streamFn: baseStreamFn }; const agent = { streamFn: baseStreamFn };
@@ -97,7 +97,7 @@ describe("extra-params: Kilocode kilo/auto reasoning", () => {
const baseStreamFn: StreamFn = (_model, _context, options) => { const baseStreamFn: StreamFn = (_model, _context, options) => {
const payload: Record<string, unknown> = { reasoning_effort: "high" }; const payload: Record<string, unknown> = { reasoning_effort: "high" };
options?.onPayload?.(payload, model); options?.onPayload?.(payload);
capturedPayload = payload; capturedPayload = payload;
return createAssistantMessageEventStream(); return createAssistantMessageEventStream();
}; };
@@ -125,7 +125,7 @@ describe("extra-params: Kilocode kilo/auto reasoning", () => {
const baseStreamFn: StreamFn = (_model, _context, options) => { const baseStreamFn: StreamFn = (_model, _context, options) => {
const payload: Record<string, unknown> = {}; const payload: Record<string, unknown> = {};
options?.onPayload?.(payload, model); options?.onPayload?.(payload);
capturedPayload = payload; capturedPayload = payload;
return createAssistantMessageEventStream(); return createAssistantMessageEventStream();
}; };
@@ -158,7 +158,7 @@ describe("extra-params: Kilocode kilo/auto reasoning", () => {
const baseStreamFn: StreamFn = (_model, _context, options) => { const baseStreamFn: StreamFn = (_model, _context, options) => {
const payload: Record<string, unknown> = { reasoning_effort: "high" }; const payload: Record<string, unknown> = { reasoning_effort: "high" };
options?.onPayload?.(payload, model); options?.onPayload?.(payload);
capturedPayload = payload; capturedPayload = payload;
return createAssistantMessageEventStream(); return createAssistantMessageEventStream();
}; };

View File

@@ -13,7 +13,7 @@ type StreamPayload = {
function runOpenRouterPayload(payload: StreamPayload, modelId: string) { function runOpenRouterPayload(payload: StreamPayload, modelId: string) {
const baseStreamFn: StreamFn = (_model, _context, options) => { const baseStreamFn: StreamFn = (_model, _context, options) => {
options?.onPayload?.(payload, model); options?.onPayload?.(payload);
return createAssistantMessageEventStream(); return createAssistantMessageEventStream();
}; };
const agent = { streamFn: baseStreamFn }; const agent = { streamFn: baseStreamFn };

View File

@@ -222,7 +222,7 @@ function createGoogleThinkingPayloadWrapper(
const onPayload = options?.onPayload; const onPayload = options?.onPayload;
return underlying(model, context, { return underlying(model, context, {
...options, ...options,
onPayload: (payload, payloadModel) => { onPayload: (payload) => {
if (model.api === "google-generative-ai") { if (model.api === "google-generative-ai") {
sanitizeGoogleThinkingPayload({ sanitizeGoogleThinkingPayload({
payload, payload,
@@ -230,7 +230,7 @@ function createGoogleThinkingPayloadWrapper(
thinkingLevel, thinkingLevel,
}); });
} }
return onPayload?.(payload, payloadModel); return onPayload?.(payload);
}, },
}); });
}; };
@@ -258,12 +258,12 @@ function createZaiToolStreamWrapper(
const originalOnPayload = options?.onPayload; const originalOnPayload = options?.onPayload;
return underlying(model, context, { return underlying(model, context, {
...options, ...options,
onPayload: (payload, payloadModel) => { onPayload: (payload) => {
if (payload && typeof payload === "object") { if (payload && typeof payload === "object") {
// Inject tool_stream: true for Z.AI API // Inject tool_stream: true for Z.AI API
(payload as Record<string, unknown>).tool_stream = true; (payload as Record<string, unknown>).tool_stream = true;
} }
return originalOnPayload?.(payload, payloadModel); return originalOnPayload?.(payload);
}, },
}); });
}; };
@@ -306,11 +306,11 @@ function createParallelToolCallsWrapper(
const originalOnPayload = options?.onPayload; const originalOnPayload = options?.onPayload;
return underlying(model, context, { return underlying(model, context, {
...options, ...options,
onPayload: (payload, payloadModel) => { onPayload: (payload) => {
if (payload && typeof payload === "object") { if (payload && typeof payload === "object") {
(payload as Record<string, unknown>).parallel_tool_calls = enabled; (payload as Record<string, unknown>).parallel_tool_calls = enabled;
} }
return originalOnPayload?.(payload, payloadModel); return originalOnPayload?.(payload);
}, },
}); });
}; };

View File

@@ -22,7 +22,7 @@ type ToolStreamCase = {
function runToolStreamCase(params: ToolStreamCase) { function runToolStreamCase(params: ToolStreamCase) {
const payload: Record<string, unknown> = { model: params.model.id, messages: [] }; const payload: Record<string, unknown> = { model: params.model.id, messages: [] };
const baseStreamFn: StreamFn = (model, _context, options) => { const baseStreamFn: StreamFn = (model, _context, options) => {
options?.onPayload?.(payload, model); options?.onPayload?.(payload);
return {} as ReturnType<StreamFn>; return {} as ReturnType<StreamFn>;
}; };
const agent = { streamFn: baseStreamFn }; const agent = { streamFn: baseStreamFn };

View File

@@ -53,14 +53,14 @@ export function createSiliconFlowThinkingWrapper(baseStreamFn: StreamFn | undefi
const originalOnPayload = options?.onPayload; const originalOnPayload = options?.onPayload;
return underlying(model, context, { return underlying(model, context, {
...options, ...options,
onPayload: (payload, payloadModel) => { onPayload: (payload) => {
if (payload && typeof payload === "object") { if (payload && typeof payload === "object") {
const payloadObj = payload as Record<string, unknown>; const payloadObj = payload as Record<string, unknown>;
if (payloadObj.thinking === "off") { if (payloadObj.thinking === "off") {
payloadObj.thinking = null; payloadObj.thinking = null;
} }
} }
return originalOnPayload?.(payload, payloadModel); return originalOnPayload?.(payload);
}, },
}); });
}; };
@@ -89,7 +89,7 @@ export function createMoonshotThinkingWrapper(
const originalOnPayload = options?.onPayload; const originalOnPayload = options?.onPayload;
return underlying(model, context, { return underlying(model, context, {
...options, ...options,
onPayload: (payload, payloadModel) => { onPayload: (payload) => {
if (payload && typeof payload === "object") { if (payload && typeof payload === "object") {
const payloadObj = payload as Record<string, unknown>; const payloadObj = payload as Record<string, unknown>;
let effectiveThinkingType = normalizeMoonshotThinkingType(payloadObj.thinking); let effectiveThinkingType = normalizeMoonshotThinkingType(payloadObj.thinking);
@@ -106,7 +106,7 @@ export function createMoonshotThinkingWrapper(
payloadObj.tool_choice = "auto"; payloadObj.tool_choice = "auto";
} }
} }
return originalOnPayload?.(payload, payloadModel); return originalOnPayload?.(payload);
}, },
}); });
}; };

View File

@@ -187,7 +187,7 @@ export function createOpenAIResponsesContextManagementWrapper(
const originalOnPayload = options?.onPayload; const originalOnPayload = options?.onPayload;
return underlying(model, context, { return underlying(model, context, {
...options, ...options,
onPayload: (payload, payloadModel) => { onPayload: (payload) => {
if (payload && typeof payload === "object") { if (payload && typeof payload === "object") {
applyOpenAIResponsesPayloadOverrides({ applyOpenAIResponsesPayloadOverrides({
payloadObj: payload as Record<string, unknown>, payloadObj: payload as Record<string, unknown>,
@@ -197,7 +197,7 @@ export function createOpenAIResponsesContextManagementWrapper(
compactThreshold, compactThreshold,
}); });
} }
return originalOnPayload?.(payload, payloadModel); return originalOnPayload?.(payload);
}, },
}); });
}; };
@@ -219,14 +219,14 @@ export function createOpenAIServiceTierWrapper(
const originalOnPayload = options?.onPayload; const originalOnPayload = options?.onPayload;
return underlying(model, context, { return underlying(model, context, {
...options, ...options,
onPayload: (payload, payloadModel) => { onPayload: (payload) => {
if (payload && typeof payload === "object") { if (payload && typeof payload === "object") {
const payloadObj = payload as Record<string, unknown>; const payloadObj = payload as Record<string, unknown>;
if (payloadObj.service_tier === undefined) { if (payloadObj.service_tier === undefined) {
payloadObj.service_tier = serviceTier; payloadObj.service_tier = serviceTier;
} }
} }
return originalOnPayload?.(payload, payloadModel); return originalOnPayload?.(payload);
}, },
}); });
}; };

View File

@@ -73,7 +73,7 @@ export function createOpenRouterSystemCacheWrapper(baseStreamFn: StreamFn | unde
const originalOnPayload = options?.onPayload; const originalOnPayload = options?.onPayload;
return underlying(model, context, { return underlying(model, context, {
...options, ...options,
onPayload: (payload, payloadModel) => { onPayload: (payload) => {
const messages = (payload as Record<string, unknown>)?.messages; const messages = (payload as Record<string, unknown>)?.messages;
if (Array.isArray(messages)) { if (Array.isArray(messages)) {
for (const msg of messages as Array<{ role?: string; content?: unknown }>) { for (const msg of messages as Array<{ role?: string; content?: unknown }>) {
@@ -92,7 +92,7 @@ export function createOpenRouterSystemCacheWrapper(baseStreamFn: StreamFn | unde
} }
} }
} }
return originalOnPayload?.(payload, payloadModel); return originalOnPayload?.(payload);
}, },
}); });
}; };
@@ -111,9 +111,9 @@ export function createOpenRouterWrapper(
...OPENROUTER_APP_HEADERS, ...OPENROUTER_APP_HEADERS,
...options?.headers, ...options?.headers,
}, },
onPayload: (payload, payloadModel) => { onPayload: (payload) => {
normalizeProxyReasoningPayload(payload, thinkingLevel); normalizeProxyReasoningPayload(payload, thinkingLevel);
return onPayload?.(payload, payloadModel); return onPayload?.(payload);
}, },
}); });
}; };
@@ -136,9 +136,9 @@ export function createKilocodeWrapper(
...options?.headers, ...options?.headers,
...resolveKilocodeAppHeaders(), ...resolveKilocodeAppHeaders(),
}, },
onPayload: (payload, payloadModel) => { onPayload: (payload) => {
normalizeProxyReasoningPayload(payload, thinkingLevel); normalizeProxyReasoningPayload(payload, thinkingLevel);
return onPayload?.(payload, payloadModel); return onPayload?.(payload);
}, },
}); });
}; };

View File

@@ -520,7 +520,7 @@ describe("wrapOllamaCompatNumCtx", () => {
let payloadSeen: Record<string, unknown> | undefined; let payloadSeen: Record<string, unknown> | undefined;
const baseFn = vi.fn((_model, _context, options) => { const baseFn = vi.fn((_model, _context, options) => {
const payload: Record<string, unknown> = { options: { temperature: 0.1 } }; const payload: Record<string, unknown> = { options: { temperature: 0.1 } };
options?.onPayload?.(payload, _model); options?.onPayload?.(payload);
payloadSeen = payload; payloadSeen = payload;
return {} as never; return {} as never;
}); });

View File

@@ -228,16 +228,16 @@ export function wrapOllamaCompatNumCtx(baseFn: StreamFn | undefined, numCtx: num
return (model, context, options) => return (model, context, options) =>
streamFn(model, context, { streamFn(model, context, {
...options, ...options,
onPayload: (payload: unknown, payloadModel) => { onPayload: (payload: unknown) => {
if (!payload || typeof payload !== "object") { if (!payload || typeof payload !== "object") {
return options?.onPayload?.(payload, payloadModel); return options?.onPayload?.(payload);
} }
const payloadRecord = payload as Record<string, unknown>; const payloadRecord = payload as Record<string, unknown>;
if (!payloadRecord.options || typeof payloadRecord.options !== "object") { if (!payloadRecord.options || typeof payloadRecord.options !== "object") {
payloadRecord.options = {}; payloadRecord.options = {};
} }
(payloadRecord.options as Record<string, unknown>).num_ctx = numCtx; (payloadRecord.options as Record<string, unknown>).num_ctx = numCtx;
return options?.onPayload?.(payload, payloadModel); return options?.onPayload?.(payload);
}, },
}); });
} }
@@ -869,13 +869,7 @@ export async function runEmbeddedAttempt(
runId: params.runId, runId: params.runId,
agentDir, agentDir,
workspaceDir: effectiveWorkspace, workspaceDir: effectiveWorkspace,
// When sandboxing uses a copied workspace (`ro` or `none`), effectiveWorkspace points
// at the sandbox copy. Spawned subagents should inherit the real workspace instead.
spawnWorkspaceDir:
sandbox?.enabled && sandbox.workspaceAccess !== "rw" ? resolvedWorkspace : undefined,
config: params.config, config: params.config,
trigger: params.trigger,
memoryFlushWritePath: params.memoryFlushWritePath,
abortSignal: runAbortController.signal, abortSignal: runAbortController.signal,
modelProvider: params.model.provider, modelProvider: params.model.provider,
modelId: params.modelId, modelId: params.modelId,
@@ -1550,7 +1544,6 @@ export async function runEmbeddedAttempt(
getMessagingToolSentTargets, getMessagingToolSentTargets,
getSuccessfulCronAdds, getSuccessfulCronAdds,
didSendViaMessagingTool, didSendViaMessagingTool,
didSendDeterministicApprovalPrompt,
getLastToolError, getLastToolError,
getUsageTotals, getUsageTotals,
getCompactionCount, getCompactionCount,
@@ -2065,7 +2058,6 @@ export async function runEmbeddedAttempt(
lastAssistant, lastAssistant,
lastToolError: getLastToolError?.(), lastToolError: getLastToolError?.(),
didSendViaMessagingTool: didSendViaMessagingTool(), didSendViaMessagingTool: didSendViaMessagingTool(),
didSendDeterministicApprovalPrompt: didSendDeterministicApprovalPrompt(),
messagingToolSentTexts: getMessagingToolSentTexts(), messagingToolSentTexts: getMessagingToolSentTexts(),
messagingToolSentMediaUrls: getMessagingToolSentMediaUrls(), messagingToolSentMediaUrls: getMessagingToolSentMediaUrls(),
messagingToolSentTargets: getMessagingToolSentTargets(), messagingToolSentTargets: getMessagingToolSentTargets(),

View File

@@ -1,5 +1,5 @@
import type { OAuthCredentials } from "@mariozechner/pi-ai/oauth"; import type { OAuthCredentials } from "@mariozechner/pi-ai";
import { loginOpenAICodex } from "@mariozechner/pi-ai/oauth"; import { loginOpenAICodex } from "@mariozechner/pi-ai";
import type { RuntimeEnv } from "../runtime.js"; import type { RuntimeEnv } from "../runtime.js";
import type { WizardPrompter } from "../wizard/prompts.js"; import type { WizardPrompter } from "../wizard/prompts.js";
import { createVpsAwareOAuthHandlers } from "./oauth-flow.js"; import { createVpsAwareOAuthHandlers } from "./oauth-flow.js";