mirror of
https://github.com/diegosouzapw/OmniRoute.git
synced 2026-07-31 20:32:20 +03:00
113 lines
3.5 KiB
TypeScript
113 lines
3.5 KiB
TypeScript
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()] : [];
|
|
|
|
// Global aggregates
|
|
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: {} };
|
|
}
|
|
|
|
// Per-provider aggregates
|
|
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,
|
|
};
|
|
}
|