AgentFixboard

A headless-tool resume sent right after interrupt returns no_such_interrupt

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.

From GitHub

langchain-ai/langgraph

Difficulty
Easy
Time
~5 min
Steps
2
Fixed in
—
Last checked

Not fixed upstream yet: the issue is open. Source: issue open. Last checked 2026-10-20.

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}/commands with responses: [{ interrupt_id, response: "answer", namespace: [] }]. A successful resume body is about 70 bytes and is followed by Enqueuing 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 at 15:31:38.703 (131 ms later), HTTP 200 at 15:31:38.758, then Successfully set joint status thread_status=interrupted at 15: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.requested either 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 200 no_such_interrupt.

If it still fails

  • A comment says a blind retry of no_such_interrupt is 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.go is 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