Home / Class/ TestWrapModelCallDecorator Class — langchain Architecture

TestWrapModelCallDecorator Class — langchain Architecture

Architecture documentation for the TestWrapModelCallDecorator class in test_wrap_model_call.py from the langchain codebase.

Entity Profile

Dependency Diagram

graph TD
  5db67c89_ade5_52fe_bf90_ef8d8896f7a3["TestWrapModelCallDecorator"]
  6d9956c5_7c84_9ec3_58a3_b6b89f42fd0b["AgentMiddleware"]
  5db67c89_ade5_52fe_bf90_ef8d8896f7a3 -->|extends| 6d9956c5_7c84_9ec3_58a3_b6b89f42fd0b
  edf81759_05d2_fa5d_d2a5_784f18a911cc["GenericFakeChatModel"]
  5db67c89_ade5_52fe_bf90_ef8d8896f7a3 -->|extends| edf81759_05d2_fa5d_d2a5_784f18a911cc
  3501ddcf_a91a_a4b4_cf6d_5b38492caabc["test_wrap_model_call.py"]
  5db67c89_ade5_52fe_bf90_ef8d8896f7a3 -->|defined in| 3501ddcf_a91a_a4b4_cf6d_5b38492caabc
  8931cd1a_6f7c_ac13_7690_cbda6b03f7e0["test_basic_decorator_usage()"]
  5db67c89_ade5_52fe_bf90_ef8d8896f7a3 -->|method| 8931cd1a_6f7c_ac13_7690_cbda6b03f7e0
  45b4526e_5d00_aa67_2d89_dde3f9bd7ee1["test_decorator_with_custom_name()"]
  5db67c89_ade5_52fe_bf90_ef8d8896f7a3 -->|method| 45b4526e_5d00_aa67_2d89_dde3f9bd7ee1
  f67f3dc6_fca3_47a6_9b8f_962348612284["test_decorator_retry_logic()"]
  5db67c89_ade5_52fe_bf90_ef8d8896f7a3 -->|method| f67f3dc6_fca3_47a6_9b8f_962348612284
  febc2cce_3cbc_f6f6_b5a3_0f32e7b4ae83["test_decorator_response_rewriting()"]
  5db67c89_ade5_52fe_bf90_ef8d8896f7a3 -->|method| febc2cce_3cbc_f6f6_b5a3_0f32e7b4ae83
  047d3c1b_9109_7a7e_f5f3_285c9512865a["test_decorator_error_handling()"]
  5db67c89_ade5_52fe_bf90_ef8d8896f7a3 -->|method| 047d3c1b_9109_7a7e_f5f3_285c9512865a
  7a2dbbb8_a86b_235c_0025_163cb9ae5845["test_decorator_with_state_access()"]
  5db67c89_ade5_52fe_bf90_ef8d8896f7a3 -->|method| 7a2dbbb8_a86b_235c_0025_163cb9ae5845
  4751852f_8fed_dd59_07c5_5e3b31b02f67["test_multiple_decorated_middleware()"]
  5db67c89_ade5_52fe_bf90_ef8d8896f7a3 -->|method| 4751852f_8fed_dd59_07c5_5e3b31b02f67
  d382878b_2a39_7079_5d9e_ca8d3895b296["test_decorator_with_custom_state_schema()"]
  5db67c89_ade5_52fe_bf90_ef8d8896f7a3 -->|method| d382878b_2a39_7079_5d9e_ca8d3895b296
  bb0a29f7_2f7c_3f66_f9b8_ae6996aca040["test_decorator_with_tools_parameter()"]
  5db67c89_ade5_52fe_bf90_ef8d8896f7a3 -->|method| bb0a29f7_2f7c_3f66_f9b8_ae6996aca040
  f3d387cb_3bb3_7434_f102_ae78ac60d721["test_decorator_parentheses_optional()"]
  5db67c89_ade5_52fe_bf90_ef8d8896f7a3 -->|method| f3d387cb_3bb3_7434_f102_ae78ac60d721
  ca1521ab_735a_0008_a24e_101ec5a03c5f["test_decorator_preserves_function_name()"]
  5db67c89_ade5_52fe_bf90_ef8d8896f7a3 -->|method| ca1521ab_735a_0008_a24e_101ec5a03c5f

Relationship Graph

Source Code

libs/langchain_v1/tests/unit_tests/agents/middleware/core/test_wrap_model_call.py lines 1005–1376

class TestWrapModelCallDecorator:
    """Test the @wrap_model_call decorator for creating middleware."""

    def test_basic_decorator_usage(self) -> None:
        """Test basic decorator usage without parameters."""

        @wrap_model_call
        def passthrough_middleware(
            request: ModelRequest,
            handler: Callable[[ModelRequest], ModelResponse],
        ) -> ModelCallResult:
            return handler(request)

        # Should return an AgentMiddleware instance
        assert isinstance(passthrough_middleware, AgentMiddleware)

        # Should work in agent
        model = GenericFakeChatModel(messages=iter([AIMessage(content="Hello")]))
        agent = create_agent(model=model, middleware=[passthrough_middleware])

        result = agent.invoke({"messages": [HumanMessage("Hi")]})
        assert len(result["messages"]) == 2
        assert result["messages"][1].content == "Hello"

    def test_decorator_with_custom_name(self) -> None:
        """Test decorator with custom middleware name."""

        @wrap_model_call(name="CustomMiddleware")
        def my_middleware(
            request: ModelRequest,
            handler: Callable[[ModelRequest], ModelResponse],
        ) -> ModelCallResult:
            return handler(request)

        assert isinstance(my_middleware, AgentMiddleware)
        assert my_middleware.__class__.__name__ == "CustomMiddleware"

    def test_decorator_retry_logic(self) -> None:
        """Test decorator for implementing retry logic."""
        call_count = {"value": 0}

        class FailOnceThenSucceed(GenericFakeChatModel):
            @override
            def _generate(
                self,
                messages: list[BaseMessage],
                stop: list[str] | None = None,
                run_manager: CallbackManagerForLLMRun | None = None,
                **kwargs: Any,
            ) -> ChatResult:
                call_count["value"] += 1
                if call_count["value"] == 1:
                    msg = "First call fails"
                    raise ValueError(msg)
                return super()._generate(messages, **kwargs)

        @wrap_model_call
        def retry_once(
            request: ModelRequest,
            handler: Callable[[ModelRequest], ModelResponse],
        ) -> ModelCallResult:
            try:
                return handler(request)
            except Exception:
                # Retry once
                return handler(request)

        model = FailOnceThenSucceed(messages=iter([AIMessage(content="Success")]))
        agent = create_agent(model=model, middleware=[retry_once])

        result = agent.invoke({"messages": [HumanMessage("Test")]})

        assert call_count["value"] == 2
        assert result["messages"][1].content == "Success"

    def test_decorator_response_rewriting(self) -> None:
        """Test decorator for rewriting responses."""

        @wrap_model_call
        def uppercase_responses(
            request: ModelRequest,

Frequently Asked Questions

What is the TestWrapModelCallDecorator class?
TestWrapModelCallDecorator is a class in the langchain codebase, defined in libs/langchain_v1/tests/unit_tests/agents/middleware/core/test_wrap_model_call.py.
Where is TestWrapModelCallDecorator defined?
TestWrapModelCallDecorator is defined in libs/langchain_v1/tests/unit_tests/agents/middleware/core/test_wrap_model_call.py at line 1005.
What does TestWrapModelCallDecorator extend?
TestWrapModelCallDecorator extends AgentMiddleware, GenericFakeChatModel.

Analyze Your Own Codebase

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

Try Supermodel Free