Symptom
After SSE input.requested, a resume within about 100–150 ms returns HTTP 200 with {"type":"error","id":3,"error":"no_such_interrupt","message":"Unknown or already-consumed interrupt: <interrupt_id>"}. No run is enqueued. GET /threads/{id}/state still lists that same interrupt id under tasks[].interrupts.
Evidence what you'll see
- The failing POST is
/threads/{thread_id}/commandswithresponses: [{ interrupt_id, response: "answer", namespace: [] }]. A successful resume body is about 70 bytes and is followed byEnqueuing runs; the failing body is about 135 bytes and is not. - The report's trace: node executed and SSE emitted at
15:31:38.572, resume POST at15:31:38.703(131 ms later), HTTP 200 at15:31:38.758, thenSuccessfully set joint statusthread_status=interruptedat15:31:39.342(~640 ms after the resume). - Waiting about 2 s before the same resume succeeds. Human-answered interrupts work because seconds have already passed.
Why it happens
The interrupt is announced over SSE before the durable thread row is committed. input.respond validates against that row, so a headless-tool resume that arrives in the commit window is rejected as no_such_interrupt even though /state already shows the id. A 2 Oct 2026 comment says flushPendingHeadlessToolInterrupts also submits the resume in a fire-and-forget void (async () => { ... })(), so a ProtocolError never reaches the caller.
Affected versions
Self-hosted Agent Server GET /info version 0.15.1, langgraph_py_version 1.2.6, image langchain/langgraphjs-api, @langchain/langgraph-sdk 1.12.0, @langchain/langgraph 1.4.16. The linked issue does not name an operating system.
Fix steps
0 of 2 done
Your check marks stay in this browser only.
How to check it worked
- A resume sent immediately after
input.requestedeither continues the run (Enqueuing runs) or raises so the caller can retry; the thread does not stay interrupted with the same pending id and HTTP 200no_such_interrupt.
If it still fails
- A comment says a blind retry of
no_such_interruptis unsafe when several interrupts are pending, because the same error is returned for "not committed yet" and "already consumed". - The publication-ordering half lives in the Agent Server (
threads_repo.gois not in the public langgraph tree). The linked issue does not name a server or SDK release that accepts the immediate resume.
Sources and credit
Summarized in our own words from these public reports. Credit goes to their authors.
Provided as is, without warranty. Try changes in a non-production environment and back up first. Security-related steps: verify against the official docs. Terms · Request removal or attribution change
Hit an error we don't cover? Submit it