Testing another transport (Pipecat, OpenAI Realtime, Gemini Live, Twilio) from code? See Voice Agent Testing.
What it is
A Voice agent type in Agents points at an ElevenLabs Conversational AI agent by its agent id. Three ways to test it:Talk to it works before the agent is saved, as soon as the agent id and the ElevenLabs key exist. The agent is saved on hang-up, and the call is stored as a run in the voice-calls set with caller
human, a transcript and a link to the recording.Turn it on
In-app voice agents are in private beta. The feature sits behind the product flagrelease_voice_agents_enabled, off by default. To request access, reach out to support at support@langwatch.ai.
- Self-hosted
- Cloud
Set
FEATURE_FLAG_FORCE_ENABLE=release_voice_agents_enabled on the app.Credentials
Add both under Settings > Model Providers. Never from environment variables.1
ElevenLabs key
The key needs
convai_read to read the agent, convai_write to mint the browser conversation token and signed URL, and conversation read to fetch the transcript and recording after the call.The agent must live in the same ElevenLabs workspace as the key. A wrong workspace shows as agent not found.2
OpenAI key
Required only for a simulated scenario run. The simulated caller’s speech is synthesized with OpenAI text-to-speech (
gpt-4o-mini-tts), and the agent’s audio is transcribed with OpenAI for the judge. Talk to it and Call it myself use ElevenLabs only and need no OpenAI key.Without it a simulated run fails with “The caller voice needs an OpenAI key. Add one in Settings > Model Providers.”Caller voice
Set the caller voice on the scenario, under Customize scenario, or in the Caller voice block of the Agent Testing case editor. It is stored on the scenario, so every run of it uses the same caller.Limits
Set these as app environment variables.VOICE_CALL_MAX_SECONDS is enforced by the server and governs a scenario run: the simulated caller, the judge and the recorded transcript all stop at that limit. A Talk to it or Call it myself call in the browser is bounded by the browser tab instead, up to ElevenLabs’ own maximum call length: closing or reloading the tab, or losing the connection, ends the call at whatever point that happens, not at VOICE_CALL_MAX_SECONDS.
Security: projects in one organization that share a single ElevenLabs key share that workspace’s agents and conversations, since ElevenLabs checks the key, not the project. A project-scoped key is the way to isolate a project’s voice agents from the rest of the organization.
Traps
- The ElevenLabs key needs
convai_read,convai_writeand conversation read. A key missing any of these fails at a different step, so check all three when a call breaks. - The agent must be in the same ElevenLabs workspace as the key.
- An agent marked public in ElevenLabs still needs a token here; public access does not skip the credential check.
- LangWatch never sends prompt overrides. Enabling overrides on the agent has no effect on these calls: the agent’s own ElevenLabs prompt is what gets tested.
- The recording can be unavailable for a short while after hang-up while ElevenLabs processes it. The run shows “Recording unavailable”; reload later.
- The browser needs HTTPS or localhost and microphone permission. Autoplay policy can keep the agent silent until the page has been clicked.
- Every call, whether Talk to it, Call it myself or simulated, consumes ElevenLabs conversation minutes on your account. A simulated run also consumes OpenAI audio tokens.
- Only one browser call per tab.
- Self-hosted: voice turns carry audio, and audio is written to stored objects. If the stored-objects path is not writable (or no S3 bucket is configured), every voice message fails to ingest and the run shows “No response” even though the call happened. Check the api log for
EACCESon the stored-objects directory.