From 1d2c5783fd0cbf45b1201b7a1369079e8b852c7f Mon Sep 17 00:00:00 2001 From: 0xRain Date: Thu, 12 Feb 2026 07:42:24 +0800 Subject: [PATCH] fix(agents): enable tool call ID sanitization for Anthropic provider (#13830) Co-authored-by: 0xRaini <0xRaini@users.noreply.github.com> --- ...ed-runner.sanitize-session-history.test.ts | 4 +- src/agents/transcript-policy.test.ts | 41 +++++++++++++++++++ src/agents/transcript-policy.ts | 2 +- 3 files changed, 44 insertions(+), 3 deletions(-) create mode 100644 src/agents/transcript-policy.test.ts diff --git a/src/agents/pi-embedded-runner.sanitize-session-history.test.ts b/src/agents/pi-embedded-runner.sanitize-session-history.test.ts index 6ee05837bfc..d8efba99a22 100644 --- a/src/agents/pi-embedded-runner.sanitize-session-history.test.ts +++ b/src/agents/pi-embedded-runner.sanitize-session-history.test.ts @@ -76,7 +76,7 @@ describe("sanitizeSessionHistory", () => { ); }); - it("does not sanitize tool call ids for non-Google APIs", async () => { + it("sanitizes tool call ids for Anthropic APIs", async () => { vi.mocked(helpers.isGoogleModelApi).mockReturnValue(false); await sanitizeSessionHistory({ @@ -90,7 +90,7 @@ describe("sanitizeSessionHistory", () => { expect(helpers.sanitizeSessionMessagesImages).toHaveBeenCalledWith( mockMessages, "session:history", - expect.objectContaining({ sanitizeMode: "full", sanitizeToolCallIds: false }), + expect.objectContaining({ sanitizeMode: "full", sanitizeToolCallIds: true }), ); }); diff --git a/src/agents/transcript-policy.test.ts b/src/agents/transcript-policy.test.ts new file mode 100644 index 00000000000..48977ec98fe --- /dev/null +++ b/src/agents/transcript-policy.test.ts @@ -0,0 +1,41 @@ +import { describe, expect, it } from "vitest"; +import { resolveTranscriptPolicy } from "./transcript-policy.js"; + +describe("resolveTranscriptPolicy", () => { + it("enables sanitizeToolCallIds for Anthropic provider", () => { + const policy = resolveTranscriptPolicy({ + provider: "anthropic", + modelId: "claude-opus-4-5", + modelApi: "anthropic-messages", + }); + expect(policy.sanitizeToolCallIds).toBe(true); + expect(policy.toolCallIdMode).toBe("strict"); + }); + + it("enables sanitizeToolCallIds for Google provider", () => { + const policy = resolveTranscriptPolicy({ + provider: "google", + modelId: "gemini-2.0-flash", + modelApi: "google-generative-ai", + }); + expect(policy.sanitizeToolCallIds).toBe(true); + }); + + it("enables sanitizeToolCallIds for Mistral provider", () => { + const policy = resolveTranscriptPolicy({ + provider: "mistral", + modelId: "mistral-large-latest", + }); + expect(policy.sanitizeToolCallIds).toBe(true); + expect(policy.toolCallIdMode).toBe("strict9"); + }); + + it("disables sanitizeToolCallIds for OpenAI provider", () => { + const policy = resolveTranscriptPolicy({ + provider: "openai", + modelId: "gpt-4o", + modelApi: "openai", + }); + expect(policy.sanitizeToolCallIds).toBe(false); + }); +}); diff --git a/src/agents/transcript-policy.ts b/src/agents/transcript-policy.ts index 6d74c3832b7..22e173320b5 100644 --- a/src/agents/transcript-policy.ts +++ b/src/agents/transcript-policy.ts @@ -95,7 +95,7 @@ export function resolveTranscriptPolicy(params: { const needsNonImageSanitize = isGoogle || isAnthropic || isMistral || isOpenRouterGemini; - const sanitizeToolCallIds = isGoogle || isMistral; + const sanitizeToolCallIds = isGoogle || isMistral || isAnthropic; const toolCallIdMode: ToolCallIdMode | undefined = isMistral ? "strict9" : sanitizeToolCallIds