/** * KHAELOR * File: tests/context/budget.test.ts * Description: ContextBudget tests — real-usage accounting, thresholds, config-driven windows. * * Author: Simon-Pierre Boucher * Contact: contact@spboucher.ai */ import { describe, expect, it } from "vitest"; import { ContextBudget, DEFAULT_CONTEXT_WINDOW, resolveContextWindow, } from "../../src/context/index.js"; describe("resolveContextWindow", () => { it("falls back to the default window when nothing is configured", () => { expect(resolveContextWindow("any-model")).toBe(DEFAULT_CONTEXT_WINDOW); }); it("uses a configured default window", () => { expect(resolveContextWindow("any-model", { defaultWindow: 500_000 })).toBe(500_000); }); it("prefers an exact per-model override from config", () => { const config = { defaultWindow: 200_000, byModel: { "big-model": 1_000_000 } }; expect(resolveContextWindow("big-model", config)).toBe(1_000_000); expect(resolveContextWindow("other-model", config)).toBe(200_000); }); it("ignores invalid overrides", () => { expect(resolveContextWindow("m", { byModel: { m: -5 }, defaultWindow: 0 })).toBe( DEFAULT_CONTEXT_WINDOW, ); }); }); describe("ContextBudget", () => { const budget = () => new ContextBudget({ model: "m", reservedOutputTokens: 1_000, contextWindow: { defaultWindow: 10_000 }, compactionBufferTokens: 1_000, pruneThresholdRatio: 0.5, }); it("computes usableWindow = window − reservedOutput − compactionBuffer", () => { expect(budget().usableWindow).toBe(8_000); }); it("starts with no observed usage and zero pressure", () => { const b = budget(); expect(b.hasObservedUsage).toBe(false); expect(b.lastTotalTokens).toBe(0); expect(b.pressure()).toBe(0); expect(b.level()).toBe("ok"); }); it("records real usage including cache reads and writes", () => { const b = budget(); b.onUsage({ inputTokens: 1_000, outputTokens: 500, cacheReadTokens: 6_000, cacheWriteTokens: 1_000 }); expect(b.lastTotalTokens).toBe(8_500); expect(b.hasObservedUsage).toBe(true); }); it("levels: ok → prune → compact as fake usage crosses thresholds", () => { const b = budget(); b.onUsage({ inputTokens: 3_000, outputTokens: 0, cacheReadTokens: 0, cacheWriteTokens: 0 }); expect(b.level()).toBe("ok"); expect(b.shouldCompact()).toBe(false); b.onUsage({ inputTokens: 4_500, outputTokens: 0, cacheReadTokens: 0, cacheWriteTokens: 0 }); expect(b.level()).toBe("prune"); // ≥ 50% of 8000 expect(b.shouldCompact()).toBe(false); b.onUsage({ inputTokens: 8_000, outputTokens: 100, cacheReadTokens: 0, cacheWriteTokens: 0 }); expect(b.level()).toBe("compact"); expect(b.shouldCompact()).toBe(true); expect(b.pressure()).toBeGreaterThanOrEqual(1); }); it("tracks only the LAST turn's usage (context footprint, not a running sum)", () => { const b = budget(); b.onUsage({ inputTokens: 7_900, outputTokens: 200, cacheReadTokens: 0, cacheWriteTokens: 0 }); expect(b.level()).toBe("compact"); b.onUsage({ inputTokens: 100, outputTokens: 10, cacheReadTokens: 0, cacheWriteTokens: 0 }); expect(b.level()).toBe("ok"); }); });