Skip to content
Open
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
31 changes: 30 additions & 1 deletion tui.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -27,10 +27,17 @@ type SessionAverage = {
messageCount: number
}

type TurnAccumulator = {
tokens: number
startAt: number
}

type TrackerState = {
streamSamplesBySession: Record<string, StreamSample[]>
messageTimingByID: Record<string, MessageTiming>
sessionAverageByID: Record<string, SessionAverage>
sessionLastTurnTpsByID: Record<string, number>
turnBySession: Record<string, TurnAccumulator>
}

type TrackerListener = () => void
Expand Down Expand Up @@ -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
Expand All @@ -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}`
}
}

Expand All @@ -140,6 +153,8 @@ const tui: TuiPlugin = async (api) => {
streamSamplesBySession: {},
messageTimingByID: {},
sessionAverageByID: {},
sessionLastTurnTpsByID: {},
turnBySession: {},
}
const listeners = new Set<TrackerListener>()

Expand Down Expand Up @@ -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]
Expand Down