From b54d609934b12d10215cef79c3cc9229092999e0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Troed=20S=C3=A5ngberg?= Date: Sun, 14 Jun 2026 08:37:19 +0200 Subject: [PATCH] feat: v0.0.54 - replace AVG with prefill progress percentage - Display: PP xxxx tps (yyy%) | GEN xxxx tps - Add prefillTotalTokens and prefillProcessedTokens tracking - Show progress percentage during prefill - Remove sessionAverage memo and AVG calculation --- package.json | 2 +- tui.tsx | 42 +++++++++++++++++++++++++++++++----------- 2 files changed, 32 insertions(+), 12 deletions(-) diff --git a/package.json b/package.json index 0fcb06d..5b4a411 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "$schema": "https://json.schemastore.org/package.json", "name": "@troed/oc-ls-stats", - "version": "0.0.53", + "version": "0.0.54", "type": "module", "exports": { "./tui": { diff --git a/tui.tsx b/tui.tsx index 564a736..28f2540 100644 --- a/tui.tsx +++ b/tui.tsx @@ -48,6 +48,8 @@ type TrackerState = { prefillSlotId: number | null prefillCapturedTokens: number | null prefillStartAt: number + prefillTotalTokens: number + prefillProcessedTokens: number isGenerating: boolean generateSlotId: number | null generatePrevNd: number @@ -192,6 +194,13 @@ function formatAvg(value: number) { return `${value.toFixed(1)}` } +function formatPercent(value: number) { + if (!Number.isFinite(value) || value < 0) return undefined + if (value >= 100) return "100" + if (value >= 10) return `${Math.round(value)}` + return `${value.toFixed(1)}` +} + function pad4(s: string | undefined) { if (!s) return "----" return s.padStart(4, " ") @@ -231,13 +240,6 @@ function SessionPromptRight(props: { return rate }) - const sessionAverage = createMemo(() => { - props.version() - const totals = props.tracker.sessionAverageByID[props.sessionID] - if (!totals || totals.totalTokens <= 0 || totals.totalDurationMs <= 0) return undefined - return totals.totalTokens / (totals.totalDurationMs / 1000) - }) - const prefillRate = createMemo(() => { props.version() if (!props.tracker.isPrefilling) return undefined @@ -246,12 +248,22 @@ function SessionPromptRight(props: { return rate }) - const text = createMemo(() => { + const prefillProgress = createMemo(() => { + props.version() + if (!props.tracker.isPrefilling) return undefined + const total = props.tracker.prefillTotalTokens + const processed = props.tracker.prefillProcessedTokens + if (total <= 0) return undefined + return (processed / total) * 100 + }) + + const text = createMemo(() => { const pp = prefillRate() const tps = liveTps() - const avg = sessionAverage() - const parts = [`PP ${pad4(pp ? formatPps(pp) : undefined)}`, `TPS ${pad4(tps ? formatTps(tps) : undefined)}`, `AVG ${pad4(avg ? formatAvg(avg) : undefined)}`] - return parts.join(" | ") + const progress = prefillProgress() + const ppLabel = pp ? `PP ${pad4(formatPps(pp))} tps (${pad4(formatPercent(progress))}%)` : `PP ${pad4(undefined)} tps (${pad4(undefined)}%)` + const tpsLabel = tps ? `GEN ${pad4(formatTps(tps))} tps` : `GEN ${pad4(undefined)} tps` + return `${ppLabel} | ${tpsLabel}` }) return <>{text() ? {text()} : null} @@ -269,6 +281,8 @@ const tui: TuiPlugin = async (api) => { prefillSlotId: null, prefillCapturedTokens: null, prefillStartAt: 0, + prefillTotalTokens: 0, + prefillProcessedTokens: 0, isGenerating: false, generateSlotId: null, generatePrevNd: 0, @@ -363,6 +377,10 @@ const tui: TuiPlugin = async (api) => { const slotId = prefillSlot.id const now = Date.now() const nt = prefillSlot.n_prompt_tokens ?? 0 + const npp = prefillSlot.n_prompt_tokens_processed ?? 0 + + tracker.prefillTotalTokens = nt + tracker.prefillProcessedTokens = npp if (tracker.prefillSlotId === slotId) { if (tracker.prefillCapturedTokens !== null) { @@ -383,6 +401,8 @@ const tui: TuiPlugin = async (api) => { tracker.prefillSlotId = null tracker.prefillCapturedTokens = null tracker.prefillStartAt = 0 + tracker.prefillTotalTokens = 0 + tracker.prefillProcessedTokens = 0 } }