Home / File/ test_dynamic_tools.py — langchain Source File

test_dynamic_tools.py — langchain Source File

Architecture documentation for test_dynamic_tools.py, a python file in the langchain codebase. 11 imports, 0 dependents.

File python CoreAbstractions RunnableInterface 11 imports 10 functions 5 classes

Entity Profile

Dependency Diagram

graph LR
  d67e9997_c33d_b023_a29b_2a9611d9b93e["test_dynamic_tools.py"]
  a327e534_84f6_5308_58ca_5727d5eda0cf["asyncio"]
  d67e9997_c33d_b023_a29b_2a9611d9b93e --> a327e534_84f6_5308_58ca_5727d5eda0cf
  cfe2bde5_180e_e3b0_df2b_55b3ebaca8e7["collections.abc"]
  d67e9997_c33d_b023_a29b_2a9611d9b93e --> cfe2bde5_180e_e3b0_df2b_55b3ebaca8e7
  8e2034b7_ceb8_963f_29fc_2ea6b50ef9b3["typing"]
  d67e9997_c33d_b023_a29b_2a9611d9b93e --> 8e2034b7_ceb8_963f_29fc_2ea6b50ef9b3
  120e2591_3e15_b895_72b6_cb26195e40a6["pytest"]
  d67e9997_c33d_b023_a29b_2a9611d9b93e --> 120e2591_3e15_b895_72b6_cb26195e40a6
  d758344f_537f_649e_f467_b9d7442e86df["langchain_core.messages"]
  d67e9997_c33d_b023_a29b_2a9611d9b93e --> d758344f_537f_649e_f467_b9d7442e86df
  43d88577_548b_2248_b01b_7987bae85dcc["langchain_core.tools"]
  d67e9997_c33d_b023_a29b_2a9611d9b93e --> 43d88577_548b_2248_b01b_7987bae85dcc
  1fe3d0c5_4963_3c08_63e9_108cefcdbab5["langgraph.checkpoint.memory"]
  d67e9997_c33d_b023_a29b_2a9611d9b93e --> 1fe3d0c5_4963_3c08_63e9_108cefcdbab5
  0e93d2ee_1fb2_3a0f_5a76_8aba32d0d4ed["langgraph.types"]
  d67e9997_c33d_b023_a29b_2a9611d9b93e --> 0e93d2ee_1fb2_3a0f_5a76_8aba32d0d4ed
  6f5e6c4b_1a3f_fd09_4697_631c27ef1033["langchain.agents.factory"]
  d67e9997_c33d_b023_a29b_2a9611d9b93e --> 6f5e6c4b_1a3f_fd09_4697_631c27ef1033
  50acc543_e5f0_2162_cf07_c2bf50723e0c["langchain.agents.middleware.types"]
  d67e9997_c33d_b023_a29b_2a9611d9b93e --> 50acc543_e5f0_2162_cf07_c2bf50723e0c
  d135b586_15fc_7b4a_47fb_a8b2bcda78a5["tests.unit_tests.agents.model"]
  d67e9997_c33d_b023_a29b_2a9611d9b93e --> d135b586_15fc_7b4a_47fb_a8b2bcda78a5
  style d67e9997_c33d_b023_a29b_2a9611d9b93e fill:#6366f1,stroke:#818cf8,color:#fff

Relationship Graph

Source Code

"""Tests for dynamic tool registration via middleware.

These tests verify that middleware can dynamically register and handle tools
that are not declared upfront when creating the agent.
"""

import asyncio
from collections.abc import Awaitable, Callable
from typing import Any

import pytest
from langchain_core.messages import HumanMessage, ToolCall, ToolMessage
from langchain_core.tools import tool
from langgraph.checkpoint.memory import InMemorySaver
from langgraph.types import Command

from langchain.agents.factory import create_agent
from langchain.agents.middleware.types import (
    AgentMiddleware,
    ModelCallResult,
    ModelRequest,
    ModelResponse,
    ToolCallRequest,
)
from tests.unit_tests.agents.model import FakeToolCallingModel


@tool
def static_tool(value: str) -> str:
    """A static tool that is always available."""
    return f"Static result: {value}"


@tool
def dynamic_tool(value: str) -> str:
    """A dynamically registered tool."""
    return f"Dynamic result: {value}"


@tool
def another_dynamic_tool(x: int, y: int) -> str:
    """Another dynamically registered tool for calculations."""
    return f"Sum: {x + y}"


# -----------------------------------------------------------------------------
# Middleware classes
# -----------------------------------------------------------------------------


class DynamicToolMiddleware(AgentMiddleware):
    """Middleware that dynamically adds and handles a tool (sync and async)."""

    def wrap_model_call(
        self,
        request: ModelRequest,
        handler: Callable[[ModelRequest], ModelResponse],
    ) -> ModelCallResult:
        updated = request.override(tools=[*request.tools, dynamic_tool])
        return handler(updated)
// ... (350 more lines)

Subdomains

Dependencies

  • asyncio
  • collections.abc
  • langchain.agents.factory
  • langchain.agents.middleware.types
  • langchain_core.messages
  • langchain_core.tools
  • langgraph.checkpoint.memory
  • langgraph.types
  • pytest
  • tests.unit_tests.agents.model
  • typing

Frequently Asked Questions

What does test_dynamic_tools.py do?
test_dynamic_tools.py is a source file in the langchain codebase, written in python. It belongs to the CoreAbstractions domain, RunnableInterface subdomain.
What functions are defined in test_dynamic_tools.py?
test_dynamic_tools.py defines 10 function(s): another_dynamic_tool, dynamic_tool, get_tool_messages, invoke_agent, static_tool, test_conditional_dynamic_tool, test_dynamic_tool_basic, test_dynamic_tool_chained_middleware, test_dynamic_tool_without_handler_raises_error, test_multiple_dynamic_tools_with_static.
What does test_dynamic_tools.py depend on?
test_dynamic_tools.py imports 11 module(s): asyncio, collections.abc, langchain.agents.factory, langchain.agents.middleware.types, langchain_core.messages, langchain_core.tools, langgraph.checkpoint.memory, langgraph.types, and 3 more.
Where is test_dynamic_tools.py in the architecture?
test_dynamic_tools.py is located at libs/langchain_v1/tests/unit_tests/agents/middleware/core/test_dynamic_tools.py (domain: CoreAbstractions, subdomain: RunnableInterface, directory: libs/langchain_v1/tests/unit_tests/agents/middleware/core).

Analyze Your Own Codebase

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

Try Supermodel Free