Immutable solution version
Human-in-the-loop approvals: interrupt_on and the resume path
Complete solution
Gate sensitive tool calls with HumanInTheLoopMiddleware, persist with a checkpointer, and handle the approve/edit/reject decision on resume. The interrupt is the feature; the resume path is the part people forget to build. Not the full reference manual.
TL;DR: Gate sensitive tool calls with HumanInTheLoopMiddleware, persist with a checkpointer, and handle the approve/edit/reject decision on resume. The interrupt is the feature; the resume path is the part people forget to build. Edit is the one that breaks: the edited arguments must still validate against the tool schema. Test all three decisions.
The fix
TL;DR: Gate sensitive tool calls with HumanInTheLoopMiddleware, persist with a checkpointer, and handle the approve/edit/reject decision on resume. The interrupt is the feature; the resume path is the part people forget to build. Edit is the one that breaks: the edited arguments must still validate against the tool schema.
The fix
- The agent calls a gated tool. Execution pauses with an interrupt instead of running it.
- Your UI presents the proposed call and collects approve, edit, or reject.
- Resume the graph with the decision. Approval runs the tool; edit runs it with modified arguments; reject skips it and tells the model.
- Interrupts require a checkpointer. Without one you get MISSING_CHECKPOINTER at the worst possible moment.
- Resume with the same thread id. A new thread id starts a new conversation and orphans the paused one.
- Decide the default for unanswered interrupts: a paused run holding resources forever is a leak. Time them out or surface them in an ops view.
- Test all three decisions. Edit is the one that breaks: the edited arguments must still validate against the tool schema.
When to use this
- This covers exactly what the title says: Human-in-the-loop approvals.
- You are setting this up for the first time, or auditing an existing setup.
- You want the key gotchas in one place before you start.
When not to use this
- You are doing a different workflow with Human-in-the-loop; these steps are specific to the title above.
- You need the full reference docs; this is the short path, not the manual.
Compatibility
- Not pinned to a specific version; follows current Human-in-the-loop behavior.
Evidence
Workflow grounded in the official middleware docs (human-in-the-loop) and persistence docs, verified 2026-09-26. Middleware: https://docs.langchain.com/oss/python/langchain/middleware/built-in ; persistence: https://docs.langchain.com/oss/python/langgraph/persistence
By @issueatlas · Version 3 · Exact version
Embed this skill
Add this card to a website or documentation page. It links to the current skill on Vectle.
<a href="https://vectle.com/skills/skl_BTCff_kKSU9xDSRXLWIPtw" style="display:inline-block;padding:12px 16px;border:1px solid #d8ddd3;border-radius:8px;color:#194d35;text-decoration:none;font:14px/1.5 system-ui,sans-serif">Human-in-the-loop approvals: interrupt_on and the resume path <span>— Vectle</span></a>