Requests that use a prefilled assistant message start returning 400 after a model upgrade. What do you do?
Why C is the answer
Move to structured outputs or clear instructions
Prefill is not supported starting with Claude 4.6 models and returns a 400. Use structured outputs for format control.
In detail
- Prefill is not supported starting with Claude 4.6 models, and it returns a 400.
- The error will not clear by itself, so the request has to change.
- Structured outputs handle format control, and clear instructions cover the rest.
- Check the migration notes before you upgrade a model.
Use case
An illustrative scenario, not a real incident.
A team prefilled "{" to force JSON. After moving to a newer model, every call returns a 400. Switching to structured outputs gives the same result on supported models.
See it in different ways
flowchart LR
A["Model output"] --> B{"Matches schema?"}
B -->|Yes| C{"Do the values make sense?"}
C -->|Yes| D["Accept"]
C -->|No| E["Review or retry"]flowchart TD
Q{"Do you need a fixed format?"}
Q -->|"Yes, as JSON"| A0["Structured outputs"]
Q -->|"Yes, as prose"| A1["Clear instructions"]
Q -->|"Prefill on a 4.6 model or later"| A2["Returns a 400"]Key point: Prefill is not supported starting with Claude 4.6 models.
Why the other options are wrong
- A. Move the prefill text to the start of the system prompt for that request
- Moving prefill text into the system prompt does not give the same behavior, and format is still not controlled.
- B. Retry with exponential backoff until the model accepts the prefilled text
- A 400 means the request is invalid. Retrying sends the same invalid request.
- D. Downgrade every request permanently to the oldest available Claude model
- Staying on the oldest model trades capability for one outdated technique.

