ToolRetryMiddleware Class — langchain Architecture
Architecture documentation for the ToolRetryMiddleware class in tool_retry.py from the langchain codebase.
Entity Profile
Dependency Diagram
graph TD 33f83a05_ad1b_0c1c_e484_ac91455db157["ToolRetryMiddleware"] d1a1c88e_8e50_9b1e_f783_6ddf1220b647["tool_retry.py"] 33f83a05_ad1b_0c1c_e484_ac91455db157 -->|defined in| d1a1c88e_8e50_9b1e_f783_6ddf1220b647 eca8764c_16d4_7994_0b57_199409e3f389["__init__()"] 33f83a05_ad1b_0c1c_e484_ac91455db157 -->|method| eca8764c_16d4_7994_0b57_199409e3f389 5665de07_b809_7bb1_4e7f_e0409866de63["_should_retry_tool()"] 33f83a05_ad1b_0c1c_e484_ac91455db157 -->|method| 5665de07_b809_7bb1_4e7f_e0409866de63 a235f099_6804_8d79_50f5_13bbaa648627["_format_failure_message()"] 33f83a05_ad1b_0c1c_e484_ac91455db157 -->|method| a235f099_6804_8d79_50f5_13bbaa648627 7a031c34_097e_d25a_0210_cf5d0d368b98["_handle_failure()"] 33f83a05_ad1b_0c1c_e484_ac91455db157 -->|method| 7a031c34_097e_d25a_0210_cf5d0d368b98 731777b2_3052_874d_7b48_c5d58d2e0a8c["wrap_tool_call()"] 33f83a05_ad1b_0c1c_e484_ac91455db157 -->|method| 731777b2_3052_874d_7b48_c5d58d2e0a8c e9a8e4d0_4a9e_0f20_9c10_65fc4f8ed225["awrap_tool_call()"] 33f83a05_ad1b_0c1c_e484_ac91455db157 -->|method| e9a8e4d0_4a9e_0f20_9c10_65fc4f8ed225
Relationship Graph
Source Code
libs/langchain_v1/langchain/agents/middleware/tool_retry.py lines 30–403
class ToolRetryMiddleware(AgentMiddleware[AgentState[ResponseT], ContextT, ResponseT]):
"""Middleware that automatically retries failed tool calls with configurable backoff.
Supports retrying on specific exceptions and exponential backoff.
Examples:
!!! example "Basic usage with default settings (2 retries, exponential backoff)"
```python
from langchain.agents import create_agent
from langchain.agents.middleware import ToolRetryMiddleware
agent = create_agent(model, tools=[search_tool], middleware=[ToolRetryMiddleware()])
```
!!! example "Retry specific exceptions only"
```python
from requests.exceptions import RequestException, Timeout
retry = ToolRetryMiddleware(
max_retries=4,
retry_on=(RequestException, Timeout),
backoff_factor=1.5,
)
```
!!! example "Custom exception filtering"
```python
from requests.exceptions import HTTPError
def should_retry(exc: Exception) -> bool:
# Only retry on 5xx errors
if isinstance(exc, HTTPError):
return 500 <= exc.status_code < 600
return False
retry = ToolRetryMiddleware(
max_retries=3,
retry_on=should_retry,
)
```
!!! example "Apply to specific tools with custom error handling"
```python
def format_error(exc: Exception) -> str:
return "Database temporarily unavailable. Please try again later."
retry = ToolRetryMiddleware(
max_retries=4,
tools=["search_database"],
on_failure=format_error,
)
```
!!! example "Apply to specific tools using `BaseTool` instances"
```python
from langchain_core.tools import tool
@tool
def search_database(query: str) -> str:
'''Search the database.'''
return results
retry = ToolRetryMiddleware(
max_retries=4,
tools=[search_database], # Pass BaseTool instance
)
```
!!! example "Constant backoff (no exponential growth)"
```python
Source
Frequently Asked Questions
What is the ToolRetryMiddleware class?
ToolRetryMiddleware is a class in the langchain codebase, defined in libs/langchain_v1/langchain/agents/middleware/tool_retry.py.
Where is ToolRetryMiddleware defined?
ToolRetryMiddleware is defined in libs/langchain_v1/langchain/agents/middleware/tool_retry.py at line 30.
Analyze Your Own Codebase
Get architecture documentation, dependency graphs, and domain analysis for your codebase in minutes.
Try Supermodel Free