Acknowledgements
Let an agent say a short "One moment" in its own voice while a slow reply is still being prepared, and choose what the caller hears while a slow tool call runs.
Between the end of a caller's turn and the first word of the reply there is a gap: the model is still writing and the voice has not started. When that gap runs long, callers hear dead air. Acknowledgements fill it the way a human receptionist does, with one short neutral phrase such as "One moment" or "Let me check", spoken in the agent's own voice, model and language.
They are off unless you enable them, per agent, and they never change what the agent says: an acknowledgement is not part of the conversation, is not returned to the model as its own previous utterance, and is not a transcript line. A GPT-Live 1 agent hides this section: the live model owns barge-in, backchannels, and waiting speech.
Switch acknowledgements on in the agent editor
Open the AI agent in the workspace and choose Tuning, under Advanced in the editor's section rail. Acknowledgements, waiting speech and turn taking are one section: they answer the same question -- what the caller hears in the gaps -- and they share one saved payload. The switch is off for every agent until you turn it on there. With it on you can:
- add up to six phrases of your own, each at most five words and forty characters, with no digits, currency marks or claim words; the editor refuses a phrase for the same reason the API would and says why. Leave the list empty to use the built-in phrases for the agent's language, which the editor shows dashed. A language with no built-in phrases (Estonian and Sinhala today) needs phrases of your own before the feature does anything;
- set how long a reply may take before the agent acknowledges, from 0.6 to 3.0 seconds, default 1.2;
- press Hear an acknowledgement as your AI agent to play one acknowledgement in the agent's own voice, with the agent's delivery profile, through the same preview a call's synthesis uses. It counts against the voice-preview allowance like any other preview.
The fixed rules stated in the section are not editable: never over the caller, cancelled the moment the reply starts, at most one every three turns and six per call, and never in the transcript. Changes apply to new calls after you save the agent.
Enable acknowledgements through the API
PATCH /v1/agents/{agent_id}/voice-stack accepts an optional
voice_polish.acknowledgements section:
{
"voice_polish": {
"acknowledgements": {
"enabled": true,
"phrases": ["One moment.", "Let me check that for you."],
"delay_ms": 1200
}
}
}| Field | Meaning |
|---|---|
enabled | true turns the feature on. Absent or false is off, and an agent that never configured the section has no acknowledgements key in its responses. |
phrases | Optional. Up to 6 short neutral phrases, each at most 40 characters. Digits and currency marks are rejected so a phrase can never carry a factual, payment, legal or consent claim. Without phrases the platform's reviewed list for the agent's language is used. |
delay_ms | Optional, 600 to 3000, default 1200. How long the reply may take before an acknowledgement is worth speaking. Shorter delays collide with fast replies; longer ones leave more silence. |
The same section is accepted by the MCP set_agent_voice_stack tool and is
returned by GET /v1/agents/{agent_id}/voice-stack. The exact schema is in
the generated API reference. The editor reads and
writes this same section, so a setting made through the API shows up in the
editor and a save from the editor never drops a field the API stored.
How the worker uses it
- Language follows the call. Phrases you supply are spoken as written. Without your own phrases, the reviewed list for the call's language applies; a language with no reviewed list stays silent rather than acknowledging in English. An agent that follows the caller's language keeps that rule per call.
- Own voice. Each phrase is synthesized once per call with the agent's selected voice and model and billed to that call like any other synthesis. Clips are prepared in the background after the greeting, so enabling the feature never delays the first words of a call.
- At most once per turn, never over anyone. The worker starts waiting when
the reply is being prepared and speaks only if the reply has not started
after
delay_ms. If the caller starts talking, or the reply begins, the acknowledgement is cancelled or cut immediately. A cooldown keeps consecutive turns quiet so it never becomes a tic, and nothing is spoken in front of the agent's goodbye. - Separate track. Acknowledgements play on the same outgoing background
track as audio environments, not on the agent's
speech track. Call evidence therefore contains no acknowledgement audio or
text; the transcript's
semantic_response_audio_policystatesfiller_acknowledgements_enabled: truefor calls where the feature was on, so a reviewer knows the caller may have heard a filler the transcript does not show.
During tool waits
A tool call is the one wait the model cannot talk through. When the agent
calls an integration action or searches a knowledge base, it is silent for as
long as your endpoint takes; most calls return in well under a second, but the
slow tail runs to several seconds, and dead air of that length reads as a
dropped call. voice_polish.tool_wait chooses what the caller hears instead:
{
"voice_polish": {
"tool_wait": {
"mode": "sound",
"delay_ms": 1000
}
}
}| Field | Meaning |
|---|---|
mode | off (default, not stored), sound or acknowledge. sound plays a quiet keyboard-typing bed on the separate outgoing track once the tool has run for delay_ms, and cuts it the instant the tool finishes; it is wordless, so it works in every language. acknowledge speaks one short phrase in the agent's own voice and language instead ("One moment while I check."), synthesized once per call like an acknowledgement. |
delay_ms | Optional, 600 to 3000, default 1000. How long a tool may run before feedback starts. Most tools finish inside this and the caller hears nothing. |
phrases | Optional, acknowledge only. Up to 6 short neutral phrases under the same rule as acknowledgements (at most 40 characters, no digits, currency marks or claim words). Without phrases the reviewed list for the call's language is used; a language without one stays silent rather than acknowledging in English. Rejected with mode: "sound". |
How the worker behaves:
- Never over anyone. Feedback waits until both the caller and the agent are silent. If the agent says "let me look that up" before calling the tool, the delay starts when those words end. Caller speech or the start of the reply cuts the feedback immediately, and a wait the caller interrupts stays quiet for the rest of that tool call.
- Once per wait. Tools the model calls in parallel share one window, from the first start to the last end; the caller hears one bed or one phrase, not one per tool. The typing bed also stops after 15 seconds so a hung tool cannot type forever. A phrase that has started is allowed to finish unless the reply or the caller begins.
- Not for the call's own controls. Ending the call, transferring to a human and the internal language switch never get feedback.
- One spoken filler per turn. With acknowledgements enabled as well, the acknowledgement pauses while a tool runs and resumes afterwards; a turn that already heard one phrase does not hear a second. The typing bed is not speech and may still play.
- Evidence. Like acknowledgements, feedback plays on the background track
and never appears in the recorded agent audio or the transcript lines. The
transcript's
tool_wait_feedbacksection states the configuredmodeand lists every start and cut with its reason, and the effective voice stack identity records the mode when it is on. Once the call's artifacts are imported, the Calls page shows that record under Tool waits on the call detail (the setting the call ran with, then each start, cut, skip or failure with its reason, the tools that were running and the offset from call start), andGET /v1/calls/{call_id}/observabilityreturns the same bounded projection astool_wait_evidence(statuscomplete, partial or unavailable with areason,mode, up to 64events,has_more). A call recorded before this section existed reads as unavailable, never as a quiet call.
In the workspace, open the AI agent, choose Tuning under Advanced in the
editor rail, and use During tool waits below the acknowledgements switch:
pick Nothing, One phrase or Typing sound, move the wait between 0.6 and
3.0 seconds, and for a phrase add up to six of your own or leave the list
empty to use the built-in ones shown dashed. Each mode has a preview under
it: Hear the phrase plays the phrase a call would say first (your first
phrase, or the language's first built-in) in the AI agent's own voice with its
delivery profile, and Hear the typing sound plays a few seconds of the
same typing bed at the level a call uses. The control writes the same
voice_polish.tool_wait object as the API, is saved with the voice settings,
and applies to new calls after you save.
When the agent stops answering altogether
Acknowledgements and tool-wait audio cover a wait the agent will come back from. A conversation engine can also stop answering and not come back: a provider outage in the middle of a call can leave the connection open and silent, and on some engines nothing is reported at all. A call in that state used to stay up with the caller talking to nobody, and it was billed for all of it.
Skysay bounds that. After the caller finishes speaking, the agent has a fixed
amount of time to produce something — a reply, a tool call, or the end of the
call. A reply counts even if the agent held it back rather than talk over the
caller and it was never played because they kept talking, so a caller who
talks in short bursts is never ended this way. If the whole bound
passes with nothing, Skysay ends the call and
reports ended_reason agent_unresponsive with reason_detail
model_unresponsive on the call result.
The bound is 20 seconds by default and counts only time the line was free:
the caller's own speech is subtracted, so a caller who keeps talking is never
cut off mid-sentence. A normal conversation never approaches it — it is
cleared by anything the agent does, and it never runs while the agent is
speaking, while one of its tools is still running, before the caller has said
anything, or on a call whose replies come from a workflow.
A call where nobody speaks at all is a different situation, with its own
reason, no_caller_speech_after_answer.
On GPT-Live calls with end_call enabled, Skysay can request one recovery
reply if caller input reached the engine but the engine stopped responding.
It waits until half the configured bound, capped at 10 seconds of free-line
time, and does not interrupt the caller or an active tool or backend request.
The model can answer a continuing question or invoke end_call if the
conversation is finished. Saying goodbye alone never authorizes a hang-up.
The agent keeps its configured tools and is instructed not to repeat completed
actions. Recovery runs at most once per call and does not extend the original
unresponsive deadline. It is a safety net, not a guarantee that a model will
respond or choose to end the call.
Change it per agent in the same voice_polish object:
{
"voice_polish": {
"model_unresponsive": { "seconds": 45 }
}
}seconds accepts any value from 10 to 120, or 0 to switch the bound off for
an agent that legitimately waits on something slow. Leaving the section out
keeps the 20-second default. There is no editor control for it; set it through
PATCH /v1/agents/{agent_id}/voice-stack.
When the opening never reaches the caller
Every call opens with the AI agent's opening: its opening line as written, or first words it writes from its instructions when it has no line. If producing that opening fails before anything is heard, Skysay asks for it once more, but only when that cannot repeat or overlap anything: nothing of the opening was played, the person has not started speaking, no tool or ending is in progress, and the original time allowed for the reply has not run out. If the person speaks first, their turn is answered as usual instead.
If the opening still never reaches the caller, Skysay ends the call rather than
leave both sides waiting in silence. The call result
reports ended_reason agent_unresponsive with an empty reason_detail, which
tells it apart from the silent-agent bound above (model_unresponsive). A
workspace browser test reports such a failure as browser_startup_failed, as
before. On an incoming call answered by a voice-to-voice engine (GPT-Live,
Gemini Live), the engine already hears the caller and answers them directly, so
the call continues and the silent-agent bound above applies.
What it does not do
Acknowledgements reduce perceived waiting, not the reply time itself. They do not change turn-taking, interruption sensitivity, the selected voice or the spoken language, and they cannot be used to say anything about the caller's case. Use turn-taking settings for barge-in behaviour and audio environments for ambience.
Related
- Delivery profiles choose how the voice performs
every reply; acknowledgements only fill the wait before one starts. Both live
in the same
voice_polishobject on the voice stack. - Post-call results explains
agent_unresponsive,model_session_lostandreason_detail, including the silent-agent bound above.
When funded call time runs out
A hosted call can end because its existing credit reservation cannot be extended. Skysay checks this independently of whether the conversation is progressing, which language is spoken, or which conversation engine is selected. This is a platform billing rule; it does not depend on the AI agent following a prompt.
The ending is funding_exhausted. The billing guide
explains the reason details, automatic recharge and final settlement. Keeping
sufficient eligible credit available lets renewals proceed, subject to the
call's existing maximum duration.
Audio environments
Version-pinned licensed ambience for agent output and separate caller-input noise conditions in Simulation Lab.
How a call ends
How the AI agent ends a call with end_call on each conversation engine, the standing instruction every agent with end_call receives, and the check-in and polite ending when both sides go quiet.