From 3d70ad414ef9568c80f59e8f656fc8a0ddaa1459 Mon Sep 17 00:00:00 2001 From: Randi <55005611+rdself@users.noreply.github.com> Date: Fri, 1 May 2026 07:36:15 -0400 Subject: [PATCH] Hide combo compression controls when disabled (#1840) Integrated into release/v3.7.8 --- open-sse/handlers/chatCore.ts | 35 ++++- src/app/(dashboard)/dashboard/combos/page.tsx | 49 ++++--- .../chatcore-compression-integration.test.ts | 122 ++++++++++++++++++ .../unit/compression/strategySelector.test.ts | 11 ++ 4 files changed, 199 insertions(+), 18 deletions(-) diff --git a/open-sse/handlers/chatCore.ts b/open-sse/handlers/chatCore.ts index ea09957f63..bbac5a2ae5 100644 --- a/open-sse/handlers/chatCore.ts +++ b/open-sse/handlers/chatCore.ts @@ -136,6 +136,7 @@ import { isFallbackDecision, EMERGENCY_FALLBACK_CONFIG, } from "../services/emergencyFallback.ts"; +import type { CompressionConfig } from "../services/compression/types.ts"; import { prepareWebSearchFallbackBody } from "../services/webSearchFallback.ts"; import { resolveExplicitStreamAlias, @@ -1561,15 +1562,37 @@ export async function handleChatCore({ body?.messages || body?.input || body?.contents || body?.request?.contents || []; if (body && Array.isArray(allMessages) && allMessages.length > 0) { let estimatedTokens = estimateTokens(JSON.stringify(allMessages)); + let promptCompressionEnabled = false; + let compressionSettings: CompressionConfig | null = null; + + try { + const { getCompressionSettings } = await import("../../src/lib/db/compression.ts"); + compressionSettings = await getCompressionSettings(); + promptCompressionEnabled = compressionSettings.enabled; + } catch (err) { + log?.warn?.( + "COMPRESSION", + "Compression settings lookup skipped: " + (err instanceof Error ? err.message : String(err)) + ); + } // --- Modular Compression Pipeline (Phase 1 Lite + Phase 2 Standard/Caveman + Phase 3 Aggressive) --- // Runs BEFORE the existing reactive compressContext() to proactively reduce tokens. try { - const { getCompressionSettings } = await import("../../src/lib/db/compression.ts"); const { selectCompressionStrategy, applyCompression } = await import("../services/compression/strategySelector.ts"); const { trackCompressionStats } = await import("../services/compression/stats.ts"); - let config = await getCompressionSettings(); + let config: CompressionConfig = compressionSettings ?? { + enabled: false, + defaultMode: "off", + autoTriggerTokens: 0, + cacheMinutes: 5, + preserveSystemPrompt: true, + comboOverrides: {}, + }; + if (!promptCompressionEnabled || !compressionSettings) { + log?.debug?.("COMPRESSION", "Prompt compression disabled or unavailable"); + } let compressionComboKey = comboName ?? null; if (isCombo && comboName) { try { @@ -1704,6 +1727,12 @@ export async function handleChatCore({ } // --- End Modular Compression Pipeline --- + if (!promptCompressionEnabled) { + log?.debug?.( + "CONTEXT", + "Skipping proactive context compression: Prompt Compression disabled" + ); + } let contextLimit = getTokenLimit(provider, effectiveModel); if (isCombo && comboName) { @@ -1748,7 +1777,7 @@ export async function handleChatCore({ `Checking compression: ${estimatedTokens} tokens vs ${threshold} threshold (${contextLimit} limit, ${reservedTokens} reserved)` ); - if (estimatedTokens > threshold) { + if (promptCompressionEnabled && estimatedTokens > threshold) { log?.info?.( "CONTEXT", `Proactive compression triggered: ${estimatedTokens} tokens > ${threshold} threshold (${contextLimit} limit)` diff --git a/src/app/(dashboard)/dashboard/combos/page.tsx b/src/app/(dashboard)/dashboard/combos/page.tsx index d992b9f916..58c8b3ebca 100644 --- a/src/app/(dashboard)/dashboard/combos/page.tsx +++ b/src/app/(dashboard)/dashboard/combos/page.tsx @@ -606,6 +606,7 @@ export default function CombosPage() { const [comboDragOverIndex, setComboDragOverIndex] = useState(null); const [savingComboOrder, setSavingComboOrder] = useState(false); const [comboConfigMode, setComboConfigMode] = useState("guided"); + const [promptCompressionEnabled, setPromptCompressionEnabled] = useState(false); const [selectedIntelligentComboId, setSelectedIntelligentComboId] = useState(null); const comboDragIndexRef = useRef(null); const activeFilter = normalizeIntelligentRoutingFilter(searchParams.get("filter")); @@ -650,6 +651,10 @@ export default function CombosPage() { .then((r) => (r.ok ? r.json() : null)) .then((settings) => setComboConfigMode(normalizeComboConfigMode(settings?.comboConfigMode))) .catch(() => setComboConfigMode("guided")); + fetch("/api/settings/compression") + .then((r) => (r.ok ? r.json() : null)) + .then((settings) => setPromptCompressionEnabled(settings?.enabled === true)) + .catch(() => setPromptCompressionEnabled(false)); fetch("/api/settings/proxy") .then((r) => (r.ok ? r.json() : null)) .then((c) => setProxyConfig(c)) @@ -1128,6 +1133,7 @@ export default function CombosPage() { s.emailsVisible); const strategyDescription = getStrategyDescription(t, strategy); - const initialCompressionMode = combo?.config?.compressionMode || combo.compressionOverride || ""; + const hasRuntimeConfig = combo?.config && typeof combo.config === "object"; + const initialCompressionMode = + typeof combo?.config?.compressionMode === "string" + ? combo.config.compressionMode + : hasRuntimeConfig + ? "" + : combo.compressionOverride || ""; const [compressionOverride, setCompressionOverride] = useState(initialCompressionMode); const [isSavingCompression, setIsSavingCompression] = useState(false); + useEffect(() => { + setCompressionOverride(initialCompressionMode); + }, [initialCompressionMode]); + const handleCompressionOverrideChange = async (value) => { setCompressionOverride(value); setIsSavingCompression(true); @@ -1687,20 +1704,22 @@ function ComboCard({
- + {compressionEnabled && ( + + )}