From aa40bc34f584b7369dd098f823b2439a87b5f38f Mon Sep 17 00:00:00 2001 From: diegosouzapw Date: Sat, 2 May 2026 12:57:37 -0300 Subject: [PATCH] feat(compression): expose rule intensities and track usd savings Add estimated USD savings to compression analytics so saved tokens can be reported in cost terms alongside existing token metrics. Expose caveman rule intensity metadata for settings consumers and add a settings API route alias for rule lookup. Also preserve system prompts when aggressive compression falls back to lite mode. --- open-sse/handlers/chatCore.ts | 18 +++++++++++++---- open-sse/services/compression/aggressive.ts | 5 ++++- open-sse/services/compression/cavemanRules.ts | 4 ++++ .../components/CompressionSettingsTab.tsx | 3 ++- .../api/settings/compression/rules/route.ts | 1 + tests/unit/compression/caveman-v379.test.ts | 9 ++++++++- .../compression-aggressive.test.ts | 20 +++++++++++++++++++ .../compression/compressionAnalytics.test.ts | 17 ++++++++++++++++ 8 files changed, 70 insertions(+), 7 deletions(-) create mode 100644 src/app/api/settings/compression/rules/route.ts diff --git a/open-sse/handlers/chatCore.ts b/open-sse/handlers/chatCore.ts index 2f1773bcb4..9759e1e967 100644 --- a/open-sse/handlers/chatCore.ts +++ b/open-sse/handlers/chatCore.ts @@ -1689,6 +1689,18 @@ export async function handleChatCore({ try { const { insertCompressionAnalyticsRow } = await import("../../src/lib/db/compressionAnalytics.ts"); + const { calculateCost } = await import("../../src/lib/usage/costCalculator.ts"); + const tokensSaved = Math.max( + 0, + result.stats.originalTokens - result.stats.compressedTokens + ); + const estimatedUsdSaved = await calculateCost( + provider ?? "", + effectiveModel ?? "", + { + input: tokensSaved, + } + ); insertCompressionAnalyticsRow({ timestamp: new Date().toISOString(), combo_id: comboName ?? null, @@ -1696,12 +1708,10 @@ export async function handleChatCore({ mode, original_tokens: result.stats.originalTokens, compressed_tokens: result.stats.compressedTokens, - tokens_saved: Math.max( - 0, - result.stats.originalTokens - result.stats.compressedTokens - ), + tokens_saved: tokensSaved, duration_ms: result.stats.durationMs ?? null, request_id: skillRequestId, + estimated_usd_saved: estimatedUsdSaved || null, validation_fallback: result.stats.fallbackApplied ? 1 : 0, output_mode: cavemanOutputModeApplied ? cavemanOutputModeIntensity : null, }); diff --git a/open-sse/services/compression/aggressive.ts b/open-sse/services/compression/aggressive.ts index 83c1acb86c..a1edf3536a 100644 --- a/open-sse/services/compression/aggressive.ts +++ b/open-sse/services/compression/aggressive.ts @@ -144,7 +144,10 @@ export function compressAggressive( } try { - const liteResult = applyLiteCompression({ messages: currentMessages }); + const liteResult = applyLiteCompression( + { messages: currentMessages }, + { preserveSystemPrompt: cfg.preserveSystemPrompt !== false } + ); if (liteResult?.compressed && liteResult.stats) { const liteSavings = liteResult.stats.savingsPercent ?? 0; if (liteSavings > resultStats.savingsPercent) { diff --git a/open-sse/services/compression/cavemanRules.ts b/open-sse/services/compression/cavemanRules.ts index 7050372ef3..906f64fc28 100644 --- a/open-sse/services/compression/cavemanRules.ts +++ b/open-sse/services/compression/cavemanRules.ts @@ -406,11 +406,15 @@ export function getRuleByName(name: string): CavemanRule | undefined { } export function getCavemanRuleMetadata() { + const intensities = ["lite", "full", "ultra"] as const; return CAVEMAN_RULES.map((rule) => ({ name: rule.name, context: rule.context, category: rule.category ?? "terse", minIntensity: rule.minIntensity ?? "lite", + intensities: intensities.filter( + (intensity) => INTENSITY_RANK[intensity] >= INTENSITY_RANK[rule.minIntensity ?? "lite"] + ), description: rule.description ?? rule.name.replace(/_/g, " "), })); } diff --git a/src/app/(dashboard)/dashboard/settings/components/CompressionSettingsTab.tsx b/src/app/(dashboard)/dashboard/settings/components/CompressionSettingsTab.tsx index c072e37acf..7d363e817f 100644 --- a/src/app/(dashboard)/dashboard/settings/components/CompressionSettingsTab.tsx +++ b/src/app/(dashboard)/dashboard/settings/components/CompressionSettingsTab.tsx @@ -70,6 +70,7 @@ interface RuleMetadata { category: string; context: string; minIntensity: CavemanIntensity; + intensities?: CavemanIntensity[]; description: string; } @@ -498,7 +499,7 @@ export default function CompressionSettingsTab() {