Overview: expose all_time_spend per member + total_all_time_spend (SpendLogs aggregate)

This commit is contained in:
inference-bot committed 2026-09-30 22:22:17 -06:00
1 parent e00da486b5
commit 6f0c728513
1 file changed
+29 -1
+29 -1
View File
@@ -1883,12 +1883,38 @@ async def admin_overview(request: Request):
except Exception as e: except Exception as e:
logger.warning("admin overview: team/list failed: %s", e) logger.warning("admin overview: team/list failed: %s", e)
# All-time spend per member team, from SpendLogs (the team `spend` counter
# is cycle-only and resets at each member's budget_reset_at — the panel
# needs both to avoid the "month change wiped the numbers" confusion).
all_time_spend: dict[str, float] = {}
try:
conn = _pg_connect()
try:
with conn.cursor() as cur:
cur.execute(
"""
SELECT t.team_alias, COALESCE(SUM(s.spend), 0)
FROM "LiteLLM_TeamTable" t
LEFT JOIN "LiteLLM_SpendLogs" s ON s."team_id" = t.team_id
WHERE t.team_alias LIKE 'member:%'
GROUP BY 1
"""
)
all_time_spend = {alias: float(v or 0) for alias, v in cur.fetchall()}
finally:
conn.close()
except Exception as e:
logger.warning("admin overview: all-time spend query failed: %s", e)
members = [] members = []
total_spend = 0.0 total_spend = 0.0
total_all_time = 0.0
for email, active, balance, user_id in rows: for email, active, balance, user_id in rows:
team = teams.get(f"member:{email}", {}) team = teams.get(f"member:{email}", {})
spend = float(team.get("spend") or 0.0) spend = float(team.get("spend") or 0.0)
total_spend += spend total_spend += spend
member_all_time = all_time_spend.get(f"member:{email}", 0.0)
total_all_time += member_all_time
credits = get_credit_balance(email) credits = get_credit_balance(email)
eff = compute_max_budget( eff = compute_max_budget(
float(balance) if balance is not None else MEMBER_BUDGET, float(balance) if balance is not None else MEMBER_BUDGET,
@@ -1898,6 +1924,7 @@ async def admin_overview(request: Request):
members.append( members.append(
{ {
"email": email, "email": email,
"all_time_spend": round(member_all_time, 2),
"username": usernames.get(user_id), "username": usernames.get(user_id),
"activated": invite_accepted.get(user_id, False), "activated": invite_accepted.get(user_id, False),
"active": bool(active), "active": bool(active),
@@ -1918,7 +1945,8 @@ async def admin_overview(request: Request):
"totals": { "totals": {
"members": len(members), "members": len(members),
"active": sum(1 for m in members if m["active"]), "active": sum(1 for m in members if m["active"]),
"total_spend": total_spend, "total_spend": round(total_spend, 2),
"total_all_time_spend": round(total_all_time, 2),
}, },
} }