Home / Class/ ConditionalDynamicToolMiddleware Class — langchain Architecture

ConditionalDynamicToolMiddleware Class — langchain Architecture

Architecture documentation for the ConditionalDynamicToolMiddleware class in test_dynamic_tools.py from the langchain codebase.

Entity Profile

Dependency Diagram

graph TD
  de073c97_ee50_abbe_e9db_be6c9383a57d["ConditionalDynamicToolMiddleware"]
  949c7cf4_56fe_f3b4_cd89_9631a7e9cb1e["AgentMiddleware"]
  de073c97_ee50_abbe_e9db_be6c9383a57d -->|extends| 949c7cf4_56fe_f3b4_cd89_9631a7e9cb1e
  ed3bf1bf_abaf_832a_a548_adfcdbed05b3["test_dynamic_tools.py"]
  de073c97_ee50_abbe_e9db_be6c9383a57d -->|defined in| ed3bf1bf_abaf_832a_a548_adfcdbed05b3
  580b624c_f1c8_b0f3_bc1b_a923c5510c83["_should_add_tool()"]
  de073c97_ee50_abbe_e9db_be6c9383a57d -->|method| 580b624c_f1c8_b0f3_bc1b_a923c5510c83
  27e57f6e_279a_bc2d_2c0c_af66d9891168["wrap_model_call()"]
  de073c97_ee50_abbe_e9db_be6c9383a57d -->|method| 27e57f6e_279a_bc2d_2c0c_af66d9891168
  58e61ad0_ff9b_5db1_c2d4_c574eabfbb5a["awrap_model_call()"]
  de073c97_ee50_abbe_e9db_be6c9383a57d -->|method| 58e61ad0_ff9b_5db1_c2d4_c574eabfbb5a
  455837cc_5fda_f424_2098_8408fe296ed5["wrap_tool_call()"]
  de073c97_ee50_abbe_e9db_be6c9383a57d -->|method| 455837cc_5fda_f424_2098_8408fe296ed5
  92b87ffd_b44c_687a_8e06_7143b5495020["awrap_tool_call()"]
  de073c97_ee50_abbe_e9db_be6c9383a57d -->|method| 92b87ffd_b44c_687a_8e06_7143b5495020

Relationship Graph

Source Code

libs/langchain_v1/tests/unit_tests/agents/middleware/core/test_dynamic_tools.py lines 154–195

class ConditionalDynamicToolMiddleware(AgentMiddleware):
    """Middleware that conditionally adds a tool based on state (sync and async)."""

    def _should_add_tool(self, request: ModelRequest) -> bool:
        messages = request.state.get("messages", [])
        return messages and "calculator" in str(messages[-1].content).lower()

    def wrap_model_call(
        self,
        request: ModelRequest,
        handler: Callable[[ModelRequest], ModelResponse],
    ) -> ModelCallResult:
        if self._should_add_tool(request):
            request = request.override(tools=[*request.tools, another_dynamic_tool])
        return handler(request)

    async def awrap_model_call(
        self,
        request: ModelRequest,
        handler: Callable[[ModelRequest], Awaitable[ModelResponse]],
    ) -> ModelCallResult:
        if self._should_add_tool(request):
            request = request.override(tools=[*request.tools, another_dynamic_tool])
        return await handler(request)

    def wrap_tool_call(
        self,
        request: ToolCallRequest,
        handler: Callable[[ToolCallRequest], ToolMessage | Command[Any]],
    ) -> ToolMessage | Command[Any]:
        if request.tool_call["name"] == "another_dynamic_tool":
            return handler(request.override(tool=another_dynamic_tool))
        return handler(request)

    async def awrap_tool_call(
        self,
        request: ToolCallRequest,
        handler: Callable[[ToolCallRequest], Awaitable[ToolMessage | Command[Any]]],
    ) -> ToolMessage | Command[Any]:
        if request.tool_call["name"] == "another_dynamic_tool":
            return await handler(request.override(tool=another_dynamic_tool))
        return await handler(request)

Extends

Frequently Asked Questions

What is the ConditionalDynamicToolMiddleware class?
ConditionalDynamicToolMiddleware is a class in the langchain codebase, defined in libs/langchain_v1/tests/unit_tests/agents/middleware/core/test_dynamic_tools.py.
Where is ConditionalDynamicToolMiddleware defined?
ConditionalDynamicToolMiddleware is defined in libs/langchain_v1/tests/unit_tests/agents/middleware/core/test_dynamic_tools.py at line 154.
What does ConditionalDynamicToolMiddleware extend?
ConditionalDynamicToolMiddleware extends AgentMiddleware.

Analyze Your Own Codebase

Get architecture documentation, dependency graphs, and domain analysis for your codebase in minutes.

Try Supermodel Free