fix(workbench): dedupe final assistant trace rows (#2009)

This commit is contained in:
Lyon
2026-06-24 03:11:16 +08:00
committed by GitHub
parent b61fb4e65c
commit da86d56821
+16 -1
View File
@@ -20,6 +20,7 @@ export function traceDisplayRows(trace: Record<string, unknown> = {}, events: Tr
const orderedEvents = traceEventsForDisplay(events);
const effectiveTrace = traceWithInferredStart(trace, orderedEvents);
const finalResponseText = traceFinalResponseText(effectiveTrace);
const finalResponseFingerprint = traceMessageFingerprint(finalResponseText);
const hasCompletionEvent = orderedEvents.some(isCompletionTraceEvent);
const rows: TraceEventRow[] = [];
const renderedSourceEvents = new Set<string>();
@@ -58,6 +59,7 @@ export function traceDisplayRows(trace: Record<string, unknown> = {}, events: Tr
continue;
}
if (isAssistantTraceEvent(event)) {
if (finalResponseFingerprint && traceAssistantEventFingerprint(effectiveTrace, event) === finalResponseFingerprint) continue;
rows.push(traceAssistantMessageRow(effectiveTrace, event, { terminal: false }, options));
continue;
}
@@ -214,7 +216,7 @@ export function traceNoiseEventCount(events: TraceEvent[] = []): number {
}
function traceAssistantMessageRow(trace: Record<string, unknown>, event: TraceEvent, { terminal }: { terminal: boolean }, options: TraceDisplayRowsOptions): TraceEventRow {
const text = cleanTraceDetailText(event.message ?? event.outputSummary ?? assistantStreamText(trace, event) ?? "");
const text = traceAssistantEventText(trace, event);
const index = Number.isInteger(event.messageIndex) ? Number(event.messageIndex) : null;
const count = Number.isInteger(event.messageCount) ? Number(event.messageCount) : null;
const eventKey = traceEventIdentityToken(event);
@@ -229,6 +231,19 @@ function traceAssistantMessageRow(trace: Record<string, unknown>, event: TraceEv
};
}
function traceAssistantEventText(trace: Record<string, unknown>, event: TraceEvent): string {
return cleanTraceDetailText(event.message ?? event.outputSummary ?? assistantStreamText(trace, event) ?? "");
}
function traceAssistantEventFingerprint(trace: Record<string, unknown>, event: TraceEvent): string | null {
return traceMessageFingerprint(traceAssistantEventText(trace, event));
}
function traceMessageFingerprint(value: unknown): string | null {
const text = cleanTraceDetailText(value ?? "").replace(/\s+/gu, " ").trim();
return text || null;
}
function traceFinalResponseRow(event: TraceEvent, finalText: string, options: TraceDisplayRowsOptions): TraceEventRow {
const eventKey = traceEventIdentityToken(event);
return {