Home / Class/ TestAlwaysInclude Class — langchain Architecture

TestAlwaysInclude Class — langchain Architecture

Architecture documentation for the TestAlwaysInclude class in test_tool_selection.py from the langchain codebase.

Entity Profile

Dependency Diagram

graph TD
  ee17f352_671b_7645_71f1_b7942fb8e4d0["TestAlwaysInclude"]
  18e85ff8_9a5d_f800_f722_027398dc89e7["BaseTool"]
  ee17f352_671b_7645_71f1_b7942fb8e4d0 -->|extends| 18e85ff8_9a5d_f800_f722_027398dc89e7
  f96107c8_8757_b550_ad6f_b1dcda0da20b["test_tool_selection.py"]
  ee17f352_671b_7645_71f1_b7942fb8e4d0 -->|defined in| f96107c8_8757_b550_ad6f_b1dcda0da20b
  5c760ec7_1408_6a23_d909_a355873179cf["test_always_include_tools_present()"]
  ee17f352_671b_7645_71f1_b7942fb8e4d0 -->|method| 5c760ec7_1408_6a23_d909_a355873179cf
  3796c5a1_df9c_31be_045e_7ac76025f521["test_always_include_not_counted_against_max()"]
  ee17f352_671b_7645_71f1_b7942fb8e4d0 -->|method| 3796c5a1_df9c_31be_045e_7ac76025f521
  3e8f3180_67ac_422b_2053_0866098572e6["test_multiple_always_include_tools()"]
  ee17f352_671b_7645_71f1_b7942fb8e4d0 -->|method| 3e8f3180_67ac_422b_2053_0866098572e6

Relationship Graph

Source Code

libs/langchain_v1/tests/unit_tests/agents/middleware/implementations/test_tool_selection.py lines 337–510

class TestAlwaysInclude:
    """Test always_include functionality."""

    def test_always_include_tools_present(self) -> None:
        """Test that always_include tools are always present in the request."""
        model_requests = []

        @wrap_model_call
        def trace_model_requests(
            request: ModelRequest, handler: Callable[[ModelRequest], ModelResponse]
        ) -> ModelResponse:
            model_requests.append(request)
            return handler(request)

        # Selector picks only search_web
        tool_selection_model = FakeModel(
            messages=cycle(
                [
                    AIMessage(
                        content="",
                        tool_calls=[
                            {
                                "name": "ToolSelectionResponse",
                                "id": "1",
                                "args": {"tools": ["search_web"]},
                            }
                        ],
                    ),
                ]
            )
        )

        model = FakeModel(messages=iter([AIMessage(content="Done")]))

        # But send_email is always included
        tool_selector = LLMToolSelectorMiddleware(
            max_tools=1, always_include=["send_email"], model=tool_selection_model
        )

        agent = create_agent(
            model=model,
            tools=[get_weather, search_web, send_email],
            middleware=[tool_selector, trace_model_requests],
        )

        agent.invoke({"messages": [HumanMessage("test")]})

        # Both selected and always_include tools should be present
        assert len(model_requests) > 0
        for request in model_requests:
            tool_names = []
            for tool_ in request.tools:
                assert isinstance(tool_, BaseTool)
                tool_names.append(tool_.name)
            assert "search_web" in tool_names
            assert "send_email" in tool_names
            assert len(tool_names) == 2

    def test_always_include_not_counted_against_max(self) -> None:
        """Test that always_include tools don't count against max_tools limit."""
        model_requests = []

        @wrap_model_call
        def trace_model_requests(
            request: ModelRequest, handler: Callable[[ModelRequest], ModelResponse]
        ) -> ModelResponse:
            model_requests.append(request)
            return handler(request)

        # Selector picks 2 tools
        tool_selection_model = FakeModel(
            messages=cycle(
                [
                    AIMessage(
                        content="",
                        tool_calls=[
                            {
                                "name": "ToolSelectionResponse",
                                "id": "1",
                                "args": {"tools": ["get_weather", "search_web"]},
                            }

Extends

Frequently Asked Questions

What is the TestAlwaysInclude class?
TestAlwaysInclude is a class in the langchain codebase, defined in libs/langchain_v1/tests/unit_tests/agents/middleware/implementations/test_tool_selection.py.
Where is TestAlwaysInclude defined?
TestAlwaysInclude is defined in libs/langchain_v1/tests/unit_tests/agents/middleware/implementations/test_tool_selection.py at line 337.
What does TestAlwaysInclude extend?
TestAlwaysInclude extends BaseTool.

Analyze Your Own Codebase

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

Try Supermodel Free