Live decode tok/s, prefill and token breakdown for every agent turn
npmjs · Paseo 0.9+
paseo plugin add npm:paseo-turn-speed@1.0.1GitHub · Paseo 0.8 fallback
paseo plugin add Drenalol/paseo-turn-speed --ref 16e77d6e0e4e68b6e9724330aae8635351fb622eGit security status and fallback installation are pinned to commit 16e77d6e0e4e.
From the plugin's README
paseo plugin add github:Drenalol/paseo-turn-speed
README
A composer pill per agent that shows how fast the model is actually decoding:
⚡ 138 tok/s · 0.8k while a turn runs, 139 tok/s · 1.2k tok after it ends,
with a popover breakdown (prefill/TTFT, in/cached/out tokens, steps, tool wait,
context occupancy). Numbers measured from real provider usage are exact;
before the first usage event they are character estimates marked with ≈.
paseo plugin add github:Drenalol/paseo-turn-speed
# or, from npm:
paseo plugin add npm:paseo-turn-speed
Then open Settings → Plugins → Turn speed to tune it. See Requirements for the one provider setting that makes the numbers exact.
Desktop — the composer pill while a turn decodes, and the paused variant (the model is waiting for your answer):
The popover behind the pill — decode and whole-turn rates, prefill/TTFT, token totals, steps, tool wait and context occupancy:
The same popover on mobile, with the pill shows basis chips:
npm install here; Paseo itself
needs no npm to run the plugin).cd /path/to/paseo-turn-speed
npm install # dev dependencies for typechecking only
npm run typecheck
paseo plugin install "$(pwd)"
paseo plugin reload turn-speed # after every source edit
paseo plugin logs turn-speed
Then open the Paseo app: every agent with a workspace gets a pill in the composer track (next to Tasks/Subagents). Settings → Plugins → Turn speed holds the options.
includeUsageThe plugin reads real token counts from the usage the provider reports. For
OpenCode-backed models (including local MLX servers) the provider only forwards
usage when it is enabled in the OpenCode config, e.g. in opencode.json:
{
"provider": {
"mlx": {
"options": { "includeUsage": true }
}
}
}
Without it the plugin still works: every number is estimated from streamed
characters (≈) and the popover shows a hint about this setting.
Also useful: a limit.context value for the model (the model catalog or the
provider config) — it feeds the context 34k / 131k line in the popover.
turn time stays wall-clock; the popover shows a
separate waiting for you row and the pill switches to a ⏸ icon meanwhile.≈ until the call's usage lands.turn-speed: step dropped as implausible).chars/token ratio for
the model is blended into a stored per-model calibration (EMA 0.7/0.3, clamped
to 2..8, persisted in plugin settings). After 2–3 steps the live estimate
tracks the real one closely. Settings → Turn speed shows and can override it.| Option | Default | Effect |
|---|---|---|
| Show pills for idle agents | off | otherwise pills appear only around observed turns |
| Speed basis | Live decode | what the pill shows: live estimate, decode-window average, or whole-turn rate |
| Token format | 1.2k | compact or grouped digits |
| Live smoothing window | 2 s | averaging window of the live tok/s |
| Manual chars per token | off (auto-calibrated) | override the live character estimate |
| Implausible rate limit | 400 tok/s | steps implying a faster decode are dropped as misattributed usage |
npm run verify # typecheck + unit tests + client-bundle check
paseo plugin reload turn-speed
paseo plugin ls # status of every installed plugin
npm run check:client compiles the client entry with the same options Paseo's
compiler uses and rejects output the mobile app's JS engine (Hermes) cannot
parse — notably anonymous class expressions, which is exactly what a class
becomes after bundling. Client code therefore uses closure factories instead of
classes. With a hermes binary available, HERMES_BIN=/path/to/hermes npm run check:client runs the real Hermes syntax check too.
≈.lastUsage still gives totals).~/Library/Logs/Paseo/main.log, prefix turn-speed:) if you want to audit
where a number came from.Scanned 15 Oct 2026, 10:23 UTC from Drenalol/paseo-turn-speed.