From c71a77bb2256df4ce225a049dafd529a3245f75f Mon Sep 17 00:00:00 2001 From: weichen Date: Wed, 7 Oct 2026 17:19:28 +0000 Subject: [PATCH] Show last-request and cumulative tokens in the usage badge (N3 WP6) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Why: run.Usage now carries the WP6 split fields; the badge should show them ('+last · cumulative · duration · tools', cache hits in the tooltip). Evidence: npx tsc --noEmit clean; npx vitest run 82/82 green. Impact: display only. Refs: Agent-System-Backend#96, N3 plan WP6 --- src/components/AgentTracker.tsx | 7 +++++-- src/contracts.ts | 6 ++++++ 2 files changed, 11 insertions(+), 2 deletions(-) diff --git a/src/components/AgentTracker.tsx b/src/components/AgentTracker.tsx index 232a388..2821edf 100644 --- a/src/components/AgentTracker.tsx +++ b/src/components/AgentTracker.tsx @@ -78,7 +78,10 @@ export function AgentTracker() { function UsageBadge({ usage }: { usage?: Usage | null }) { if (!usage) return null - return - {usage.totalTokens > 0 ? `${usage.totalTokens} tok · ` : ''}{(usage.durationMs / 1000).toFixed(1)}s{usage.toolCalls > 0 ? ` · ${usage.toolCalls} 工具` : ''} + // N3 计费拆分:有上一请求数据时显示「+最近 · 累计(含缓存命中)」。 + const last = (usage.lastPromptTokens ?? 0) + (usage.lastCompletionTokens ?? 0) + const cache = usage.cacheReadTokens ?? 0 + return 0 ? `token 用量与时长(缓存命中 ${cache})` : 'token 用量与时长'}> + {last > 0 ? `+${last} · ` : ''}{usage.totalTokens > 0 ? `累计 ${usage.totalTokens} tok · ` : ''}{(usage.durationMs / 1000).toFixed(1)}s{usage.toolCalls > 0 ? ` · ${usage.toolCalls} 工具` : ''} } diff --git a/src/contracts.ts b/src/contracts.ts index ec8ffd2..1c86755 100644 --- a/src/contracts.ts +++ b/src/contracts.ts @@ -60,6 +60,12 @@ export interface Usage { promptTokens: number; completionTokens: number; totalTokens: number; durationMs: number; toolCalls: number; model?: string; + // N3 计费拆分(additive;旧记录缺省为 0): + // Last* 是最近一次请求的用量,Cache* 是缓存命中累计。 + lastPromptTokens?: number; + lastCompletionTokens?: number; + cacheReadTokens?: number; + cacheWriteTokens?: number; } export interface Run {