bzuccaro f98043c21b fix: self-heal in-flight counts by pruning stale request ids
On a long-lived SSE connection a missed remove leaves a stale request id in
the tracker forever; llama-swap only sends a fresh snapshot on connect, so
counts drifted up and stayed stuck. The tracker now timestamps each request
id (upserts refresh it) and prunes ids not updated within 120s, on every
inflight event and on a 30s runtime interval. Removes also accept numeric
ids defensively.
2026-08-15 14:26:28 -06:00

llama-watch

A Stream Deck plugin (macOS) that monitors a llama-swap instance.

Actions

  • In-Flight Monitor — per-model request activity. The default view shows the live in-flight request count with a 60-second activity spark (states: OFF / LOADING / IDLE / count). Switch Display to Usage stats to show request/token totals and the generation-speed P95 from /api/metrics/stats, per model or across All models, with a pickable primary stat. Powered by the real-time /api/events SSE feed.
  • GPU Graph — live line chart of a GPU metric (utilization %, VRAM %, temperature, power draw, fan speed) for one GPU, all GPUs, or an arbitrary combination (e.g. GPU combination 0,2), sampled every 5 s.

Pressing either key opens http://<base-url>/ui in your browser.

Install

Double-click the packaged .streamDeckPlugin, or run:

npm install
npm run build
streamdeck validate com.bryce.llamawatch.sdPlugin

Develop

npm run watch   # hot-reload while the Stream Deck app is running
npm test        # unit tests (node:test + tsx)

Configure

Per-key settings: base URL (default http://localhost:9292), optional API key, and the model / GPU / metric to watch. The model and GPU dropdowns are populated live from the instance. Each action instance is independent, so you can place several In-Flight Monitor keys (one per model, or in either display mode) and several GPU Graph keys (one per GPU × metric, or per GPU combination) on the same profile. All keys share a single connection to the configured llama-swap instance, which is re-established automatically if you change the base URL or API key on any key.

Notes

  • Usage totals come from llama-swap's /api/metrics/stats and cover its in-memory activity retention (default ~1000 most recent requests), not lifetime counters. The P95 is a tokens/sec generation-speed percentile.
  • Keys are SVG-rendered (render.ts), so no image assets or canvas are needed at runtime.

Marketplace

Assets are prepared for eventual submission (imgs/plugin/icon.png 256/512, action icons, category icon). The plugin only stores its settings locally; it reads GPU metrics and request status from the user's own llama-swap server and sends nothing elsewhere.

S
Description
No description provided
Readme
446 KiB
Languages
TypeScript 95.2%
HTML 3.3%
JavaScript 1.5%