TestRetryLogic Class — langchain Architecture
Architecture documentation for the TestRetryLogic class in test_wrap_model_call.py from the langchain codebase.
Entity Profile
Dependency Diagram
graph TD 1c3bae87_d793_bb0b_1a39_594b67feb9d4["TestRetryLogic"] 0f829642_e361_67a1_cbca_f82839bbbd31["GenericFakeChatModel"] 1c3bae87_d793_bb0b_1a39_594b67feb9d4 -->|extends| 0f829642_e361_67a1_cbca_f82839bbbd31 949c7cf4_56fe_f3b4_cd89_9631a7e9cb1e["AgentMiddleware"] 1c3bae87_d793_bb0b_1a39_594b67feb9d4 -->|extends| 949c7cf4_56fe_f3b4_cd89_9631a7e9cb1e 48aa29b8_65e7_522f_a445_a441eeb6baff["BaseChatModel"] 1c3bae87_d793_bb0b_1a39_594b67feb9d4 -->|extends| 48aa29b8_65e7_522f_a445_a441eeb6baff 573473e5_eb93_a7d7_84ba_c975071c09af["test_wrap_model_call.py"] 1c3bae87_d793_bb0b_1a39_594b67feb9d4 -->|defined in| 573473e5_eb93_a7d7_84ba_c975071c09af ae450ab7_5748_619d_f94d_1695b7403730["test_simple_retry_on_error()"] 1c3bae87_d793_bb0b_1a39_594b67feb9d4 -->|method| ae450ab7_5748_619d_f94d_1695b7403730 eedf4bc6_5e98_0645_1eaf_5284b71916c9["test_max_retries()"] 1c3bae87_d793_bb0b_1a39_594b67feb9d4 -->|method| eedf4bc6_5e98_0645_1eaf_5284b71916c9 853e8053_a1bc_555e_641b_7290843523a6["test_no_retry_propagates_error()"] 1c3bae87_d793_bb0b_1a39_594b67feb9d4 -->|method| 853e8053_a1bc_555e_641b_7290843523a6 52bf1393_d286_3c4e_02bb_ad254af71470["test_max_attempts_limit()"] 1c3bae87_d793_bb0b_1a39_594b67feb9d4 -->|method| 52bf1393_d286_3c4e_02bb_ad254af71470
Relationship Graph
Source Code
libs/langchain_v1/tests/unit_tests/agents/middleware/core/test_wrap_model_call.py lines 106–293
class TestRetryLogic:
"""Test retry logic with wrap_model_call."""
def test_simple_retry_on_error(self) -> None:
"""Test middleware that retries once on error."""
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)
class RetryOnceMiddleware(AgentMiddleware):
def __init__(self) -> None:
super().__init__()
self.retry_count = 0
def wrap_model_call(
self,
request: ModelRequest,
handler: Callable[[ModelRequest], ModelResponse],
) -> ModelCallResult:
try:
return handler(request)
except Exception:
self.retry_count += 1
return handler(request)
retry_middleware = RetryOnceMiddleware()
model = FailOnceThenSucceed(messages=iter([AIMessage(content="Success")]))
agent = create_agent(model=model, middleware=[retry_middleware])
result = agent.invoke({"messages": [HumanMessage("Test")]})
assert retry_middleware.retry_count == 1
assert result["messages"][1].content == "Success"
def test_max_retries(self) -> None:
"""Test middleware with maximum retry limit."""
class AlwaysFailModel(GenericFakeChatModel):
@override
def _generate(
self,
messages: list[BaseMessage],
stop: list[str] | None = None,
run_manager: CallbackManagerForLLMRun | None = None,
**kwargs: Any,
) -> ChatResult:
msg = "Always fails"
raise ValueError(msg)
class MaxRetriesMiddleware(AgentMiddleware):
def __init__(self, max_retries: int = 3):
super().__init__()
self.max_retries = max_retries
self.attempts = []
def wrap_model_call(
self,
request: ModelRequest,
handler: Callable[[ModelRequest], ModelResponse],
) -> ModelCallResult:
last_exception = None
for attempt in range(self.max_retries):
self.attempts.append(attempt + 1)
try:
return handler(request)
except Exception as e:
last_exception = e
continue
Source
Frequently Asked Questions
What is the TestRetryLogic class?
TestRetryLogic 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 TestRetryLogic defined?
TestRetryLogic is defined in libs/langchain_v1/tests/unit_tests/agents/middleware/core/test_wrap_model_call.py at line 106.
What does TestRetryLogic extend?
TestRetryLogic extends GenericFakeChatModel, AgentMiddleware, BaseChatModel.
Analyze Your Own Codebase
Get architecture documentation, dependency graphs, and domain analysis for your codebase in minutes.
Try Supermodel Free