instructions, and for some, a tool.
This page collects ideas to start from. Each one worked in our tests and comes with the prompt and tool we used, so you can try it and change it to fit your agent. The last section lists ideas we haven’t tested yet.
Two approaches worked well. For a reaction the caller should hear, prompt for the reply directly, with an example of the line you want. For anything your code acts on, have the model report what it hears as tool arguments. In our tests that was more reliable than asking it to react out loud.
Both depend on the model hearing the real line. Send raw audio: noise suppression strips the cues these ideas use.
Telling a caller on a noisy line you can hear the noise
Say it once, then say back what you caught. A caller who knows the line is noisy can move somewhere quieter. A caller who isn’t told just gets asked to repeat themselves.instructions: flag a noisy line
instructions show the line you want. Without “for example by saying it’s a bit noisy on their end”, the model rarely mentions the noise at all.
Logging what the model hears about the caller
Start with a tool the model calls silently to report what it hears. Here’s an example function that should work well,tag_inbound_audio. It gives your code the kind of audio on each turn, the caller’s perceived gender and accent, and whether they’re whispering. The next three ideas all build on it.
session.tools: tag_inbound_audio
instructions:
instructions: tag what you hear
function_call_output, then response.create, since a tool result ends no turn on its own. The output is where your code tells the model what to do next. When nothing needs to change, return {"logged": true} and the model answers the caller as usual. Keep the last values you received: the ideas below compare against them.
Re-checking identity when a different voice comes on
A different voice after a security check is an unverified caller. Your code owns whether the caller is verified, so the decision belongs there, not in the prompt. When atag_inbound_audio call arrives with a different gender or accent from the last one, and the caller has already passed your check, clear that state and say so in the result:
function_call_output: a different voice
Logging the caller’s accent
accent is a free-text field, so log it as it comes. Use it for reporting, or to try routing a caller to a regional team. In our tests it was right about Australian and Indian English every time, and often wrong about less common accents, where it heard a nearby one instead: Irish came back as New Zealand or Australian. Treat it as a hint, not a fact about the caller.
Keep the field description neutral. Examples in a description pull the answer toward them: list a few accents there and the model will map nearby accents onto those. The description above names none.
Offering a text message to a caller who’s whispering
A caller who whispers may not be able to talk freely. Whenwhispering comes back true, don’t ask them to speak up, and don’t ask why. Use the result to have the model offer a way to carry on that doesn’t need their voice:
function_call_output: whispering
Staying quiet on hold
On an outbound call, hold music isn’t a turn to answer. Give the model a tool to call instead of speaking.wait isn’t built in; you declare it like any other tool, and it takes no arguments. It’s worth declaring in any agent that might be put on hold or transferred.
session.tools: wait
instructions: wait through hold
wait with a function_call_output, such as {"status": "waiting"}, and don’t send response.create after it: the model has nothing to say yet. It stays quiet until the next turn it hears. Hold music on its own usually doesn’t open a turn at all, so in practice the model hears the recorded messages, calls wait for each, and answers the person who picks up. Keep streaming the line audio the whole time you’re on hold. The model can only hear someone pick up in audio you send.
What it doesn’t pick up reliably
These are worth knowing before you design around them:More ideas to try
We haven’t tested these yet. Each one turns on something the model can hear, so they’re a place to start your own experiments:- Tell a live person from an IVR or voicemail greeting by how it sounds.
- Notice a child on the line and ask for an adult before any account change.
- Match the text-to-speech voice, or the regional team you route to, to the caller’s accent.
- Offer a callback when the caller sounds like they’re driving.
- Wait while a caller reads a number off a card, instead of jumping in at a pause.
Next steps
Prompt guide
What the model perceives beyond words, and why it needs the raw audio.
Tool calling recipes
Handling results and errors from the tools these ideas declare.

