From 77bc9e1a5f1741982f35a5d7d2460f4ad9f562d7 Mon Sep 17 00:00:00 2001 From: Jonathan Davies Date: Tue, 18 Aug 2026 17:46:25 +0000 Subject: [PATCH] Add LAST turn TPS to status display Fixes: #5 --- tui.tsx | 31 ++++++++++++++++++++++++++++++- 1 file changed, 30 insertions(+), 1 deletion(-) diff --git a/tui.tsx b/tui.tsx index 01f242a..1fbb3e6 100644 --- a/tui.tsx +++ b/tui.tsx @@ -27,10 +27,17 @@ type SessionAverage = { messageCount: number } +type TurnAccumulator = { + tokens: number + startAt: number +} + type TrackerState = { streamSamplesBySession: Record messageTimingByID: Record sessionAverageByID: Record + sessionLastTurnTpsByID: Record + turnBySession: Record } type TrackerListener = () => void @@ -105,6 +112,11 @@ function SessionPromptRight(props: { return formatRate(totals.totalTokens / (totals.totalDurationMs / 1000)) } + function sessionLastTps() { + const last = props.tracker.sessionLastTurnTpsByID[props.sessionID] + return formatRate(last) + } + function sessionTtft() { const totals = props.tracker.sessionAverageByID[props.sessionID] if (!totals || totals.messageCount <= 0 || totals.totalTtftMs < 0) return undefined @@ -129,9 +141,10 @@ function SessionPromptRight(props: { function statusText() { const live = liveTps() ?? "-" + const last = sessionLastTps() ?? "-" const avg = sessionAverage() ?? "-" const ttft = sessionTtft() ?? "-" - return `TPS ${live} | AVG ${avg} | TTFT ${ttft}` + return `TPS ${live} | LAST ${last} | AVG ${avg} | TTFT ${ttft}` } } @@ -140,6 +153,8 @@ const tui: TuiPlugin = async (api) => { streamSamplesBySession: {}, messageTimingByID: {}, sessionAverageByID: {}, + sessionLastTurnTpsByID: {}, + turnBySession: {}, } const listeners = new Set() @@ -240,6 +255,20 @@ const tui: TuiPlugin = async (api) => { totalTtftMs: totals.totalTtftMs + ttftMs, messageCount: totals.messageCount + 1, } + + if (evt.properties.info.finish === "tool-calls") { + const currentTurn = tracker.turnBySession[sessionID] + tracker.turnBySession[sessionID] = currentTurn + ? { tokens: currentTurn.tokens + totalTokens, startAt: currentTurn.startAt } + : { tokens: totalTokens, startAt: timing.firstResponseAt } + } else { + const turn = tracker.turnBySession[sessionID] + const turnStartAt = turn?.startAt ?? timing.firstResponseAt + const turnTokens = totalTokens + (turn?.tokens ?? 0) + const turnDurationMs = Math.max(evt.properties.info.time.completed - turnStartAt, 1) + tracker.sessionLastTurnTpsByID[sessionID] = turnTokens / (turnDurationMs / 1000) + delete tracker.turnBySession[sessionID] + } } } delete tracker.messageTimingByID[evt.properties.info.id]