diff --git a/packages/opencode/src/session/overflow.ts b/packages/opencode/src/session/overflow.ts index 3374d1c9f8d4..18154f94fddd 100644 --- a/packages/opencode/src/session/overflow.ts +++ b/packages/opencode/src/session/overflow.ts @@ -5,15 +5,11 @@ import type { Provider } from "@/provider/provider" import { ProviderTransform } from "@/provider/transform" import type { MessageV2 } from "./message-v2" -const COMPACTION_BUFFER = 20_000 - export function usable(input: { cfg: ConfigV1.Info; model: Provider.Model; outputTokenMax?: number }) { const context = input.model.limit.context if (context === 0) return 0 - const reserved = - input.cfg.compaction?.reserved ?? - Math.min(COMPACTION_BUFFER, ProviderTransform.maxOutputTokens(input.model, input.outputTokenMax)) + const reserved = input.cfg.compaction?.reserved ?? ProviderTransform.maxOutputTokens(input.model, input.outputTokenMax) return input.model.limit.input ? Math.max(0, input.model.limit.input - reserved) : Math.max(0, context - ProviderTransform.maxOutputTokens(input.model, input.outputTokenMax)) diff --git a/packages/opencode/test/session/compaction.test.ts b/packages/opencode/test/session/compaction.test.ts index 63276bfe197d..45711f6fe684 100644 --- a/packages/opencode/test/session/compaction.test.ts +++ b/packages/opencode/test/session/compaction.test.ts @@ -534,6 +534,19 @@ describe("session.compaction.isOverflow", () => { ), ) + it.live( + "reserves the full output budget for models with input caps", + provideTmpdirInstance(() => + Effect.gen(function* () { + const compact = yield* SessionCompaction.Service + const model = createModel({ context: 200_000, input: 200_000, output: 32_000 }) + const tokens = { input: 170_000, output: 4_000, reasoning: 0, cache: { read: 1_000, write: 0 } } + + expect(yield* compact.isOverflow({ tokens, model })).toBe(true) + }), + ), + ) + it.live( "returns false when model context limit is 0", provideTmpdirInstance(() =>