Articles

BluejayAssemblyAI

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
How the integration works: Bluejay Digital Humans connect over the CHIRP protocol to the open-source bridge, which speaks to an agent on AssemblyAI's Voice Agent API
AssemblyAI
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.

01Clone and configure

Everything lives in one repository: AssemblyAI/bluejay-aai-bridge. Clone it, install the requirements, and copy the example environment file.

shell
$ git clone https://github.com/AssemblyAI/bluejay-aai-bridge
$ cd bluejay-aai-bridge
$ pip install -r requirements.txt
$ cp .env.example .env   # add ASSEMBLYAI_API_KEY and AGENT_ID

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.

VariableWhat it does
ASSEMBLYAI_API_KEYRequired. The account that runs — and is billed for — every session.
AGENT_ID / AGENTWhich agent answers: a dashboard agent ID, or the name of a local file imported with import_agent.py.
CHIRP_USER, CHIRP_PASSBasic-auth credentials the bridge requires from callers. Set both on any hosted instance.
BLUEJAY_API_KEYOptional. Cross-links each AssemblyAI session ID to its Bluejay simulation result.
LOG_LEVELINFO by default; DEBUG narrates every event crossing the bridge.
PORTWhere 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.

Pre-flight checklist

Five things to confirm before your first full experiment — each one traces back to a step above.

Thanks to Daniel Ince, David Lange, and Ryan Seams for helping us get this out.

Test, monitor, & improve your
way into customer trust

Ship conversational AI that earns trust at every turn.