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