Dashboard: current vs all-time labels; leaderboard = last 30 days with total spend (not sub-cent cost/request)

This commit is contained in:
inference-bot committed 2026-10-01 15:52:47 -06:00
1 parent 4be4dc4d03
commit 7539516c4e
1 file changed
+9 -10
+9 -10
View File
@@ -124,7 +124,7 @@ async def api_usage(request: Request):
data["keys"] = keys.get("keys", []) data["keys"] = keys.get("keys", [])
# Co-op-wide model popularity (aggregate, anonymized) for the leaderboard. # Co-op-wide model popularity (aggregate, anonymized) for the leaderboard.
try: try:
board = await broker_get(identity, "/broker/model-leaderboard") board = await broker_get(identity, "/broker/model-leaderboard?days=30")
data["coop_models"] = board.get("models", []) data["coop_models"] = board.get("models", [])
except HTTPException: except HTTPException:
data["coop_models"] = [] # best-effort; never block the main view data["coop_models"] = [] # best-effort; never block the main view
@@ -493,14 +493,14 @@ PAGE_HTML = """<!DOCTYPE html>
<div id="view-mine"> <div id="view-mine">
<div class="balance"> <div class="balance">
<span class="big" id="spend">—</span> <span class="big" id="spend">—</span>
<span class="lbl" id="of">of your balance used</span> <span class="lbl" id="of">of your current balance used</span>
</div> </div>
<div class="stats"> <div class="stats">
<div class="stat"><div class="num" id="remaining">—</div><div class="lbl">remaining</div></div> <div class="stat"><div class="num" id="remaining">—</div><div class="lbl">remaining now</div></div>
<div class="stat"><div class="num" id="allowance">—</div><div class="lbl">monthly allowance left</div></div> <div class="stat"><div class="num" id="allowance">—</div><div class="lbl">allowance left</div></div>
<div class="stat"><div class="num" id="credits">—</div><div class="lbl">credits (never expire)</div></div> <div class="stat"><div class="num" id="credits">—</div><div class="lbl">credits (never expire)</div></div>
<div class="stat"><div class="num" id="tokens">—</div><div class="lbl">tokens used</div></div> <div class="stat"><div class="num" id="tokens">—</div><div class="lbl">tokens, all time</div></div>
<div class="stat"><div class="num" id="calls">—</div><div class="lbl">requests</div></div> <div class="stat"><div class="num" id="calls">—</div><div class="lbl">requests, all time</div></div>
</div> </div>
<div class="bar"><div class="fill" id="fill" style="width:0%"></div></div> <div class="bar"><div class="fill" id="fill" style="width:0%"></div></div>
<div class="meta" id="meta">Shared across chat and API.</div> <div class="meta" id="meta">Shared across chat and API.</div>
@@ -569,7 +569,7 @@ async function load() {
const allowanceLeft = Math.max(0, allowance - spentThisCycle); const allowanceLeft = Math.max(0, allowance - spentThisCycle);
$('spend').textContent = fmtMoney(spend); $('spend').textContent = fmtMoney(spend);
$('of').textContent = 'of ' + fmtMoney(balance) + ' used'; $('of').textContent = 'of ' + fmtMoney(balance) + ' current balance used';
$('remaining').textContent = fmtMoney(remaining); $('remaining').textContent = fmtMoney(remaining);
$('allowance').textContent = fmtMoney(allowanceLeft); $('allowance').textContent = fmtMoney(allowanceLeft);
$('credits').textContent = fmtMoney(credits); $('credits').textContent = fmtMoney(credits);
@@ -633,17 +633,16 @@ function renderBoard(models) {
const top = Math.max(...rows.map(m => m.requests || 0), 1); const top = Math.max(...rows.map(m => m.requests || 0), 1);
el.innerHTML = rows.map((m, i) => { el.innerHTML = rows.map((m, i) => {
const req = m.requests || 0; const req = m.requests || 0;
const cpr = req > 0 ? (m.spend || 0) / req : 0; // cost per request
const pct = Math.round((req / top) * 100); const pct = Math.round((req / top) * 100);
return '<div class="board-row">' + return '<div class="board-row">' +
'<div class="board-rank">' + (i + 1) + '</div>' + '<div class="board-rank">' + (i + 1) + '</div>' +
'<div class="board-main">' + '<div class="board-main">' +
'<div class="board-line">' + '<div class="board-line">' +
'<div class="board-name">' + escapeHtml(m.model) + '</div>' + '<div class="board-name">' + escapeHtml(m.model) + '</div>' +
'<div class="board-cost">' + fmtMoney(cpr) + ' / request</div>' + '<div class="board-cost">' + fmtMoney(m.spend || 0) + ' total</div>' +
'</div>' + '</div>' +
'<div class="board-bar"><div class="board-fill" style="width:' + pct + '%"></div></div>' + '<div class="board-bar"><div class="board-fill" style="width:' + pct + '%"></div></div>' +
'<div class="board-sub">' + req.toLocaleString() + ' requests by members</div>' + '<div class="board-sub">' + req.toLocaleString() + ' requests by members · last 30 days</div>' +
'</div>' + '</div>' +
'</div>'; '</div>';
}).join(''); }).join('');