Skip to content

Commit a638194

Browse files
author
jun
committed
fix(catalog): drop the native long-context tier under any window lever below it
A per-model window override or provider window below the long window must remove the tier the same way a provider cap does; otherwise the row keeps advertising 922k while the effective window is smaller (CodeRabbit).
1 parent 3906ed0 commit a638194

2 files changed

Lines changed: 28 additions & 6 deletions

File tree

‎src/codex/catalog/metadata.ts‎

Lines changed: 11 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -276,9 +276,10 @@ export function nativeOpenAiContextWindow(slug: string, limits?: NativeContextLi
276276
* pick a window per request (Cursor's local-agent "Context" selector). The pair is the family's
277277
* pinned default window and its opt-in ceiling, independent of whether the operator has
278278
* already opted the proxy into the long window: the selector exists so the client can choose.
279-
* A provider cap below the long tier removes the tier; a cap at or above it leaves it intact
280-
* (the 922k/1050k opt-in values are the levers, not a request to shrink). Undefined when the
281-
* family has no separate tier or when the two windows coincide.
279+
* Any user lever below the long window removes the tier: a per-model window override, the
280+
* provider-level window override, or a provider context cap. A lever at or above it leaves the
281+
* tier intact (the 922k/1050k opt-in values are the levers, not a request to shrink). Undefined
282+
* when the family has no separate tier or when the two windows coincide.
282283
*/
283284
export function nativeOpenAiContextTier(
284285
slug: string,
@@ -288,8 +289,13 @@ export function nativeOpenAiContextTier(
288289
const defaultWindow = positiveInt(override?.contextWindow);
289290
const longWindow = positiveInt(override?.maxContextWindow);
290291
if (defaultWindow === undefined || longWindow === undefined || longWindow <= defaultWindow) return undefined;
291-
const cap = positiveInt(asLimits(limits).cap);
292-
if (cap !== undefined && cap < longWindow) return undefined;
292+
const resolved = asLimits(limits);
293+
const levers = [
294+
positiveInt(resolved.modelWindows?.[slug]),
295+
positiveInt(resolved.providerWindow),
296+
positiveInt(resolved.cap),
297+
];
298+
if (levers.some(lever => lever !== undefined && lever < longWindow)) return undefined;
293299
return { defaultWindow, longWindow };
294300
}
295301

‎tests/cursor-local-models-schema.test.ts‎

Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ import { mkdtempSync, rmSync } from "node:fs";
33
import { tmpdir } from "node:os";
44
import { join } from "node:path";
55
import { saveConfig } from "../src/config";
6-
import { nativeReasoningEfforts } from "../src/codex/catalog";
6+
import { nativeOpenAiContextTier, nativeReasoningEfforts } from "../src/codex/catalog";
77
import {
88
resetCodexModelEntitlementCacheForTests,
99
seedCodexModelEntitlementsForTests,
@@ -110,6 +110,22 @@ describe("modelCapabilityFields", () => {
110110
});
111111
});
112112

113+
describe("nativeOpenAiContextTier", () => {
114+
test("native GPT-5.6 carries the 272k/922k pair and other natives carry none", () => {
115+
expect(nativeOpenAiContextTier("gpt-5.6-sol")).toEqual({ defaultWindow: 272000, longWindow: 922000 });
116+
expect(nativeOpenAiContextTier("gpt-5.5")).toBeUndefined();
117+
});
118+
119+
test("any user lever below the long window removes the tier; levers at or above it keep it", () => {
120+
expect(nativeOpenAiContextTier("gpt-5.6-sol", { cap: 500000 })).toBeUndefined();
121+
expect(nativeOpenAiContextTier("gpt-5.6-sol", { providerWindow: 400000 })).toBeUndefined();
122+
expect(nativeOpenAiContextTier("gpt-5.6-sol", { modelWindows: { "gpt-5.6-sol": 300000 } })).toBeUndefined();
123+
expect(nativeOpenAiContextTier("gpt-5.6-sol", { cap: 1050000, providerWindow: 922000 })).toEqual({ defaultWindow: 272000, longWindow: 922000 });
124+
// A window override for another slug does not touch this one.
125+
expect(nativeOpenAiContextTier("gpt-5.6-sol", { modelWindows: { "gpt-5.6-terra": 300000 } })).toEqual({ defaultWindow: 272000, longWindow: 922000 });
126+
});
127+
});
128+
113129
describe("raw /v1/models list advertises Cursor local-agent capabilities", () => {
114130
test("routed rows carry api_types and capabilities derived from provider config", async () => {
115131
seedCodexModelEntitlementsForTests("main", ["gpt-5.6-sol"]);

0 commit comments

Comments
 (0)