awrap_tool_call() — langchain Function Reference
Architecture documentation for the awrap_tool_call() function in types.py from the langchain codebase.
Entity Profile
Dependency Diagram
graph TD 90f2beae_5ebb_27c8_e8a7_357c5024c7cc["awrap_tool_call()"] 949c7cf4_56fe_f3b4_cd89_9631a7e9cb1e["AgentMiddleware"] 90f2beae_5ebb_27c8_e8a7_357c5024c7cc -->|defined in| 949c7cf4_56fe_f3b4_cd89_9631a7e9cb1e style 90f2beae_5ebb_27c8_e8a7_357c5024c7cc fill:#6366f1,stroke:#818cf8,color:#fff
Relationship Graph
Source Code
libs/langchain_v1/langchain/agents/middleware/types.py lines 731–798
async def awrap_tool_call(
self,
request: ToolCallRequest,
handler: Callable[[ToolCallRequest], Awaitable[ToolMessage | Command[Any]]],
) -> ToolMessage | Command[Any]:
"""Intercept and control async tool execution via handler callback.
The handler callback executes the tool call and returns a `ToolMessage` or
`Command`. Middleware can call the handler multiple times for retry logic, skip
calling it to short-circuit, or modify the request/response. Multiple middleware
compose with first in list as outermost layer.
Args:
request: Tool call request with call `dict`, `BaseTool`, state, and runtime.
Access state via `request.state` and runtime via `request.runtime`.
handler: Async callable to execute the tool and returns `ToolMessage` or
`Command`.
Call this to execute the tool.
Can be called multiple times for retry logic.
Can skip calling it to short-circuit.
Returns:
`ToolMessage` or `Command` (the final result).
The handler `Callable` can be invoked multiple times for retry logic.
Each call to handler is independent and stateless.
Examples:
!!! example "Async retry on error"
```python
async def awrap_tool_call(self, request, handler):
for attempt in range(3):
try:
result = await handler(request)
if is_valid(result):
return result
except Exception:
if attempt == 2:
raise
return result
```
```python
async def awrap_tool_call(self, request, handler):
if cached := await get_cache_async(request):
return ToolMessage(content=cached, tool_call_id=request.tool_call["id"])
result = await handler(request)
await save_cache_async(request, result)
return result
```
"""
msg = (
"Asynchronous implementation of awrap_tool_call is not available. "
"You are likely encountering this error because you defined only the sync version "
"(wrap_tool_call) and invoked your agent in an asynchronous context "
"(e.g., using `astream()` or `ainvoke()`). "
"To resolve this, either: "
"(1) subclass AgentMiddleware and implement the asynchronous awrap_tool_call method, "
"(2) use the @wrap_tool_call decorator on a standalone async function, or "
"(3) invoke your agent synchronously using `stream()` or `invoke()`."
)
raise NotImplementedError(msg)
Domain
Subdomains
Source
Frequently Asked Questions
What does awrap_tool_call() do?
awrap_tool_call() is a function in the langchain codebase, defined in libs/langchain_v1/langchain/agents/middleware/types.py.
Where is awrap_tool_call() defined?
awrap_tool_call() is defined in libs/langchain_v1/langchain/agents/middleware/types.py at line 731.
Analyze Your Own Codebase
Get architecture documentation, dependency graphs, and domain analysis for your codebase in minutes.
Try Supermodel Free