You have a working LiveKit agent and want a phone call (or a browser leg) to reach it over TeleQuick’s QUIC transport — without editing the agent. The shipped way is a vendor-bridge front-proxy: the voice gateway terminates the caller edge, then relays the audio to a small bridge process that joins your LiveKit room as an ordinary participant. Your agent code is untouched.
There is no packaged LiveKit-Agents adapter. You do not pip install a TeleQuick plugin into your agent. Integration happens at the edge — the gateway sits in front of your agent and moves audio to it. The conceptual walkthrough is in LiveKit Agent Integration; this page is the runnable version.

1. Configure a vendor-bridge agent

Give the agent a single VENDOR_BRIDGE entry node instead of an ASR→LLM→TTS cascade. With this config the runtime runs no turn detection and no model — it hands the caller’s audio to your LiveKit room and streams the room’s audio back.
agent-config.json
{
  "entry_node": "bridge",
  "nodes": {
    "bridge": {
      "node_type": "VENDOR_BRIDGE",
      "vendor_provider": "livekit",
      "vendor_room": "support",
      "vendor_creds_ref": "livekit_prod"
    }
  }
}
vendor_provider
string
default:"livekit"
External vendor to route to — livekit, vapi, or twilio. Swap this one field to front-proxy a Vapi or Twilio agent with the same mechanism.
vendor_room
string
The LiveKit room the bridge sidecar joins (Vapi assistant id / Twilio app for the other vendors).
vendor_creds_ref
string
Key into your tenant’s sealed vendor credentials — your LIVEKIT_URL, LIVEKIT_API_KEY, and LIVEKIT_API_SECRET. Stored at rest, never inlined.

2. Place a call at that agent

Attach the agent on originate and the gateway wires the audio automatically on answer — no AudioBridge of your own.
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",
  agent:   "livekit-front-proxy",   // the vendor-bridge agent above
});
console.log("dialing", call.sid);
For inbound calls, attach the same agent to a number or trunk instead of dialing — see SIP Trunking and Number Provisioning.

3. Promote a live call to the LiveKit agent

Already on a call? Attach the vendor-bridge agent to a running sid to hand the conversation to your LiveKit room mid-call.
await v.agents.attach(call.sid, "livekit-front-proxy");

4. Run the bridge sidecar

The gateway-side of the bridge — the vendor-bridge node plus the media handler — is shipped and in-tree. The process that actually joins your LiveKit room is a bridge sidecar you run next to your LiveKit deployment.
# Runs alongside your LiveKit server; carries caller audio in both directions.
export LIVEKIT_URL="wss://your-livekit-host.example.com"
export LIVEKIT_API_KEY="APIxxxx"
export LIVEKIT_API_SECRET="secretxxxx"
# + the gateway's media-bridge URL and the room to join (matches vendor_room).
What’s shipped vs. what you deploy. The vendor-bridge routing lives in the runtime and is shipped. The bridge sidecar is a separate component you operate, using your own LiveKit URL, key, and secret — so its exact CLI and image ship with the bridge, not with the gateway. The edge is shipped; the bridge is a thin component you run.

Browser leg? The compat shim (preview)

If your LiveKit surface is a browser app (livekit-client) rather than a server-side agent, you can skip the edge bridge and run the client’s audio over the transport directly with a one-line import swap.
- import { Room, RoomEvent, createLocalAudioTrack } from "livekit-client";
+ import { Room, RoomEvent, createLocalAudioTrack } from "@telequick/sdk/livekit-compat";
Preview / experimental. The livekit-compat shim is an early-access browser package, not a shipped product. It covers the core voice path (publish the mic, subscribe to remote audio, data messages); video, screenshare, and per-participant E2EE key rotation are deferred, and a session-setup race can occasionally deliver zero frames on connect (retry). It requires encoded media transforms and refuses to fall back to plaintext WebRTC — today that means Chromium-family browsers. A server-side Python (livekit.rtc) equivalent is not yet available. Full deep-dive: Keep Your Existing Runtime.

LiveKit Agent Integration

The conceptual walkthrough of both paths — front-proxy and shim.

From Self-Hosted LiveKit

The wave-by-wave migration off a LiveKit SFU.

Custom Agent Runtime

The same front-proxy pattern for any non-LiveKit runtime.

WebRTC Diversion

How the compat shim taps encoded Opus onto QUIC in the browser.