test_tool_call_limit.py — langchain Source File
Architecture documentation for test_tool_call_limit.py, a python file in the langchain codebase. 7 imports, 0 dependents.
Entity Profile
Dependency Diagram
graph LR a75b8390_08d3_7137_c8a7_9d78fc0c4517["test_tool_call_limit.py"] f69d6389_263d_68a4_7fbf_f14c0602a9ba["pytest"] a75b8390_08d3_7137_c8a7_9d78fc0c4517 --> f69d6389_263d_68a4_7fbf_f14c0602a9ba 9444498b_8066_55c7_b3a2_1d90c4162a32["langchain_core.messages"] a75b8390_08d3_7137_c8a7_9d78fc0c4517 --> 9444498b_8066_55c7_b3a2_1d90c4162a32 121262a1_0bd6_d637_bce3_307ab6b3ecd4["langchain_core.tools"] a75b8390_08d3_7137_c8a7_9d78fc0c4517 --> 121262a1_0bd6_d637_bce3_307ab6b3ecd4 2ff5ef5d_5050_1ab2_e4f2_f72e391945a2["langgraph.checkpoint.memory"] a75b8390_08d3_7137_c8a7_9d78fc0c4517 --> 2ff5ef5d_5050_1ab2_e4f2_f72e391945a2 998e41c8_6a3e_eb9b_699f_db967a1242f7["langchain.agents.factory"] a75b8390_08d3_7137_c8a7_9d78fc0c4517 --> 998e41c8_6a3e_eb9b_699f_db967a1242f7 43521798_d28e_39b9_6c75_ed97b7f2edfb["langchain.agents.middleware.tool_call_limit"] a75b8390_08d3_7137_c8a7_9d78fc0c4517 --> 43521798_d28e_39b9_6c75_ed97b7f2edfb 069947d2_727b_035a_0691_c12203e2f5a6["tests.unit_tests.agents.model"] a75b8390_08d3_7137_c8a7_9d78fc0c4517 --> 069947d2_727b_035a_0691_c12203e2f5a6 style a75b8390_08d3_7137_c8a7_9d78fc0c4517 fill:#6366f1,stroke:#818cf8,color:#fff
Relationship Graph
Source Code
"""Unit tests for ToolCallLimitMiddleware."""
import pytest
from langchain_core.messages import AIMessage, HumanMessage, ToolCall, ToolMessage
from langchain_core.tools import tool
from langgraph.checkpoint.memory import InMemorySaver
from langchain.agents.factory import create_agent
from langchain.agents.middleware.tool_call_limit import (
ToolCallLimitExceededError,
ToolCallLimitMiddleware,
ToolCallLimitState,
)
from tests.unit_tests.agents.model import FakeToolCallingModel
def test_middleware_initialization_validation() -> None:
"""Test that middleware initialization validates parameters correctly."""
# Test that at least one limit must be specified
with pytest.raises(ValueError, match="At least one limit must be specified"):
ToolCallLimitMiddleware()
# Test valid initialization with both limits
middleware = ToolCallLimitMiddleware(thread_limit=5, run_limit=3)
assert middleware.thread_limit == 5
assert middleware.run_limit == 3
assert middleware.exit_behavior == "continue"
assert middleware.tool_name is None
# Test with tool name
middleware = ToolCallLimitMiddleware(tool_name="search", thread_limit=5)
assert middleware.tool_name == "search"
assert middleware.thread_limit == 5
assert middleware.run_limit is None
# Test exit behaviors
for behavior in ["error", "end", "continue"]:
middleware = ToolCallLimitMiddleware(thread_limit=5, exit_behavior=behavior)
assert middleware.exit_behavior == behavior
# Test invalid exit behavior
with pytest.raises(ValueError, match="Invalid exit_behavior"):
ToolCallLimitMiddleware(thread_limit=5, exit_behavior="invalid") # type: ignore[arg-type]
# Test run_limit exceeding thread_limit
with pytest.raises(
ValueError,
match=r"run_limit .* cannot exceed thread_limit",
):
ToolCallLimitMiddleware(thread_limit=3, run_limit=5)
# Test run_limit equal to thread_limit (should be valid)
middleware = ToolCallLimitMiddleware(thread_limit=5, run_limit=5)
assert middleware.thread_limit == 5
assert middleware.run_limit == 5
# Test run_limit less than thread_limit (should be valid)
middleware = ToolCallLimitMiddleware(thread_limit=5, run_limit=3)
assert middleware.thread_limit == 5
assert middleware.run_limit == 3
// ... (758 more lines)
Domain
Subdomains
Functions
- test_end_behavior_creates_artificial_messages()
- test_exception_error_messages()
- test_exit_behavior_continue()
- test_limit_reached_but_not_exceeded()
- test_middleware_end_behavior_with_unrelated_parallel_tool_calls()
- test_middleware_error_behavior()
- test_middleware_initialization_validation()
- test_middleware_name_property()
- test_middleware_unit_functionality()
- test_middleware_with_specific_tool()
- test_multiple_middleware_instances()
- test_parallel_mixed_tool_calls_with_specific_tool_limit()
- test_parallel_tool_calls_with_limit_continue_mode()
- test_parallel_tool_calls_with_limit_end_mode()
- test_run_limit_with_multiple_human_messages()
- test_thread_count_excludes_blocked_run_calls()
- test_unified_error_messages()
Dependencies
- langchain.agents.factory
- langchain.agents.middleware.tool_call_limit
- langchain_core.messages
- langchain_core.tools
- langgraph.checkpoint.memory
- pytest
- tests.unit_tests.agents.model
Source
Frequently Asked Questions
What does test_tool_call_limit.py do?
test_tool_call_limit.py is a source file in the langchain codebase, written in python. It belongs to the LangChainCore domain, MessageInterface subdomain.
What functions are defined in test_tool_call_limit.py?
test_tool_call_limit.py defines 17 function(s): test_end_behavior_creates_artificial_messages, test_exception_error_messages, test_exit_behavior_continue, test_limit_reached_but_not_exceeded, test_middleware_end_behavior_with_unrelated_parallel_tool_calls, test_middleware_error_behavior, test_middleware_initialization_validation, test_middleware_name_property, test_middleware_unit_functionality, test_middleware_with_specific_tool, and 7 more.
What does test_tool_call_limit.py depend on?
test_tool_call_limit.py imports 7 module(s): langchain.agents.factory, langchain.agents.middleware.tool_call_limit, langchain_core.messages, langchain_core.tools, langgraph.checkpoint.memory, pytest, tests.unit_tests.agents.model.
Where is test_tool_call_limit.py in the architecture?
test_tool_call_limit.py is located at libs/langchain_v1/tests/unit_tests/agents/middleware/implementations/test_tool_call_limit.py (domain: LangChainCore, subdomain: MessageInterface, directory: libs/langchain_v1/tests/unit_tests/agents/middleware/implementations).
Analyze Your Own Codebase
Get architecture documentation, dependency graphs, and domain analysis for your codebase in minutes.
Try Supermodel Free