We’ve partnered with AssemblyAI to make agent testing native to the Voice Agent API. Here’s the announcement — and the runbook for your agent’s first hundred simulated calls.
REQ 01
An AssemblyAI agent
Your API key, and the agent ID from its dashboard URL
REQ 02
A Bluejay account
The free tier is enough to run your first simulations
REQ 03
Python 3.12+
The bridge is one stateless Python process
REQ 04
A public wss:// host
Railway and Render one-click deploys are prewired
About AssemblyAI
A leading speech AI company. AssemblyAI’s models power transcription and understanding for thousands of products, and its Voice Agent API gives developers a single realtime API for building production voice agents. assemblyai.com
Voice agents built on AssemblyAI’s Voice Agent API sound great when you test them yourself: you speak clearly, you wait your turn, you ask the questions the agent was built to answer. Your customers will do none of those things. They interrupt mid-sentence, call from a car on a bad line, switch languages halfway through, and ask for the one thing the prompt never anticipated.
Today we are announcing our partnership with AssemblyAI: builders on the Voice Agent API can now natively test, evaluate, and improve their agents with Bluejay. The first half of this post is the why. The rest is a runbook you can follow with a terminal open — the same steps as the official guide on AssemblyAI’s site.
What we’re announcing
Bluejay runs simulated callers — Digital Humans — against your live agent and scores what happens. With this integration, AssemblyAI users point that machinery at their real production agent, not a mock: barge-ins that cut it off mid-sentence, accents across every supported language, conversations in 15+ languages, bad audio quality that degrades the line — the edge cases you would never sit through by hand. Run one scenario as a smoke test or hundreds in parallel as a regression suite, and every conversation lands as a scored result with transcripts, recordings, and evaluations in the Bluejay dashboard.
The integration runs on CHIRP, our realtime A2A protocol — the WebSocket protocol Bluejay uses to let two voice systems talk to each other like two parties on a phone line, streaming PCM audio frames and conversation events in both directions. Voice companies are adopting CHIRP as the default communication protocol for realtime A2A, and with this launch the AssemblyAI team supports it for the Voice Agent API.
The open-source bridge does the translation: it accepts CHIRP connections from Bluejay, converts our 16 kHz PCM audio to the 24 kHz PCM the Voice Agent API expects, and paces the stream so buffers never overflow and interruption handling behaves the way it would on a real call. When a Digital Human barges in, your agent experiences a real barge-in — not an artifact of the test harness. That’s the announcement. Now the terminal.
Your agent ID is in the agent’s dashboard URL. That’s the whole configuration: the bridge answers as whichever agent you point it at.
Tip
Prefer editing your agent as a file? python import_agent.py <agent-id> pulls it down locally, and AGENT=<name> python bridge.py runs the bridge against your editable copy — handy for iterating on prompts between test runs.
02Rehearse locally
Before any real simulations, make sure the plumbing holds. The repo ships with call.py, a miniature caller that places a short conversation against the bridge on your machine.
shell · two terminals
$ python bridge.py # terminal 1: the bridge$ python call.py --seconds 12 # terminal 2: a 12-second test call
Feed it audio files or plain text, and adjust its --delay flag to rehearse barge-in timing. If the twelve-second call comes back clean, your agent just survived its first simulated caller.
03Host the bridge
Bluejay’s Digital Humans call in from the cloud, so the bridge needs a public wss:// endpoint — secured with Basic-auth credentials, because an open bridge would let anyone run sessions on your API key.
.env
CHIRP_USER=bluejay
CHIRP_PASS=<a long random string>
One-click deploys are prewired for Railway and Render, with credentials auto-generated on Render. Anywhere else, just run the Python process: it is stateless, shares nothing between calls, scales horizontally, and answers health checks at GET /health.
Watch out
Two hosting mistakes cost real debugging time: instances that sleep when idle (the cold start times out the incoming call) and instances sized below the concurrent sessions your experiments will open. Always-on, sized for your suite.
04Connect Bluejay
In Bluejay, create an agent with connection type Websocket and point it at wss://<your-host>/voice with the credentials from step 03. That single agent entry is the handshake: from here, everything on the platform applies to your Voice Agent API agent — generated test scenarios, custom metrics, red teaming, multilingual callers, and monitoring.
05Run and review
Run your first experiment. Every simulated conversation is scored in Bluejay, and the AssemblyAI side keeps its own record of each session — the repo’s sessions.py lists and downloads them.
shell
$ python sessions.py # recent Voice Agent API sessions$ python sessions.py sess_abc123 # download one session
Set a BLUEJAY_API_KEY and the bridge cross-links each AssemblyAI session ID to its Bluejay result: the scored evaluation on one side, the session-level view of what your agent did on the other. One call, both perspectives.
Cost note
Every simulated call is a real, billable Voice Agent API session — by design, because that is what makes the results trustworthy. The bridge terminates sessions cleanly at hangup so nothing billable lingers, and the credentials from step 03 keep strangers off your key.
Configuration reference
Six variables cover the whole bridge. The AssemblyAI docs keep the canonical list.
Variable
What it does
ASSEMBLYAI_API_KEY
Required. The account that runs — and is billed for — every session.
AGENT_ID / AGENT
Which agent answers: a dashboard agent ID, or the name of a local file imported with import_agent.py.
CHIRP_USER, CHIRP_PASS
Basic-auth credentials the bridge requires from callers. Set both on any hosted instance.
BLUEJAY_API_KEY
Optional. Cross-links each AssemblyAI session ID to its Bluejay simulation result.
LOG_LEVEL
INFO by default; DEBUG narrates every event crossing the bridge.
PORT
Where the bridge listens. Defaults to 8767.
Start testing your agent
The integration is live today. The docs, the bridge, and a free Bluejay account are all you need to put your Voice Agent API agent through its first hundred calls.