Broker usage: expose all_time_spend (member's lifetime total from SpendLogs) in both DB and HTTP paths

This commit is contained in:
inference-bot committed 2026-10-01 16:07:10 -06:00
1 parent 7af02f6466
commit 070c6525cd
1 file changed
+21
+21
View File
@@ -2152,6 +2152,22 @@ async def broker_get_usage(email: str, days: int = 0) -> dict:
spend = float(team["spend"] or 0.0) spend = float(team["spend"] or 0.0)
reset_at = team["budget_reset_at"] reset_at = team["budget_reset_at"]
usage = aggregate_model_usage(days=days, team_id=team_id) usage = aggregate_model_usage(days=days, team_id=team_id)
# All-time spend for this member: total of their spend-log rows
# (the team `spend` counter resets with their allowance period).
all_time_spend = 0.0
try:
conn = _pg_connect()
try:
with conn.cursor() as cur:
cur.execute(
'SELECT COALESCE(SUM(spend), 0) FROM "LiteLLM_SpendLogs" WHERE team_id = %s',
(team_id,),
)
all_time_spend = float(cur.fetchone()[0] or 0.0)
finally:
conn.close()
except Exception as e:
logger.warning("broker_get_usage: all-time spend query failed: %s", e)
model_list = [ model_list = [
{"model": m["model"], "spend": m["spend"], "tokens": m["tokens"], {"model": m["model"], "spend": m["spend"], "tokens": m["tokens"],
"calls": m["requests"]} "calls": m["requests"]}
@@ -2163,6 +2179,7 @@ async def broker_get_usage(email: str, days: int = 0) -> dict:
"allowance": allowance, "allowance": allowance,
"credits": credits, "credits": credits,
"spend": spend, "spend": spend,
"all_time_spend": round(all_time_spend, 2),
"remaining": max(balance - spend, 0.0), "remaining": max(balance - spend, 0.0),
"total_tokens": usage["totals"]["total_tokens"], "total_tokens": usage["totals"]["total_tokens"],
"reset_at": reset_at, "reset_at": reset_at,
@@ -2219,6 +2236,9 @@ async def broker_get_usage(email: str, days: int = 0) -> dict:
except Exception as e: # spend logs are best-effort; don't fail the whole view except Exception as e: # spend logs are best-effort; don't fail the whole view
logger.warning("spend/logs fetch failed: %s", e) logger.warning("spend/logs fetch failed: %s", e)
# All-time spend from the same log rows (team counter is period-only).
all_time_spend = round(sum(m["spend"] for m in models.values()), 2)
# Sort models by spend descending (which models are draining the most). # Sort models by spend descending (which models are draining the most).
model_list = [ model_list = [
{"model": name, **stats} {"model": name, **stats}
@@ -2231,6 +2251,7 @@ async def broker_get_usage(email: str, days: int = 0) -> dict:
"allowance": allowance, "allowance": allowance,
"credits": credits, "credits": credits,
"spend": spend, "spend": spend,
"all_time_spend": all_time_spend,
"remaining": max(balance - spend, 0.0), "remaining": max(balance - spend, 0.0),
"total_tokens": total_tokens, "total_tokens": total_tokens,
"reset_at": reset_at, "reset_at": reset_at,