-
Notifications
You must be signed in to change notification settings - Fork 5
Dashboard
OmniGlyph ships a full local dashboard inside the npm package — offline, single-file, zero external requests. Start the proxy and open it:
npx omniglyph # proxy + dashboard on 127.0.0.1:47821Six pages, all updated live over SSE (GET /events/stream) as requests flow, with 2-second polling as fallback. Light and dark themes, OmniRoute-family visual language.
| page | what it shows |
|---|---|
| Overview | Mission control: savings % (cache-weighted), $ saved, requests (imaged / passthrough), latency p95, first-byte p50, cache hits, errors, imaged chars — plus a savings sparkline and a live event feed. |
| Live Flow | The pipeline as a node graph: client → gate → renderer / passthrough → Anthropic API → response. Each real request fires an animated particle down the branch it took. |
| Telemetry | A token/$ odometer and a live request timeline. Click any request to open the image-vs-text breakdown and read the exact source text behind every rendered page. |
| Benchmarks | The harness receipts rendered straight from benchmarks/*/results/*.jsonl — one row per model·config experiment — plus in-UI benchmark runs (below). |
| Sessions | Top sessions ranked by tokens saved, cross-referenced with Claude Code sessions. |
| History | Every event on disk: statuses, token totals, durations, cache behavior. |
The Benchmarks page can execute the two harnesses directly:
-
Dry-run ($0) — runs
--dry-run(billing predictions / cost table, no API calls) and streams the harness stdout live into a terminal card. -
Live run — disabled unless
ANTHROPIC_API_KEYis set in the proxy's environment, and requires an explicit confirmation that warns about cost. Results are appended tobenchmarks/*/results/by the harnesses themselves (the dashboard never writes there).
Safety model: the server only accepts a closed enum (harness × mode) — no client string ever reaches the spawned process; processes run without a shell; one run at a time, cancellable. These endpoints exist on the local Node host only.
- Every savings percentage derives from the cache-weighted pair (
baseline_input_weightedvsactual_input_weighted) — never rawcount_tokens, which over-states savings whenever the prefix would have been a cheap cache read. - A weighted net loss renders as a loss (red), never masked.
- The per-request cost split only shows once the sample is large enough; before that it says so.
- The density scorecard shows one row per (model, config) experiment — a per-model rollup would blend production-config reads with deliberately-overdense experiments and misstate both.
The top bar of every page carries the compression kill switch (resets to ON at restart) and the model chips — toggle which Claude models are allowed to receive imaged context at runtime (persist with OMNIGLYPH_MODELS).