LiveKit
Connect your own voice bot — built with Pipecat, the LiveKit Agents framework, or anything that can join a LiveKit room — and let RubricHQ’s simulated caller talk to it over real audio.
Both parties join one LiveKit room:
rubric-test-caller— RubricHQ’s AI caller, running your scenario.- your agent-under-test — the bot you’re testing.
They publish and subscribe to each other’s audio; RubricHQ records the call and produces transcript + audio metrics.
Prefer Daily as your transport? The model is identical — see Daily.
The model: rooms, tokens, and who creates them
A few LiveKit facts that decide how the integration is wired:
- A room is one call/session. A token is a JWT that authorizes one identity to join one room.
- Minting a token requires the LiveKit project’s API key + secret (the token is signed with the secret; its
issis the API key). Joining a room requires only the room URL + a token — never the API key. - So the only real question is who creates the room and mints the tokens. That gives two modes:
Configure this under Agent → Channels → Web, provider LiveKit.
Credentials are only needed for “We create rooms” mode — because that’s where we mint the tokens. In “You create rooms” mode we never see your API key; you hand us a scoped token.
Credentials (for “We create rooms”)
Provide your LiveKit project credentials in either place — RubricHQ resolves per-agent override → workspace default → error:
- Workspace default — Settings → Integrations → Transport Providers → LiveKit:
URL,API Key,API Secret. Used by every agent that doesn’t override. - Per-agent override — Agent → Channels → Web → “We create rooms” → LiveKit credentials. Overrides the workspace default for that one agent.
The API Secret is write-only: once saved it shows “Configuration saved” and is never sent back to the browser. Leave it untouched to keep it; click Edit to replace it.
Mode 1 — You create rooms (client)
Recommended for most custom/Pipecat bots. You own the LiveKit project; RubricHQ never needs your keys.
Config
Sequence
- RubricHQ POSTs to your Bot Runner URL with the run context.
- Your service creates a LiveKit room, starts your bot in it, and returns a join token for our caller.
- RubricHQ’s caller joins that room with the token you returned, and the conversation runs.
What we send → your Bot Runner URL
What you return (immediately, in the HTTP response)
The token is a join token you mint for RubricHQ’s caller. Decoded, it looks like:
The room + token come back in the HTTP response — not via a webhook. By the time you respond 200, the room must exist and the token must be valid, because RubricHQ’s caller joins immediately.
Reference bot runner (client mode)
Mode 2 — We create rooms (rubric)
RubricHQ creates the room on your LiveKit project (using the credentials above), mints both tokens, then gets your bot into that room. How we reach your bot depends on the agent type:
Config
Sequence (Pipecat / Custom)
- RubricHQ creates a room on your project and mints a
bot_token(for your bot) and atest_caller_token(for our caller). - RubricHQ POSTs your join endpoint with the room name, the
bot_token, and the room URL. - Your bot joins that room with the token we minted; our caller joins too; the conversation runs.
What we send → your join endpoint
What you return
The bot_token we minted for your bot, decoded:
Your bot doesn’t need its own credentials here — it joins our room with the bot_token we minted (signed by your project’s key, so it’s valid on your project). It only needs the room_name, bot_token, and livekit_url from the request.
Reference bot runner (rubric mode — Pipecat)
LiveKit explicit dispatch (registered Agents workers)
If your bot is a registered LiveKit Agents worker, you don’t need a join endpoint. Set Agent Name to your worker’s name and RubricHQ issues a dispatch into the room it created:
Leave Agent Name blank to rely on your worker’s automatic dispatch (it joins every new room on the project).
The dispatch only pulls in an agent if a worker registered under that agent_name is online and connected to the project. RubricHQ always issues the dispatch correctly (you can confirm it via lk.agent_dispatch.list_dispatch(room_name=…)), but if no matching worker is running, only our caller is in the room and the run will have no agent to talk to.
Optional room config — “LiveKit Config (JSON)”
When RubricHQ creates the room (“We create rooms”), you can pass extra room-creation options as JSON under Agent → Channels → Web → LiveKit Config (JSON). They’re optional and forwarded to LiveKit’s CreateRoom call; RubricHQ’s required keys (the room name) always take precedence.
Only the keys above are honored — any other keys are ignored. For the authoritative meaning of each, see the LiveKit CreateRoom reference.
This JSON only applies in “We create rooms” mode. In “You create rooms” mode you create the room, so you set these options yourself in your own CreateRoom call.
Choosing a mode
Results
When the call ends, the transcript, audio recording (speaker-separated when available), and metrics appear automatically on the run in RubricHQ — your bot runner doesn’t need to report anything back. If a call can’t proceed (missing/incorrect credentials, room creation failed, or the bot never joins) the run is marked failed with the reason rather than left hanging.
A reference Pipecat bot runner that supports both modes only needs two endpoints: POST /api/create-and-join (client mode) and POST /api/session (rubric mode). Everything else — recording, transcription, metrics — is handled by RubricHQ.