diff --git a/extensions/whatsapp/src/auto-reply/deliver-reply.ts b/extensions/whatsapp/src/auto-reply/deliver-reply.ts index 3c4adcd415f..f1fe0705e39 100644 --- a/extensions/whatsapp/src/auto-reply/deliver-reply.ts +++ b/extensions/whatsapp/src/auto-reply/deliver-reply.ts @@ -24,6 +24,7 @@ import { elide } from "./util.js"; export async function deliverWebReply(params: { replyResult: ReplyPayload; + normalizedReplyResult?: ReturnType>; msg: WebInboundMsg; mediaLocalRoots?: readonly string[]; maxMediaBytes: number; @@ -45,9 +46,11 @@ export async function deliverWebReply(params: { } const tableMode = params.tableMode ?? "code"; const chunkMode = params.chunkMode ?? "length"; - const normalizedReply = normalizeWhatsAppOutboundPayload(replyResult, { - normalizeText: normalizeWhatsAppPayloadTextPreservingIndentation, - }); + const normalizedReply = + params.normalizedReplyResult ?? + normalizeWhatsAppOutboundPayload(replyResult, { + normalizeText: normalizeWhatsAppPayloadTextPreservingIndentation, + }); const convertedText = markdownToWhatsApp(convertMarkdownTables(normalizedReply.text, tableMode)); const textChunks = chunkMarkdownTextWithMode(convertedText, textLimit, chunkMode); const mediaList = normalizedReply.mediaUrls ?? []; diff --git a/extensions/whatsapp/src/auto-reply/monitor/inbound-dispatch.ts b/extensions/whatsapp/src/auto-reply/monitor/inbound-dispatch.ts index 429933945cc..2d8e210ff92 100644 --- a/extensions/whatsapp/src/auto-reply/monitor/inbound-dispatch.ts +++ b/extensions/whatsapp/src/auto-reply/monitor/inbound-dispatch.ts @@ -327,6 +327,7 @@ export async function dispatchWhatsAppBufferedReply(params: { } await params.deliverReply({ replyResult: normalizedDeliveryPayload, + normalizedReplyResult: normalizedDeliveryPayload, msg: params.msg, mediaLocalRoots, maxMediaBytes: params.maxMediaBytes, diff --git a/src/shared/text/assistant-visible-text.test.ts b/src/shared/text/assistant-visible-text.test.ts index c30deeb9688..7dfb1392cd2 100644 --- a/src/shared/text/assistant-visible-text.test.ts +++ b/src/shared/text/assistant-visible-text.test.ts @@ -2,6 +2,7 @@ import { describe, expect, it } from "vitest"; import { sanitizeAssistantVisibleText, sanitizeAssistantVisibleTextWithProfile, + stripToolCallXmlTags, stripAssistantInternalScaffolding, } from "./assistant-visible-text.js"; import { stripModelSpecialTokens } from "./model-special-tokens.js"; @@ -504,6 +505,17 @@ describe("stripAssistantInternalScaffolding", () => { }); }); +describe("stripToolCallXmlTags", () => { + it("strips plural function/tool wrapper XML only when the opt-in flag is enabled", () => { + const input = + 'prefix secret suffix'; + expect(stripToolCallXmlTags(input)).toBe(input); + expect(stripToolCallXmlTags(input, { stripFunctionCallsXmlPayloads: true })).toBe( + "prefix suffix", + ); + }); +}); + describe("sanitizeAssistantVisibleText", () => { it("strips minimax, tool XML, downgraded tool markers, and think tags in one pass", () => { const input = [