From acc672a78fc135f5fe239f7c78ef2546bfec172f Mon Sep 17 00:00:00 2001 From: Krrish Dholakia Date: Wed, 13 Mar 2024 17:04:51 -0700 Subject: [PATCH] fix(proxy_server.py): maintain support for model specific budgets --- litellm/proxy/proxy_server.py | 40 +++++++++++++++++++++++------------ 1 file changed, 27 insertions(+), 13 deletions(-) diff --git a/litellm/proxy/proxy_server.py b/litellm/proxy/proxy_server.py index e374686e0..4f291df64 100644 --- a/litellm/proxy/proxy_server.py +++ b/litellm/proxy/proxy_server.py @@ -658,23 +658,37 @@ async def user_api_key_auth( # Check 5. Token Model Spend is under Model budget max_budget_per_model = valid_token.model_max_budget - spend_per_model = valid_token.model_spend - if max_budget_per_model is not None and spend_per_model is not None: + if ( + max_budget_per_model is not None + and isinstance(max_budget_per_model, dict) + and len(max_budget_per_model) > 0 + ): current_model = request_data.get("model") - if current_model is not None: - current_model_spend = spend_per_model.get(current_model, None) - current_model_budget = max_budget_per_model.get(current_model, None) - + ## GET THE SPEND FOR THIS MODEL + twenty_eight_days_ago = datetime.now() - timedelta(days=28) + model_spend = await prisma_client.db.litellm_spendlogs.group_by( + by=["model"], + sum={"spend": True}, + where={ + "AND": [ + {"api_key": valid_token.token}, + {"startTime": {"gt": twenty_eight_days_ago}}, + {"model": current_model}, + ] + }, + ) + if len(model_spend) > 0: if ( - current_model_spend is not None - and current_model_budget is not None + model_spend[0]["model"] == model + and model_spend[0]["_sum"]["spend"] + >= max_budget_per_model["model"] ): - if current_model_spend > current_model_budget: - raise Exception( - f"ExceededModelBudget: Current spend for model: {current_model_spend}; Max Budget for Model: {current_model_budget}" - ) - + current_model_spend = model_spend[0]["_sum"]["spend"] + current_model_budget = max_budget_per_model["model"] + raise Exception( + f"ExceededModelBudget: Current spend for model: {current_model_spend}; Max Budget for Model: {current_model_budget}" + ) # Check 6. Token spend is under Team budget if ( valid_token.spend is not None