Skip to main content
The bridge is configured entirely by environment variables (a .env file works with node --env-file=.env). Numeric variables fail loudly at startup if set to a non-number or a negative value, so a typo stops the process with a clear message rather than silently misbehaving.

Required

Agent dispatch

The dispatch carries per-call metadata to your agent (ctx.job.metadata, JSON): source, caller_name, tenant_id, call_direction, and user_id (AAD id, only when Teams provides one). Your agent can also listen on two data topics: teams.context (participant count/DTMF) and teams.goodbye (the governor’s goodbye line to speak). See Agents and dispatch.

Avatar video

Relay an avatar agent’s video track onto the caller’s Teams tile. On by default (auto).
If your agent publishes an avatar (bitHuman, Tavus, …), auto shows its face on the tile; set off to disable the relay (it adds an outbound video stream, so it costs a little bandwidth). Voice-only agents publish no avatar video, so auto has no effect for them. The caller always hears the agent’s audio either way.

Governor

There is no bridge-side TTS on the room transport - the goodbye is a teams.goodbye data message your agent speaks. Have your handler interrupt the current turn so the goodbye actually plays; if the current turn outlasts GOODBYE_GRACE_MS it can be cut.

Transport hardening

There is no chat lane and no chat variable. The bridge serves the calling WebSocket, /healthz and /metrics - nothing else. Leave the identity’s Agent messages URL empty.

TLS

The Node package has no TLS variable: it serves plain WebSocket by design, so front it with a TLS terminator (tunnel, ingress, or load balancer). The Python package adds TLS_CERT_PATH and TLS_KEY_PATH: set both and it serves wss:// natively, leave them unset and it behaves like the Node build. Either way StandIn requires wss:// in any real deployment, so a bridge on a tunnel needs no cert of its own.

Privacy

The bridge stores nothing - audio is relayed frame-by-frame between the worker socket and the LiveKit room and never written to disk; recording.status is logged only, and /metrics exposes counters, never call content. Whatever your agent and LiveKit retain follows their own settings. The room is deleted at teardown (LIVEKIT_DELETE_ROOM_ON_END=true). See Governors and privacy.

Docs site

Installation

Source