Logo
Search
API Docs

Idle Messages

Voice & Audio Tuning

Idle Messages: Handling Silence and Inactivity

Overview

Sulus's idle messages feature automatically prompts users during periods of silence or inactivity, keeping them engaged and reducing call abandonment. Idle messages are configured via Assistant Hooks using the customer.speech.timeout event.


How It Works

When a user stops speaking, Sulus starts a timer. Once the configured timeout elapses, the hook triggers and the assistant speaks a message to the user. The counter can optionally reset when the user responds.


Configuration

Use the customer.speech.timeout hook in your assistant's hooks array:

import { CoreSystemClient } from "@core-system/server-sdk";

const client = new CoreSystemClient({ token: process.env.CORE_SYSTEM_API_KEY });

await client.assistants.create({
  name: "Support Assistant",
  hooks: [
    {
      on: "customer.speech.timeout",
      options: {
        timeoutSeconds: 10,
        triggerMaxCount: 3,
        triggerResetMode: "onUserSpeech"
      },
      do: [
        {
          type: "say",
          exact: [
            "Are you still there?",
            "Can I help you with anything else?",
            "I'm here whenever you're ready to continue."
          ]
        }
      ],
      name: "idle_message_check"
    }
  ]
});

Configuration Options

Timeout and triggering:

OptionTypeRangeDefaultDescription
timeoutSecondsnumber1–1000s7.5How long to wait before triggering
triggerMaxCountnumber1–103Max times the hook fires per call
triggerResetModestringnever | onUserSpeechneverWhether to reset the trigger count when the user speaks

Message action:

FieldTypeDescription
say.exactstring or string[]Speak one of the provided messages verbatim
say.promptstringUse a model-generated response based on a prompt and {{transcript}} context

Advanced: Escalating Timeouts + End Call

You can stack multiple customer.speech.timeout hooks at different intervals to escalate the response — including ending the call after prolonged silence:

{
  "hooks": [
    {
      "on": "customer.speech.timeout",
      "options": { "timeoutSeconds": 10, "triggerMaxCount": 3, "triggerResetMode": "onUserSpeech" },
      "do": [{ "type": "say", "exact": "Are you still there? Please let me know how I can help you." }]
    },
    {
      "on": "customer.speech.timeout",
      "options": { "timeoutSeconds": 20, "triggerMaxCount": 3, "triggerResetMode": "onUserSpeech" },
      "do": [{ "type": "say", "prompt": "The user has not responded in 20s. Based on the above conversation in {{transcript}} ask the user if they need help or if not you will be ending the call" }]
    },
    {
      "on": "customer.speech.timeout",
      "options": { "timeoutSeconds": 30, "triggerMaxCount": 3, "triggerResetMode": "onUserSpeech" },
      "do": [
        { "type": "say", "exact": "I'll be ending the call now, please feel free to call back at any time." },
        { "type": "tool", "tool": { "type": "endCall" } }
      ]
    }
  ]
}

Key Behaviors & Limitations

  • Idle messages are automatically disabled during tool calls and warm transfers, to avoid interrupting system processes.
  • triggerMaxCount caps how many times the timeout hook fires per call (range: 1–10).
  • Using say.prompt produces model-generated text that may vary; use say.exact for strict, predictable output.
  • Allow 2–3 seconds of audio processing time when choosing timeout values.
  • If the max count is reached, a log entry will appear in call logs noting the hook was not triggered due to max count.

Timing Recommendations

Use CaseRecommended Timeout
Urgent/transactional calls5–10 seconds
General support calls10–20 seconds
Complex/decision-making topics20–30 seconds

In summary, idle messages give you fine-grained control over how your assistant handles user silence — from gentle check-ins to gracefully ending unresponsive calls — all configured through the customer.speech.timeout hook in Assistant Hooks.