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
This commit is contained in:
Troed Sångberg
2026-06-14 08:37:19 +02:00
parent 9ff08beb1b
commit b54d609934
2 changed files with 32 additions and 12 deletions
+1 -1
View File
@@ -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": {
+31 -11
View File
@@ -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 fg={props.api.theme.current.textMuted}>{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
}
}