TestDuplicateAndInvalidTools Class — langchain Architecture
Architecture documentation for the TestDuplicateAndInvalidTools class in test_tool_selection.py from the langchain codebase.
Entity Profile
Dependency Diagram
graph TD 35f5015e_df33_4916_06b8_dc32a7e06b79["TestDuplicateAndInvalidTools"] 18e85ff8_9a5d_f800_f722_027398dc89e7["BaseTool"] 35f5015e_df33_4916_06b8_dc32a7e06b79 -->|extends| 18e85ff8_9a5d_f800_f722_027398dc89e7 f96107c8_8757_b550_ad6f_b1dcda0da20b["test_tool_selection.py"] 35f5015e_df33_4916_06b8_dc32a7e06b79 -->|defined in| f96107c8_8757_b550_ad6f_b1dcda0da20b 31e7b88f_288b_3f1b_84af_0fa51bf0c2b7["test_duplicate_tool_selection_deduplicated()"] 35f5015e_df33_4916_06b8_dc32a7e06b79 -->|method| 31e7b88f_288b_3f1b_84af_0fa51bf0c2b7 930426e2_7d66_b5c1_f4fd_e0acab02d9de["test_max_tools_with_duplicates()"] 35f5015e_df33_4916_06b8_dc32a7e06b79 -->|method| 930426e2_7d66_b5c1_f4fd_e0acab02d9de
Relationship Graph
Source Code
libs/langchain_v1/tests/unit_tests/agents/middleware/implementations/test_tool_selection.py lines 513–632
class TestDuplicateAndInvalidTools:
"""Test handling of duplicate and invalid tool selections."""
def test_duplicate_tool_selection_deduplicated(self) -> None:
"""Test that duplicate tool selections are deduplicated."""
model_requests = []
@wrap_model_call
def trace_model_requests(
request: ModelRequest, handler: Callable[[ModelRequest], ModelResponse]
) -> ModelResponse:
model_requests.append(request)
return handler(request)
# Selector returns duplicates
tool_selection_model = FakeModel(
messages=cycle(
[
AIMessage(
content="",
tool_calls=[
{
"name": "ToolSelectionResponse",
"id": "1",
"args": {
"tools": [
"get_weather",
"get_weather",
"search_web",
"search_web",
]
},
}
],
),
]
)
)
model = FakeModel(messages=iter([AIMessage(content="Done")]))
tool_selector = LLMToolSelectorMiddleware(max_tools=5, model=tool_selection_model)
agent = create_agent(
model=model,
tools=[get_weather, search_web, calculate],
middleware=[tool_selector, trace_model_requests],
)
agent.invoke({"messages": [HumanMessage("test")]})
# Duplicates should be removed
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 tool_names == ["get_weather", "search_web"]
assert len(tool_names) == 2
def test_max_tools_with_duplicates(self) -> None:
"""Test that max_tools works correctly with duplicate selections."""
model_requests: list[ModelRequest] = []
@wrap_model_call
def trace_model_requests(
request: ModelRequest, handler: Callable[[ModelRequest], ModelResponse]
) -> ModelResponse:
model_requests.append(request)
return handler(request)
# Selector returns duplicates but max_tools=2
tool_selection_model = FakeModel(
messages=cycle(
[
AIMessage(
content="",
tool_calls=[
{
"name": "ToolSelectionResponse",
Defined In
Extends
Source
Frequently Asked Questions
What is the TestDuplicateAndInvalidTools class?
TestDuplicateAndInvalidTools is a class in the langchain codebase, defined in libs/langchain_v1/tests/unit_tests/agents/middleware/implementations/test_tool_selection.py.
Where is TestDuplicateAndInvalidTools defined?
TestDuplicateAndInvalidTools is defined in libs/langchain_v1/tests/unit_tests/agents/middleware/implementations/test_tool_selection.py at line 513.
What does TestDuplicateAndInvalidTools extend?
TestDuplicateAndInvalidTools extends BaseTool.
Analyze Your Own Codebase
Get architecture documentation, dependency graphs, and domain analysis for your codebase in minutes.
Try Supermodel Free