User manual

VeloBenchmark is a single-binary LLM live-stats benchmarking and chat console. This manual walks through every screen, how to create and run tests, and how to read the reports.

New here? Start with the Quick start at the bottom, then come back for the details.

Table of contents:


Adding providers and models

Everything lives in Settings (⚙ in the sidebar). Settings are stored server-side in velobench_data/ — they survive browser changes and restarts.

Settings

Settings → Providers: every provider card carries its models, tokenizer status and live-calibration ratio.

One provider card

A provider card: base URL, model entries with tokenizer source and calibration, and the per-model actions (use / test / edit / duplicate / remove).

  1. Add a provider — an OpenAI-compatible base URL plus an API key. Any server that speaks /v1/chat/completions works (llama.cpp llama-server, vLLM, LM Studio, OpenRouter, cloud endpoints, …).
  2. Add a model — the model list is fetched live from the provider's /v1/models every time the dialog opens (never cached), so new models appear immediately.
  3. Per-model configuration: - Parameter overridestemperature, top_k, repetition_penalty, seed, … as key/value pairs. These are merged into every request the model serves. - Reasoning — a per-model reasoning toggle and effort level (off / low / medium / high / …). When reasoning is off, no effort is sent. - Tokenizer — optional path/URL to a tokenizer.json for exact token counting. Without it, VeloBenchmark probes the server's tokenizer; as a last resort it falls back to an estimated count (you can set a per-model live calibration ratio to bring live tok/s in line with the provider's authoritative usage numbers).
  4. Helper model — a separate provider/URL/key/model used for background meta-analysis (e.g. output classification). Independent of your chat models.
  5. Model + provider switcher — the dropdown in the top bar switches the active config for the current session; the persisted default can be set in Settings.

Chat — manual testing

The Chat page (💬) is a full streaming chat console with a live measurement instruments attached.

Chat

The composer

The composer: attachment and image controls, the prompt box, Send/Stop, and the Fill Context selector with the running context estimate (ctx ≈ …K).

The live stats panel

While a turn streams (and once it finishes), the right-hand panel shows:

The live stats deck

The stats deck after a completed turn: final decode rate with median/range/stability, responsiveness (TTFT and ITL p90), progress with the authoritative usage snap, the decode-rate timeline, and the decode-rate / inter-token-latency distributions.

Tests — building suites

The Tests page (🧪) lists built-in suites and your own tests.

Tests

Step types

Step Purpose
Section Names a sub-test in progress/reports. With Reset context it clears the conversation (a fresh sub-test); without it, it is just a marker. When "Treat LLM sessions as regimes" is on, section titles become the regime names in reports.
Prompt Sends text to the model, as-is. Optional per-step generation budget (tg).
Context Fills the context with an exact lorem-ipsum payload (chosen in K tokens) before the next prompt — cumulative context tests stay exact.
Bench A fixed-shape run: ONE request with depth corpus tokens + pp measured prompt tokens, generating tg tokens. exact-tg forces the full generation (no early stop). Independent of history.
Image A vision request: pick one of the embedded test images (dropdown lists them by size) and write the prompt (default: "Please describe this image."). The image is sent to the model; the turn streams and records like any other. If the model rejects the image (no vision support, provider error), the test stops and shows the error.

Test-level settings: temperature and max output tokens — applied to every step unless a step overrides them. Several built-ins demonstrate both.

Test editor header

The builder header: title, favourite mark, description, temperature and max-output overrides, the "treat LLM sessions as regimes" switch, and the Builder/JSON mode toggle.

A prompt step card

A step card in the builder — here a Prompt step with its reorder and remove controls.

Step type buttons

The five step types, as the builder's add-row: Section, Prompt, Context, Bench, Image.

Adding your own images to the vision dropdown: drop files into assets/test_images/ and rebuild — images are embedded in the binary at compile time (see Building).

Runner — concurrent load

The Runner (⚡) executes a test with N workers in parallel, all walking the same plan with a step barrier: every worker finishes step k before any worker starts step k+1, so the report stays phase-aligned.

Runner

  1. Pick the provider + model and the test (defaults to the quick shape check).
  2. Set the worker count and start. Each step shows: - the current step title and progress bar, - one snapshot per worker — state (queued / starting / streaming / done / failed), tok/s, TTFT, completion tokens, - per-step failures, with the reason.
  3. Stop aborts the run; completed turns are kept.
  4. All turns land in one VeloBenchmark session, so the normal reports apply — the analytics view adds a Decode Rate Timeline — Workers + Σ section showing each worker's decode rate and their sum (your effective concurrency throughput).

Worker snapshots

Per-worker snapshot cards at the end of a 3-worker run: state, tok/s, completion tokens and TTFT per worker, with the summed Σ rate in the run header.

Demo: a concurrent run from start to shared report — workers behind the step barrier, live snapshots, and the workers + Σ timeline in the analytics view. 5. Vision steps under load: if a provider errors on an image, the whole test stops immediately and the reason shows in the banner — no half-finished ambiguity about which shapes ran.

Sessions

The Sessions page (🗂) lists every recorded VeloBenchmark session — chat conversations, test runs, concurrent runs — with their turn counts and model labels. Open one to jump into its analytics; sessions can be renamed, favourited and deleted here.

Session analytics — what each report shows

The analytics view is the full report for one session.

Analytics

The sections of a report, as they appear top to bottom:

At a Glance

At a Glance — headline cards with verdict badges (steady / snappy), stability ring and the p90 token gap.

Where the tokens went

Where the Tokens Went — reasoning vs output composition with the per-request averages.

Throughput

Throughput — the decode-rate story with reference lines and per-regime rates.

Latency

Latency — TTFT per request, decode-time and inter-token-latency distributions.

Quality & diagnostics

Quality & Diagnostics — decode-rate and ITL histograms, acceptance-rate estimate, speculation depth.

Workers + Σ

Workers + Σ — present on concurrent sessions only: every worker's decode timeline and their sum.

Comparing sessions

The Compare page (⇄) puts sessions side by side.

Comparisons

  1. Select two or more sessions from the list (chat runs, test runs, concurrent runs — any mix).
  2. Compare selected creates a persistent comparison.
  3. The comparison view lays the sessions' headline numbers and timelines next to each other — same prompts across models, before/after server tuning, single vs concurrent, vision vs text: whatever you line up.

Comparison headers

The two session headers of a comparison, with regime mix and turn counts.

Head-to-head metrics

Head-to-head metrics: per-metric values for both sessions with absolute and percentage deltas, green marking the better side.

Telemetry

VeloBenchmark ships a built-in OTLP/HTTP-JSON telemetry receiver that turns a serving engine's OpenTelemetry stream into a live dashboard.

Telemetry

A live telemetry panel

One live panel: the rolling text feed, the stats deck and the full chart set, updated ~10×/s, with Record to freeze the window into a session.

Quick start

  1. Build (or grab a release binary): see Building & installing.
  2. Start: ./target/release/velobench --host 0.0.0.0 --port 13843 and open http://localhost:13843.
  3. Settings → add a provider (base URL + key), add a model, pick it in the top bar.
  4. Chat — send a prompt and watch the live stats.
  5. Tests → Run a built-in suite (try Regime switch · JavaScript ⇄ story to see decode speed swing between code and prose, or Vision · all test images on a vision model).
  6. Sessions → open the run → export the report as PNG/PDF.
  7. Runner — same test, N workers, one shared report.
  8. Compare — line two sessions up and see what changed.