
























@@ -234,7 +234,6 @@ function stripStaleAssistantUsageBeforeLatestCompaction(messages: AgentMessage[]
234234// content and, on Bedrock or strict OpenAI-compatible providers, can also
235235// trigger turn-ordering rejections.
236236const TRANSCRIPT_ONLY_OPENCLAW_MODELS = new Set<string>(["delivery-mirror", "gateway-injected"]);
237-const OMITTED_INBOUND_METADATA_TEXT = "[assistant copied inbound metadata omitted]";
238237239238function sanitizeUserReplayContent(message: AgentMessage): AgentMessage | null {
240239if (!message || message.role !== "user") {
@@ -282,6 +281,49 @@ function isTranscriptOnlyOpenclawAssistant(message: AgentMessage): boolean {
282281);
283282}
284283284+function normalizeAssistantReplayTextContent(message: AgentMessage, replayContent: string) {
285+const strippedText = stripInboundMetadata(replayContent);
286+if (!strippedText.trim()) {
287+return null;
288+}
289+return {
290+ ...message,
291+content: [{ type: "text", text: strippedText }],
292+} as AgentMessage;
293+}
294+295+function normalizeAssistantReplayBlockContent(message: AgentMessage, replayContent: unknown[]) {
296+let touched = false;
297+const sanitizedContent: unknown[] = [];
298+for (const block of replayContent) {
299+if (!block || typeof block !== "object") {
300+sanitizedContent.push(block);
301+continue;
302+}
303+const text = (block as { text?: unknown }).text;
304+if (typeof text !== "string") {
305+sanitizedContent.push(block);
306+continue;
307+}
308+const strippedText = stripInboundMetadata(text);
309+if (strippedText === text) {
310+sanitizedContent.push(block);
311+continue;
312+}
313+touched = true;
314+if (strippedText.trim()) {
315+sanitizedContent.push({ ...block, text: strippedText });
316+}
317+}
318+if (!touched) {
319+return message;
320+}
321+if (sanitizedContent.length === 0) {
322+return null;
323+}
324+return { ...message, content: sanitizedContent } as AgentMessage;
325+}
326+285327export function normalizeAssistantReplayContent(messages: AgentMessage[]): AgentMessage[] {
286328let touched = false;
287329const out: AgentMessage[] = [];
@@ -308,44 +350,19 @@ export function normalizeAssistantReplayContent(messages: AgentMessage[]): Agent
308350}
309351const replayContent = (message as { content?: unknown }).content;
310352if (typeof replayContent === "string") {
311-const strippedText = stripInboundMetadata(replayContent);
312-out.push({
313- ...message,
314-content: [
315-{
316-type: "text",
317-text: strippedText.trim() ? strippedText : OMITTED_INBOUND_METADATA_TEXT,
318-},
319-],
320-});
353+const normalized = normalizeAssistantReplayTextContent(message, replayContent);
354+if (normalized) {
355+out.push(normalized);
356+}
321357touched = true;
322358continue;
323359}
324360if (Array.isArray(replayContent)) {
325-let contentTouched = false;
326-const sanitizedContent = replayContent.map((block) => {
327-if (!block || typeof block !== "object") {
328-return block;
329-}
330-const text = (block as { text?: unknown }).text;
331-if (typeof text !== "string") {
332-return block;
333-}
334-const strippedText = stripInboundMetadata(text);
335-if (strippedText === text) {
336-return block;
361+const normalized = normalizeAssistantReplayBlockContent(message, replayContent);
362+if (normalized !== message) {
363+if (normalized) {
364+out.push(normalized);
337365}
338-contentTouched = true;
339-return {
340- ...block,
341-text: strippedText.trim() ? strippedText : OMITTED_INBOUND_METADATA_TEXT,
342-};
343-});
344-if (contentTouched) {
345-out.push({
346- ...message,
347-content: sanitizedContent,
348-});
349366touched = true;
350367continue;
351368}
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。