📞 Telephone.org

IVR Management Console
Invalid password
Ready
Conversation
Debug
DSL:
🔧 Kazoo Pivot Output
Start a simulation to see Kazoo Pivot JSON output here.

Each step will show the JSON that would be sent to Kazoo.
Select a flow to edit
No flow
100%
🔍 Analyze Flow:
💾 Presets:
Traces all reachable flows from selected root
Loading analysis...
📊 Flow Statistics
Click a flow to see stats
🌳 Branch Visualizer
🗺️ Flow Connection Map
🔌 Endpoint Dependency Map
Run analysis to see endpoint usage
💾 Saved Presets (click to expand)
🎯 Test Navigator & Node Tools (click to expand)
🎯 Test Navigator

Jump to any node with pre-filled session data

Preset:
📊 Coverage Progress
📝 Node Verification (click to expand)

Click: cycle status (❓→✅→🔧) | Right-click: notes | Double-click: test

❓ Not Tested | 👁️ Visited | ✅ Verified | 🔧 Needs Fix

🔧 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.

Core rules for the LLM - edit to adjust strictness
DSL node specifications - add/modify as needed
Expected output format for flows and endpoints
Real example from our system - helps LLM understand patterns
Paste Twilio JSON, script code, or describe the flow you want

📥 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...
If routing fails for any reason, calls fall back to this server

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.

📊 Today's Stats
0
Calls Today
0
Active Now
0
Peak Concurrent
0
Avg Steps
Avg Response: 0ms
Last Call: --
Errors: 0
📞 Order Identification
0
Auto (Caller ID)
0
Manual Entry
Avg Steps (all calls): 0
🧠 Prediction Accuracy
--
Accuracy Rate
Prediction Coverage --
0 of 0 calls
0
Confirmed
0
Declined
0
Auto-routed
0
Low Confidence
Per-Rule Accuracy
No data yet
🎯 Flow Hits Today
No data yet
🌐 API Endpoint Hits
No data yet
🟢 Active Calls
No active calls
⚙ Feature Flags
Loading…
🚨 Error Log
No errors
Page 1 0 entries
📡
Loading call logs...

🌐 API Endpoints

CRM API integration health and usage dashboard

-
Total Endpoints
-
Used in Flows
-
Orphaned
-
Local Handlers
-
Fields Mapped
-
KB Conditions

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
Page 1
📁 API Groups
⚠️ Orphaned Endpoints
🌐

Select an endpoint group or endpoint to view details

Bot Hierarchy
Loading hierarchy...
Orphan Nodes
Loading insights...
DSL Nodes
Select a Landbot flow to visualize its graph and DSL nodes.
KB Articles
Loading articles...
Loading KB overview...
Article Detail
Click an article to view details.
Loading rules...
Select a rule to edit
🔮
Select a prediction rule from the left panel to edit
Rule Status
No rule selected
Test Predictions
Run a test to see matched rules
Engine Info
-
Known Fields
-

🗺 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.

or:
// 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.

Master Toggle
Max Concurrent AI Sessions
New calls beyond this fall back to DTMF for that call. Existing AI calls finish.
🗣 Groq Utterance Polish (Phase 2)
Routes Claude's draft response through Groq for tone cleanup. Adds ~200-400ms but cheaper Groq tokens. A/B test whether it improves naturalness.
🔇 Silence Hangup (consecutive no-speech)
Mirrors the DTMF gather's retry-then-hangup pattern for AI flows. After N customer turns where nothing is heard (empty 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.
1–20. Default 3.
Spoken once before hangup. Keep it warm and short.
⏩ VAD-driven endpointing (Phase 3)
Drives turn-end detection from our local VAD + ASR provider fast-path events instead of Kazoo's fixed-window <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).
0–2000. Default 250.
▸ Active AI sessions
▸ Recent acquire/reject/release events
Auto-refreshes every 5s while panel is open

📞 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.

Loading…

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.

Loading…

🌐 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.

Master toggle

📋 Setup checklist (follow in order)

Loading…

🔐 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)

Voice URL (initial call — pick flow)
Status URL (call lifecycle — optional)
Health probe (test the adapter)

📡 Recent webhook attempts

No webhook traffic yet. Once the voice gateway hits us, attempts (success + failure) will appear here.
Auto-refreshes every 5s while the Settings tab is open

🔑 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.

Loading…

🔊 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/.

Loading…

🚧 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.

Loading…

🧪 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.

📚 Kazoo research notes
  • 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-progress play verb is unverified.
  • POST /v2/accounts/{aid}/channels/{call_id} with action=break / queue — older API. Behavior under Pivot's play is unknown.
  • Pivot redirect: returning a fresh Pivot response with a new play may 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

Loading…

Interrupt strategy

📋 Expected observations to record
  • 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
Append findings to 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/.

Loading…

🎙️ 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.

🧪 Probe a scenario
Thresholds are placeholders — see open question #13 (out to customer)

🌐 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.

No file uploaded

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.

🔗 Hash Registry
--
Registered Hashes
--
Max Capacity
🎵 Audio Cache
--
Hit Rate
--
Entries
--
Hits
--
Misses
--
Memory
--
Bytes Saved
--
Evictions
Recent Cache Entries:
Click "Refresh Stats" to load entries

🔢 DTMF Settings

Configure timing for DTMF digit collection. Other settings (max digits, timeout) are defined per-node in the DSL.

Time between key presses before input is accepted. Increase if callers need more time to type order numbers or zip codes.

📥 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

Standard Fields (every request)
Optional Fields (after certain actions)
Always included:
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
// In your DSL flow, branch based on caller:
{
"type": "branch",
"input": "{{caller_id}}",
"branches": {
"+15551234567": "vip_greeting",
"_default": "standard_greeting"
}
}

🔀 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.

The OSTI server receives Kazoo pivot redirects, streams audio, races DTMF vs speech, and returns results.
Template URL OSTI uses to return results. Use {session_id} placeholder.
Confidence score (0-1) required to accept speech intent
How long OSTI listens for speech
WebSocket URL for Kazoo to stream call audio to OSTI
📋 OSTI Redirect Parameters
Parameters sent TO OSTI:
session_id
- Current call session ID
return_url
- URL to redirect back with results
prompt_url
- TTS audio URL for speech prompt
dtmf_prompt_url
- TTS audio URL for DTMF prompt
intents
- JSON: {key: {dtmf:["1"], phrases:[...]}}
threshold
- Confidence threshold
timeout
- Speech timeout in ms
session_vars
- Base64 encoded session variables
flow_id
- Current flow ID
node_id
- Current node ID
Parameters returned FROM OSTI:
Digits
- Matched DTMF digit (for DSL compatibility)
source
- "osti" or "dtmf"
intent
- Intent key if from speech
confidence
- Match confidence (0-1)
transcript
- What caller said
session_id
- Session ID (echoed back)

📡 Real-time WebSocket

Enable WebSocket event broadcasting for real-time dashboards. When disabled, there is zero performance overhead on the IVR engine.

When enabled:
• WebSocket endpoint: ws://host/ws/realtime?channels=stats,calls,all
• REST API: GET /api/realtime/summary
• Events published for: call start/end, flow changes, node execution
Use for external dashboards that need real-time call counts.
Status: Checking...

📱 Twilio SMS

Configure Twilio for sending SMS messages from IVR flows (missing item links, PAN notices, order modification links).

Keep this secret - stored in settings.json
Uses messaging service for automatic number selection
📋 SMS Nodes in Flows
DELIVERY_FLOW / missing_item_message
Sends CS URL for missing item requests
SOP_FLOW / pan_url_text
Sends Product Availability Notice URL + PIN
ORDER_MOD_FLOW / ordermod_send_sms
Sends order modification URL

🔐 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).

Loading...

🔍 System Diagnostics

Shows which directories the system is using for config and flows. Helps diagnose persistent disk issues.

Click Refresh to load diagnostics...

📋 Current Configuration

Showing: Last saved configuration


                    
Copied!