Augur — text-to-image evals
Judge your image-generation pipeline's output against approved references, compare multiple models side by side, and ground prompt phrases to image regions — all from testrelic augur.
testrelic augur runs evals for a text-to-image pipeline: it drives each eval case's
prompt through your generator, judges the output against an approved reference, and renders
a Verdict with evidence — SSIM, changed-pixel ratio, and perceptual hash, backed by an
HTML report. Augur judges images — it doesn't generate them by default; generation is your
own pipeline (or one of the built-in backends, for seeding references).
$ testrelic augur demo --open
● Augur Demo — synthesizing 5 scenes × 9 GenAI-image failure patterns (deterministic, no assets)
▸ hue_shift_35 global color drift after a model/checkpoint swap expect fail
▸ patch_swap content hallucination — two 96px regions swapped expect fail
▸ watermark provider watermark/badge injected lower-right expect review
▸ nudge_3px framing/composition shift (3px translate) expect review
● matching 9 candidate(s) through the full pipeline…
✗ hue_shift_35 FAIL SSIM 0.812 · Δpx 4.20% (611 ms)
⚠ watermark review SSIM 0.964 · Δpx 0.88% (598 ms)
Verdict: NEEDS REVIEW · PASS 6 · FAIL 2 · REVIEW 1
Detection scorecard:
✓ hue_shift_35 fail — detected as designed
✓ watermark review — detected as designed
9/9 failure patterns detected as designed.
A hand-recreated transcript of the real pipeline output — switch between demo, run, a
multi-model comparison, selfbench, and uploading a verdict.
Try it with no setup
testrelic augur demo --openSynthesizes 5 scenes and 9 real-world GenAI failure patterns (color drift, hallucinated
content, watermark injection, resolution change, sampler noise, compression, framing shift,
…), judges them through the full pipeline, and grades detection against calibrated
expectations. Exit 0 means every pattern landed on its expected verdict — a good way to
confirm the pipeline works before pointing it at your own images.
The real workflow
testrelic augur init # scaffold .testrelic-augur/
testrelic augur baseline add ./ref.png --id hero-shot # approve a reference image
testrelic augur run # judge suite.json against references
testrelic augur open # review the evidence reportaugur initscaffolds.testrelic-augur/(config.json+baselines/) in the current repo.augur baseline add|list|show|rmmanages the approved-reference store — the golden images every eval case is judged against.augur runexecutes.testrelic-augur/suite.json, generating each selected case's candidate and judging it, producing one verdict for the run.augur match <candidate> [golden]judges a single candidate (or directory) directly against the reference store, without a suite — useful for one-off checks.augur open [run-dir]opens the latest (or given) run's HTML report connected: an ephemeral127.0.0.1review server lets the report's Apply buttons approve references directly. Idles out after 30 minutes;--no-serveopens it as a plain file instead.augur report <run-dir>re-renders the HTML report from a finished run directory.
Same commands work from the interactive UI as /augur <action> — /augur run, /augur baseline add <img> --id <test-id>, /augur open, and so on.
Multi-model comparison
A suite.json can carry more than one generator — generators: [{id, backend|command, model}] — unifying built-in SDK backends and your own shell hook. Legacy single-generator
suites (generator: {command}) keep working byte-for-byte; a multi-model suite renders
every eval case once per generator, so you can compare, say, Gemini against your own
pipeline on the identical prompt set.
testrelic augur run --concurrency 8 --attribution--concurrency Nbounds how many (eval case × generator) generations run at once (default 4).- Each candidate's baseline reference is a composite id,
{testId}__{generatorId}, so the same golden store holds references per model without collision. augur baseline --model <generatorId>promotes a generator's candidates to approved references. On a brand-new multi-model suite with no references yet, it falls back to the run'scandidates/directory (matched by the__{generatorId}suffix) instead of requiring a prior verdict — so a first run can seed its own references without hand-adding images one at a time.- The
/augurTUI form is the same:/augur baseline <generatorId>. - A backend generator with no configured API key skips with a per-column notice, not a run failure.
Generator backends
augur configure --backend gemini|flux|openai stores a backend's API key locally
(~/.testrelic/<backend>-key, owner-only; Local mode only — cloud-side key storage isn't
supported yet). Env vars always win over a stored key.
testrelic augur configure --backend gemini # prompts for a masked key
testrelic augur gen "a red running shoe on white" --backend gemini --as-baseline hero-shotaugur gen generates a single image via a configured backend to seed a reference (Augur
judges images — generation here is scaffolding, not the eval itself). Backends: gemini
(default, also backs imagen), imagen, flux (BFL_API_KEY), openai
(OPENAI_API_KEY). --edit <path> turns the prompt into an edit instruction against an
existing image instead of generating from scratch.
Semantic attribution (grounding)
--attribution (or suite.json "grounding": {"enabled": true}) grounds bracketed
[phrases] in your prompt to regions of the candidate image via Gemini — for example a
prompt like a shoe with [a red laptop] on the sole extracts a red laptop as a phrase and
locates it in the image. Each phrase is scored honored (confidently present at a location),
uncertain, or missing. This is evidence, not verdict — attribution always runs after
the verdict has already been decided and can never change it; a per-image grounding failure
just leaves that case without an attribution block. Results are cached by image + phrase set,
so re-runs are free.
Benchmark the judge itself
testrelic augur selfbench --target 0.99Runs the verdict engine against a ≥1,000-case labeled synthetic corpus (scene variants × drift
ops × graded magnitudes) — "eval the evaluator." Reports overall accuracy with a 95% CI,
per-op scores, and a confusion matrix; exits 0 iff accuracy meets --target. Pass --suite
to score against your own labeled pairs (suite.json cases with "expected": "pass"|"fail") instead of the synthetic corpus.
Uploading verdicts
testrelic augur run --upload # judge and upload in one step
testrelic augur upload <run-dir> # upload a finished run's verdict.jsonUploads to TestRelic evals (Cloud mode + a tr_live_* ingest key). --upload-dry-run prints
the exact payload without any HTTP call — useful for checking what a run would send before it
sends it. Multi-model runs upload the generator roster, per-case prompt-phrase groups, and any
attribution bundle; legacy single-generator suites upload none of that extra shape.
augur run flags
| Flag | Purpose |
|---|---|
--tag <t> | Only run eval cases carrying this tag (repeatable, any-of). |
--id <x> | Only run these eval case ids (repeatable). |
--concurrency <N> | Max concurrent generations across (eval case × generator). Default 4. |
--attribution | Ground bracketed prompt phrases to image regions. |
--out <dir> | Run output directory (default ./.testrelic-augur/runs/<timestamp>). |
--no-report | Skip rendering the HTML evidence report. |
--upload / --upload-dry-run | Upload the verdict to TestRelic evals, or print the payload without sending. |
--fail-on-review | Exit 1 (not 2) when the worst outcome is needs_review. |
--open / --no-serve | Open the HTML report when the run finishes; --no-serve opens a plain file, no review server. |
Next steps
→ Modes & engines · Upload existing reports · Artifacts & headless output · Augur in Studio — the same evidence report, plus in-pane review, in a live workbench surface
Device setup
testrelic device setup takes a bare machine to a booted Android emulator — no JDK, no Android Studio required — then device up boots it for WebDriver, Maestro, or adb.
Slash commands, context & keys
Reference for the CLI's slash commands, @-context attachments, ! shell mode, and Claude-Code-parity keybindings including vim mode and history search.