diff --git a/packages/snapcompact/CHANGELOG.md b/packages/snapcompact/CHANGELOG.md index b6fce27a2..f694be1d7 100644 --- a/packages/snapcompact/CHANGELOG.md +++ b/packages/snapcompact/CHANGELOG.md @@ -2,6 +2,10 @@ ## [Unreleased] +### Fixed + +- Fixed `claude-opus-5` (and later Opus lines) falling back to the 1568px frame instead of the 1932px high-res tier, so snapcompact archives for the current flagship Opus now retain ~33% more history at the same per-frame bill ([#8256](https://github.com/can1357/oh-my-pi/issues/8256)). + ## [17.1.5] - 2026-07-27 ### Fixed diff --git a/packages/snapcompact/src/snapcompact.ts b/packages/snapcompact/src/snapcompact.ts index dce081240..026d491df 100644 --- a/packages/snapcompact/src/snapcompact.ts +++ b/packages/snapcompact/src/snapcompact.ts @@ -342,11 +342,15 @@ export interface IdealShape { * lines the mono evals measured; everything else falls back to the API * family's winner at the standard 1568px frame. First match wins. */ const MODEL_VARIANTS: readonly (readonly [RegExp, IdealShape])[] = [ - // Opus 4.7+ and Fable/Mythos read high-res natively (2576px edge under a - // 4,784 visual-token cap → 1932px square sweet spot): same recall and - // cost as 1568, a third fewer frames. + // Opus 4.7+ and Fable/Mythos read high-res natively: same recall and cost as + // 1568, a third fewer frames. 1932 is the largest *square* not downscaled + // under Anthropic's 4,784 visual-token cap ((1932/28)² = 69² = 4,761 ≤ 4,784 + // 28px patches), and staying below 2000px keeps frames clear of the stricter + // ≤2000px per-image dimension limit that applies once a request carries more + // than 20 image blocks. The cap is a family-wide Anthropic billing property, + // so every Opus line from 4.7 up (5.x and later included) belongs on this tier. [/claude.*(fable|mythos)/i, { variant: "11on16-bw", frameSize: 1932 }], - [/claude-?opus-?4[.-][7-9]/i, { variant: "11on16-bw", frameSize: 1932 }], + [/claude-?opus-?(4[.-][7-9]|[5-9])/i, { variant: "11on16-bw", frameSize: 1932 }], // Older Claude lines downscale past 1568px — keep the safe size. [/claude/i, { variant: "11on16-bw" }], // Gemini 3.x bills a fixed 1,120-token budget per image regardless of diff --git a/packages/snapcompact/test/snapcompact.test.ts b/packages/snapcompact/test/snapcompact.test.ts index fd6734bd4..6ee75583f 100644 --- a/packages/snapcompact/test/snapcompact.test.ts +++ b/packages/snapcompact/test/snapcompact.test.ts @@ -299,6 +299,14 @@ describe("shape resolution", () => { // High-res frames are reserved for the lines that read them natively; // older Claude lines keep the safe 1568px family default. expect(snapcompact.resolveShape({ api: "anthropic-messages", id: "claude-opus-4-8" }).frameSize).toBe(1932); + // Opus 5+ shares the Anthropic visual-token cap, so it stays on the + // high-res tier rather than falling back to the 1568px default (#8256). + expect(snapcompact.resolveShape({ api: "anthropic-messages", id: "claude-opus-5" }).frameSize).toBe(1932); + expect(snapcompact.resolveShape({ api: "anthropic-messages", id: "claude-opus-6" }).frameSize).toBe(1932); + // Opus lines below 4.7 downscale, so they keep the safe family default. + expect(snapcompact.resolveShape({ api: "anthropic-messages", id: "claude-opus-4-6" })).toBe( + snapcompact.SHAPES.anthropic, + ); expect(snapcompact.resolveShape({ api: "anthropic-messages", id: "claude-3-5-sonnet" })).toBe( snapcompact.SHAPES.anthropic, );