fix(web-probe): read turn timing only from card fields (#678)

Co-authored-by: Codex <codex@noreply.local>
This commit is contained in:
Lyon
2026-06-22 20:04:15 +08:00
committed by GitHub
parent 702fea6239
commit 24885272ab
@@ -2872,10 +2872,11 @@ function buildSampleMetrics(samples, control) {
const promptTimes = promptCommands.map((item) => item.tsMs);
const timeline = samples.map((sample) => {
const texts = sampleTexts(sample);
const timingTexts = sampleTurnTimingTexts(sample);
const tsMs = Date.parse(sample.ts);
const promptIndex = Number.isFinite(tsMs) ? latestPromptIndex(promptTimes, tsMs) : 0;
const totalElapsedValues = texts.flatMap(parseTotalElapsedSeconds).filter(Number.isFinite);
const recentUpdateValues = texts.flatMap(parseRecentUpdateSeconds).filter(Number.isFinite);
const totalElapsedValues = timingTexts.flatMap(parseTotalElapsedSeconds).filter(Number.isFinite);
const recentUpdateValues = timingTexts.flatMap(parseRecentUpdateSeconds).filter(Number.isFinite);
const diagnosticTexts = texts.filter(isDiagnosticText).slice(0, 5);
const terminalTexts = texts.filter(isTerminalTraceText).slice(0, 5);
const finalResultTexts = texts.filter(isFinalResultText).slice(0, 5);
@@ -3546,7 +3547,7 @@ function turnMetricItems(sample, timelineItem) {
}
if (Array.isArray(sample?.messages) && sample.messages.length > 0) {
for (const message of sample.messages) {
const text = String(message?.textPreview || "");
const text = [message?.durationText, message?.activityText].map((value) => String(value || "")).filter((value) => value.trim().length > 0).join("\n");
const totalElapsedValues = parseTotalElapsedSeconds(text).filter(Number.isFinite);
const recentUpdateValues = parseRecentUpdateSeconds(text).filter(Number.isFinite);
if (totalElapsedValues.length === 0 && recentUpdateValues.length === 0) continue;
@@ -3596,9 +3597,7 @@ function turnMetricItems(sample, timelineItem) {
function turnTexts(turn) {
return [
turn?.durationText,
turn?.activityText,
turn?.textPreview,
turn?.text
turn?.activityText
].map((value) => String(value || "")).filter((value) => value.trim().length > 0);
}
@@ -3693,6 +3692,20 @@ function sampleTexts(sample) {
return rows;
}
function sampleTurnTimingTexts(sample) {
const rows = [];
for (const group of [sample?.turns, sample?.messages]) {
if (!Array.isArray(group)) continue;
for (const item of group) {
for (const value of [item?.durationText, item?.activityText]) {
const text = String(value || "");
if (text.trim()) rows.push(text);
}
}
}
return rows;
}
function parseTotalElapsedSeconds(text) {
const values = [];
for (const match of String(text || "").matchAll(/(?:总耗时|耗时)\s*[=:]?\s*(\d{1,2}):(\d{2}):(\d{2})/giu)) {
@@ -3805,7 +3818,8 @@ function detectTerminalZeroElapsed(samples) {
const text = [item?.durationText, item?.activityText, item?.status, item?.textPreview, item?.text].filter(Boolean).join("\n");
if (!/(?:Code Agent|运行记录|completed|failed|canceled|blocked)/iu.test(text)) continue;
if (!/(?:completed|failed|canceled|blocked|已完成|失败|取消)/iu.test(text)) continue;
const elapsedValues = parseTotalElapsedSeconds(text);
const timingText = [item?.durationText, item?.activityText].filter(Boolean).join("\n");
const elapsedValues = parseTotalElapsedSeconds(timingText);
if (!elapsedValues.includes(0)) continue;
rows.push({
...ref(sample),