mirror of
https://github.com/BerriAI/litellm.git
synced 2026-09-17 23:51:30 +00:00
num_retries_per_request has always capped the retries of one request with its fallback hops included. #40930 started reading the per-hop attempted_retries counter instead, and every fallback hop restarts that counter at zero, so a request could spend a fresh retry budget on each hop and the legacy fallback cap test started seeing the hop run. Router.log_retry now also keeps request_retry_count on the request metadata, incremented on every retry and fallback hop and never truncated the way previous_models is, and max_retries_per_request_hit reads that count. The flat retry records, the litellm_metadata coverage and caps above four from #40930 stay as they are, and the legacy test goes back to its previous_models == 0 assertion.
33 lines
1.1 KiB
Python
33 lines
1.1 KiB
Python
from typing import Final
|
|
|
|
import pytest
|
|
|
|
import litellm
|
|
from litellm.rust_bridge.lifecycle import check_limits
|
|
|
|
|
|
@pytest.mark.parametrize("metadata_key", ["metadata", "litellm_metadata"])
|
|
@pytest.mark.parametrize(
|
|
"cap, request_retry_count, refused",
|
|
[(5, 5, True), (5, 4, False), (0, 0, False), (0, 1, True)],
|
|
ids=[
|
|
"cap-above-four-reached",
|
|
"cap-above-four-not-reached",
|
|
"first-attempt-passes-cap-of-zero",
|
|
"cap-of-zero-refuses-first-retry",
|
|
],
|
|
)
|
|
def test_check_limits_reads_request_retry_count(
|
|
monkeypatch: pytest.MonkeyPatch, metadata_key: str, cap: int, request_retry_count: int, refused: bool
|
|
) -> None:
|
|
monkeypatch.setattr(litellm, "num_retries_per_request", cap)
|
|
monkeypatch.setattr(litellm, "max_budget", None)
|
|
kwargs: Final = {
|
|
"model": "mistral/mistral-ocr-latest",
|
|
metadata_key: {"request_retry_count": request_retry_count},
|
|
}
|
|
if refused:
|
|
with pytest.raises(RuntimeError, match="Max retries per request hit!"):
|
|
check_limits(kwargs)
|
|
else:
|
|
check_limits(kwargs)
|