Skip to main content
Send a different reasoning_effort (Chat Completions) or reasoning.effort (Responses) on any request, and Phaseo changes Claude’s effort without restarting its prompt cache. You don’t change anything else in your code, as long as you send Claude’s reasoning back unchanged on every request. Phaseo keeps sending Claude the effort of your conversation’s first request and adds each change as an effort marker after your new message. Everything before the marker stays the same, so Claude reads it from cache. If you drop the reasoning, Phaseo changes the top-level effort instead, and Claude processes everything from its first reply onward again instead of reading it from cache.

How Phaseo keeps the cache

Claude reads a cached conversation only when the start of the request is byte-for-byte the same, and the top-level effort is part of that start. Anthropic’s per-message effort changes the level inside messages instead, with a system message that has empty content and an output_config.effort. Phaseo writes those markers for you: Phaseo stores nothing between requests. Each Claude reply ends with one reasoning entry that records the level it ran at, and Phaseo rebuilds every earlier marker, in the same place, from the entries you send back: Messages you send back are never changed. The markers exist only in the request Phaseo sends Claude.

Send reasoning back unchanged

Send every reasoning entry back exactly as you received it, on every request: Chat reasoning_details, Responses reasoning items and Anthropic thinking blocks, encrypted or not. Don’t drop, edit, reorder or summarise them. Without them, an effort change restarts Claude’s cache, and Claude loses its reasoning between tool-loop steps.
The effort entry has no text. On Chat Completions it is the last reasoning.encrypted entry in reasoning_details:
On Responses it is the last reasoning item in output, with an id that starts with rs_effort_:
The value is opaque, and Phaseo removes it before the conversation reaches any provider.

Change effort in your code

Append Claude’s whole reply to your conversation, then set the effort you want on the next request. The top-level cache_control turns on caching for Claude routes; see Prompt Caching.

Chat Completions

Responses

Phaseo doesn’t store responses, so send the whole conversation in input, including every output item.

Anthropic Messages

On /v1/messages, send the marker yourself: a system message with empty content and output_config.effort. Keep the top-level output_config.effort the same on every request, and keep each marker in place on later requests. Phaseo adds the mid-conversation-output-config-2026-07-01 beta header, so you don’t send it.
cURL
Where the marker sits decides when the new level starts:
  • Directly after a user message: Claude’s reply to that message uses the new level.
  • Anywhere else, such as between Claude’s reply and your next message as above: the new level starts at your next message.
A user message that holds only tool results doesn’t count as a new message. On routes without per-message effort, Phaseo removes the markers and sends the level in force as the top-level effort.

When the change restarts the cache

Phaseo changes the top-level effort, as it does for other providers, when:
  • The reasoning is missing. Your latest Claude reply has no effort entry, because your client dropped reasoning_details or reasoning items.
  • The change comes between tool-loop steps. Your latest message holds only tool results, so a marker would apply only from your next message. Phaseo changes the top-level effort so this step runs at the level you asked for, and later changes use markers again.
  • The request sets no effort, or turns reasoning off. Send reasoning_effort or reasoning.effort on every request. "none" and reasoning.enabled: false turn reasoning off.
  • The route doesn’t support it. See Supported models.
A top-level change keeps the part of the conversation before Claude’s first reply in the cache. Claude processes everything from that reply onward again, and bills it as new input.

Supported models

On every other route, including Claude on Azure, an effort change goes to the top level.

Check that the cache held

Read the cache counts on the request after a change: usage.prompt_tokens_details.cached_tokens on Chat Completions, usage.input_tokens_details.cached_tokens on Responses and usage.cache_read_input_tokens on Anthropic Messages. Usage and pricing fields lists every field. We measured the same five-request Chat Completions conversation on anthropic/claude-haiku-5.5 on 11 November 2026, once with the effort entries sent back and once without them. Effort was high, high, low, low, high, and a 3,400-token document arrived in the second message:
Last modified on November 12, 2026