fix(agents): make image sanitization dimension configurable

This commit is contained in:
Peter Steinberger
2026-02-18 00:43:31 +01:00
parent 5ee79f80eb
commit b05e89e5e6
21 changed files with 156 additions and 45 deletions

View File

@@ -1,4 +1,5 @@
import type { AgentMessage, AgentToolResult } from "@mariozechner/pi-agent-core";
import type { ImageSanitizationLimits } from "../image-sanitization.js";
import type { ToolCallIdMode } from "../tool-call-id.js";
import { sanitizeToolCallIdsForCloudCodeAssist } from "../tool-call-id.js";
import { sanitizeContentBlocksImages } from "../tool-images.js";
@@ -45,12 +46,16 @@ export async function sanitizeSessionMessagesImages(
allowBase64Only?: boolean;
includeCamelCase?: boolean;
};
},
} & ImageSanitizationLimits,
): Promise<AgentMessage[]> {
const sanitizeMode = options?.sanitizeMode ?? "full";
const allowNonImageSanitization = sanitizeMode === "full";
const imageSanitization = {
maxDimensionPx: options?.maxDimensionPx,
maxBytes: options?.maxBytes,
};
// We sanitize historical session messages because Anthropic can reject a request
// if the transcript contains oversized base64 images (see MAX_IMAGE_DIMENSION_PX).
// if the transcript contains oversized base64 images (default max side 1200px).
const sanitizedIds =
allowNonImageSanitization && options?.sanitizeToolCallIds
? sanitizeToolCallIdsForCloudCodeAssist(messages, options.toolCallIdMode)
@@ -69,6 +74,7 @@ export async function sanitizeSessionMessagesImages(
const nextContent = (await sanitizeContentBlocksImages(
content,
label,
imageSanitization,
)) as unknown as typeof toolMsg.content;
out.push({ ...toolMsg, content: nextContent });
continue;
@@ -81,6 +87,7 @@ export async function sanitizeSessionMessagesImages(
const nextContent = (await sanitizeContentBlocksImages(
content as unknown as ContentBlock[],
label,
imageSanitization,
)) as unknown as typeof userMsg.content;
out.push({ ...userMsg, content: nextContent });
continue;
@@ -95,6 +102,7 @@ export async function sanitizeSessionMessagesImages(
const nextContent = (await sanitizeContentBlocksImages(
content as unknown as ContentBlock[],
label,
imageSanitization,
)) as unknown as typeof assistantMsg.content;
out.push({ ...assistantMsg, content: nextContent });
} else {
@@ -108,6 +116,7 @@ export async function sanitizeSessionMessagesImages(
const nextContent = (await sanitizeContentBlocksImages(
content as unknown as ContentBlock[],
label,
imageSanitization,
)) as unknown as typeof assistantMsg.content;
out.push({ ...assistantMsg, content: nextContent });
continue;
@@ -129,6 +138,7 @@ export async function sanitizeSessionMessagesImages(
const finalContent = (await sanitizeContentBlocksImages(
filteredContent as unknown as ContentBlock[],
label,
imageSanitization,
)) as unknown as typeof assistantMsg.content;
if (finalContent.length === 0) {
continue;