Agana · eval bench

Signal Bench.

Compose evaluation profiles for the Swedish voice agent. Patch in the metrics you want, set each threshold on the fader, and save the rack — the runner scores exactly what you build here.

metrics
groups
profiles

Run & history

Score recordings

Runs score_recordings.py over the selected data — calls the judge LLM, ~30–60s. Pick a dataset to score its frozen, labelled items (unlocks the label-based metrics); a profile scores exactly that selection.

Results history

Company

Everything below is read live from the brain. A knowledge base with no chunks retrieves nothing, and a source that produced none contributes nothing — both are silent during a call, so they are counted here instead.

Identity & wiring
Recorded traffic
Onboard a company

Creates a v1 company, onboards it from its website (crawl → Q&A → blocks + knowledge), then migrates it to v2. Minutes long — the log streams on the Run tab, and the company appears in the target lists when it finishes. Needs the brain's worker container up.

The crawl stops after this many pages, so a thin site needs few and a large one needs many — a big site capped low is onboarded from whatever the crawler happened to reach first.

Stored as the v1 company's opening_line. The brain folds it into the agent's prompt and speaks it as the greeting preblock when a call connects, so it opens the transcript in the Playground.

The voice channel comes from the phone number — derived by the migration on the v1 path, created by the run on the v2 one — so the tenant is only callable with one. Language steers onboarding; the call itself runs in sv unless the brain says otherwise.

Also onboard from · Intercom, WaiterAid

Without an Intercom token there is no tonality, so the agent's prompt is the opening line alone.

Base prompt · editable per company after onboarding

Shown for reference. Set a company's override from Prompt layers on the Prompt tab once it exists.

Scraper — what onboarding finds on a website

Websites to crawl

The crawler onboarding runs, on domains that have no company yet — nothing is created. Each site is ranked and scraped exactly as a bootstrap would, then checked for whether the pages it kept even contain a phone number, an address or opening hours. Those flags are a presence check over the raw text, not parsed values: they say whether extraction could work. To see what it actually extracts, open a page and press Extract — that spends one Bedrock call.

Three sites crawl at a time; a domain takes tens of seconds, most of it probing subdomains and common paths. Raising pages read costs one fetch each and is where a page that ranked low but holds the address shows up.

Simulate — scenario calls

Run scenarios

Its prompt, blocks and knowledge are set up in the Company tab.

An LLM plays the caller against agana-brain and the call is read from its DB into recordings.json. Simulate only generates data — score it from the Run tab (Simulated view). Needs the brain stack up · ~15–40s per scenario.

New scenario

Playground — talk to the agent

no session
Call

A real call on agana-brain — every turn is recorded like any other, so it shows up in Dataset and Trace too. Its prompt, blocks and knowledge are set up in the Company tab. Needs the brain stack up · ~2–8s per turn.

Turn inspector
Live call · your microphone

The whole real pipeline: your mic → Soniox STT → agana-brainElevenLabs → your speakers, with barge-in. The tab dials /ws/webcall on the bridge, so the bridge must be running with WEBCALL_ENABLED=true. It spends real STT/TTS credit, and the call is recorded like any other — Dataset and Trace show it. Use headphones: there is no Krisp here, so on speakers the agent hears itself.

idle

Dataset

Calls are read live from the agana-brain DB (the source of truth — nothing stored locally). Simulated calls run against that same brain, so they are in here too. Open a call, then add it to a dataset to curate + label it — the dataset keeps its own snapshot, independent of the DB.

Pick a conversation to read its turns, RAG chunks, tool calls and blocks.

Trace

Where one turn's time actually went, from the recorded latencies — not a replay. Time zero is the caller's finalized utterance; the brain's stages run end to end from there, while the bridge's audio legs are placed at their own measured offsets, so an overlap reads as an overlap. A leg with no number is marked not measured rather than drawn as zero.

Pick a turn to see where its time went.

Optimize the base prompt

Search

Replays each turn's recorded Bedrock call with the candidate base swapped in, then scores the regenerated answers. Offline — no brain, no live calls. A run is dominated by judge calls: expect minutes, not seconds.

Seed base prompt

Where the search starts. Loaded live from the brain's _base_system_prompt() — edit it here to search from something else; the edit is used for this run only and never written to the brain. A winner ships as a reviewed change to that function — it applies to every tenant.

Keep the {{today}} token: each replayed turn renders it from its own recorded date.

Past searches

Pick a past search to read the base prompt it landed on.

Results

Pick a case to see its content, RAG chunks/blocks, and pass/fail reasons.
Run configuration
Raw score tables