mirror of
https://github.com/BerriAI/litellm.git
synced 2025-04-25 10:44:24 +00:00
* fix(edit_budget_modal.tsx): call `/budget/update` endpoint instead of `/budget/new` allows updating existing budget on ui * fix(user_api_key_auth.py): support cost tracking for end user via jwt field * fix(presidio.py): support pii masking on sync logging callbacks enables masking before logging to langfuse * feat(utils.py): support retry policy logic inside '.completion()' Fixes https://github.com/BerriAI/litellm/issues/6623 * fix(utils.py): support retry by retry policy on async logic as well * fix(handle_jwt.py): set leeway default leeway value * test: fix test to handle jwt audience claim
71 lines
2.2 KiB
Python
71 lines
2.2 KiB
Python
"""
|
|
Get num retries for an exception.
|
|
|
|
- Account for retry policy by exception type.
|
|
"""
|
|
|
|
from typing import Dict, Optional, Union
|
|
|
|
from litellm.exceptions import (
|
|
AuthenticationError,
|
|
BadRequestError,
|
|
ContentPolicyViolationError,
|
|
RateLimitError,
|
|
Timeout,
|
|
)
|
|
from litellm.types.router import RetryPolicy
|
|
|
|
|
|
def get_num_retries_from_retry_policy(
|
|
exception: Exception,
|
|
retry_policy: Optional[Union[RetryPolicy, dict]] = None,
|
|
model_group: Optional[str] = None,
|
|
model_group_retry_policy: Optional[Dict[str, RetryPolicy]] = None,
|
|
):
|
|
"""
|
|
BadRequestErrorRetries: Optional[int] = None
|
|
AuthenticationErrorRetries: Optional[int] = None
|
|
TimeoutErrorRetries: Optional[int] = None
|
|
RateLimitErrorRetries: Optional[int] = None
|
|
ContentPolicyViolationErrorRetries: Optional[int] = None
|
|
"""
|
|
# if we can find the exception then in the retry policy -> return the number of retries
|
|
|
|
if (
|
|
model_group_retry_policy is not None
|
|
and model_group is not None
|
|
and model_group in model_group_retry_policy
|
|
):
|
|
retry_policy = model_group_retry_policy.get(model_group, None) # type: ignore
|
|
|
|
if retry_policy is None:
|
|
return None
|
|
if isinstance(retry_policy, dict):
|
|
retry_policy = RetryPolicy(**retry_policy)
|
|
|
|
if (
|
|
isinstance(exception, BadRequestError)
|
|
and retry_policy.BadRequestErrorRetries is not None
|
|
):
|
|
return retry_policy.BadRequestErrorRetries
|
|
if (
|
|
isinstance(exception, AuthenticationError)
|
|
and retry_policy.AuthenticationErrorRetries is not None
|
|
):
|
|
return retry_policy.AuthenticationErrorRetries
|
|
if isinstance(exception, Timeout) and retry_policy.TimeoutErrorRetries is not None:
|
|
return retry_policy.TimeoutErrorRetries
|
|
if (
|
|
isinstance(exception, RateLimitError)
|
|
and retry_policy.RateLimitErrorRetries is not None
|
|
):
|
|
return retry_policy.RateLimitErrorRetries
|
|
if (
|
|
isinstance(exception, ContentPolicyViolationError)
|
|
and retry_policy.ContentPolicyViolationErrorRetries is not None
|
|
):
|
|
return retry_policy.ContentPolicyViolationErrorRetries
|
|
|
|
|
|
def reset_retry_policy() -> RetryPolicy:
|
|
return RetryPolicy()
|