What a framework interrupt is good at
LangGraph’sinterrupt() and the OpenAI Agents SDK’s tool-approval interruption both stop a run
at exactly the right moment, carry the pending call to whatever console your operators use, and
resume the run where it stopped. They are integrated with the framework’s state, its
checkpointing and its streaming, and they are what your users already know. Nothing here
replaces that; the adapters exist so a human keeps answering there.
What it does not do
When to use both
If your agent runs on LangGraph or the Agents SDK and your operators answer there, install the adapter:@protect(wait=True) sends the approval out through the framework’s interrupt, the
answer comes back, and one core provider writes the grant through the same calls
ctrlrun approve makes. Two places to say yes would be one place nobody is watching, so there
is only ever one.
If your framework has no such primitive, you need no adapter. @protect covers the call
anyway, and ApprovalRequired is raised for your own code to handle.
The distinction that matters
A framework binds an approval to a call it is about to make. CTRLRun binds it to what that call would do. Where the framework’s resumption carries the arguments the human saw, an adapter hands them back and CTRLRun re-checks the hash: prevention. Where it carries only a verdict, CTRLRun records who answered and cannot re-check what about: attribution. Each adapter’s page says which it is, in that word.Next
- Three ways in: when an adapter is the answer and when it is not.
- Use the LangGraph adapter · Use the OpenAI Agents SDK adapter.
- Get started · Why.