Each step will show the JSON that would be sent to Kazoo.
💾 Saved Presets (click to expand)
🎯 Test Navigator & Node Tools (click to expand)
Jump to any node with pre-filled session data
📝 Node Verification (click to expand)
Click: cycle status (❓→✅→🔧) | Right-click: notes | Double-click: test
🔧 DSL Builder & Validator
Convert Twilio Studio flows, scripts, or descriptions into our DSL format. All prompt sections below are editable - customize them for your specific needs.
📥 Import LLM Response
After running the prompt through an LLM (Claude, GPT, etc.), paste the response here. The system will extract FLOWS and ENDPOINTS JSON blocks, validate them, and prepare for import.
🕐 Business Hours Manager
Manage named schedules that DSL check_schedule calls reference
📊 Schedule Status
Current status of all named schedules (as referenced by DSL)
📅 Weekly Hours
Select a schedule to edit its weekly hours
🚫 Recurring Holidays
These dates are closed every year (affects schedules with shared holidays enabled)
📆 Special Closures
One-time closures (e.g., Thanksgiving varies each year)
🧪 Test Schedule
Simulate a date/time to test if a schedule would be open
📞 Queue Manager
Map DSL queue destinations to Kazoo extensions and CRM callback IDs
📋 Queue Mappings
| DSL Destination | Name | Ext | Callflow ID | Queue ID | CRM ID | Aliases | |
|---|---|---|---|---|---|---|---|
| Loading... | |||||||
🔍 Test Queue Lookup
Test resolving any identifier to its queue info
📊 Queue Usage in Flows
Shows which flows use each queue
Traffic Router
Route Kazoo pivot calls across multiple IVR servers with weighted traffic splitting
Servers
Shared pool of IVR server base URLs referenced by route profiles
| Key | Name | Base URL | |
|---|---|---|---|
| Loading... | |||
Routes
Each route is a Kazoo entry point with switchable traffic profiles
Server Base URL
This URL is used by Kazoo to reach your IVR server. Set it in Settings → Server Settings.
🌐 API Endpoints
CRM API integration health and usage dashboard
Refund Audit Log
Cancel & refund operations with business rule validation| Time | Order # | Caller | Endpoint | Amount | Balance | Delivered | Cancel OK | Status | Flags |
|---|---|---|---|---|---|---|---|---|---|
| Click Refresh to load audit data | |||||||||
Select an endpoint group or endpoint to view details
🗺 Phase Status / Roadmap
[click to expand]📋 Agent Context Bundle
The curated payload sent to the LLM at agent_loop entry — order summary, eligibility flags with block reasons, history, frustration signal, and the in-scope tool catalog. Strips PII, internal IDs, and URLs.
See src/agent_context.py and Section 11.5 of docs/ARCHITECTURE_DECISIONS.md.
// Pick a session above or click a demo to view the bundle.
🧪 Scenario harness
Run hand-coded scenarios against real Claude. Multi-run mode runs each scenario N times to expose LLM stochasticity.
~$0.05 per single run · ~$0.15 per 3-run.
🔁 Replay recorded AI calls
Every completed AI agent_loop turn is recorded to disk. Pick a recorded call and replay it through the agent_loop with simulated CRM tools — optionally with a candidate prompt — to see how a change affects past calls.
🗣️ Speech-match stats (speech mode only)
Per-CHOICE-node speech recognition outcomes. DTMF callers don't appear here — by design. The lowest match-rate nodes are the highest-leverage place to add to speech_intents.
💰 Usage & Billing
Append-only ledger of every metered upstream call (TTS, Claude, Groq, ASR). Filter by tenant or call. Cache hits show up but bill 0 — only generations bill.
See src/usage_ledger.py · logs/usage_*.jsonl · Section 11.7 of docs/ARCHITECTURE_DECISIONS.md.
🤖 AI / LLM Mode
Master toggle for the agent_loop on pilot flows (NON_DELIVERY_AI, PRODUCT_QUALITY_AI). When OFF, calls fall back to deterministic CANCEL_ORDER_FLOW / PRODUCT_FLOW (DTMF). Same fallback fires on concurrency-cap rejection or any agent_loop exception. See src/ai_concurrency.py + src/interpreter.py agent_loop branch.
SpeechResult AND empty Pivot-TAP transcript), the agent_loop short-circuits BEFORE calling Claude — plays
the goodbye message and hangs up. Counter resets the moment the customer actually speaks.
Master toggle kills the feature globally (any value). Threshold + Goodbye are defaults — flows that set
max_consecutive_no_speech / silence_goodbye_message in their JSON win. NON_DELIVERY_AI and
PRODUCT_QUALITY_AI both set 3 explicitly today.
<Gather> timeout
(which is DTMF-only, not speech-aware). When ON: the EndpointingCoordinator listens for VAD speech-end (after min_silence_ms debounce) AND Deepgram UtteranceEnd
events; whichever fires first triggers a Kazoo metaflow redirect to /pivot/continue after a small grace period.
Provider-agnostic — works the same with Whisper-via-Together once that lands.
Grace (ms): how long we wait after the speech-end signal for the ASR to finalize the last word before firing the redirect. 250ms is a balanced default; bump to 400ms if you're losing tail-words, drop to 150ms if turns feel sluggish.
Default OFF — flip ON for a verified test call once you've confirmed Kazoo metaflow is wired (KAZOO_API_URL / ACCOUNT_ID / AUTH_TOKEN env vars set). When OFF, falls back to the legacy 8s gather (existing behavior).
▸ Active AI sessions
▸ Recent acquire/reject/release events
📞 Kazoo Integration URLs
Edit the public-facing URLs Kazoo uses to reach this server. Saves to .env and applies live (no restart). The catalog below is auto-derived — copy-paste into your Kazoo Pivot configuration.
See src/env_config_manager.py.
Paths Kazoo connects to:
Defined in the FastAPI routers — paths themselves are not user-configurable, but the BASE_URL above feeds into all of them. Click any URL to copy.
🌐 Voice Gateway
Speech-mode voice transport. Handles VAD / ASR / endpointing on the gateway side (real speech support, unlike the DTMF-only touchtone path). First time setting this up? Follow the checklist below.
📋 Setup checklist (follow in order)
🔐 Inbound HTTP Basic auth
When you set Basic auth in your voice-gateway application, paste the same credentials here. We'll verify every incoming webhook carries them. Leave both empty to skip verification (less secure but simpler — fine for early testing).
🔗 URLs (click to copy)
—
—
—
📡 Recent webhook attempts
🔑 LLM API Keys
Anthropic (Claude) for tool-use decisions · Groq for fast utterance generation (Phase 2). Keys are persisted to .env and applied to the running process immediately — no restart required. Values are masked for display.
See src/secrets_manager.py.
🔊 VAD (Voice Activity Detection) Provider
Detects when the customer is speaking. WebRTC is the default — Google's lightweight C extension, ~0.1ms per frame, no torch/onnx, ~150KB total. Binary speech/silence per 30ms frame. Silero is heavier (~1ms/chunk, ships torch+onnxruntime) but trained on speech formants — better at rejecting noise. SoulX-Duplug is a semantic upgrade (returns idle/nonidle/speak/blank where speak means semantic completeness) — skeleton until hosting is decided. NoOp disables VAD entirely (zero CPU).
See src/vad/.
🚧 Phase 3 Feature Toggles
Switches for Phase 3 audio-pipeline features. Some are wired to live code paths; others are skeletons until the underlying impl lands. Flipping a flag whose impl isn't ready is a no-op on dead code — safe to toggle ahead of time.
🧪 Channel Interrupt Lab — Empirical Testing
Test how Kazoo behaves when you interrupt an in-progress play verb. Documentation is sparse — the only way to know if metaflow / redirect / break actually preempts mid-utterance is to fire the request against a live call and observe.
POST /v2/accounts/{aid}/channels/{call_id}/metaflow— runtime callflow injection. Documented purpose: hot-key callflow features mid-call (e.g. dial a star-code to mute). Whether it preempts an in-progressplayverb is unverified.POST /v2/accounts/{aid}/channels/{call_id}with action=break/queue— older API. Behavior under Pivot'splayis unknown.- Pivot redirect: returning a fresh Pivot response with a new
playmay or may not preempt the previous one — depends on Pivot's playback state machine. - The polite barge-in approach (Section 5.4(a) of arch doc) sidesteps this entirely: let the current play finish a short sentence, capture customer speech in parallel, respond on next turn.
Live call selector
Interrupt strategy
- Did the original play stop immediately? Within how many ms?
- Did Kazoo queue the new audio (waited for original to finish)?
- Did the call drop or behave erratically?
- HTTP response code + body from Kazoo
docs/ARCHITECTURE_DECISIONS.md Section 5.4(b).
🎤 ASR (Speech-to-Text) Provider
Selects the streaming-ASR backend used by the voice gateway and the Pivot-TAP path. Deepgram nova-2 is the production-ready default. Together.ai Whisper is the cost target (streaming verification pending). Google Cloud is a future skeleton. NoOp bypasses ASR for tests/dev.
See src/asr/.
🎙️ TTS Cache Pre-warm + Hash Registry
Pre-generate audio for common phrases at startup so the first call doesn't pay synthesis latency. Hash registry persistence lets dynamic Groq utterances survive restarts.
See src/tts_prewarm.py · src/adapters/tts_endpoint.py.
🚨 Frustration Detector
Repeat-call frequency thresholds + keyword signals (BBB, lawyer, chargeback, etc.).
Hard signals skip the AI agent entirely and route to the priority queue.
Soft signals are exposed to the LLM as context flags.
See src/frustration_detector.py · Section 11.6 of docs/ARCHITECTURE_DECISIONS.md.
🌐 Server Settings
Configure the public URLs that Kazoo will use to reach this server and the TTS endpoint.
🔊 TTS Provider
Select and configure the text-to-speech engine for IVR prompts.
🗣️ Pronunciation Mappings
Map words to TTS-friendly pronunciations. Example: "avas" → "ayvas" so TTS says it correctly.
☁️ Google Cloud TTS Settings
Configure Google Cloud Text-to-Speech API credentials and voice settings.
Upload your Google Cloud service account JSON key file (e.g., my-project-123456.json)
🔊 TTS Testing
Test TTS synthesis directly and via the Kazoo-compatible endpoint.
Current Provider: -- (Change above and Save Settings to switch)
📦 TTS Cache & Hash Registry
Monitor TTS caching and hash registry. Hash registry maps clean URLs to text.
🔢 DTMF Settings
Configure timing for DTMF digit collection. Other settings (max digits, timeout) are defined per-node in the DSL.
📥 Pivot Session Fields
Select which Kazoo Pivot request fields to store as session variables. These become available as {{variable}} in your DSL flows for branching, API calls, etc.
📖 Kazoo Pivot Docs
call_id - unique call identifier (used as session ID)lead_id - alias for call_id (CRM convenience)Custom-Application-Vars - unpacked as individual session vars
💡 Usage Example
🔀 Relay Proxy
Configure relay proxy for CRM API calls through a remote server.
🎤 OSTI Speech Intent Router
Configure the openSpeechToIntent server for voice-based menu navigation. When enabled on a choice node, calls will be redirected to OSTI for speech recognition racing against DTMF.
📋 OSTI Redirect Parameters
📡 Real-time WebSocket
Enable WebSocket event broadcasting for real-time dashboards. When disabled, there is zero performance overhead on the IVR engine.
ws://host/ws/realtime?channels=stats,calls,allGET /api/realtime/summary📱 Twilio SMS
Configure Twilio for sending SMS messages from IVR flows (missing item links, PAN notices, order modification links).
📋 SMS Nodes in Flows
🔐 Security Settings
Basic login protection for the admin console.
Leave blank to keep current password. Default: avas2026
🔒 Superadmin password
Required to open the Settings tab itself. Stored only in this browser (localStorage). Once unlocked, it stays unlocked for the rest of the session — Logout above clears both the admin and superadmin sessions.
Default: avas-super-2026. Min 8 chars on change.
📁 File Manager
Browse and manage files on the persistent data disk (config, flows, data).
🔍 System Diagnostics
Shows which directories the system is using for config and flows. Helps diagnose persistent disk issues.
📋 Current Configuration
Showing: Last saved configuration