TestAgentHooksCombined Class — langchain Architecture
Architecture documentation for the TestAgentHooksCombined class in test_framework.py from the langchain codebase.
Entity Profile
Dependency Diagram
graph TD 7756726f_6234_5476_ab8e_0716a0d87ec6["TestAgentHooksCombined"] 8310d669_2524_e019_e333_8473b50a4990["test_framework.py"] 7756726f_6234_5476_ab8e_0716a0d87ec6 -->|defined in| 8310d669_2524_e019_e333_8473b50a4990 44443e17_7efb_5273_2b9a_9df0ee61dd62["test_execution_order()"] 7756726f_6234_5476_ab8e_0716a0d87ec6 -->|method| 44443e17_7efb_5273_2b9a_9df0ee61dd62 06b106f1_6ab1_200e_f08c_ec2f46bbea62["test_state_passthrough()"] 7756726f_6234_5476_ab8e_0716a0d87ec6 -->|method| 06b106f1_6ab1_200e_f08c_ec2f46bbea62 93a67dd5_fd91_9116_1998_00b79f1f04f9["test_multiple_middleware_instances()"] 7756726f_6234_5476_ab8e_0716a0d87ec6 -->|method| 93a67dd5_fd91_9116_1998_00b79f1f04f9 f9cd3634_d4af_0a56_9d92_0c457772b3a1["test_agent_hooks_run_once_with_multiple_model_calls()"] 7756726f_6234_5476_ab8e_0716a0d87ec6 -->|method| f9cd3634_d4af_0a56_9d92_0c457772b3a1
Relationship Graph
Source Code
libs/langchain_v1/tests/unit_tests/agents/middleware/core/test_framework.py lines 878–1041
class TestAgentHooksCombined:
"""Test before_agent and after_agent hooks working together."""
@pytest.mark.parametrize("is_async", [False, True])
async def test_execution_order(self, *, is_async: bool) -> None:
"""Test that before_agent executes before after_agent in both sync and async modes."""
execution_log: list[str] = []
if is_async:
@before_agent
async def log_before(*_args: Any, **_kwargs: Any) -> None:
execution_log.append("before")
@after_agent
async def log_after(*_args: Any, **_kwargs: Any) -> None:
execution_log.append("after")
else:
@before_agent
def log_before(*_args: Any, **_kwargs: Any) -> None:
execution_log.append("before")
@after_agent
def log_after(*_args: Any, **_kwargs: Any) -> None:
execution_log.append("after")
model = GenericFakeChatModel(messages=iter([AIMessage(content="Response")]))
agent = create_agent(model=model, tools=[], middleware=[log_before, log_after])
if is_async:
await agent.ainvoke({"messages": [HumanMessage("Test")]})
else:
agent.invoke({"messages": [HumanMessage("Test")]})
assert execution_log == ["before", "after"]
def test_state_passthrough(self) -> None:
"""Test that state modifications in before_agent are visible to after_agent."""
@before_agent
def modify_in_before(*_args: Any, **_kwargs: Any) -> dict[str, Any]:
return {"messages": [HumanMessage("Added by before_agent")]}
model = GenericFakeChatModel(messages=iter([AIMessage(content="Response")]))
agent = create_agent(model=model, tools=[], middleware=[modify_in_before])
result = agent.invoke({"messages": [HumanMessage("Original")]})
message_contents = [msg.content for msg in result["messages"]]
assert message_contents[1] == "Added by before_agent"
def test_multiple_middleware_instances(self) -> None:
"""Test multiple before_agent and after_agent middleware instances."""
execution_log = []
@before_agent
def before_one(*_args: Any, **_kwargs: Any) -> None:
execution_log.append("before_1")
@before_agent
def before_two(*_args: Any, **_kwargs: Any) -> None:
execution_log.append("before_2")
@after_agent
def after_one(*_args: Any, **_kwargs: Any) -> None:
execution_log.append("after_1")
@after_agent
def after_two(*_args: Any, **_kwargs: Any) -> None:
execution_log.append("after_2")
model = GenericFakeChatModel(messages=iter([AIMessage(content="Response")]))
agent = create_agent(
model=model, tools=[], middleware=[before_one, before_two, after_one, after_two]
)
agent.invoke({"messages": [HumanMessage("Test")]})
assert execution_log == ["before_1", "before_2", "after_2", "after_1"]
def test_agent_hooks_run_once_with_multiple_model_calls(self) -> None:
Source
Frequently Asked Questions
What is the TestAgentHooksCombined class?
TestAgentHooksCombined is a class in the langchain codebase, defined in libs/langchain_v1/tests/unit_tests/agents/middleware/core/test_framework.py.
Where is TestAgentHooksCombined defined?
TestAgentHooksCombined is defined in libs/langchain_v1/tests/unit_tests/agents/middleware/core/test_framework.py at line 878.
Analyze Your Own Codebase
Get architecture documentation, dependency graphs, and domain analysis for your codebase in minutes.
Try Supermodel Free