Continuous visual awareness: every change to the caller’s screen-share or camera is described and handed to the agent as background context, so it can refer to what is on screen without anyone invoking the look tool.
Env
Default
Meaning
AMBIENT_VISION_ENABLED
false
Opt-in. Each scene change costs one vision-model call, so the default must not spend.
MAX_VISION_PER_MINUTE
30
Sliding 60-second cap on paid vision calls per call, shared by ambient vision and the look tool, and applied whether or not ambient vision is on. 0 = all vision off.
AMBIENT_VISION_REQUIRE_RECORDING
true
Hold ambient pushes back until Teams reports recording.status == "active".
In a call with two or more humans the agent’s reply audio is withheld until someone addresses it by name, then flows freely for a short follow-up window so the exchange can continue. A 1:1 call is never gated, whatever these are set to.
Env
Default
Meaning
GROUP_CALL_REQUIRE_ADDRESS
true
The gate itself. On by default: it only ever suppresses output, never adds a paid call, and a meeting is exactly where an interjecting bot is harmful. Set false to opt out.
GROUP_CALL_WAKE_PHRASES
assistant
Comma-separated phrases that wake the agent. Matching is case-insensitive and word-boundary aware, so assistantship does not match. Rename this to your agent’s actual name.
GROUP_CALL_FOLLOW_UP_WINDOW_MS
12000
How long after being addressed the agent keeps answering without being named again. The window is refreshed while it is speaking, so a long reply is never cut mid-sentence.
Drop a connection that authenticates but never sends session.start.
WORKER_IDLE_TIMEOUT_MS
0 (= 90000)
Dead-peer window: end the call after this long without any worker message (the worker heartbeats every 30 s). Frees the call id for reconnect and closes the billed ElevenLabs conversation.
STALE_CALL_REAPER_SECONDS
120
End a connected call that never went live (the ElevenLabs session never opened) with reason no-answer. Unlike the pre-start timeout this also covers a call that did send session.start and then wedged, which nothing else ends while the worker keeps heartbeating. 0 disables it. On by default because it spends nothing - it makes no provider call, it only frees local resources.
LOG_TRANSCRIPTS
false
Log ElevenLabs transcripts (still gated on Teams recording.status == "active").
The bridge also exposes GET /metrics (Prometheus text format, no auth): calls total/active, call seconds, upgrade rejections by cause, frames relayed each way, backpressure drops, and ElevenLabs connect failures. Like /healthz it is served on the same port - keep the port private to your network or scrape through your ingress.
| LOG_LEVEL | info | debug | info | warn | error. An invalid value falls back to info. |
The audio format is fixed at pcm_16000 by design (the no-transcode contract) and is not configurable. The bridge validates the agent’s declared format at call start and ends the call on a mismatch.