Run key budget alert check before max-budget enforcement

_virtual_key_max_budget_check raises BudgetExceededError when spend
crosses max_budget, which meant the 100% threshold in the multi-threshold
email config never got a chance to fire — the request that pushes spend
over 100% was rejected before the alert check ran. Reorder so the alert
check runs first; enforcement still raises right after.
This commit is contained in:
Ryan Crabbe 2026-04-17 17:32:39 -07:00
parent 779a9fab8e
commit ea509ec6b9
No known key found for this signature in database

View file

@ -1373,7 +1373,16 @@ async def _user_api_key_auth_builder( # noqa: PLR0915
if not skip_budget_checks:
with tracer.trace("litellm.proxy.auth.budget_checks"):
# Check 4. Token Spend is under budget
# Check 4. Max Budget Alert Check (runs before budget enforcement
# so multi-threshold 100% alerts fire on the request that crosses
# max_budget, before BudgetExceededError is raised below)
await _virtual_key_max_budget_alert_check(
valid_token=valid_token,
proxy_logging_obj=proxy_logging_obj,
user_obj=user_obj,
)
# Check 5. Token Spend is under budget
if RouteChecks.is_llm_api_route(route=route):
await _virtual_key_max_budget_check(
valid_token=valid_token,
@ -1381,13 +1390,6 @@ async def _user_api_key_auth_builder( # noqa: PLR0915
user_obj=user_obj,
)
# Check 5. Max Budget Alert Check
await _virtual_key_max_budget_alert_check(
valid_token=valid_token,
proxy_logging_obj=proxy_logging_obj,
user_obj=user_obj,
)
# Check 6. Soft Budget Check
await _virtual_key_soft_budget_check(
valid_token=valid_token,