Wire a Pipecat pipeline onto the audio bridge over raw MoQT — the real seam today, plus the illustrative shape of a dedicated transport.
You have a Pipecat bot — a frame pipeline wired to ASR, an LLM, and TTS — and you
want it to answer real calls over TeleQuick’s QUIC/MoQT transport. There is no
packaged Pipecat adapter, but Pipecat’s transport seam maps cleanly onto the
audio bridge: caller audio arrives on an uplink track, agent audio goes back
on a downlink track. That bridge is real and shipping — you feed it into
Pipecat yourself.
Aspirational — no Pipecat adapter ships. There is no pipecat transport,
plugin, or vendor-bridge target in TeleQuick today; the built-in
VENDOR_BRIDGE routes to LiveKit,
Vapi, and Twilio only. The audio-bridge code below is real; the
Pipecat-transport wrapper is an illustrative design sketch, not an installable
package. See Pipecat + TeleQuick Transport
for the full framing.
Skip agents.attach and run the bridge yourself. Ask for pcm16 so Pipecat gets
raw audio; the bridge transcodes the PSTN (G.711) leg for you. This is stock SDK.
TypeScript
Python
import { Voice } from "@telequick/sdk/voice";const v = new Voice({ baseUrl: "https://engine.telequick.dev", apiKey: process.env.TELEQUICK_CREDENTIALS!, orgId: "org_abc",});const call = await v.calls.originate({ to: "+15551234567", from: "+15558675309", trunkId: "trunk_main",});// pcm16 @ 16 kHz — the shape most frame pipelines expect.const bridge = await v.audioBridge.attach(call.sid, { codec: "pcm16", sampleRate: 16000, onUplink: (pcm, tsUs) => pipeline.pushAudio(pcm), // caller -> your bot});pipeline.onAudioOut((pcm) => bridge.publishDownlink(pcm)); // your bot -> caller
Keep the bridge reference alive for the call’s lifetime — if it is
garbage-collected both tracks drop. Always bridge.close() before
call.hangup() so the tracks tear down cleanly.
The bridge above already gives you the two hooks a Pipecat Transport needs:
onUplink produces input frames, publishDownlink consumes output frames. A
dedicated transport would just wrap those into Pipecat’s input() / output()
processors so the pipeline runs unchanged.
Illustrative — this transport is not shipped.MoqtBridgeTransport below
does not exist as a package. It is the design shape only: what a first-class
adapter would wrap around the real audio bridge. Do not pip install it.
# ILLUSTRATIVE — design sketch, not an installable package.from pipecat.pipeline.pipeline import Pipelinefrom pipecat.pipeline.runner import PipelineRunnerfrom pipecat.pipeline.task import PipelineTask# A transport that would wrap TeleQuick's audio bridge:# input(): bridge.on_uplink -> AudioRawFrame (PCM16 @ 16 kHz)# output(): AudioRawFrame -> bridge.publish_downlinktransport = MoqtBridgeTransport(bridge, sample_rate=16000)pipeline = Pipeline([ transport.input(), # caller audio in stt, # your ASR frame processor llm, # your LLM context tts, # your TTS frame processor transport.output(), # agent audio back to the caller])await PipelineRunner().run(PipelineTask(pipeline))
The adapter’s only real work is the seam our own runtime already handles:
resample between Pipecat’s frame rate and the runtime’s 8 kHz PCM16 audio
bus, keep the room-scoped MoQT namespaces valid, and carry Opus rather than
PCM on browser legs. None of it is exotic — it just isn’t packaged, so today you
own the onUplink/publishDownlink glue directly.
Pipecat already speaks WebSocket audio, and TeleQuick accepts a bespoke
WebSocket audio sender as a media leg. Point Pipecat’s WebSocket server
transport at that on-ramp, route the trunk’s inbound rule to your endpoint,
and let the SIP gateway terminate the carrier while Pipecat drives the
conversation — no TeleQuick code in the bot. This is the same path as
migrating a custom WebSocket audio sender.
For QUIC/MoQT directly rather than a WebSocket leg, treat Pipecat as a
custom runtime: the native
SDK exposes MoQT publish/subscribe over the QUIC transport, and you bind
Pipecat’s input()/output() to those primitives — the manual version of
the sketch above.
Native SDK bindings speak QUIC/MoQT only and do not carry the browser’s
WebSocket/WebRTC fallback leg — plan for a QUIC-reachable network.
If your goal is really “keep my existing media backend,” the built-in
VENDOR_BRIDGE node routes call
media to an external LiveKit, Vapi, or Twilio backend via a sidecar. Pipecat
is not a bridge target — but if your Pipecat bot fronts one of those,
this is a config-only path.
If you want Pipecat only for the pipeline (cascaded ASR → LLM → TTS,
turn-taking, tools), TeleQuick’s runtime already ships that as a configured
DAG with transport, telephony, and barge-in built in. Bringing only your
models via provider credentials is often less work than porting a Pipecat
pipeline onto an adapter that doesn’t exist yet.