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, 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. Keep LOG_TRANSCRIPTS off and vision unconfigured if not needed, and disclose the AI on the call via OPENAI_FIRST_MESSAGE. See Governors and privacy.

Docs site

Installation

Source