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
Source
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