Prompt agents
A prompt agent is a single agent driven by one prompt. It is the fastest way to something useful, and it is the right shape whenever the conversation does not have to follow a fixed path.
The keys below are fields of the agent's configuration. The dashboard edits them for
you; over the API they are set on the agent's config.
The prompt
system_prompt is the agent's instructions and it is where most behaviour lives. If
the agent does not ask for something, uses the wrong tone, skips a step or fails to
confirm, the fix is almost always here rather than in a setting.
Write it like a brief for a new employee:
You are the receptionist for Acme Dental.
Your job: find out whether the caller wants to book, move or cancel an
appointment, then collect their full name and phone number.
Always: confirm the details back before ending.
Never: give medical advice, or quote a price.
If asked anything else: say a colleague will call back.The prompt and the greeting can use variables with
{{name}}.
On a call, replies are spoken aloud. Ask for one thing at a time, keep sentences short, and avoid anything that only makes sense in writing (lists, headings, symbols).
Who speaks first
greeting is the agent's opening line. first_speaker decides whether the agent
greets or waits.
assistant- the agent opens with its greeting.user- the agent stays silent until the caller speaks.
This is the most common cause of an agent that appears to do nothing, or that talks over a caller who has already started. The dashboard shows this setting for voice agents only.
Turn-taking
On a cascaded call, the end of a caller's turn is decided by turn detection that listens for a finished thought, not only for a pause, so a caller who stops mid-sentence to think is usually not cut off.
endpointing tunes how speech is detected in the first place: stop_secs (how
quickly a pause counts as the caller having stopped speaking, default 0.2),
start_secs, confidence and min_volume. It does not set the end of the turn on
its own. On the OpenAI and Grok realtime engines the model does its own speech
detection and these settings do not apply.
allow_interruptions decides whether the caller can talk over the agent. It is off
by default: the caller's microphone is muted while the agent speaks, so the agent
finishes every line and its own echo cannot cut it off. On GPT-Live the model always
handles interruptions itself and this setting has no effect.
Silence
By default the agent waits indefinitely. Set silence_timeout_seconds above zero to
have it nudge a silent caller. idle_message is what it says, or give several lines
in idle_messages to rotate through them. idle_max_prompts (default 2) is how many
nudges it gives before it ends the call with its farewell.
max_duration_seconds is a hard cap on call length regardless of what is happening.
A call can also end sooner if it reaches the platform's own maximum call length, or
when your credit balance can no longer pay for it.
Speech that cannot be transcribed
Sometimes a caller audibly speaks but the transcriber cannot commit their words - most often speech in a language the agent was not configured for. Instead of going silent, the agent's model receives an automatic system note containing whatever fragment was captured, marked as an unverified transcript with a detected-language hint, and reacts from its own prompt: by default it politely asks the caller to repeat themselves in the language the agent speaks.
Because the note reaches your prompt, you can decide what happens. For example:
If you receive a notice that the caller could not be understood and the
fragment looks like Spanish, say - in English - that support is available
in English only, and offer the callback line.unclear_message- pin a fixed sentence to speak instead of involving the model.unclear_max_prompts- how many consecutive unintelligible turns before the agent gives up and ends the call with its farewell (default 2; 0 turns recovery off).
This only ever triggers when the caller genuinely spoke: background noise or silence never produces an apology to nobody.
Ending the conversation
end_call_phrases- phrases that end the conversation when the caller's message contains them, ignoring case. They are matched as substrings, so "that's all" also matches "that's all I wanted to ask, but...".end_call_message- the farewell. Default: "Thanks for reaching out. Goodbye!"end_call_enabled- see below.
When end_call_phrases is absent from the configuration, a built-in list
applies to every prompt agent, chat agents included: goodbye, good bye,
hang up, that's all, that is all, we're done, we are done, görüşürüz,
hoşça kal, hoşçakal and iyi günler. To turn phrase matching off, set the key
to an empty list ([]) through the API. Leaving the phrases field empty in the
dashboard does not do that: an empty field saves no phrases, so the built-in list
applies.
In chat, reaching the end completes the session: the farewell is added to the
transcript and any further message to that session is refused with 409. A chat
user who types "goodbye" or "that's all" mid-conversation ends it. If that is not
what you want, set end_call_phrases to your own list, or to [].
end_call_enabled governs the agent deciding to end the conversation itself, rather
than waiting for a phrase:
- On a call, it gives the model an end-call tool it can use when the
conversation is over. When the key is absent the tool is available; when it is
falsethe model cannot hang up, though phrases, the silence and duration limits still end the call. - When it is
true, a check of the caller's intent to wrap up also runs on each turn, in chat as well as on a cascaded call. On a realtime engine that check does not run and the model's own end-call tool decides.
The dashboard saves end_call_enabled as false unless you turn it on, so an agent
built there cannot hang up on its own until you enable it.
Conversation limits
max_turns- end the conversation after this many caller turns, in chat and on a call.max_turns_message- what the agent says when that limit is reached.
Structured replies and tools
These two apply to text conversations (chat and the sessions API), not to calls:
response_format- constrain replies to JSON, in the OpenAI shape ({"type": "json_object"}, or{"type": "json_schema", ...}). Useful for a chat agent whose replies are read by code.strict_tools- request OpenAI strict function calling, so the model's tool arguments follow each tool's parameter schema exactly.
Transfers and recording
transfer.number- a number the agent may hand the call to. The model can transfer only to this preset number.record_calls- record the call. See Sessions and transcripts.
Speaking style
speaking_style adds guidance to the agent's prompt on a call. It has three keys:
fillers (use a brief natural filler such as "let me check that" before answering),
backchannel (acknowledge the caller with short words such as "mhm" or "got it"),
and style (free text describing how it should speak). It shapes the words the model
writes; it does not change the voice or add sounds of its own.
Voicemail
voicemail.enabled lets an outbound call that reaches an answering machine leave
voicemail.message and hang up, instead of starting a conversation with a
recording. With the message empty it hangs up without leaving one.
- It relies on the carrier's answering-machine detection, so it applies to numbers on carriers that provide it. It does not apply on a direct SIP trunk.
- The message is spoken by the carrier's own text-to-speech voice, not the agent's voice.
- Detection reports a machine as soon as it recognises one; it does not wait for the beep, so the start of the message can play over the recorded greeting. Keep the important part of the message towards the end.
Compliance
compliance.redact_pii replaces structured identifiers in stored transcripts. It
is currently inactive and cannot be turned on. See
Privacy and compliance.
What else an agent can have
- Models and voices - which model, transcriber and voice.
- Knowledge base - answer from your own documents.
- Tools - take actions mid-conversation.
- Variables and extraction - pass data in, capture data out.