VoiceTel

VoiceML / ConversationRelay

Voice agent projects you can run on VoiceML.

VoiceML's <Connect><ConversationRelay> speaks the same JSON WebSocket protocol as Twilio's ConversationRelay, so open-source voice agents written for it can run against VoiceML. We read the source of popular projects and compared it with what VoiceML supports; here is what runs as-is and what doesn't carry over.

ConversationRelay guide AI Agents

Runs as-is

ProjectBuilt withFromNotes
twilio-samples/conversationrelay-elevenlabs-openai Node.js · OpenAI Twilio sample The ElevenLabs voice ID applies only if your VoiceML account uses ElevenLabs for text-to-speech.
twilio-samples/conversationrelay-ai-demo Next.js · OpenAI Twilio sample The outbound-call button uses the Twilio SDK; point it at voiceml.voicetel.com with your VoiceTel credentials.
langflow-ai/langflow-twilio-voice Node.js · Langflow Langflow —
pkamp3/cr-anthropic-demo Node.js · Anthropic Claude Community —
rishabkumar7/twilio-cr-gemini-python Python · Google Gemini Community The ElevenLabs voice ID applies only if your VoiceML account uses ElevenLabs for text-to-speech.
manbearshark/ConversationRelay-LiveChat-Bedrock-Fargate Node.js · Amazon Bedrock on AWS Fargate Community Its DTMF attributes are ignored (VoiceML always forwards DTMF), and the <Parameter> values it adds are not forwarded; the sample does not read them.

Runs with limits

ProjectBuilt withWhat doesn't carry over
danohn/langchain-conversationrelay Python · LangChain Memory across calls from the same number does not carry over: it keys memory on a caller number passed as a <Parameter>, which VoiceML does not forward, so each call starts fresh.
pBread/twilio-agentic-voice-assistant TypeScript · OpenAI Sending DTMF and switching language mid-call are ignored, and its custom parameters are not forwarded.
midshipman/ConvRelay-LiteLLM Python · LiteLLM Needs a one-line change: it reads the caller number from the setup message, which VoiceML does not send. Change message['from'] to message.get('from', '') or the call ends after setup.

Building blocks

Running a project on VoiceML

  1. Select a speech-to-text and a text-to-speech provider for your VoiceML account. ConversationRelay needs both; see the speech recognition and text-to-speech guides.
  2. Run the project and point your number's voice URL at the endpoint that returns its <Connect><ConversationRelay> markup.
  3. If the project validates webhook signatures, give it your VoiceTel auth token; VoiceML signs requests with the same scheme.
  4. If the project calls the REST API (to place or transfer calls, for example), point the Twilio SDK at voiceml.voicetel.com with your VoiceTel credentials.

What VoiceML supports

DirectionMessageFields
To your appsetupsessionId, callSid, language
To your apppromptvoicePrompt, lang, last
To your appinterruptutteranceUntilInterrupt, durationUntilInterruptMs
To your appdtmfdigit
From your apptexttoken, interruptible, preemptible, last
From your appplaysource, interruptible, preemptible
From your appendhandoffData (returned on the <Connect> action callback)

<ConversationRelay> attributes VoiceML uses: url, voice, language, welcomeGreeting. ttsProvider and transcriptionProvider are accepted, but your account's own speech providers are used.

Not supported:

  • sendDigits and language-switch messages from your app (ignored)
  • caller details (from, to, direction, callerName) in the setup message
  • <Parameter> values (customParameters in setup)
  • other <ConversationRelay> attributes, such as dtmfDetection and interruptByDtmf (ignored; DTMF is always forwarded)

Media Streams frameworks

Frameworks that use Twilio's Media Streams instead of ConversationRelay, such as the OpenAI Agents SDK and Pipecat, connect through <Connect><Stream>: VoiceML delivers the same Media Streams wire protocol to your WebSocket. LiveKit Agents connects through SIP trunking instead. See voice AI frameworks for how Pipecat, LiveKit Agents, Dograh, TEN, and Bolna connect.

Reviewed 2026-10-04 by reading each project's source against VoiceML's ConversationRelay support; not tested on live calls. Projects change after review, so check the repository before you deploy. Project names belong to their owners; listing a project does not imply endorsement by, or affiliation with, its authors or Twilio.

Trusted by