SunsetDiff

Request breaking changes

These are the old request settings and endpoints that fail after you change the model id, and the settings that fail under a new API version. Each row names the models or the API version, what the source says happens, the fix, and the page it came from. 19 rules. The newest check date is October 22, 2026 (2026-10-22). Machine-readable copies: breaking-changes.json and breaking-changes.csv. License CC BY 4.0. Publisher: SunsetDiff. Retired model ids are on Request errors.

Anthropic

12 Anthropic rules.
Old setting Affected models What happens Fix Source
temperature set to a non-default value

claude-sonnet-5-5

temperature is deprecated for this model

claude-sonnet-5-5 returns HTTP 400. The Sonnet 5.5 migration guide prints the quoted sentence. Claude Sonnet 4.6 and earlier, and Claude Haiku 4.5, still accept temperature.

Remove temperature from the request. Claude Sonnet 5.5 migration guide, checked 2026-10-20.

Error page

top_p or top_k set to a non-default value

claude-sonnet-5-5

The Sonnet 5.5 migration guide says a non-default top_p or top_k returns a 400 on claude-sonnet-5-5. It does not print a separate error sentence for those fields. Claude Sonnet 4.6 and earlier, and Claude Haiku 4.5, still accept them.

Remove top_p and top_k from the request. Claude Sonnet 5.5 migration guide, checked 2026-10-20.

Error page

thinking.type set to "disabled"

claude-sonnet-5-5

To turn thinking off on this model, send "thinking": {"type": "between_tools"} instead of {"type": "disabled"}. The model does not think before responding. The short updates it writes between tool calls come back as thinking blocks.

claude-sonnet-5-5 returns HTTP 400 invalid_request_error. The Sonnet 5.5 migration guide prints the quoted sentence. The guide's before example turns thinking off on Claude Sonnet 5 with thinking type disabled.

Send thinking type "between_tools". The guide accepts that value at low, medium, or high effort. between_tools takes no display, budget_tokens, or block_binding field. Claude Sonnet 5.5 migration guide, checked 2026-10-20.

Error page

thinking.type "between_tools" with output_config.effort "xhigh" or "max"

claude-sonnet-5-5

The Sonnet 5.5 migration guide says between_tools returns a 400 at xhigh or max effort. It does not print a separate error sentence. between_tools is accepted at low, medium, and high effort.

Set output_config.effort to low, medium, or high when thinking type is between_tools. Claude Sonnet 5.5 migration guide, checked 2026-10-20.

Error page

thinking.type "enabled" with budget_tokens

claude-sonnet-5-5

"thinking.type.enabled" is not supported for this model. Use "thinking.type.adaptive" and "output_config.effort" to control thinking behavior.

claude-sonnet-5-5 returns HTTP 400. The Sonnet 5.5 migration guide prints the quoted sentence. The same guide says Claude Sonnet 4.6 still accepts budget_tokens as a deprecated setting, and Claude Sonnet 4.5 and Claude Haiku 4.5 use budget_tokens for all thinking. There is no fixed mapping from a token budget to an effort level.

Remove budget_tokens. Send thinking type adaptive and output_config.effort. Claude Sonnet 5.5 migration guide, checked 2026-10-20.

Error page

tool_choice type "tool" or type "any"

claude-sonnet-5-5

tool_choice: type "tool" and "any" are not supported for this model.

claude-sonnet-5-5 returns HTTP 400, including on the token counting endpoint. The Sonnet 5.5 migration guide prints the quoted sentence. The guide says every earlier model on that page accepts tool_choice type "any" or "tool".

Send tool_choice type "auto", set strict true on the tool, and say in the prompt when to call the tool. Claude Sonnet 5.5 migration guide, checked 2026-10-20.

Error page

a conversation whose last message is an assistant prefill

Claude Sonnet 4.6, Claude Sonnet 5, and claude-sonnet-5-5

This model does not support assistant message prefill. The conversation must end with a user message.

claude-sonnet-5-5, Claude Sonnet 4.6, and Claude Sonnet 5 return HTTP 400. The Sonnet 5.5 migration guide prints the quoted sentence. Claude Sonnet 4.5, Claude Haiku 4.5, and older models accept a prefilled last assistant turn.

End the conversation with a user message. For output format, use structured outputs. For a continuation, move the instruction into the user message. Claude Sonnet 5.5 migration guide, checked 2026-10-20.

Error page

temperature, top_p, or top_k on API version 2026-10-21

API version 2026-10-21. Every model on that version.

Under API version 2026-10-21, a request that sends temperature, top_p, or top_k returns a 400 on every model, even at the parameter's default value. The migration guide says this applies to the Messages API (POST /v1/messages), to token counting, and to each request in a Message Batch created with 2026-10-21. Models that already accept only the defaults, such as Claude 4.7 and later models, sample as before once the parameters are removed. On models that accept other values, such as Claude Sonnet 4.6, a request that lowered temperature for more consistent output loses that effect. No other setting replaces it. The versioning page states: Available on the Claude API, Claude Platform on AWS, Microsoft Foundry, and Google Cloud. On Amazon Bedrock, it's available for Claude 4.7 and later models. For other models on Bedrock, see the migration guide. The migration guide says the first versions that send 2026-10-21 are the Python anthropic package 2.0.0, TypeScript @anthropic-ai/sdk 1.0.0, the Go SDK 2.0.0 (module github.com/anthropics/anthropic-sdk-go/v2), Java com.anthropic:anthropic-java 3.0.0, C# Anthropic 13.0.0, PHP anthropic-ai/sdk 1.0.0, the Ruby anthropic gem 2.0.0, and the ant CLI 2.0.0. The versioning page and the migration guide do not print an error sentence.

Remove temperature, top_p, and top_k. If the request needs a non-default value, the migration guide says to keep that request on 2023-06-01. The versioning page still lists 2023-06-01 and does not call that version deprecated. Migrating to Claude API version 2026-10-21, checked 2026-10-22.

Error page

a document block placed directly in an assistant message on API version 2026-10-21

API version 2026-10-21. Every model on that version.

Under API version 2026-10-21, a request that places a document block directly in an assistant message returns a 400. The migration guide says to send documents in user messages instead. A document nested inside another block, such as a web fetch tool result that Claude returned, is still accepted. The same section applies to the Messages API, token counting, and each request in a Message Batch created with 2026-10-21. The versioning page also says the 400 covers a document block placed directly in an assistant message. The versioning page states: Available on the Claude API, Claude Platform on AWS, Microsoft Foundry, and Google Cloud. On Amazon Bedrock, it's available for Claude 4.7 and later models. For other models on Bedrock, see the migration guide. The pages do not print an error sentence.

Send document blocks in user messages. A request kept on 2023-06-01 is outside this version. The versioning page still lists 2023-06-01 and does not call that version deprecated. Migrating to Claude API version 2026-10-21, checked 2026-10-22.
a text block with a non-empty citations array in a user message on API version 2026-10-21

API version 2026-10-21. Every model on that version.

Under API version 2026-10-21, sending a text block with a non-empty citations array in a user message returns a 400. The versioning page says this includes a text block sent directly or inside a search_result block. The migration guide says to remove citations from those blocks. Citations on text blocks in assistant messages, such as Claude's earlier replies that you send back, are still accepted, and so is the citations enabled setting on documents and search results. The same section applies to the Messages API, token counting, and each request in a Message Batch created with 2026-10-21. The versioning page states: Available on the Claude API, Claude Platform on AWS, Microsoft Foundry, and Google Cloud. On Amazon Bedrock, it's available for Claude 4.7 and later models. For other models on Bedrock, see the migration guide. The pages do not print an error sentence.

Remove citations from text blocks in user messages. A request kept on 2023-06-01 is outside this version. The versioning page still lists 2023-06-01 and does not call that version deprecated. Claude API versioning, checked 2026-10-22.
reading the API key from the X-Api-Key header after the SDK or CLI majors that send 2026-10-21

API version 2026-10-21. Every model on that version.

The migration guide says the SDK and the CLI send the API key as Authorization: Bearer instead of in the X-Api-Key header. It says to change any proxy or gateway that reads or sets X-Api-Key to use Authorization, or send the key in X-Api-Key yourself. The Claude API accepts a key in either header, so a program that talks to the API directly needs no change. The migration guide says the first versions that send 2026-10-21 are the Python anthropic package 2.0.0, TypeScript @anthropic-ai/sdk 1.0.0, the Go SDK 2.0.0 (module github.com/anthropics/anthropic-sdk-go/v2), Java com.anthropic:anthropic-java 3.0.0, C# Anthropic 13.0.0, PHP anthropic-ai/sdk 1.0.0, the Ruby anthropic gem 2.0.0, and the ant CLI 2.0.0. The versioning page states: Available on the Claude API, Claude Platform on AWS, Microsoft Foundry, and Google Cloud. On Amazon Bedrock, it's available for Claude 4.7 and later models. For other models on Bedrock, see the migration guide. The page does not print an error sentence for this header change.

Change a proxy or gateway that reads or sets X-Api-Key to use Authorization, or send the key in X-Api-Key yourself. A program that talks to the Claude API directly needs no change for this header. Migrating to Claude API version 2026-10-21, checked 2026-10-22.
calling MessageParam or BetaMessageParam as one type for every role

API version 2026-10-21. Every model on that version.

The migration guide says MessageParam was one type for all roles and is now a union of UserMessageParam, AssistantMessageParam, and SystemMessageParam. BetaMessageParam is split the same way, into BetaUserMessageParam, BetaAssistantMessageParam, and BetaSystemMessageParam. Calling either name raises a TypeError. GitHub issue pydantic/pydantic-ai#10923 records that anthropic 2.0.0 makes every pydantic-ai Anthropic request fail before it is sent, because BetaMessageParam is now a union, and the recorded exception is TypeError: Cannot instantiate typing.Union. The migration guide says the first versions that send 2026-10-21 are the Python anthropic package 2.0.0, TypeScript @anthropic-ai/sdk 1.0.0, the Go SDK 2.0.0 (module github.com/anthropics/anthropic-sdk-go/v2), Java com.anthropic:anthropic-java 3.0.0, C# Anthropic 13.0.0, PHP anthropic-ai/sdk 1.0.0, the Ruby anthropic gem 2.0.0, and the ant CLI 2.0.0. The versioning page states: Available on the Claude API, Claude Platform on AWS, Microsoft Foundry, and Google Cloud. On Amazon Bedrock, it's available for Claude 4.7 and later models. For other models on Bedrock, see the migration guide.

The migration guide says to write the message as a dict, or subclass the type for the role, such as UserMessageParam. The pydantic-ai issue says the call sites can build the role-specific types or plain dicts. Migrating to Claude API version 2026-10-21, checked 2026-10-22.

OpenAI

4 OpenAI rules.
Old setting Affected models What happens Fix Source
max_tokens

o-series models

Unsupported parameter: 'max_tokens' is not supported with this model. Use 'max_completion_tokens' instead.

The Chat Completions reference says max_tokens is not compatible with o-series models. The quoted sentence was recorded for o1. This row does not claim that every newer OpenAI model returns that sentence.

Send max_completion_tokens and omit max_tokens. OpenAI Chat Completions reference, checked 2026-10-20.

Error sentence: GitHub issue openai/openai-python#2046.

Error page

function tools on POST /v1/chat/completions when reasoning_effort is not none

gpt-6-luna

Function tools with reasoning_effort are not supported for gpt-6-luna in /v1/chat/completions

gpt-6-luna returns the quoted sentence on Chat Completions. The model page says Chat Completions supports function calling only with reasoning_effort set to none, and to use the Responses API for function calling.

Use the Responses API for function tools, or set reasoning_effort to none on Chat Completions. GPT-6 Luna model page, checked 2026-10-20.

Error page

POST /v1/audio/speech (client.audio.speech.create) with model gpt-realtime-2.1-mini

Speech models whose replacement is gpt-realtime-2.1-mini

The text-to-speech guide says this is a change of API workflow: gpt-realtime-2.1-mini is not a supported model for /v1/audio/speech. The deprecations page says these speech models are removed on January 6, 2027, names gpt-realtime-2.1-mini, and points to the Realtime API guide. Those pages do not print an error sentence.

Keep the current speech model on POST /v1/audio/speech until shutdown. To move to gpt-realtime-2.1-mini, use the Realtime API. Do not send that model id to /v1/audio/speech. OpenAI text-to-speech guide, checked 2026-10-21.
POST /v1/audio/transcriptions (client.audio.transcriptions.create) with model gpt-live-transcribe

File transcription models whose replacement is gpt-live-transcribe

The speech-to-text guide says file transcription sends the audio file to POST /v1/audio/transcriptions. The realtime transcription guide says gpt-live-transcribe is a realtime transcription session (session type transcription, WebSocket or WebRTC), not that file endpoint. It also says gpt-live-transcribe does not return word-level timestamps, speaker labels, or transcription confidence scores. Those pages do not print an error sentence.

For a recorded file, the speech-to-text guide says to start with gpt-transcribe on POST /v1/audio/transcriptions. gpt-live-transcribe is a realtime session, so it is not a model-id swap on the file endpoint. OpenAI realtime transcription guide, checked 2026-10-21.

Google Gemini API

2 Google Gemini API rules.
Old setting Affected models What happens Fix Source
client.models.generate_images

Imagen models whose replacement is gemini-nano-banana-2.1

The Imagen page says Imagen models are shut down and to use Nano Banana. It says to call client.models.generate_content instead of client.models.generate_images. The image generation guide's text-to-image sample for gemini-nano-banana-2.1 uses client.interactions.create and POST https://generativelanguage.googleapis.com/v1beta/interactions. Neither page prints an error sentence, and neither shows a sample that only swaps the model id.

Do not put an Imagen model id or gemini-nano-banana-2.1 into generate_images. Use the call the Imagen page names, or the interactions sample on the image generation guide. Gemini API Imagen page, checked 2026-10-21.
client.models.generate_videos or POST /v1beta/models/{model}:predictLongRunning

Veo preview models whose replacement is gemini-omni-1.1-flash

The Veo guide's samples call client.models.generate_videos and POST https://generativelanguage.googleapis.com/v1beta/models/{id}:predictLongRunning with a Veo model id. The same page says to migrate to gemini-omni-1.1-flash and says this feature is currently only available with the generateContent API. No generate_videos sample for gemini-omni-1.1-flash was on that page. The page does not print an error sentence.

Do not put gemini-omni-1.1-flash into generate_videos. The Veo guide says the replacement uses the generateContent API. Gemini API Veo guide, checked 2026-10-21.

Google Vertex AI

1 Google Vertex AI rule.
Old setting Affected models What happens Fix Source
thinkingBudget, including a gateway that maps reasoning_effort to thinkingBudget

gemini-4-argon

Thinking budget is not supported for this model. Use thinking level instead.

GitHub issue gravitee-io/issues#11964 records HTTP 400 from Vertex for gemini-4-argon when thinkingBudget is sent. The JSON message is the quoted sentence, then a link to the thinking guide. A direct Vertex call with generationConfig.thinkingConfig.thinkingLevel set to LOW returned 200. Issue can1357/oh-my-pi#16350 records a shorter sentence for gemma-4-26b-a4b-it and gemma-4-31b-it. Those gemma ids are not SunsetDiff model records, so this row does not list them.

Send thinkingLevel instead of thinkingBudget. The thinking guide calls the parameter thinking_level. Its sample uses gemini-3.8-flash. The guide's table lists low, medium, and high for gemini-4-argon. GitHub issue gravitee-io/issues#11964, checked 2026-10-21.

Error page

Questions

Where is the list of settings that break when the model id changes?

On this page. The same rows are in breaking-changes.json and breaking-changes.csv. The license is CC BY 4.0. Credit SunsetDiff and link the license.

Does every row quote the provider's error sentence?

A row includes error_text only when an official page or a public GitHub issue prints that sentence. When the source does not print one, error_text is null and the row says what the source says happens.

Are shut-down model ids in this file?

No. A request that still sends a retired model id is on Request errors. This file is the old setting or endpoint that the replacement rejects.