langchain · difficulty ◆◆◆
ToolRetryMiddleware: Interrupts Now Propagate Through Retries
Stop agents reliably, even mid-retry
Your agent kept retrying after you told it to stop.
$ pip install -U langchain>=1.3.12What it does
When a tool call fails and ToolRetryMiddleware retries it, any interrupt signal (a human Interrupt exception, or a forced termination) was silently swallowed, so the retry loop kept going. This fix ensures interrupts are properly propagated through the retry middleware, so the agent honours stop requests even mid-retry.
Why it matters
Interruptibility is critical in production agents. You may need to revoke a tool call mid-execution due to changing context, a timeout, or a security policy. If ToolRetryMiddleware ignores the interrupt and keeps retrying, you lose the ability to halt the agent safely. This closes that gap, making agent pipelines more robust and predictable under failure conditions.
Example
$ Build a ReAct agent with an unreliable tool that fails twice then succeeds, and confirm it retries.[agent] Action: unreliable_tool with args {"query": "test"}\n[tool] RuntimeError: Transient failure #1\n[agent] Retrying (1/3)...\n[tool] RuntimeError: Transient failure #2\n[agent] Retrying (2/3)...\n[tool] Success after 3 attempts\nResult: Success after 3 attemptsPatch the tool to raise Interrupt on its second call and confirm the agent halts rather than retrying.
Common flags
- ToolRetryMiddleware
- Retries failed tool calls with exponential backoff
- AgentExecutor
- Runs the agent loop with retry policies
- create_react_agent
- Builds a ReAct agent from an LLM, tools, and prompt
- Interrupt
- LangChain base interrupt signal propagated through chains
History
Origin
The retry loop caught every exception, including interrupt signals, and continued as if nothing had happened.
The fix
PR #38722, fix(langchain): propagate interrupts through ToolRetryMiddleware, added a raise e path that re-raises the interrupt instead of swallowing it.
Fun facts
Pros & cons
pros
- + Honours stop requests mid-retry
- + Prevents runaway retry loops
- + No app code changes
cons
- − Touches an internal middleware path
- − Requires upgrading langchain
Takeaways
- 1Interrupts now halt retries
- 2Inspect the raise e path
- 3Upgrade to 1.3.12+