refactor: v0.0.52 - simplify generation tracking to per-slot prev n_decoded

- Track generatePrevNd per slot instead of global generateMaxDecoded
- Calculate TPS from delta between consecutive polls
- Detect resets when nd drops below previous
- Stall (nd == prev) doesn't end generation, just doesn't update TPS
- Reset tracking when no slot found
This commit is contained in:
Troed Sångberg
2026-06-13 23:38:42 +02:00
parent 10319b5e80
commit bba57e2eb5
2 changed files with 25 additions and 26 deletions
+1 -1
View File
@@ -1,7 +1,7 @@
{
"$schema": "https://json.schemastore.org/package.json",
"name": "@troed/oc-ls-stats",
"version": "0.0.51",
"version": "0.0.52",
"type": "module",
"exports": {
"./tui": {
+24 -25
View File
@@ -48,9 +48,8 @@ type TrackerState = {
prefillStartAt: number
isGenerating: boolean
generateSlotId: number | null
generateCapturedDecoded: number | null
generatePrevNd: number
generateStartAt: number
generateMaxDecoded: number
}
function estimateStreamTokens(delta: string) {
@@ -270,9 +269,8 @@ const tui: TuiPlugin = async (api) => {
prefillStartAt: 0,
isGenerating: false,
generateSlotId: null,
generateCapturedDecoded: null,
generatePrevNd: 0,
generateStartAt: 0,
generateMaxDecoded: 0,
}
const [version, setVersion] = createSignal(0)
const [clock, setClock] = createSignal(Date.now())
@@ -392,35 +390,36 @@ const tui: TuiPlugin = async (api) => {
const now = Date.now()
const nd = generateSlot.next_token?.[0]?.n_decoded ?? 0
if (nd > tracker.generateMaxDecoded) {
const isNew = tracker.generateMaxDecoded === 0
const delta = nd - tracker.generateMaxDecoded
const dt = (now - tracker.generateStartAt) / 1000
if (delta > 0 && dt > 0 && !isNew) {
tracker.lastGeneratedTps = delta / dt
debug(`gen slot=${slotId} nd=${nd} max=${tracker.generateMaxDecoded} delta=${delta} dt=${dt.toFixed(2)} tps=${tracker.lastGeneratedTps.toFixed(1)}`)
if (tracker.generateSlotId === slotId) {
if (nd > tracker.generatePrevNd) {
const dt = (now - tracker.generateStartAt) / 1000
const delta = nd - tracker.generatePrevNd
if (dt > 0 && delta > 0) {
tracker.lastGeneratedTps = delta / dt
debug(`gen slot=${slotId} nd=${nd} prev=${tracker.generatePrevNd} delta=${delta} dt=${dt.toFixed(2)} tps=${tracker.lastGeneratedTps.toFixed(1)}`)
}
tracker.generatePrevNd = nd
tracker.generateStartAt = now
} else if (nd < tracker.generatePrevNd) {
tracker.generatePrevNd = nd
tracker.generateStartAt = now
tracker.lastGeneratedTps = 0
debug(`gen slot=${slotId} nd=${nd} prev=${tracker.generatePrevNd} counter reset`)
} else {
debug(`gen slot=${slotId} nd=${nd} prev=${tracker.generatePrevNd} stalled`)
}
tracker.generateMaxDecoded = nd
tracker.generateCapturedDecoded = nd
tracker.generateStartAt = now
tracker.generateSlotId = slotId
} else if (nd < tracker.generateMaxDecoded) {
tracker.generateCapturedDecoded = nd
tracker.generateStartAt = now
tracker.lastGeneratedTps = 0
debug(`gen slot=${slotId} nd=${nd} max=${tracker.generateMaxDecoded} counter reset`)
} else {
debug(`gen slot=${slotId} nd=${nd} max=${tracker.generateMaxDecoded} stalled`)
tracker.generateMaxDecoded = 0
tracker.generateSlotId = slotId
tracker.generatePrevNd = nd
tracker.generateStartAt = now
tracker.lastGeneratedTps = 0
genEnded = true
debug(`gen new slot id=${slotId} nd=${nd}`)
}
} else {
if (tracker.isGenerating) {
tracker.generateSlotId = null
tracker.generateCapturedDecoded = null
tracker.generatePrevNd = 0
tracker.generateStartAt = 0
tracker.generateMaxDecoded = 0
tracker.lastGeneratedTps = 0
genEnded = true
debug(`gen no slot found ending`)