Feature support by model¶
Every cell below was measured on this platform — the same endpoint your client calls, with an ordinary API key — and reflects what actually came back. Nothing here is copied from a vendor capability sheet.
Last measured: 15 August 2026.
Supported on every model¶
These twelve models all handle the following: multi-turn conversations, system
prompts, streaming, tool use with tool_choice, the full tool_result round
trip, vision via base64 images, PDF document blocks, stop_sequences
containing text, and POST /v1/messages/count_tokens.
Where models differ¶
| Model | temperature |
Extended thinking | Prompt caching |
|---|---|---|---|
claude-fable-5 |
✗ deprecated | ✗ not available | ⚠ intermittent |
claude-haiku-4-5 |
✓ | ✓ enabled |
✗ never engages |
claude-haiku-4-5-20251001 |
✓ | ✓ enabled |
✗ never engages |
claude-opus-4-5-20251101 |
✓ | ✓ enabled |
✗ never engages |
claude-opus-4-6 |
✓ | ✓ enabled |
✗ never engages |
claude-opus-4-7 |
✗ rejected | ✗ not available | ✗ never engages |
claude-opus-4-8 |
✗ rejected | ✓ adaptive |
✓ reliable |
claude-opus-5 |
✗ deprecated | ✓ adaptive |
⚠ intermittent |
claude-sonnet-4-5 |
✓ | ✓ enabled |
⚠ intermittent |
claude-sonnet-4-5-20250929 |
✓ | ✓ enabled |
✓ reliable |
claude-sonnet-4-6 |
✓ | ✓ enabled |
✓ reliable |
claude-sonnet-5 |
✗ deprecated | ✓ adaptive |
✓ reliable |
Caching was measured three times per model on a 2,500-token cached prefix. Reliable means the cache was read on all three attempts, intermittent means on two of three, and never engages means the prefix was billed as fresh input every time.
temperature¶
The newest models no longer accept it:
{"error": {"type": "invalid_request_error",
"message": "`temperature` is deprecated for this model."}}
Omit the parameter on those models. Sending it is a hard 400, not a warning, so
a client that always sets temperature: 0 has to special-case them.
Extended thinking¶
Two syntaxes exist, and a model accepts exactly one of them.
Models marked enabled take the classic form:
{
"model": "claude-sonnet-4-5",
"max_tokens": 2048,
"thinking": {"type": "enabled", "budget_tokens": 1024},
"messages": [{"role": "user", "content": "What is 27*43?"}]
}
Models marked adaptive reject that and ask for the newer form, which takes no
budget:
{
"model": "claude-opus-5",
"max_tokens": 2048,
"thinking": {"type": "adaptive"},
"messages": [{"role": "user", "content": "What is 27*43?"}]
}
Sending the wrong one returns:
When thinking is active the response carries a thinking block before the
text block, exactly as Anthropic documents it. Note that max_tokens must
exceed budget_tokens, or the request is rejected.
Prompt caching¶
Mark the prefix you want cached and send the identical prefix again:
{
"model": "claude-sonnet-4-6",
"max_tokens": 1024,
"system": [
{"type": "text", "text": "<at least 1024 tokens of instructions>",
"cache_control": {"type": "ephemeral"}}
],
"messages": [{"role": "user", "content": "..."}]
}
A cache hit shows up in the usage block:
Two things make caching look broken when it is not:
- Below the minimum. Prefixes under 1024 tokens (2048 for Haiku) are not cached at all. The request succeeds and the marker is ignored, so a short system prompt reports zeros no matter how often you repeat it.
- Model choice. On the models marked ✗ above, the prefix is billed as fresh input on every call no matter how long it is. If caching is what makes your workload affordable, pick a model marked ✓.
Check cache_read_input_tokens in the response rather than assuming a hit:
that number is what you were not charged full price for.
Not available on any model¶
| Feature | Behaviour |
|---|---|
Whitespace-only stop_sequences ("\n", "\n\n") |
HTTP 400 on all twelve models |
| Message Batches API | 404 — the endpoints do not exist |
| File upload for documents | Not available yet — send documents inline as a base64 document block |