Transport plugin
Recommended. Install a package into your
livekit-agents worker. Your
agent runs verbatim over our QUIC transport. You retire the SFU
completely.Transport in front
Keep your LiveKit room in operation. Bridge the media into it with a
sidecar. Best when other participants still join the room.
Drop-in client shim
Swap one import in your browser app. Your
Room / RoomEvent / track
code still compiles, but runs over our transport instead of your SFU.Path 1 — install the transport plugin (recommended)
The LiveKit Agents SDK skips its own room/WebRTC layer whenever a session already has custom audio IO set. This is the same seam that LiveKit uses for its TCP console mode. The transport plugin binds that seam to a QUIC/WebTransport connection to ClutchCall. Thus yourentrypoint runs
byte-for-byte unchanged. There is no room, no SFU, and no LiveKit server
anywhere in the path.
1
Install the plugin next to your agent
- Python
- TypeScript
2
Swap your worker runner
Replace
cli.run_app(...) with run_agent_worker(...). Pass your existing
entrypoint. The worker dials out to :443, registers under an agent
name, and serves the calls that the engine assigns. It reconnects
automatically if the link drops. This is the only new file in your repo.
The agent itself does not change.The full worker snippet for both languages is in
Run a LiveKit Agent on ClutchCall Transport.3
Point your inbound numbers at us
Move the trunks that feed your LiveKit agent onto ClutchCall. Then attach
an agent whose entry node is a
VENDOR_BRIDGE with
vendor_provider: "clutchcall" and vendor_room set to the name
that your worker registered under.See SIP Trunking and
Number Provisioning.4
Cut over and retire the SFU
Move numbers in waves. When traffic is stable, your LiveKit server carries
no voice traffic at all. Shut it down, along with the TURN relays and the
ICE plumbing.
Path 2 — put the transport in front of your agent
Take this path when your LiveKit room must stay in operation — other participants join it, or something else in your stack depends on it. Your LiveKit agent, room logic, and model plumbing stay byte-for-byte the same. What changes is the media plane in front of them. This path also covers the two cases that the plugin does not yet: a scale-to-zero serverless worker, and a network with no outbound UDP. Callers (PSTN via SIP trunks, or browsers) land on ClutchCall’s single:443 QUIC/WebTransport plane. A lightweight bridge
sidecar that you run next to your LiveKit deployment carries the audio
between our transport and your LiveKit room. The runtime routes a call to that
bridge with a first-class vendor-bridge step. The runtime does not drive
the conversation itself.
The vendor-bridge routing is a first-class part of the runtime. Its targets
are
livekit, vapi, and twilio. The bridge sidecar itself is a
separate component that you deploy next to your LiveKit stack. It is not
bundled into the engine. Its exact packaging depends on your environment.
Unlike Path 1, this path keeps your LiveKit server in the call flow.1
Point your inbound numbers at our transport
Move the trunks that feed your LiveKit agent onto ClutchCall. Your
carrier trunk terminates on our SIP gateway. Numbers are provisioned per
tenant under
<workspace-id>.sip.clutchcall.dev. Nothing about your agent
changes. Only the place where the call first lands changes.See SIP Trunking and
Number Provisioning.2
Run the LiveKit bridge sidecar
Deploy the bridge sidecar next to your LiveKit server. It connects to our
transport on one side and to your LiveKit room on the other. It uses your
existing LiveKit URL and access-token issuance. Audio moves across as Opus.
Your agent sees a normal LiveKit participant.
3
Route calls to the bridge
In the agent configuration for the number, select the vendor bridge
target instead of the built-in runtime. As a concept, the agent config
carries a vendor-bridge block that names LiveKit as the destination:When a call matches, the runtime gives its media to the bridge. It does not
run a conversation DAG. Your LiveKit agent joins the room and answers as it
always did.
4
Cut over and validate
Move numbers over in waves. On each wave, check that the call reaches your
LiveKit agent. Check that audio is two-way. Check that your existing
telemetry still fires. The agent is unchanged, so the only new surface is
the transport and the bridge. Validate those, not your model.
Path 3 — the drop-in client shim (Preview)
Your LiveKit usage can be a browser app that talks to a room. For that case, the shim exposes alivekit-client-compatible surface (Room,
RoomEvent, createLocalAudioTrack, participants, tracks) mapped onto our
MoQT/QUIC transport. For the common voice path, the migration is a one-line
import swap. There is no SFU, no ICE, and no media server.
1
Install the shim
2
Swap the import
Point your existing
livekit-client imports at the shim. Your component
code does not change in any other way.3
Connect to the relay
Your call sites stay the same. The shim reads room and identity from your
access token. It opens a MoQT session on
:443 instead of a join to an
SFU.How the shim maps LiveKit concepts
The shim keeps LiveKit semantics but replaces the media plane entirely. There is no SFU and no ICE. WebRTC’s transport is never used. The mic still runs through the browser’s Opus encoder. But the shim taps only the encoded frames and sends them over MoQT. See One-Line WebRTC Diversion.What you gain, and what stays the same
What you drop
What you drop
You drop the SFU that you operate, the ICE/DTLS/SRTP negotiation, the TURN
relays for blocked networks, and the media server’s scale and on-call
burden. Media moves on one QUIC/WebTransport plane on
:443.What stays yours
What stays yours
You keep your agent logic, prompts, and models. On Path 1, your
entrypoint and AgentSession run verbatim. On Path 2, your LiveKit room
code is unchanged. On Path 3, your browser component keeps its
Room/RoomEvent shape. We move frames. We do not impose a runtime.Credentials
Credentials
Paths 2 and 3 read the room and identity out of your existing LiveKit
access token. Thus your auth/token-minting service does not have to change
to get audio to flow. Path 1 has no room and no LiveKit token. The worker
authenticates to the edge with a ClutchCall media app key + secret
(
CLUTCHCALL_MEDIA_KEY / CLUTCHCALL_MEDIA_SECRET). Your provider
keys stay where they are, in your own process.Related
Run a LiveKit Agent on the Transport
Path 1 end to end — install the plugin, register a worker, take a call.
Keep Your Existing Runtime
The transport-only on-ramps in depth — the shim and the raw MoQT primitives.
LiveKit Agent Integration
Run a LiveKit agent behind our transport, at the integration level.
Migration Overview
Choose a path across all the products that you can move off.
Migration Checklist
The wave-by-wave cutover checklist for any voice migration.

