diff --git a/web/hwlab-cloud-web/src/components/agent/TraceTimeline.vue b/web/hwlab-cloud-web/src/components/agent/TraceTimeline.vue index 17af8559..ea2dbfd4 100644 --- a/web/hwlab-cloud-web/src/components/agent/TraceTimeline.vue +++ b/web/hwlab-cloud-web/src/components/agent/TraceTimeline.vue @@ -91,7 +91,7 @@ function filterReadableRows(rows: TraceEventRow[], hideSealedFinalResponse: bool function traceRowDuplicatesSealedFinal(row: TraceEventRow): boolean { if (rowIsTool(row)) return false; if (row.rowId.startsWith("trace-final-response:")) return true; - return row.terminal === true && /(?:助手最终消息|assistant\s+(?:final\s+)?message)/iu.test(String(row.header ?? "")); + return /(?:助手(?:最终)?消息|assistant\s+(?:final\s+)?message)/iu.test(String(row.header ?? "")); } function toolCommandPreview(row: TraceEventRow): string | null { diff --git a/web/hwlab-cloud-web/src/components/workbench/ConversationPanel.vue b/web/hwlab-cloud-web/src/components/workbench/ConversationPanel.vue index 1a955430..9c77f1f8 100644 --- a/web/hwlab-cloud-web/src/components/workbench/ConversationPanel.vue +++ b/web/hwlab-cloud-web/src/components/workbench/ConversationPanel.vue @@ -319,12 +319,17 @@ function messageTimingForDisplay(message: ChatMessage): ChatMessage["timing"] { function terminalMessageDurationMs(message: ChatMessage, timing: ChatMessage["timing"]): number | null { const elapsed = elapsedTerminalDurationMs(message, timing); - if (elapsed !== null && elapsed > 0) return elapsed; + if (elapsed !== null && elapsed > 0) return ceilDisplayDurationSecond(elapsed); const recorded = sealedTerminalRecordedDurationMs(message, timing); - if (recorded !== null) return recorded; + if (recorded !== null) return ceilDisplayDurationSecond(recorded); return null; } +function ceilDisplayDurationSecond(ms: number): number { + if (!Number.isFinite(ms) || ms <= 0) return ms; + return Math.ceil(ms / 1000) * 1000; +} + function sealedTerminalRecordedDurationMs(message: ChatMessage, timing: ChatMessage["timing"]): number | null { const messageRecord = message as Record; const trace = message.runnerTrace as Record | null | undefined;