feat: Token-Nutzung nach Quelle (Monitor/Globe) aufgeschluesselt

- Backend liefert usage_by_source im current-Endpoint
- Monatliche Tabelle zeigt Quelle-Badge (Monitor/Globe)
- Source-Split unter den Kosten-KPIs sichtbar

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Dieser Commit ist enthalten in:
Claude Dev
2026-03-26 20:44:20 +01:00
Ursprung 1ebb68f147
Commit 48c1892fea
3 geänderte Dateien mit 47 neuen und 7 gelöschten Zeilen

Datei anzeigen

@@ -7,7 +7,13 @@
<link rel="icon" type="image/svg+xml" href="/static/favicon.svg">
<link rel="apple-touch-icon" href="/static/favicon.svg">
<link rel="stylesheet" href="/static/css/style.css">
</head>
<style>
.source-badge { display:inline-block; padding:2px 8px; border-radius:4px; font-size:12px; font-weight:600; }
.badge-monitor { background:#e3f2fd; color:#1565c0; }
.badge-globe { background:#e8f5e9; color:#2e7d32; }
</style>
</head>
<body>
<!-- Header -->
<header class="app-header">
@@ -188,6 +194,7 @@
<div class="token-stat-value" id="tokenCostUsd">-</div>
</div>
</div>
<div id="tokenSourceSplit" style="margin-top:12px;font-size:14px;"></div>
<div class="token-budget-bar-section">
<div class="token-budget-label">
<span>Budget-Auslastung</span>
@@ -202,6 +209,7 @@
<thead>
<tr>
<th>Monat</th>
<th>Quelle</th>
<th>Refreshes</th>
<th>API-Calls</th>
<th>Input-Tokens</th>

Datei anzeigen

@@ -606,6 +606,14 @@ async function loadOrgTokenUsage(orgId) {
el('tokenBudgetUsd', budget.token_budget_usd != null ? '$' + Number(budget.token_budget_usd).toFixed(2) : '-');
el('tokenCostUsd', usage.total_cost_usd != null ? '$' + Number(usage.total_cost_usd).toFixed(2) : '-');
// Source-Split anzeigen
var bySource = current.usage_by_source || {};
var splitHtml = '';
if (bySource.monitor) splitHtml += '<span class="source-badge badge-monitor">Monitor</span> $' + Number(bySource.monitor.total_cost_usd).toFixed(2) + ' (' + bySource.monitor.api_calls + ' Calls) ';
if (bySource.globe) splitHtml += '<span class="source-badge badge-globe">Globe</span> $' + Number(bySource.globe.total_cost_usd).toFixed(2) + ' (' + bySource.globe.api_calls + ' Calls)';
var splitEl = document.getElementById('tokenSourceSplit');
if (splitEl) splitEl.innerHTML = splitHtml;
const bar = document.getElementById('tokenBudgetBar');
const percentEl = document.getElementById('tokenBudgetPercent');
const percent = budget.credits_percent_used || 0;
@@ -622,8 +630,11 @@ async function loadOrgTokenUsage(orgId) {
const tbody = document.getElementById('tokenMonthlyTable');
if (tbody) {
tbody.innerHTML = monthly.map(function(m) {
var srcLabel = (m.source || 'monitor') === 'globe' ? 'Globe' : 'Monitor';
var srcClass = (m.source || 'monitor') === 'globe' ? 'badge-globe' : 'badge-monitor';
return '<tr>' +
'<td>' + esc(m.year_month) + '</td>' +
'<td><span class="source-badge ' + srcClass + '">' + srcLabel + '</span></td>' +
'<td>' + m.refresh_count + '</td>' +
'<td>' + m.api_calls.toLocaleString('de-DE') + '</td>' +
'<td>' + m.input_tokens.toLocaleString('de-DE') + '</td>' +