fix: use real usage tracking in usage page
This commit is contained in:
@@ -597,6 +597,28 @@ function initAgentsPage() {
|
|||||||
|
|
||||||
// ============ USAGE ============
|
// ============ USAGE ============
|
||||||
async function loadUsage() {
|
async function loadUsage() {
|
||||||
|
// Try real usage first, fallback to tracked usage
|
||||||
|
try {
|
||||||
|
const realRes = await fetch("/api/usage/real");
|
||||||
|
if (realRes.ok) {
|
||||||
|
const realData = await realRes.json();
|
||||||
|
usageStats = {
|
||||||
|
totalRequests: Object.values(realData.models || {}).reduce((sum, m) => sum + (m.requests || 0), 0),
|
||||||
|
totalTokens: realData.totals?.total || 0,
|
||||||
|
totalCost: realData.totals?.cost || 0,
|
||||||
|
agents: realData.agents,
|
||||||
|
models: realData.models
|
||||||
|
};
|
||||||
|
renderUsageStats();
|
||||||
|
if (typeof renderRealUsageCharts === 'function') {
|
||||||
|
renderRealUsageCharts(realData);
|
||||||
|
}
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
} catch (e) {
|
||||||
|
console.warn("Real usage not available, falling back");
|
||||||
|
}
|
||||||
|
|
||||||
const from = document.getElementById('usage-from')?.value;
|
const from = document.getElementById('usage-from')?.value;
|
||||||
const to = document.getElementById('usage-to')?.value;
|
const to = document.getElementById('usage-to')?.value;
|
||||||
|
|
||||||
@@ -621,7 +643,47 @@ async function loadUsage() {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
function renderUsageStats() {
|
function renderRealUsageCharts(data) {
|
||||||
|
if (typeof Chart === 'undefined') return;
|
||||||
|
|
||||||
|
// Agent chart
|
||||||
|
const agentCanvas = document.getElementById('chart-agent');
|
||||||
|
if (agentCanvas && data.agents) {
|
||||||
|
const agents = Object.entries(data.agents)
|
||||||
|
.filter(([_, v]) => v.total > 0)
|
||||||
|
.sort((a, b) => b[1].total - a[1].total)
|
||||||
|
.slice(0, 10);
|
||||||
|
|
||||||
|
new Chart(agentCanvas, {
|
||||||
|
type: 'bar',
|
||||||
|
data: {
|
||||||
|
labels: agents.map(([k]) => k),
|
||||||
|
datasets: [{
|
||||||
|
label: 'Tokens',
|
||||||
|
data: agents.map(([_, v]) => v.total),
|
||||||
|
backgroundColor: 'rgba(54, 162, 235, 0.6)'
|
||||||
|
}]
|
||||||
|
},
|
||||||
|
options: {
|
||||||
|
responsive: true,
|
||||||
|
indexAxis: 'y'
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
// Provider grid
|
||||||
|
const grid = document.getElementById('provider-grid');
|
||||||
|
if (grid && data.models) {
|
||||||
|
grid.innerHTML = Object.entries(data.models)
|
||||||
|
.map(([model, stats]) => `
|
||||||
|
<div class="provider-card">
|
||||||
|
<h4>${model}</h4>
|
||||||
|
<p>Requests: ${stats.requests || 0}</p>
|
||||||
|
<p>Tokens: ${(stats.input || 0) + (stats.output || 0)}</p>
|
||||||
|
</div>
|
||||||
|
`).join('');
|
||||||
|
}
|
||||||
|
}
|
||||||
const requestsEl = document.getElementById('stat-requests');
|
const requestsEl = document.getElementById('stat-requests');
|
||||||
const tokensEl = document.getElementById('stat-tokens');
|
const tokensEl = document.getElementById('stat-tokens');
|
||||||
const costEl = document.getElementById('stat-cost');
|
const costEl = document.getElementById('stat-cost');
|
||||||
|
|||||||
Reference in New Issue
Block a user