From: Stefan Gasser Date: Wed, 21 Jan 2026 06:56:56 +0000 (+0100) Subject: Add source tracking to dashboard X-Git-Url: http://git.99rst.org/?a=commitdiff_plain;h=76421db9799af1431dc070931db5698fbbf8d22c;p=sgasser-llm-shield.git Add source tracking to dashboard - Add API requests counter to stats section - Add Source column to logs table with badges - API badge (amber) for /api/mask requests - PROXY badge (gray) for OpenAI/Anthropic proxy requests - Backward compatible: existing logs show as PROXY --- diff --git a/src/services/logger.ts b/src/services/logger.ts index 4637a03..bd1a952 100644 --- a/src/services/logger.ts +++ b/src/services/logger.ts @@ -34,6 +34,7 @@ export interface Stats { pii_percentage: number; openai_requests: number; local_requests: number; + api_requests: number; avg_scan_time_ms: number; total_tokens: number; requests_last_hour: number; @@ -169,13 +170,16 @@ export class Logger { .prepare(`SELECT COUNT(*) as count FROM request_logs WHERE pii_detected = 1`) .get() as { count: number }; - // Upstream vs Local + // Upstream vs Local vs API const openaiResult = this.db .prepare(`SELECT COUNT(*) as count FROM request_logs WHERE provider = 'openai'`) .get() as { count: number }; const localResult = this.db .prepare(`SELECT COUNT(*) as count FROM request_logs WHERE provider = 'local'`) .get() as { count: number }; + const apiResult = this.db + .prepare(`SELECT COUNT(*) as count FROM request_logs WHERE provider = 'api'`) + .get() as { count: number }; // Average scan time const scanTimeResult = this.db @@ -208,6 +212,7 @@ export class Logger { pii_percentage: total > 0 ? Math.round((pii / total) * 100 * 10) / 10 : 0, openai_requests: openaiResult.count, local_requests: localResult.count, + api_requests: apiResult.count, avg_scan_time_ms: Math.round(scanTimeResult.avg || 0), total_tokens: tokensResult.total, requests_last_hour: hourResult.count, diff --git a/src/views/dashboard/page.tsx b/src/views/dashboard/page.tsx index 1cb16bc..963434f 100644 --- a/src/views/dashboard/page.tsx +++ b/src/views/dashboard/page.tsx @@ -244,7 +244,7 @@ const Header: FC = () => ( const StatsGrid: FC = () => (
( valueId="pii-requests" accent="accent" /> + ( Time + + Source + Status @@ -402,7 +406,7 @@ const LogsSection: FC = () => ( - +
@@ -439,6 +443,7 @@ async function fetchStats() { } document.getElementById('total-requests').textContent = data.total_requests.toLocaleString(); + document.getElementById('api-requests').textContent = data.api_requests.toLocaleString(); document.getElementById('avg-scan').textContent = data.avg_scan_time_ms + 'ms'; document.getElementById('requests-hour').textContent = data.requests_last_hour.toLocaleString(); @@ -561,7 +566,7 @@ async function fetchLogs() { const tbody = document.getElementById('logs-body'); if (data.logs.length === 0) { - tbody.innerHTML = '
📋
No requests yet
'; + tbody.innerHTML = '
📋
No requests yet
'; return; } @@ -587,12 +592,17 @@ async function fetchLogs() { ? '' + log.status_code + '' : 'OK'; + const sourceBadge = log.provider === 'api' + ? 'API' + : 'PROXY'; + const mainRow = '' + '' + '▶' + '' + time + '' + '' + + '' + sourceBadge + '' + '' + statusBadge + '' + '' + '' + - '' + + '' + '
' + detailContent + '
' + '' + '';