fix(ai): add claude-fable-5-1 to the cursor capability table and variant aliases - #1613
thisisjun786 wants to merge 3 commits into
Conversation
…ant aliases
Cursor began serving `claude-fable-5-1-{low,medium,high,xhigh,max}` and the
matching `-thinking-` variants after the 2026-08-18 capture the static table
was built from. With no `CURSOR_MODEL_CAPABILITIES` entry, `normalizeCursorCatalog`
left the ten variants ungrouped and stamped each with the 200000 unknown-family
fallback, even though `GetUsableModels` names them "Claude Fable 5.1 1M ...";
with no alias, `regroupStoredCursorModels` could never fold an existing store
into the grouped shape. The result was ten separate 200k picker entries and
compaction firing at 200k on a 1M model.
- `claude-fable-5-1` takes the same contract as `claude-fable-5`: 1M window,
1M maxWindow, `300k` default context, `1m` request context, `low..max` ladder.
- ten aliases map the variants onto `claude-fable-5-1` / `claude-fable-5-1-thinking`.
- the raw 2026-09-11 `GetUsableModels` entries are committed as a fixture and
drive new grouping and resolution tests.
Codex Review SummaryThis comment shows the latest Codex review activity on this pull request.
ℹ️ About Codex in GitHubYour team has set up Codex to review pull requests in this repo. Reviews are triggered when you
Codex reacts with 👀 while any review is running, comments if it has suggestions, and reacts with 👍 once all reviews finish with no findings. |
Preserve both change trackers while merging upstream/main. Include the upstream DeepSeek catalog assertion fix and document the Cursor grouping fix in both release notes. Ultraworked with [omo](https://github.com/code-yeongyu/oh-my-openagent) Co-authored-by: sisyphus-dev-ai <sisyphus-dev-ai@users.noreply.github.com>
Merge the upstream Devin preset fix without dropping the Cursor Fable 5.1 release note. Static checks, focused tests, and the full build pass. Ultraworked with [omo](https://github.com/code-yeongyu/oh-my-openagent) Co-authored-by: sisyphus-dev-ai <sisyphus-dev-ai@users.noreply.github.com>
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: 8042c5686e
ℹ️ About Codex in GitHub
Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you
- Open a pull request for review
- Mark a draft as ready
- Comment "@codex review".
If Codex has suggestions, it will comment; otherwise it will react with 👍.
Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".
| "claude-fable-5-1-high": { | ||
| "targetId": "claude-fable-5-1", | ||
| "level": "high", | ||
| "legacyVariantId": "claude-fable-5-1-high", | ||
| "encoding": "legacy-variant" |
There was a problem hiding this comment.
Preserve observed limits while regrouping Fable aliases
When upgrading a user who previously ran a raw Fable 5.1 variant, this new alias makes regroupStoredCursorModels replace that raw ID with the grouped target, but cursor-context-limits.json remains keyed by the raw ID and entryToModel queries only the grouped entry.id. Consequently, a persisted server limit such as 200k for claude-fable-5-1-medium is ignored and the migrated model is advertised as 1M, so a resumed large turn can exceed the account's actual ceiling before another checkpoint is received; migrate or consult the representative/legacy alias limits during regrouping.
Useful? React with 👍 / 👎.
| "claude-fable-5-1-thinking-high": { | ||
| "targetId": "claude-fable-5-1-thinking", | ||
| "level": "high", | ||
| "legacyVariantId": "claude-fable-5-1-thinking-high", | ||
| "encoding": "legacy-variant" |
There was a problem hiding this comment.
Keep raw variants in the Cursor CLI cache
When a Cursor CLI probe includes these new variants, parseCursorAgentModelsListing groups them and writeCache saves only the resulting grouped configs. On the next launch, parseCachedCatalog feeds the grouped IDs back through normalizeEntries; because those target IDs are not alias keys, both entries become non-reasoning models without cursorReasoning or upstreamModelId, and resolveCursorSelectionDescriptor sends the bare claude-fable-5-1[-thinking] ID that Cursor Run rejects with not_found. Thus these identities work immediately after a probe but fail while the 24-hour cache is fresh; cache the raw variants or deserialize the normalized configs without regrouping them.
Useful? React with 👍 / 👎.
Summary
Cursor now serves
claude-fable-5-1-{low,medium,high,xhigh,max}and the matching-thinking-variants, but they post-date the 2026-08-18 capture thatCURSOR_MODEL_CAPABILITIESandcursor-variant-aliases.jsonwere built from. As a result:normalizeCursorCatalogleft the ten variants ungrouped and stamped each with the 200000 unknown-family fallback (FALLBACK_WINDOW), even thoughGetUsableModelsnames themClaude Fable 5.1 1M ...and discovery had already recovered a 1M window from that label.regroupStoredCursorModelshad no alias to fold an existingmodels-store.jsoninto the grouped shape, so the picker showed ten separate 200k entries instead of one plain and one thinking identity with an effort ladder.Changes
packages/ai/src/cursor/model-capabilities.ts:claude-fable-5-1takes the same contract asclaude-fable-5(1M window, 1M maxWindow,300kdefault context,1mrequest context,low..maxladder).packages/ai/src/cursor/cursor-variant-aliases.json: ten aliases mapping the variants ontoclaude-fable-5-1/claude-fable-5-1-thinking;sourcerecords the 2026-09-11 capture.packages/ai/test/fixtures/cursor-usable-models-claude-fable-5-1-20260911.json: the ten rawGetUsableModelsentries exactly as Cursor served them on 2026-09-11.claude-fable-5-1joins the expected-window map and variant resolution cases incursor-model-capabilities.test.ts; a newcursor-model-grouping.test.tsblock runs the live fixture throughnormalizeCursorCatalogand asserts two identities, a fulllow..maxmap, and a 1M window (the previously failing behaviour).packages/ai/src/changes.mdsection per the contributing contract.Evidence
Live
fetchCursorUsableModelscapture, 2026-09-11 (223 ids):Before this change the stored catalog had all ten at
contextWindow: 200000, compat: {}; after itregroupStoredCursorModelsproducesclaude-fable-5-1/claude-fable-5-1-thinkingat 1000000 withcursorReasoningcompat, matchingclaude-fable-5.Verification
vitest run test/cursor*inpackages/ai: 20 files, 147 tests pass.packages/coding-agent/test/cursor-legacy-model-resolution.test.tspasses.bun run check(biome, pinned deps, ts imports, shrinkwrap, install-lock, tsc, browser smoke) passes via the pre-commit hook.Summary by cubic
Registers
claude-fable-5-1in the Cursor capability table and variant aliases. Previously the ten variants fell back to the 200k unknown-family window, so the picker showed ten separate entries and compaction fired at 200k on a 1M model.Changes
claude-fable-5-1takes the same contract asclaude-fable-5: 1M window,300kdefault context,low..maxladder.claude-fable-5-1/claude-fable-5-1-thinking.Written for commit 92336c1. Summary will update on new commits.