openclaw - 💡(How to fix) Fix [voice-call] Dynamic IVR map discovery, navigation, and per-option timing calibration [1 comments, 1 participants]

Official PRs (…)
ON THIS PAGE

Recommended Tools

×6

Utilities matched from this issue’s tags and category — try them while you read without losing context.

GitHub issue graph ai analysis

Paste a GitHub issue URL. We fetch that issue, discover linked issues from bodies/comments/timeline, collect linked pull requests, and produce a structured English report.

The report is written in English Markdown for sharing and archival.

Helpful · Quick feedback

Loading…
GitHub stats
openclaw/openclaw#56183Fetched 2026-04-08 01:43:56
View on GitHub
Comments
1
Participants
1
Timeline
3
Reactions
0
Participants
Timeline (top)
closed ×1commented ×1locked ×1

Code Example

{
  "prompt_text": "For billing, press 1. For support, press 2.",
  "digit": "1",
  "min_wait_ms": 0,
  "skippable": true
}

---

{
  "prompt_text": "This call may be recorded for quality and training purposes.",
  "digit": null,
  "min_wait_ms": 4200,
  "skippable": false
}
RAW_BUFFERClick to expand / collapse

IVR maps should be built and refined dynamically at runtime, not pre-authored manually.

Goal-directed navigation without a map

When OpenClaw encounters an unknown IVR, it navigates by reasoning:

  • Listen to the current prompt
  • Based on the call goal, pick the most likely option (LLM decision)
  • Inject the digit (or speech utterance) and continue
  • No pre-existing map required for first call

Map capture

After a successful navigation to the goal (or any terminal state), record what was observed:

  • The prompt text heard at each step
  • The digit/utterance used
  • The outcome (another menu, hold queue, agent, failure)
  • Save per-number, per-path for reuse

Timing calibration (key subtlety)

IVRs vary significantly in timing requirements:

  • Some allow ahead-dialing: digits injected before the prompt finishes (fast)
  • Some have non-skippable announcements: must wait for completion before the menu accepts input
  • Some are lenient; others drop digits sent too early

The map must record per-option timing constraints:

{
  "prompt_text": "For billing, press 1. For support, press 2.",
  "digit": "1",
  "min_wait_ms": 0,
  "skippable": true
}

vs

{
  "prompt_text": "This call may be recorded for quality and training purposes.",
  "digit": null,
  "min_wait_ms": 4200,
  "skippable": false
}

On replay, honour the min_wait_ms and skippable flags to navigate as fast as possible without dropping digits.

Timing discovery

Timing constraints aren't known on the first call. Options:

  • Start conservative (wait for full prompt), then progressively try shorter waits on subsequent calls and record whether it worked
  • Use transcript confidence + silence detection as a proxy for "prompt is complete"

Scope

This is infrastructure work that underpins both DTMF and (eventually) NLU IVR navigation.

extent analysis

Fix Plan

To implement dynamic IVR mapping with timing calibration, follow these steps:

  • Create a data structure to store IVR maps, including prompt text, digit/utterance, outcome, and timing constraints (e.g., min_wait_ms and skippable flags)
  • Develop a navigation algorithm that:
    • Listens to the current prompt and picks the most likely option based on the call goal (using an LLM decision)
    • Injects the digit/utterance and continues navigation
    • Records the observed prompt text, digit/utterance, outcome, and timing constraints for each step
  • Implement timing calibration by:
    • Starting with conservative timing constraints (waiting for full prompt completion)
    • Progressively trying shorter waits on subsequent calls and recording whether it worked
    • Using transcript confidence and silence detection as a proxy for "prompt is complete"
  • Update the navigation algorithm to honor the recorded timing constraints (min_wait_ms and skippable flags) for efficient navigation

Example code snippet (in Python):

import json

class IVRMap:
    def __init__(self, prompt_text, digit, min_wait_ms, skippable):
        self.prompt_text = prompt_text
        self.digit = digit
        self.min_wait_ms = min_wait_ms
        self.skippable = skippable

class IVRNavigator:
    def __init__(self):
        self.ivr_map = {}

    def navigate(self, prompt_text, call_goal):
        # Pick the most likely option based on the call goal (using an LLM decision)
        option = self.llm_decision(prompt_text, call_goal)
        # Inject the digit/utterance and continue navigation
        self.inject_digit(option.digit)
        # Record the observed prompt text, digit/utterance, outcome, and timing constraints
        self.record_step(prompt_text, option.digit, option.min_wait_ms, option.skippable)

    def record_step(self, prompt_text, digit, min_wait_ms, skippable):
        # Update the IVR map with the recorded timing constraints
        self.ivr_map[prompt_text] = IVRMap(prompt_text, digit, min_wait_ms, skippable)

    def llm_decision(self, prompt_text, call_goal):
        # Implement the LLM decision logic to pick the most likely option
        pass

    def inject_digit(self, digit):
        # Implement the logic to inject the digit/utterance
        pass

Verification

To verify the fix, test the IVR navigation with different prompts and call goals, ensuring that the navigation algorithm correctly records and honors the timing constraints. Monitor the IVR map updates and verify that the navigation is efficient and accurate.

Extra Tips

  • Use a database or file storage to persist the IVR maps across sessions.
  • Implement error handling and logging to handle cases where the navigation

Vote matrix · Quick signals

Works
Did the solution work? Tap to confirm.
Easy Fix
Was it a quick fix?
Time Saver
Did it save you time?
Blocking
Was it severely blocking?
Common Issue
Are others likely hitting this too?
Flaky / Intermittent
Is it intermittent?
Verified / Reproducible
Can you reproduce it reliably?
Loading…

Still need to ship something?

×6

Another batch ranked right after the header list — different links, same matching logic.

Back to top recommendations

TRENDING

openclaw - 💡(How to fix) Fix [voice-call] Dynamic IVR map discovery, navigation, and per-option timing calibration [1 comments, 1 participants]