From 21a89f15dee89f36c40535214fc92227692cc431 Mon Sep 17 00:00:00 2001 From: Ishaan Jaff Date: Wed, 4 Sep 2024 17:14:49 -0700 Subject: [PATCH 1/3] show error from /spend/tags --- litellm/proxy/spend_tracking/spend_management_endpoints.py | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/litellm/proxy/spend_tracking/spend_management_endpoints.py b/litellm/proxy/spend_tracking/spend_management_endpoints.py index 9e0ef877e..7c8921c5d 100644 --- a/litellm/proxy/spend_tracking/spend_management_endpoints.py +++ b/litellm/proxy/spend_tracking/spend_management_endpoints.py @@ -1236,6 +1236,7 @@ async def global_view_spend_tags( -H "Authorization: Bearer sk-1234" ``` """ + import traceback from enterprise.utils import ui_get_spend_by_tags from litellm.proxy.proxy_server import prisma_client @@ -1262,9 +1263,11 @@ async def global_view_spend_tags( return response except Exception as e: + error_trace = traceback.format_exc() + error_str = str(e) + "\n" + error_trace if isinstance(e, HTTPException): raise ProxyException( - message=getattr(e, "detail", f"/spend/tags Error({str(e)})"), + message=getattr(e, "detail", f"/spend/tags Error({error_str})"), type="internal_error", param=getattr(e, "param", "None"), code=getattr(e, "status_code", status.HTTP_500_INTERNAL_SERVER_ERROR), @@ -1272,7 +1275,7 @@ async def global_view_spend_tags( elif isinstance(e, ProxyException): raise e raise ProxyException( - message="/spend/tags Error" + str(e), + message="/spend/tags Error" + error_str, type="internal_error", param=getattr(e, "param", "None"), code=status.HTTP_500_INTERNAL_SERVER_ERROR, From 3eb0325063f3177eca7fef19aa584aec2a1048f3 Mon Sep 17 00:00:00 2001 From: Ishaan Jaff Date: Wed, 4 Sep 2024 17:20:47 -0700 Subject: [PATCH 2/3] return error client side from spend endpoints --- .../spend_management_endpoints.py | 61 +++++++++++++------ 1 file changed, 41 insertions(+), 20 deletions(-) diff --git a/litellm/proxy/spend_tracking/spend_management_endpoints.py b/litellm/proxy/spend_tracking/spend_management_endpoints.py index 7c8921c5d..d6af6a93b 100644 --- a/litellm/proxy/spend_tracking/spend_management_endpoints.py +++ b/litellm/proxy/spend_tracking/spend_management_endpoints.py @@ -1752,32 +1752,53 @@ async def global_spend_logs( More efficient implementation of /spend/logs, by creating a view over the spend logs table. """ + import traceback + from litellm.proxy.proxy_server import prisma_client - if prisma_client is None: + try: + if prisma_client is None: + raise ProxyException( + message="Prisma Client is not initialized", + type="internal_error", + param="None", + code=status.HTTP_500_INTERNAL_SERVER_ERROR, + ) + if api_key is None: + sql_query = """SELECT * FROM "MonthlyGlobalSpend" ORDER BY "date";""" + + response = await prisma_client.db.query_raw(query=sql_query) + + return response + else: + sql_query = """ + SELECT * FROM "MonthlyGlobalSpendPerKey" + WHERE "api_key" = $1 + ORDER BY "date"; + """ + + response = await prisma_client.db.query_raw(sql_query, api_key) + + return response + + except Exception as e: + error_trace = traceback.format_exc() + error_str = str(e) + "\n" + error_trace + if isinstance(e, HTTPException): + raise ProxyException( + message=getattr(e, "detail", f"/global/spend/logs Error({error_str})"), + type="internal_error", + param=getattr(e, "param", "None"), + code=getattr(e, "status_code", status.HTTP_500_INTERNAL_SERVER_ERROR), + ) + elif isinstance(e, ProxyException): + raise e raise ProxyException( - message="Prisma Client is not initialized", + message="/global/spend/logs Error" + error_str, type="internal_error", - param="None", + param=getattr(e, "param", "None"), code=status.HTTP_500_INTERNAL_SERVER_ERROR, ) - if api_key is None: - sql_query = """SELECT * FROM "MonthlyGlobalSpend" ORDER BY "date";""" - - response = await prisma_client.db.query_raw(query=sql_query) - - return response - else: - sql_query = """ - SELECT * FROM "MonthlyGlobalSpendPerKey" - WHERE "api_key" = $1 - ORDER BY "date"; - """ - - response = await prisma_client.db.query_raw(sql_query, api_key) - - return response - return @router.get( From 172eb9b9bc12319ddc538aa61680141fd08667e6 Mon Sep 17 00:00:00 2001 From: Ishaan Jaff Date: Wed, 4 Sep 2024 17:26:34 -0700 Subject: [PATCH 3/3] return error from /global/spend endpoint --- .../spend_management_endpoints.py | 42 ++++++++++++++----- 1 file changed, 32 insertions(+), 10 deletions(-) diff --git a/litellm/proxy/spend_tracking/spend_management_endpoints.py b/litellm/proxy/spend_tracking/spend_management_endpoints.py index d6af6a93b..28db48d7f 100644 --- a/litellm/proxy/spend_tracking/spend_management_endpoints.py +++ b/litellm/proxy/spend_tracking/spend_management_endpoints.py @@ -1813,20 +1813,42 @@ async def global_spend(): View total spend across all proxy keys """ + import traceback + from litellm.proxy.proxy_server import prisma_client - total_spend = 0.0 - total_proxy_budget = 0.0 + try: - if prisma_client is None: - raise HTTPException(status_code=500, detail={"error": "No db connected"}) - sql_query = """SELECT SUM(spend) as total_spend FROM "MonthlyGlobalSpend";""" - response = await prisma_client.db.query_raw(query=sql_query) - if response is not None: - if isinstance(response, list) and len(response) > 0: - total_spend = response[0].get("total_spend", 0.0) + total_spend = 0.0 + total_proxy_budget = 0.0 - return {"spend": total_spend, "max_budget": litellm.max_budget} + if prisma_client is None: + raise HTTPException(status_code=500, detail={"error": "No db connected"}) + sql_query = """SELECT SUM(spend) as total_spend FROM "MonthlyGlobalSpend";""" + response = await prisma_client.db.query_raw(query=sql_query) + if response is not None: + if isinstance(response, list) and len(response) > 0: + total_spend = response[0].get("total_spend", 0.0) + + return {"spend": total_spend, "max_budget": litellm.max_budget} + except Exception as e: + error_trace = traceback.format_exc() + error_str = str(e) + "\n" + error_trace + if isinstance(e, HTTPException): + raise ProxyException( + message=getattr(e, "detail", f"/global/spend Error({error_str})"), + type="internal_error", + param=getattr(e, "param", "None"), + code=getattr(e, "status_code", status.HTTP_500_INTERNAL_SERVER_ERROR), + ) + elif isinstance(e, ProxyException): + raise e + raise ProxyException( + message="/global/spend Error" + error_str, + type="internal_error", + param=getattr(e, "param", "None"), + code=status.HTTP_500_INTERNAL_SERVER_ERROR, + ) @router.get(