Broker: co-op-wide model leaderboard endpoint for member dashboard (aggregate, anonymized)
This commit is contained in:
1 parent
778a7f8fd2
commit
69beb9c002
1 file changed
+29
+29
@@ -2245,6 +2245,35 @@ async def broker_usage(request: Request, days: int = 0):
|
|||||||
return await broker_get_usage(email, days=days)
|
return await broker_get_usage(email, days=days)
|
||||||
|
|
||||||
|
|
||||||
|
@app.get("/broker/model-leaderboard")
|
||||||
|
@limiter.limit("30/minute")
|
||||||
|
async def broker_model_leaderboard(request: Request, days: int = 0):
|
||||||
|
"""Co-op-wide model popularity for the member dashboard.
|
||||||
|
|
||||||
|
Same aggregation as the admin model-usage view (spend/tokens/requests per
|
||||||
|
model, across all members) but served through the broker so members can
|
||||||
|
see which models the co-op uses most — social guidance for model choice.
|
||||||
|
No per-member data; aggregate totals only.
|
||||||
|
"""
|
||||||
|
_verify_broker_secret(request)
|
||||||
|
if litellm_db_ready():
|
||||||
|
try:
|
||||||
|
usage = aggregate_model_usage(days=days)
|
||||||
|
except Exception as e:
|
||||||
|
logger.warning("broker leaderboard: DB path failed (%s)", e)
|
||||||
|
usage = None
|
||||||
|
if usage:
|
||||||
|
return {
|
||||||
|
"models": [
|
||||||
|
{"model": m["model"], "spend": m["spend"],
|
||||||
|
"tokens": m["tokens"], "requests": m["requests"]}
|
||||||
|
for m in usage["models"][:10]
|
||||||
|
]
|
||||||
|
}
|
||||||
|
# Fallback: empty (rare; the DB path is the norm)
|
||||||
|
return {"models": []}
|
||||||
|
|
||||||
|
|
||||||
async def reconcile_memberships() -> dict:
|
async def reconcile_memberships() -> dict:
|
||||||
"""Reconcile the portal against the live Open Collective member list.
|
"""Reconcile the portal against the live Open Collective member list.
|
||||||
|
|
||||||
|
|||||||
Reference in new issue
Block a user