Dashboard: current vs all-time labels; leaderboard = last 30 days with total spend (not sub-cent cost/request)
This commit is contained in:
1 parent
4be4dc4d03
commit
7539516c4e
1 file changed
+9
-10
+9
-10
@@ -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('');
|
||||||
|
|||||||
Reference in new issue
Block a user