How to Let AI Voice Agents Ask a Human for Help Using Assists

Introduction
Tools give your agent hands. Assists give it a colleague.
When a caller needs something the model cannot do — a lookup in a desktop-only system, a refund approval, a policy exception — you have two choices. You can transfer the call and lose the AI. Or you can keep the AI on the line and let it ask a person to do that one step.
Assists are that second path. The agent creates a request, a teammate on a contact-center queue handles it, and the conversation continues without a handoff.
This guide walks through building a working Assist, from queue to live request.
When to use Assists (and when not to)
Use an Assist when:
- The AI should stay with the caller.
- A human needs to take one action, not take over the call.
- The work lives in a system the agent cannot reach with Tools.
Use a call transfer when the caller needs to speak to someone. Use a tool when an API can do the work with no person involved.
A simple test: if you would tap a coworker on the shoulder mid-call rather than pass the phone, it is an Assist.
The building blocks
Assists are organized the same way as tools:
- Assist — A container with a name and a description. You will see this list under Tools → Assists.
- Action — One LLM-callable job on that Assist (
lookup_order,approve_refund). The model sees the name, description, and parameters. Each action points at a contact-center queue. - Instance — One live request created during a conversation. Teammates work these in Contact Center → Assists. History and stats live back on the Assist you configured.
Getting started: your first Assist
1. Create a queue
Every assist action routes through a contact-center queue. If you do not have one yet, create it first and assign the teammates who should receive requests.
Without a queue, the Add Action form cannot be submitted.
2. Create the Assist
- In the dashboard, open Tools → Assists.
- Click New Assist.
- Set:
- Name:
Order desk - Description:
Human lookups in the order system when tools cannot retrieve an order.
- Click Create, then open the Assist.
3. Add an action
Click Add Action and configure the interface the model will see.
Name: lookup_order
Queue: your support queue
Description: tell the model when to call it, not just what it is.
Ask a teammate to look up an order in the order system. Use this when the customer asks for status, tracking, or contents and no existing tool can retrieve the order.
Assist reason description:
One-sentence summary of what the teammate should look up, including the order ID if the customer gave one.
Parameters schema (optional, but useful here):
{
"type": "object",
"properties": {
"orderId": {
"type": "string",
"description": "The customer's order ID, digits only."
}
},
"required": ["orderId"]
}Leave Interactive, Blocking, and Cancelable on for this example:
- Interactive — the teammate can ask the customer a follow-up (“Is that 1832 or 1833?”).
- Blocking — the caller waits on hold instead of chatting about something else.
- Cancelable — the caller can say “never mind” and the agent drops the request.
Click Create.
Layer in the customer experience
Open Update Action to edit spoken copy and timeouts. These lines are what the caller hears. Never mention the tool name.
For lookup_order:
| Field | Example copy |
|---|---|
| Start | Give me a moment — I’ll check that order with a colleague. |
| Queue delay | Thanks for waiting — I’m still checking on that order. |
| Working delay | Thanks for waiting — my colleague is looking it up now. |
| Success | I’ve got the order details. Let me share what I found. |
| Error | I wasn’t able to complete that lookup just now. Let’s try another way. |
| Queue timeout | I’m sorry, I couldn’t reach a colleague in time. I can take a message, or we can try again. |
| User cancel | No problem, we can leave the order lookup for now. What else can I help you with? |
Timeouts default to 10 seconds between delay lines and 10 minutes before the request gives up. Shorten the queue timeout if you would rather fail fast and offer a callback. Lengthen it if the desk is busy but still staffed.
What the live request looks like
During a call:
- The customer asks “Where is order 1832?”
- The model calls
lookup_orderwithorderId: "1832"and a shortassistReason. - The caller hears the start message, then hold music and delay copy (because Blocking is on).
- A teammate sees the request in Contact Center → Assists → In-flight, with the reason and transcript.
- They look up the order, optionally send a clarifying question, then accept or close.
- The AI speaks the success line and continues with the answer.
If nobody picks up, the caller hears the queue-timeout line and the instance is marked failed. If the customer says to skip it, the instance is cancelled.
Prompting the agent so it actually calls the action
The action description is necessary but not always sufficient. Add a short block to the agent prompt:
## Asking a colleague for help
- You have a lookup_order assist for order status, tracking, and contents when tools cannot retrieve the order.
- Do not guess order details.
- Before you call lookup_order, collect the order ID.
- Summarize the ask in assistReason in one sentence. Include the order ID.
- Stay with the customer. Do not offer to transfer the call for an order lookup.Then test in Preview. If the model chats around the lookup instead of calling it, make the description more forceful (“You MUST call lookup_order when…”) and mention it in the prompt.
Operating the queue
Configuration lives under Tools → Assists. Live work lives under Contact Center → Assists.
Teammates should keep the inbox open while they are on shift:
- In-flight — pick these up.
- Approved / Denied — audit what was accepted or rejected.
On an assigned request they can:
- Read the reason and transcript.
- Send a question back through the AI (Interactive actions).
- Accept, reject, or close.
Staffing matters more than copy. An Assist with an empty queue always times out.
Reviewing how it is going
On the Assist, open Stats and History.
Stats (last 30 days by default) shows total, completed, failed, cancelled, and a per-action breakdown. A high fail rate usually means the queue is understaffed or the timeout is too aggressive. A high cancel rate usually means Blocking copy is unclear, or the model is calling the action too early.
History lists every instance with status and end reason. Open a row to read logs when a request behaved unexpectedly.
Troubleshooting
The model never calls the action
- Sharpen the description and the agent prompt.
- Confirm the Assist is linked to that agent.
- Make the name specific (
lookup_order, nothelp).
Every request times out
- Confirm teammates are on the queue and watching Contact Center → Assists.
- Increase queue timeout, or add staffing.
- Check that the action points at the queue you think it does.
The caller hears silence
- Fill in start and delay copy.
- For blocking actions, keep delay intervals around 10 seconds so hold music is not the only sound.
The model invents an order status instead of asking a human
- Add “Never guess order details” to the prompt.
- Disable overlapping tools that return similar-looking data.
- Lower temperature if the agent is speculating.
The customer cannot cancel
- Turn Cancelable on. When it is off, the restricted prompt tells the model to stay on the question.
I deleted an Assist and I still see old rows
- Delete archives the Assist. Agents stop receiving its actions; History keeps past instances.
Related reading
- Assists product guide — field-by-field reference.
- How to make agents take actions with tools — APIs the agent can call without a human.
- Fallback and escalation — when to transfer the live call instead of asking a colleague.
Assists are the “tap a coworker” path. Start with one well-staffed action, listen to a few live requests, then add more.
