feat: add Reset Stats button to admin LLM tracking panel

Allows resetting the LLM stats aggregation window without deleting
historical data. Stores a reset timestamp in metadata and filters
the aggregation query to only include calls after that point.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
root
2026-03-13 01:59:24 +00:00
parent 513d35e0e5
commit b2ac0e7a00
8 changed files with 78 additions and 1 deletions
+18 -1
View File
@@ -16,6 +16,7 @@ export interface LlmStatsService {
getStats(): LlmStatsData;
isTrackingEnabled(): boolean;
setTrackingEnabled(enabled: boolean): void;
resetStats(): void;
}
export function createLlmStatsService(): LlmStatsService {
@@ -52,6 +53,12 @@ export function createLlmStatsService(): LlmStatsService {
const enabled = loadTrackingEnabled();
try {
const db = getDatabase();
const resetRow = db.prepare("SELECT value FROM metadata WHERE key = 'llm_stats_reset_after'").get() as { value: string } | undefined;
const resetAfter = resetRow?.value ?? null;
const whereClause = resetAfter ? 'WHERE timestamp > ?' : '';
const params = resetAfter ? [resetAfter] : [];
const rows = db.prepare(`
SELECT
template_name,
@@ -63,9 +70,10 @@ export function createLlmStatsService(): LlmStatsService {
SUM(CASE WHEN retries > 0 THEN 1 ELSE 0 END) as retry_count,
SUM(failed) as fail_count
FROM llm_call_log
${whereClause}
GROUP BY template_name
ORDER BY count DESC
`).all() as Array<{
`).all(...params) as Array<{
template_name: string;
count: number;
total_cost: number;
@@ -114,5 +122,14 @@ export function createLlmStatsService(): LlmStatsService {
// ignore
}
},
resetStats(): void {
try {
const db = getDatabase();
db.prepare("INSERT OR REPLACE INTO metadata (key, value) VALUES ('llm_stats_reset_after', ?)").run(new Date().toISOString());
} catch {
// ignore
}
},
};
}
+8
View File
@@ -204,6 +204,14 @@ export class SocketServer {
socket.emit('admin-llm-stats-result', stats);
});
socket.on('admin-reset-llm-stats', () => {
if (!this.authenticatedSockets.has(socket.id)) return;
this.gameLoop.llmStatsService.resetStats();
const stats = this.gameLoop.llmStatsService.getStats();
socket.emit('admin-llm-stats-result', stats);
this.gameLoop.logService.log('info', 'Game', 'Admin reset LLM stats');
});
socket.on('admin-toggle-llm-tracking', (data: { enabled: boolean }) => {
if (!this.authenticatedSockets.has(socket.id)) return;
this.gameLoop.llmStatsService.setTrackingEnabled(data.enabled);