Skip to content
6 changes: 6 additions & 0 deletions packages/ai/CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -6,10 +6,16 @@

### Added

- Claude Opus 5.5 (`claude-opus-5-5`, released 2026-09-22) joins the catalog on Anthropic, Amazon Bedrock (global/us/eu/jp/au inference profiles), OpenRouter and Vercel AI Gateway: 1M context, 128k output, \$4/\$20 per 1M tokens with \$0.20 cache reads, `xhigh` and `max` effort, and `claude-opus-5` as its server-side refusal fallback.

### Changed

### Fixed

- Claude Opus 5.5 is usable on the release that first exposed it. 2026.9.22-3 shipped a partial catalog row for `claude-opus-5-5`, so selecting the model and turning thinking off sent `thinking: {type: "disabled"}` and the request failed with a 400; per-message effort and the server-side refusal fallback were missing too, Amazon Bedrock listed the bare `anthropic.claude-opus-5-5` id that is reachable only through an inference profile, and no prompt preset matched the model, so it ran on the generic system prompt. The row now carries the full set, Bedrock lists only the five profiles, and the model has its own preset.

- Requests to Claude Opus 5.5 never carry `thinking: {type: "disabled"}` or a forced `tool_choice` (`any` / a named tool). Opus 5.5 rejects both with a 400 where Opus 5 accepted them, so a thinking-off turn now pins effort `low` and a forced-tool turn sends `tool_choice` omitted, on the Anthropic Messages and Bedrock providers alike, including gateway rows that carry no catalog metadata.

### Removed

## [2026.9.22-3] - 2026-09-22
Expand Down
20 changes: 20 additions & 0 deletions packages/ai/changes.md
Original file line number Diff line number Diff line change
@@ -1,3 +1,23 @@
## 2026-09-22 - Claude Opus 5.5 catalog rows and request compat

### What changed

- `packages/ai/scripts/generate-models.ts`: `ANTHROPIC_ALLOWED_FALLBACK_MODELS["claude-opus-5-5"] = ["claude-opus-4-8", "claude-opus-5"]` (the live Models API allowlist; the generator keeps only targets that also support per-message effort, so the emitted `compat.allowedFallbackModels` is `[claude-opus-5]`); `BEDROCK_INFERENCE_PROFILE_ONLY_MODEL_IDS` gains `anthropic.claude-opus-5-5` so only the global/us/eu/jp/au profiles are emitted, mirroring Opus 5; `supportsAnthropicMidConvoEffort` matches `claude-opus-5-5` / `claude-opus-5.5`; the Fable-5 adaptive-only branch is now `isAnthropicAdaptiveOnlyModel` and covers Opus 5.5 too (`compat.supportsDisabledThinking: false` on `anthropic-messages`, `thinkingLevelMap.off: null` elsewhere). `src/providers/data/` regenerated (one strict run): anthropic, amazon-bedrock, openrouter (`anthropic/claude-opus-5.5`), vercel-ai-gateway (`anthropic/claude-opus-5.5`, `-fast`); venice picked up one unrelated metadata refresh.
- Runtime compat for the same release (Messages and Bedrock family markers, forced-tool-choice default) is tracked in `src/changes.md`.
- Tests: `test/anthropic-opus-5-5.test.ts` (catalog shape, Bedrock profile-only, thinking-off request, xhigh/max effort mapping), `test/anthropic-tool-choice-compat.test.ts` (forced `any` / named omitted for 5.5, kept for Opus 5), `test/bedrock-thinking-payload.test.ts` (Bedrock thinking-off pins effort low).

### Why

Claude Opus 5.5 (2026-09-22) returns 400 for `thinking.type` `disabled` and `enabled` alike and for `tool_choice` `any` / `tool`; on Opus 5 both were accepted. Verified against the live Models API (`thinking.types.enabled.supported: false`, `allowed_fallback_models: [claude-opus-4-8, claude-opus-5]`). Without the compat facts, a thinking-off turn or a forced-tool turn failed every request on the new model.

### Why an extension could not handle it

The catalog shards ship inside this package and the request shape is built inside the Messages and Bedrock providers before any extension hook runs.

### Expected merge conflict zones

- `packages/ai/scripts/generate-models.ts`: the Anthropic family-marker functions and the hardcoded allowlist tables, against any other model-release change.

## 2026-09-22 - generator rows for the chatgpt-subscription rename (senpi#1989)

### What changed
Expand Down
17 changes: 12 additions & 5 deletions packages/ai/scripts/generate-models.ts
Original file line number Diff line number Diff line change
Expand Up @@ -279,6 +279,7 @@ const EAGER_TOOL_INPUT_STREAMING_UNSUPPORTED_ANTHROPIC_MODELS = new Set([
const ANTHROPIC_ALLOWED_FALLBACK_MODELS = {
"claude-fable-5-1": ["claude-opus-4-8", "claude-opus-5"],
"claude-fable-5": ["claude-opus-4-8", "claude-opus-5"],
"claude-opus-5-5": ["claude-opus-4-8", "claude-opus-5"],
"claude-opus-5": ["claude-opus-4-8"],
} satisfies Record<string, string[]>;

Expand Down Expand Up @@ -387,7 +388,7 @@ const ANT_LING_RING_THINKING_LEVEL_MAP = {
xhigh: "xhigh",
} as const;

const BEDROCK_INFERENCE_PROFILE_ONLY_MODEL_IDS = new Set(["anthropic.claude-opus-5"]);
const BEDROCK_INFERENCE_PROFILE_ONLY_MODEL_IDS = new Set(["anthropic.claude-opus-5", "anthropic.claude-opus-5-5"]);
const MODELS_DEV_OPENAI_UNSUPPORTED_MODEL_IDS = new Set(["gpt-5.6"]);
const OPENAI_TOOL_SEARCH_MODEL_IDS = new Set([
"gpt-5.4",
Expand Down Expand Up @@ -709,11 +710,17 @@ const VERIFIED_ANTHROPIC_MID_CONVO_EFFORT_PROVIDERS = new Set(["anthropic", "ope
function supportsAnthropicMidConvoEffort(modelId: string): boolean {
const id = modelId.toLowerCase().replace(/^~?anthropic\//, "");
return (
/^claude-opus-5(?:-\d{8})?$/.test(id) ||
/^claude-opus-5(?:[.-]5)?(?:-\d{8})?$/.test(id) ||
/^claude-(?:fable|mythos)-5(?:[.-]1)(?:-\d{8})?$/.test(id)
);
}

// Opus 5.5 rejects `thinking: {type: "disabled"}` and `{type: "enabled"}` alike (400: `"thinking.type.disabled"
// is not supported for this model`); only adaptive thinking is accepted.
function isAnthropicAdaptiveOnlyModel(modelId: string): boolean {
return modelId.includes("fable-5") || modelId.includes("opus-5-5") || modelId.includes("opus-5.5");
}

function isAnthropicAdaptiveThinkingModel(modelId: string): boolean {
return (
modelId.includes("opus-4-6") ||
Expand Down Expand Up @@ -1130,11 +1137,11 @@ function applyThinkingLevelMetadata(model: Model<any>): void {
) {
mergeThinkingLevelMap(model, { xhigh: "xhigh", max: "max" });
}
if (model.id.includes("fable-5")) {
if (isAnthropicAdaptiveOnlyModel(model.id)) {
mergeThinkingLevelMap(model, { xhigh: "xhigh", max: "max" });
if (model.api === "anthropic-messages") {
// Fable 5 rejects `thinking: {type: "disabled"}` (verified 400: `"thinking.type.disabled"
// is not supported for this model`) and defaults to adaptive thinking when the field is
// Fable 5 and Opus 5.5 reject `thinking: {type: "disabled"}` (verified 400: `"thinking.type.disabled"
// is not supported for this model`) and default to adaptive thinking when the field is
// omitted, so the Messages provider pins the cheapest effort for a thinking-off turn.
// Encoding that as a compat fact instead of `thinkingLevelMap.off: null` keeps `off` a
// selectable level while still keeping `thinking.type: "disabled"` off the wire.
Expand Down
2 changes: 1 addition & 1 deletion packages/ai/src/api/anthropic-messages.ts
Original file line number Diff line number Diff line change
Expand Up @@ -275,7 +275,7 @@ const NATIVE_XHIGH_EFFORT_MODEL_MARKERS = [
* this as `compat.supportsDisabledThinking: false`, but `models.json` entries and third-party
* gateway rows carry no generated compat, so the family fact has to live here as well.
*/
const DISABLED_THINKING_REJECTING_MODEL_MARKERS = ["fable-5", "mythos-5"] as const;
const DISABLED_THINKING_REJECTING_MODEL_MARKERS = ["fable-5", "mythos-5", "opus-5-5", "opus-5.5"] as const;
const UNSUPPORTED_NATIVE_COMPUTER_TOOL_MODEL_MARKERS = [
"opus-4-6",
"opus-4.6",
Expand Down
4 changes: 3 additions & 1 deletion packages/ai/src/api/bedrock-converse-stream.ts
Original file line number Diff line number Diff line change
Expand Up @@ -793,7 +793,9 @@ function supportsNativeXhighEffort(model: Model<"bedrock-converse-stream">): boo
function rejectsDisabledThinking(model: Model<"bedrock-converse-stream">): boolean {
if (model.thinkingLevelMap?.off === null) return true;
const candidates = getModelMatchCandidates(model.id, model.name);
return candidates.some((s) => s.includes("fable-5") || s.includes("mythos-5"));
return candidates.some(
(s) => s.includes("fable-5") || s.includes("mythos-5") || s.includes("opus-5-5") || s.includes("opus-5.5"),
);
}

function mapThinkingLevelToEffort(
Expand Down
23 changes: 23 additions & 0 deletions packages/ai/src/changes.md
Original file line number Diff line number Diff line change
@@ -1,3 +1,26 @@
## 2026-09-22 - Claude Opus 5.5 request compat: no disabled thinking, no forced tool_choice

### What changed

- `packages/ai/src/api/anthropic-messages.ts`: `DISABLED_THINKING_REJECTING_MODEL_MARKERS` gains `opus-5-5` / `opus-5.5`, so rows with no generated compat (a `models.json` entry, a gateway row) never send `thinking.type: "disabled"` and pin effort `low` for a thinking-off turn instead.
- `packages/ai/src/api/bedrock-converse-stream.ts`: `rejectsDisabledThinking` matches the same two markers for Bedrock application inference profiles that carry no catalog metadata.
- `packages/ai/src/utils/prompt-cache-ttl.ts`: `getAnthropicCompat` defaults `supportsForcedToolChoice` to `false` for `claude-opus-5-5` / `claude-opus-5.5` ids alongside Fable and Mythos, so `tool_choice: any` / `{type: "tool"}` is omitted from the request rather than round-tripping a 400.
- Catalog rows and generator changes for the same release are tracked in `packages/ai/changes.md`.

### Why

Claude Opus 5.5 (2026-09-22) returns 400 for `thinking.type` `disabled` and `enabled` alike and for `tool_choice` `any` / `tool`; on Opus 5 both were accepted. Verified against the live Models API (`thinking.types.enabled.supported: false`). The generated catalog encodes the facts as compat, but `models.json` entries and third-party gateway rows carry no generated compat, so the family fact has to live in the providers as well.

### Why an extension could not handle it

The request shape is built inside the Messages and Bedrock providers before any extension hook runs.

### Expected merge conflict zones

- `packages/ai/src/api/anthropic-messages.ts`: the family-marker constant block near the top of the file.
- `packages/ai/src/api/bedrock-converse-stream.ts`: `rejectsDisabledThinking`.
- `packages/ai/src/utils/prompt-cache-ttl.ts`: the forced-tool-choice family regex.

## 2026-09-22 - rename the subscription-provider symbols and modules (senpi#1989)

### What changed
Expand Down
2 changes: 1 addition & 1 deletion packages/ai/src/providers/data/.manifest.json
Original file line number Diff line number Diff line change
@@ -1 +1 @@
{"schemaVersion":3,"generatedAt":"2026-09-22T16:54:20.767Z","structureHash":"a929ced567f61d33c236db542dd5a93367733557debd26bd6c497e7145c4e657","files":{"alibaba-token-plan.json":"3a9c1be76d47459371e9fa2feeffc31e7edbbfec65fa9cc41236988efc4cf6d9","amazon-bedrock.json":"d2562dc7c6a4a822eb503b601df53c4780eeba39a8bd2de1e7821888f5689d76","ant-ling.json":"4979fe79d99ed97382d7ce40170c6132e932e77906de1eb54464c042e7d63633","anthropic.json":"c55df9652e5ada18ecd9216be09d9774ba4eb39c3da34d3510883a2ea6c2fceb","azure-openai-responses.json":"9d2137c68fbf7012872296a02a13a138f7d5246dc09f2ca79e34e6a875b11488","bai.json":"2b12b15bd43462e60711944dd7283db8676611d9d76c82c2a01f64913e16a67e","baseten.json":"d155c434294b5167244cffb6dea6793f9669e91e8ab65b564f9510d81b330e37","cerebras.json":"9eaa554e1b02f3665f8f63e6432d253bf81351af7c72001054dd8108aa528a52","chatgpt-subscription.json":"a2b609fe83947ef48639926b7a1838bd52c6a1400329ad14187f86220c027965","cloudflare-ai-gateway.json":"a2b9fa9b7bc78df3459a9c53282a9c2f715b7ce703ae0d09c59bec0a6841af49","cloudflare-workers-ai.json":"7fafe70c396bfeced683d348d743ca7ae109f03b8a6083a37a36d3698090a197","deepseek.json":"b5f9693ec641e9a957dc5f7a22042b3bb928bac3d7268406619b6f18e21c4b83","fireworks.json":"6283651d25a8861e7d42fe2bdb1cb7dd80802811dfaf61e40c11cc813408c294","github-copilot.json":"beee18c9dd4cda307140d9a54da4955a2ac1142c26d1fcbcd684181b83a7ba15","google-vertex.json":"e1631109172dc1f7d7977570420a5bb86258bdd1088427e244a2c51545c4f24d","google.json":"7619bf03edd2a7acb06a2274a14b13c3a61354288abe029a758401d4de36a8fd","groq.json":"e4728fd72e358cd8f25e9a518e9b49a521ef44523d3debe38a7db9e0663c4077","huggingface.json":"2f93082144a7b2a1cbf79148244ce7559e0428d6310c5eb0648bca89b15a8b4b","minimax-cn.json":"65d37e55a6d9585855f94b3fb7739308d107fe248ebd9e1001d1c5d4606ad2c4","minimax.json":"c7dc5765995ae77242916430929c7cc9a782589f7e483e13f7e01663190d028e","mistral.json":"be522597b22bceeb0bb9a0ba1781647649ffd19637d0c8e67b056d7b0ec33d52","moonshotai-cn.json":"c4e1801b5dfd61bebcaa33cbfc5ed0c69df14a3bee37da218a558668d817864e","moonshotai.json":"3dab637e7e2648792c786157f85f29026b93393f7098b77593c1180928d371c9","nvidia.json":"6493e09b5db8b8fe9c8fae5bc15dc287645f37f83a4ed3a1ad1181e5830b5ff7","openai.json":"203a1d6bf61178268edf3d3f0ad4a6408eded401c4472bda4ac0ec73142f38ce","opencode-go.json":"64ea73012b153ef5d618663b6b542d527e43383e63b6b49f5961b310508c41cd","opencode.json":"c791718cc9f16789db88c7859b2fe94ce5e23a0aad72030422a23d7800ab2e0c","opengateway.json":"3c6a210a22965ded5f032e0a963649d809b889762205b8458cc367e5ba1e39a5","openrouter.json":"e35b480babeaee7705a378d07c4e78d38e001b9e6da992e646b395a77e59b74a","qwen-token-plan-cn.json":"4bf520ed38e5c3045680d2ec2816fa8a69079dbe97f7b929767a63172288da6b","qwen-token-plan-individual.json":"eb040e78595853e980011308b1bf9caacae6dc8a91abbac5ffebd402515dd2a6","qwen-token-plan.json":"a5c67213745329ec3ba79f712f31c1c32a781d7ffb8c04f9819f36c27672531f","together.json":"927c707d06f2236cdab13f14c870fb58bce0614ba7287bbcd57cc9fd66d191ed","venice.json":"790725da45ac4b1977e21217f50ae97e2ef9b0381079aaf034935155bfab1129","vercel-ai-gateway.json":"8ad04c9c0834fbfd48bc33e4e653d33b25f76a43f601eb2be31d88c31bbdcca0","xai.json":"9b23faa5218e966a17108c05d2498a617ade1eae9b0d0684284c77d67949a3f1","xiaomi-token-plan-ams.json":"7df74a255259fc1d5be8e682c3ffb0908eaaf0af711f6433dedcf345ce3e8393","xiaomi-token-plan-cn.json":"7dc672723d5b37e5b92605752f74f46f44eba10be2b0cb959790260b9e0c2a4e","xiaomi-token-plan-sgp.json":"69b333b158be038459a511a673f4536a5b03d4931c3119339f1ac741bc03d502","xiaomi.json":"333299657f211ad9edac0f3d4298b7e5776626914c9c80e22305a87533f23966","zai-coding-cn.json":"69c572aa75104f16ccbddbaace60c267f4bcc74f86d34891ca43110d312fb1ad","zai.json":"15c8182a88e58bdc1b1c3eb0603c690475342c8a826ceddfe9af1b36b28345ee"}}
{"schemaVersion":3,"generatedAt":"2026-09-22T17:36:37.354Z","structureHash":"6046f77c9a59677167d980e51efc462830cf64d0d804c4eb52ff3fda40493afc","files":{"alibaba-token-plan.json":"3a9c1be76d47459371e9fa2feeffc31e7edbbfec65fa9cc41236988efc4cf6d9","amazon-bedrock.json":"b66d96ab6166633303c052d09b617ba7b863ace7aadc621c0e5455b6664818e9","ant-ling.json":"4979fe79d99ed97382d7ce40170c6132e932e77906de1eb54464c042e7d63633","anthropic.json":"f9db437d92449fb860a2d457a6019cdfd51c11180c08df2b5f14d75ade773953","azure-openai-responses.json":"9d2137c68fbf7012872296a02a13a138f7d5246dc09f2ca79e34e6a875b11488","bai.json":"2b12b15bd43462e60711944dd7283db8676611d9d76c82c2a01f64913e16a67e","baseten.json":"d155c434294b5167244cffb6dea6793f9669e91e8ab65b564f9510d81b330e37","cerebras.json":"9eaa554e1b02f3665f8f63e6432d253bf81351af7c72001054dd8108aa528a52","chatgpt-subscription.json":"a2b609fe83947ef48639926b7a1838bd52c6a1400329ad14187f86220c027965","cloudflare-ai-gateway.json":"a2b9fa9b7bc78df3459a9c53282a9c2f715b7ce703ae0d09c59bec0a6841af49","cloudflare-workers-ai.json":"7fafe70c396bfeced683d348d743ca7ae109f03b8a6083a37a36d3698090a197","deepseek.json":"b5f9693ec641e9a957dc5f7a22042b3bb928bac3d7268406619b6f18e21c4b83","fireworks.json":"6283651d25a8861e7d42fe2bdb1cb7dd80802811dfaf61e40c11cc813408c294","github-copilot.json":"beee18c9dd4cda307140d9a54da4955a2ac1142c26d1fcbcd684181b83a7ba15","google-vertex.json":"e1631109172dc1f7d7977570420a5bb86258bdd1088427e244a2c51545c4f24d","google.json":"7619bf03edd2a7acb06a2274a14b13c3a61354288abe029a758401d4de36a8fd","groq.json":"e4728fd72e358cd8f25e9a518e9b49a521ef44523d3debe38a7db9e0663c4077","huggingface.json":"2f93082144a7b2a1cbf79148244ce7559e0428d6310c5eb0648bca89b15a8b4b","minimax-cn.json":"65d37e55a6d9585855f94b3fb7739308d107fe248ebd9e1001d1c5d4606ad2c4","minimax.json":"c7dc5765995ae77242916430929c7cc9a782589f7e483e13f7e01663190d028e","mistral.json":"be522597b22bceeb0bb9a0ba1781647649ffd19637d0c8e67b056d7b0ec33d52","moonshotai-cn.json":"c4e1801b5dfd61bebcaa33cbfc5ed0c69df14a3bee37da218a558668d817864e","moonshotai.json":"3dab637e7e2648792c786157f85f29026b93393f7098b77593c1180928d371c9","nvidia.json":"6493e09b5db8b8fe9c8fae5bc15dc287645f37f83a4ed3a1ad1181e5830b5ff7","openai.json":"203a1d6bf61178268edf3d3f0ad4a6408eded401c4472bda4ac0ec73142f38ce","opencode-go.json":"64ea73012b153ef5d618663b6b542d527e43383e63b6b49f5961b310508c41cd","opencode.json":"c791718cc9f16789db88c7859b2fe94ce5e23a0aad72030422a23d7800ab2e0c","opengateway.json":"3c6a210a22965ded5f032e0a963649d809b889762205b8458cc367e5ba1e39a5","openrouter.json":"3e5d29476af7daf56d904eaa2d28818df7abec4e8df6ed45caf9e54e71eb6a46","qwen-token-plan-cn.json":"4bf520ed38e5c3045680d2ec2816fa8a69079dbe97f7b929767a63172288da6b","qwen-token-plan-individual.json":"eb040e78595853e980011308b1bf9caacae6dc8a91abbac5ffebd402515dd2a6","qwen-token-plan.json":"a5c67213745329ec3ba79f712f31c1c32a781d7ffb8c04f9819f36c27672531f","together.json":"927c707d06f2236cdab13f14c870fb58bce0614ba7287bbcd57cc9fd66d191ed","venice.json":"188f582f815b45be94fb8bd4e8448e6e23eba27d829145947900093e0a734f51","vercel-ai-gateway.json":"d97e054b804ba652474ac9ce7020495187d460b439cfe6be8a7dc571fd39e354","xai.json":"9b23faa5218e966a17108c05d2498a617ade1eae9b0d0684284c77d67949a3f1","xiaomi-token-plan-ams.json":"7df74a255259fc1d5be8e682c3ffb0908eaaf0af711f6433dedcf345ce3e8393","xiaomi-token-plan-cn.json":"7dc672723d5b37e5b92605752f74f46f44eba10be2b0cb959790260b9e0c2a4e","xiaomi-token-plan-sgp.json":"69b333b158be038459a511a673f4536a5b03d4931c3119339f1ac741bc03d502","xiaomi.json":"333299657f211ad9edac0f3d4298b7e5776626914c9c80e22305a87533f23966","zai-coding-cn.json":"69c572aa75104f16ccbddbaace60c267f4bcc74f86d34891ca43110d312fb1ad","zai.json":"15c8182a88e58bdc1b1c3eb0603c690475342c8a826ceddfe9af1b36b28345ee"}}
2 changes: 1 addition & 1 deletion packages/ai/src/providers/data/amazon-bedrock.json

Large diffs are not rendered by default.

Loading
Loading