Integrations
Every carrier speaks a different dialect
Twilio sends base64 μ-law wrapped in JSON. Vonage sends raw binary. Exotel uses snake_case and throws away anything under 100 milliseconds. They all flush playback differently, and getting that flush wrong is why callers hear an agent talking over them. Setu is an open-source bridge that speaks all of them and hands the voice engine plain PCM16.
export DVAARIK_API_KEY=dvk_live_...
export AGENT_PROMPT="You are Riya, the receptionist at Sunrise Dental."
npx @dvaarik/setuMIT licensed · github.com/dvaarikai/setu
Pick your provider
Each guide gives the exact wire format, the frame that flushes queued playback when a caller interrupts, and the one detail that costs an afternoon if nobody warns you about it.
Twilio
DocumentedAnswer a Twilio number with an AI voice agent by pointing a Media Stream at a WebSocket.
/twilio · 8 kHz
SignalWire
DocumentedUse SignalWire's Twilio-compatible media streams with an AI voice agent, without writing a second integration.
/signalwire · 8 kHz
Plivo
DocumentedStream a Plivo call into an AI voice agent and play the agent's speech back on the same socket.
/plivo · 8 kHz (16 kHz where the account allows L16)
Exotel 🇮🇳
LiveConnect an Indian Exotel number to an AI voice agent over Exotel's bidirectional stream.
/exotel · 8 kHz
FreJun / Teler 🇮🇳
LiveConnect a FreJun (Teler) Indian number to an AI voice agent over Teler's bidirectional stream.
/frejun · 8 kHz
Vonage
DocumentedBridge a Vonage Voice API call into an AI voice agent using raw binary WebSocket audio.
/vonage · 16 kHz by default
Telnyx
DocumentedFork a Telnyx call's media to an AI voice agent and stream the reply back.
/telnyx · 8 kHz (PCMU by default; PCMA and L16 also handled)
jambonz
DocumentedPut an AI voice agent on your own SIP trunk using jambonz as the media gateway.
/jambonz · 16 kHz by default, set by the verb
Raw SIP or anything else
DocumentedBridge audio from a provider Setu has no adapter for, or from a browser, app or test harness.
/raw · Whatever you send, declared on connect
Live means we run that adapter ourselves on real calls every day — today that is Exotel. Documented means the adapter is written from the vendor's own published reference and reviewed, but we have not personally put a paid call through it. If you do, open an issue either way: that label should tell the truth.
Why a bridge at all?
A voice agent is four hard problems — hearing, thinking, speaking, and knowing when to stop talking. The Voice API solves those four behind one WebSocket. The fifth problem is the carrier plumbing, and it has nothing to do with your product: it is byte formats, base64 envelopes, sample rates and buffer flushes, and it reliably eats about a week.
Carriers queue seconds of audio ahead of the caller's ear. When someone interrupts, the agent stops generating — but the caller keeps hearing whatever is already queued unless you send that carrier's specific flush frame. Three providers on this page spell that frame three different ways, one of them under a completely different key. That difference is the entire reason this library exists.
Setu is MIT licensed and its engine interface is public, so it is not locked to Dvaarik — point it at another voice backend and it still works. That is deliberate. A bridge that only crosses to one bank is not a bridge.