Home / Class/ MultipleDynamicToolsMiddleware Class — langchain Architecture

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

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