.env file works with
node --env-file=.env). Numeric variables fail loudly at startup if set to a non-number, so a typo
stops the process with a clear message rather than silently misbehaving - the same goes for a bad
OPENAI_VAD value or malformed OPENAI_MCP_SERVERS JSON.
Required
The agent
There is no dashboard - these variables define the agent:Common options
Vision (the look tool)
The look tool is registered automatically - nothing to define on the OpenAI side. The bridge
answers it two ways:
Without a vision endpoint,
look falls back to attaching the frame to the Realtime conversation as
native image input (gpt-realtime is multimodal), which is only allowed when Teams recording is
active. For a fully custom vision hook in code, see the
library API.
Custom tools and MCP servers
Function tools your own code executes (
lookup_order, transfer_call, …) are registered
programmatically - see
Extending the agent’s tools
and the example.
Advanced
OPENAI_TRANSCRIPTION_MODEL (unset; needed for user-side transcript logging), OPENAI_TTS_MODEL
(gpt-4o-mini-tts), OPENAI_HOST (api.openai.com, restricted to *.openai.com so the key
cannot be exfiltrated elsewhere), HMAC_FRESHNESS_MS (default 60000), MAX_CONNECTIONS (64),
MAX_CONNECTIONS_PER_IP (= total cap), PRE_START_TIMEOUT_MS (10000), WORKER_IDLE_TIMEOUT_MS
(90000), TLS_CERT_PATH / TLS_KEY_PATH (native wss://), LOG_LEVEL (info), and
LOG_TRANSCRIPTS (false; still gated on Teams recording being active). Full reference:
configuration-reference.
Privacy
Caller audio, transcripts, any vision content, and MCP tool traffic transit OpenAI’s cloud and are retained per your organization’s OpenAI data controls. KeepLOG_TRANSCRIPTS off and vision
unconfigured if not needed, and disclose the AI on the call via OPENAI_FIRST_MESSAGE. See
Governors and privacy.