Voice Configuration
Multi-tenancy
Tenant configuration is database-backed via PostgreSQL, with an in-memory fallback for development. Cached tenant state is reused for performance and evicted when idle perTENANT_CACHE_IDLE_TTL_SECS (default 3600s).
Reload cached tenants without dropping live sessions using
POST /admin/tenants/reload-cached.
Auth transport
This is the setting most worth understanding before deploying.
Rotate
STREAM_AUTH_SECRET by setting the old value in STREAM_AUTH_SECRET_PREVIOUS, deploying
the new secret, then removing the previous once in-flight tokens have expired.
Audio output
Per-tenantaudio_output_provider: elevenlabs (default) or openai (explicit
override).
ElevenLabs transport and 5xx/429 failures retry with backoff, and a circuit breaker prevents
a provider outage from cascading. Provider outcome metrics are emitted, and
GET /admin/tenants/audio-providers shows configured vs effective provider along with
fallback state and reason.
Provider base URLs
OPENAI_BASE_URL, ELEVENLABS_BASE_URL, and ELEVENLABS_WS_BASE_URL redirect Chat
Completions, TTS, and STT traffic to an LLM gateway, regional proxy, or test harness. Defaults
are the public provider hosts.
These are read once at startup. Changing them requires a restart.
Turn response mode
Controls how assistant replies reach TTS on the Chat Completions path:
Resolution order: per-tenant
turn_response_mode → process-wide TURN_RESPONSE_MODE →
single_sentence.
Voice activity detection
VAD tuning — threshold, prefix padding, silence — is set per tenant in tenant config. Values are clamped to safe defaults with a warning at load, so a bad value degrades rather than breaks.Handoff workflows
receptionist.handoff_workflow drives number-specific bridge targets and post-call notes from
tenant config rather than compiled code.
twilio.human_agent_timeout_seconds (default 25s) bounds the ring on a human handoff. See
Voice API for the no-answer recovery path.
Custom tools
Agent versions accepttools[] — a JSON-schema function plus your HTTPS endpoint. Mid-call
invocations POST to your endpoint with Authorization passthrough and the webhook-style
X-Webhook-Signature HMAC; the JSON reply becomes the tool result.
POST /make-call also accepts a transient per-call config including tools, for prototyping
without publishing an agent version.
Rate limiting
Per-IP and per-tenant token buckets with configurable limits and automatic cleanup. Tenant key extraction supports bearer auth, signedstream_token, and — only when explicitly enabled —
legacy raw token transport.
Readiness gating
Kafka is probed and reported in/health/ready, but only fails readiness when
HEALTH_READY_REQUIRE_KAFKA=true.
That default is deliberate: a broker outage cannot pull call-serving pods out of rotation.
Enable it only if you genuinely want calls to stop when Kafka is down.
Admin safety
- Admin tenant responses redact secrets; updates preserve existing values when you send the
<redacted>placeholder. - Tenant reads expose deterministic config ETags, so writes can use
If-Matchto prevent lost updates. ADMIN_API_KEYis required on admin routes viax-admin-key.