Skip to content

Voice Adapter Capability Matrix

Every voice adapter in Scenario declares its capabilities via a frozen AdapterCapabilities record (Python capabilities.py, TypeScript voice.AdapterCapabilities). The Python table is auto-generated from those declarations and kept in sync by a CI gate — if you change an adapter's capabilities, regenerate with:

cd python
uv run python scripts/gen_capability_matrix.py

The TypeScript SDK ships a subset of adapters (see javascript/docs/voice/capability-matrix.md for the authoritative TS render).

Capabilities

Adapterstreaming_transcriptsnative_vaddtmfinterruptioninput_formatsoutput_formats
ComposableVoicepcm16/24000pcm16/24000
ElevenLabspcm16/24000pcm16/24000
GeminiLivepcm16/16000pcm16/24000
LiveKitpcm16/48000pcm16/48000
OpenAIRealtimepcm16/24000pcm16/24000
Pipecatpcm16/24000, mulaw/8000, opuspcm16/24000, mulaw/8000, opus
Twiliomulaw/8000mulaw/8000
Vapipcm16/16000pcm16/16000
WebRTCpcm16/24000pcm16/24000
WebSocketpcm16/24000pcm16/24000
Column key
ColumnMeaning
streaming_transcriptsAdapter emits incremental transcript events during a turn
native_vadAdapter has built-in voice activity detection
dtmfAdapter can detect and forward DTMF (keypad) tones
interruptionAdapter supports barge-in / user-initiated interruption
input_formatsAudio formats the adapter accepts from the user simulator
output_formatsAudio formats the adapter sends to the scenario harness

Wire transport and shipping status

The capabilities table above describes what each adapter supports. The table below describes how each adapter is wired and whether it is shipping or still stubbed behind PendingTransportError.

TypeScript readers: class names in this table match the Python SDK. TypeScript exports factory functions instead — pipecatAgent, twilioAgent, openAIRealtimeAgent, elevenLabsAgent, geminiLiveAgent, composableAgent. Python-only adapters are noted in the Not yet ported to TypeScript section below.

AdapterWire transportReal I/O?
ComposableVoiceAgentSTT + LLM + TTS pipeline (provider-defined)✅ shipping
ElevenLabsAgentAdapterWebSocket (ElevenLabs Convai)✅ shipping
GeminiLiveAgentAdapterWebSocket (Gemini Live)✅ shipping
LiveKitAgentAdapterWebRTC (LiveKit room)🚧 stub (PendingTransportError)
OpenAIRealtimeAgentAdapterWebSocket (OpenAI Realtime)✅ shipping
PipecatAgentAdapterWebSocket (Twilio Media Streams protocol)✅ shipping
TwilioAgentAdapterMedia Streams (WebSocket over Twilio)✅ shipping
VapiAgentAdapterREST (Vapi outbound)🚧 stub (PendingTransportError)
WebRTCAgentAdapterWebRTC (datachannel + audio track)🚧 stub (PendingTransportError)
WebSocketAgentAdapterWebSocket (bring-your-own protocol)✅ shipping

Adapters marked 🚧 raise PendingTransportError on connect() and are tracked as follow-up issues. Their capability declarations are final (they match the wire spec); only the transport glue code is pending.

Not yet ported to TypeScript

These adapters exist in the Python SDK but are not exported from @langwatch/scenario today — do not try to import them in TypeScript (tracked in #563):

AdapterStatus in TypeScript
LiveKitAgentAdapternot ported (Python-only)
VapiAgentAdapternot ported (Python-only)
WebRTCAgentAdapter (generic)not ported (Python-only)
WebSocketAgentAdapter (generic)not ported — subclass voice.VoiceAgentAdapter for a custom protocol

Pending transport in TypeScript: WebRTC mode on Pipecat (scenario.pipecatAgent({ transport: "webrtc", signalingUrl })) constructs fine but raises voice.PendingTransportError at connect() until the SmallWebRTC transport lands.

Source of truth

Capability values live in each adapter's capabilities declaration.