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() {