75 lines
2.5 KiB
TypeScript
75 lines
2.5 KiB
TypeScript
/**
|
|
* TDD regression — auto combos must never advertise `limit.context: 0`.
|
|
*
|
|
* opencode's overflow guard (packages/opencode/src/session/overflow.ts)
|
|
* short-circuits when `model.limit.context === 0`:
|
|
*
|
|
* if (input.model.limit.context === 0) return false // never overflow
|
|
*
|
|
* so a zero context silently DISABLES opencode's smart auto-compaction for
|
|
* auto combos. The session then grows unbounded until OmniRoute's
|
|
* server-side purifyHistory() destructively drops old messages — the
|
|
* "coding agent keeps forgetting things" bug.
|
|
*
|
|
* Fix under test: mapAutoComboToStaticEntry consumes the context_length /
|
|
* max_output_tokens now served by GET /api/combos/auto, and falls back to a
|
|
* safe positive default (128000 / 8192) for older servers that do not send
|
|
* the fields yet.
|
|
*/
|
|
import test from "node:test";
|
|
import assert from "node:assert/strict";
|
|
|
|
import { mapAutoComboToStaticEntry } from "../src/index.ts";
|
|
import type { OmniRouteRawAutoCombo } from "../src/index.ts";
|
|
|
|
test("uses server-provided context_length and max_output_tokens", () => {
|
|
const raw = {
|
|
id: "auto/coding",
|
|
name: "Auto Coding",
|
|
variant: "coding",
|
|
candidateCount: 5,
|
|
context_length: 1048576,
|
|
max_output_tokens: 65536,
|
|
} as OmniRouteRawAutoCombo;
|
|
|
|
const entry = mapAutoComboToStaticEntry(raw);
|
|
assert.equal(entry.limit?.context, 1048576);
|
|
assert.equal(entry.limit?.output, 65536);
|
|
});
|
|
|
|
test("falls back to a safe positive default when the server omits limits (old servers)", () => {
|
|
const raw = {
|
|
id: "auto",
|
|
name: "Auto",
|
|
candidateCount: 3,
|
|
} as OmniRouteRawAutoCombo;
|
|
|
|
const entry = mapAutoComboToStaticEntry(raw);
|
|
assert.ok(
|
|
typeof entry.limit?.context === "number" && entry.limit.context > 0,
|
|
`context must be a positive number (never 0 — zero disables opencode auto-compaction), got ${entry.limit?.context}`
|
|
);
|
|
assert.ok(
|
|
typeof entry.limit?.output === "number" && entry.limit.output > 0,
|
|
`output must be a positive number, got ${entry.limit?.output}`
|
|
);
|
|
});
|
|
|
|
test("ignores non-positive server values and keeps the safe fallback", () => {
|
|
const raw = {
|
|
id: "auto/fast",
|
|
name: "Auto Fast",
|
|
variant: "fast",
|
|
candidateCount: 2,
|
|
context_length: 0,
|
|
max_output_tokens: -1,
|
|
} as OmniRouteRawAutoCombo;
|
|
|
|
const entry = mapAutoComboToStaticEntry(raw);
|
|
assert.ok(
|
|
typeof entry.limit?.context === "number" && entry.limit.context > 0,
|
|
"zero/negative server values must not propagate"
|
|
);
|
|
assert.ok(typeof entry.limit?.output === "number" && entry.limit.output > 0);
|
|
});
|