| import { getDbInstance } from "./core";
|
|
|
| export interface CacheStatsEntry {
|
| provider: string;
|
| model?: string;
|
| compressionMode: string;
|
| cacheControlPresent: boolean;
|
| estimatedCacheHit: boolean;
|
| tokensSavedCompression: number;
|
| tokensSavedCaching: number;
|
| netSavings: number;
|
| }
|
|
|
| export interface CacheStatsSummary {
|
| totalRequests: number;
|
| avgNetSavings: number;
|
| cacheHitRate: number;
|
| byProvider: Record<string, { count: number; avgNetSavings: number; cacheHitRate: number }>;
|
| }
|
|
|
| export function recordCacheStats(entry: CacheStatsEntry): void {
|
| const db = getDbInstance();
|
|
|
| const sql = `INSERT INTO compression_cache_stats (
|
| provider,
|
| model,
|
| compression_mode,
|
| cache_control_present,
|
| estimated_cache_hit,
|
| tokens_saved_compression,
|
| tokens_saved_caching,
|
| net_savings
|
| ) VALUES (?, ?, ?, ?, ?, ?, ?, ?)`;
|
|
|
| db.prepare(sql).run(
|
| entry.provider,
|
| entry.model ?? "",
|
| entry.compressionMode,
|
| entry.cacheControlPresent ? 1 : 0,
|
| entry.estimatedCacheHit ? 1 : 0,
|
| entry.tokensSavedCompression,
|
| entry.tokensSavedCaching,
|
| entry.netSavings
|
| );
|
| }
|
|
|
| export function getCacheStatsSummary(since?: Date): CacheStatsSummary {
|
| const db = getDbInstance();
|
| const whereClause = since ? "WHERE created_at >= ?" : "";
|
| const params = since ? [since.toISOString()] : [];
|
|
|
|
|
| const globalRow = since
|
| ? (db
|
| .prepare(
|
| `SELECT COUNT(*) as totalRequests, AVG(net_savings) as avgNetSavings, SUM(estimated_cache_hit) * 1.0 / COUNT(*) as cacheHitRate FROM compression_cache_stats WHERE created_at >= ?`
|
| )
|
| .get(since.toISOString()) as
|
| | { totalRequests: number; avgNetSavings: number; cacheHitRate: number }
|
| | undefined)
|
| : (db
|
| .prepare(
|
| `SELECT COUNT(*) as totalRequests, AVG(net_savings) as avgNetSavings, SUM(estimated_cache_hit) * 1.0 / COUNT(*) as cacheHitRate FROM compression_cache_stats`
|
| )
|
| .get() as
|
| | { totalRequests: number; avgNetSavings: number; cacheHitRate: number }
|
| | undefined);
|
|
|
| if (!globalRow || globalRow.totalRequests === 0) {
|
| return { totalRequests: 0, avgNetSavings: 0, cacheHitRate: 0, byProvider: {} };
|
| }
|
|
|
|
|
| const providerRows = since
|
| ? (db
|
| .prepare(
|
| `SELECT provider, COUNT(*) as count, AVG(net_savings) as avgNetSavings, SUM(estimated_cache_hit) * 1.0 / COUNT(*) as cacheHitRate FROM compression_cache_stats WHERE created_at >= ? GROUP BY provider`
|
| )
|
| .all(since.toISOString()) as Array<{
|
| provider: string;
|
| count: number;
|
| avgNetSavings: number;
|
| cacheHitRate: number;
|
| }>)
|
| : (db
|
| .prepare(
|
| `SELECT provider, COUNT(*) as count, AVG(net_savings) as avgNetSavings, SUM(estimated_cache_hit) * 1.0 / COUNT(*) as cacheHitRate FROM compression_cache_stats GROUP BY provider`
|
| )
|
| .all() as Array<{
|
| provider: string;
|
| count: number;
|
| avgNetSavings: number;
|
| cacheHitRate: number;
|
| }>);
|
|
|
| const byProvider: Record<string, { count: number; avgNetSavings: number; cacheHitRate: number }> =
|
| {};
|
| for (const row of providerRows) {
|
| byProvider[row.provider] = {
|
| count: row.count,
|
| avgNetSavings: row.avgNetSavings,
|
| cacheHitRate: row.cacheHitRate,
|
| };
|
| }
|
|
|
| return {
|
| totalRequests: globalRow.totalRequests,
|
| avgNetSavings: globalRow.avgNetSavings ?? 0,
|
| cacheHitRate: globalRow.cacheHitRate ?? 0,
|
| byProvider,
|
| };
|
| }
|
|
|