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,
Source
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