MultipleDynamicToolsMiddleware Class — langchain Architecture
Architecture documentation for the MultipleDynamicToolsMiddleware class in test_dynamic_tools.py from the langchain codebase.
Entity Profile
Dependency Diagram
graph TD c310c442_3221_81bd_b756_9ed477f53ca8["MultipleDynamicToolsMiddleware"] 949c7cf4_56fe_f3b4_cd89_9631a7e9cb1e["AgentMiddleware"] c310c442_3221_81bd_b756_9ed477f53ca8 -->|extends| 949c7cf4_56fe_f3b4_cd89_9631a7e9cb1e ed3bf1bf_abaf_832a_a548_adfcdbed05b3["test_dynamic_tools.py"] c310c442_3221_81bd_b756_9ed477f53ca8 -->|defined in| ed3bf1bf_abaf_832a_a548_adfcdbed05b3 86397ab0_aaf1_a31a_eced_6c15058ce22b["wrap_model_call()"] c310c442_3221_81bd_b756_9ed477f53ca8 -->|method| 86397ab0_aaf1_a31a_eced_6c15058ce22b ad06e6fb_c3a1_a346_e41e_0e0b0cf6aa37["awrap_model_call()"] c310c442_3221_81bd_b756_9ed477f53ca8 -->|method| ad06e6fb_c3a1_a346_e41e_0e0b0cf6aa37 9764bb1c_a788_be3d_4231_84ae858344e3["_handle_tool()"] c310c442_3221_81bd_b756_9ed477f53ca8 -->|method| 9764bb1c_a788_be3d_4231_84ae858344e3 f226e306_9a63_e254_49cc_cc9aa8840bf1["wrap_tool_call()"] c310c442_3221_81bd_b756_9ed477f53ca8 -->|method| f226e306_9a63_e254_49cc_cc9aa8840bf1 402fb484_ccef_17bf_7538_0bdd1700e6ab["awrap_tool_call()"] c310c442_3221_81bd_b756_9ed477f53ca8 -->|method| 402fb484_ccef_17bf_7538_0bdd1700e6ab
Relationship Graph
Source Code
libs/langchain_v1/tests/unit_tests/agents/middleware/core/test_dynamic_tools.py lines 89–131
class MultipleDynamicToolsMiddleware(AgentMiddleware):
"""Middleware that dynamically adds multiple tools (sync and async)."""
def wrap_model_call(
self,
request: ModelRequest,
handler: Callable[[ModelRequest], ModelResponse],
) -> ModelCallResult:
updated = request.override(tools=[*request.tools, dynamic_tool, another_dynamic_tool])
return handler(updated)
async def awrap_model_call(
self,
request: ModelRequest,
handler: Callable[[ModelRequest], Awaitable[ModelResponse]],
) -> ModelCallResult:
updated = request.override(tools=[*request.tools, dynamic_tool, another_dynamic_tool])
return await handler(updated)
def _handle_tool(self, request: ToolCallRequest) -> ToolCallRequest | None:
"""Return updated request if this is a dynamic tool, else None."""
tool_name = request.tool_call["name"]
if tool_name == "dynamic_tool":
return request.override(tool=dynamic_tool)
if tool_name == "another_dynamic_tool":
return request.override(tool=another_dynamic_tool)
return None
def wrap_tool_call(
self,
request: ToolCallRequest,
handler: Callable[[ToolCallRequest], ToolMessage | Command[Any]],
) -> ToolMessage | Command[Any]:
updated = self._handle_tool(request)
return handler(updated or request)
async def awrap_tool_call(
self,
request: ToolCallRequest,
handler: Callable[[ToolCallRequest], Awaitable[ToolMessage | Command[Any]]],
) -> ToolMessage | Command[Any]:
updated = self._handle_tool(request)
return await handler(updated or request)
Extends
Source
Frequently Asked Questions
What is the MultipleDynamicToolsMiddleware class?
MultipleDynamicToolsMiddleware is a class in the langchain codebase, defined in libs/langchain_v1/tests/unit_tests/agents/middleware/core/test_dynamic_tools.py.
Where is MultipleDynamicToolsMiddleware defined?
MultipleDynamicToolsMiddleware is defined in libs/langchain_v1/tests/unit_tests/agents/middleware/core/test_dynamic_tools.py at line 89.
What does MultipleDynamicToolsMiddleware extend?
MultipleDynamicToolsMiddleware extends AgentMiddleware.
Analyze Your Own Codebase
Get architecture documentation, dependency graphs, and domain analysis for your codebase in minutes.
Try Supermodel Free