A customer asks your voice agent for a refund. The agent calls a tool, the tool hits your order system, and the order system takes about 14 seconds to respond.
For those 14 seconds, the agent says nothing. No acknowledgment, no progress, just silence. The customer assumes the call dropped and hangs up before the refund ever finishes.
The dead air is the bug. The slow backend is not the problem, because every backend is slow sometimes. The problem is that a normal function tool blocks the conversation while it runs.
Async tools in LiveKit fix this. Inside the tool, you call await ctx.update(message). The first call hands control back to the LLM right away, using that message as the tool’s synthetic return value, so the agent acknowledges the customer instead of going quiet. Later updates narrate progress as the work runs.
Because the LLM voices each update, the customer hears real status instead of a canned “please hold” line.
Watch the demo:
Announcement blog: