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.
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.

Wrapping the bridge as a Pipecat transport

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 Pipeline
from pipecat.pipeline.runner import PipelineRunner
from 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_downlink
transport = 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.

What ships today instead of an adapter

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.
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.

Pipecat + Transport

The full conceptual framing and the on-ramps that ship today.

Bridge a LiveKit Agent

The vendor-bridge sibling for a LiveKit backend.

Stream to your own ASR

The uplink-subscribe half of the bridge, on its own.

Keep Your Existing Runtime

Adopt only the transport and keep your own agent loop — the Pipecat pattern.