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.pyThe TypeScript SDK ships a subset of adapters (see javascript/docs/voice/capability-matrix.md for the authoritative TS render).
Capabilities
| Adapter | streaming_transcripts | native_vad | dtmf | interruption | input_formats | output_formats |
|---|---|---|---|---|---|---|
| ComposableVoice | ✅ | ❌ | ❌ | ❌ | pcm16/24000 | pcm16/24000 |
| ElevenLabs | ✅ | ✅ | ❌ | ❌ | pcm16/24000 | pcm16/24000 |
| GeminiLive | ✅ | ✅ | ❌ | ✅ | pcm16/16000 | pcm16/24000 |
| LiveKit | ✅ | ✅ | ❌ | ❌ | pcm16/48000 | pcm16/48000 |
| OpenAIRealtime | ✅ | ✅ | ❌ | ✅ | pcm16/24000 | pcm16/24000 |
| Pipecat | ✅ | ✅ | ❌ | ✅ | pcm16/24000, mulaw/8000, opus | pcm16/24000, mulaw/8000, opus |
| Twilio | ❌ | ❌ | ✅ | ✅ | mulaw/8000 | mulaw/8000 |
| Vapi | ✅ | ✅ | ❌ | ❌ | pcm16/16000 | pcm16/16000 |
| WebRTC | ❌ | ❌ | ❌ | ❌ | pcm16/24000 | pcm16/24000 |
| WebSocket | ❌ | ❌ | ❌ | ❌ | pcm16/24000 | pcm16/24000 |
| Column | Meaning |
|---|---|
streaming_transcripts | Adapter emits incremental transcript events during a turn |
native_vad | Adapter has built-in voice activity detection |
dtmf | Adapter can detect and forward DTMF (keypad) tones |
interruption | Adapter supports barge-in / user-initiated interruption |
input_formats | Audio formats the adapter accepts from the user simulator |
output_formats | Audio 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.
| Adapter | Wire transport | Real I/O? |
|---|---|---|
ComposableVoiceAgent | STT + LLM + TTS pipeline (provider-defined) | ✅ shipping |
ElevenLabsAgentAdapter | WebSocket (ElevenLabs Convai) | ✅ shipping |
GeminiLiveAgentAdapter | WebSocket (Gemini Live) | ✅ shipping |
LiveKitAgentAdapter | WebRTC (LiveKit room) | 🚧 stub (PendingTransportError) |
OpenAIRealtimeAgentAdapter | WebSocket (OpenAI Realtime) | ✅ shipping |
PipecatAgentAdapter | WebSocket (Twilio Media Streams protocol) | ✅ shipping |
TwilioAgentAdapter | Media Streams (WebSocket over Twilio) | ✅ shipping |
VapiAgentAdapter | REST (Vapi outbound) | 🚧 stub (PendingTransportError) |
WebRTCAgentAdapter | WebRTC (datachannel + audio track) | 🚧 stub (PendingTransportError) |
WebSocketAgentAdapter | WebSocket (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):
| Adapter | Status in TypeScript |
|---|---|
LiveKitAgentAdapter | not ported (Python-only) |
VapiAgentAdapter | not 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.
- Python:
capabilities: ClassVar[AdapterCapabilities]per adapter. Canonical sourcepython/scenario/voice/capabilities.py; generatorpython/scripts/gen_capability_matrix.py. - TypeScript:
capabilities: voice.AdapterCapabilitiesper adapter, read fromjavascript/src/voice/adapters/*.ts; authoritative render injavascript/docs/voice/capability-matrix.md.
