Home / Class/ TestAgentHooksCombined Class — langchain Architecture

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:

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