It appears you are not growing a conversation at turn 3 and after based on #1 or #2. The input is smaller.
- The new cache method does not consider partial matches, and is degraded from that prior behavior with “memory” on gpt 5.4 and before.
Turn 3 might be seen as a “new chat” with its complete store “write”, but then the remainder of turns would need to be building on that. If indeed the turns 4-6 are you continuing chatting with unaltered earlier context, then the cache miss on 4 and after is a failure of the API if within the 30+ minute promise.
e.g. You made something where the complete larger size of input from turn 1 or turn 2 cannot be matched = no cache hit whatsoever.
The way that you might stop some of the mandatory overbilling on this convoluted scheme is to insert an explicit cache breakpoint on only the first developer message - or a repeated message branch point which is over 1024 tokens.
In implicit mode, the breakpoint on the latest message uses one write slot, so up to the latest three explicit breakpoints can be written.
This is ambiguous, though. Does it mean that even though you set “explicit” on a turn, the remainder up to the end is a total “implicit” and you only cost yourself more with an additional write? "prompt_cache_options": {"mode": "explicit"} would seem to turn writing off unless you use “explicit then on turns”. You can use “explicit” on multiple turns - Can multiple explicit stores again send the value of “cache_write_tokens” above the actual “input_tokens”?
This would be what you want to do also on a call you do not intend for “chat”: set “explicit” early where it cannot be cached and doesn’t produce a cache write - and the API will behave in some manner and actually stop the overbilling of cache you will never use. A “foundation” cache write (or simply a minimal-cost mostly-off switch) might look like
{
"model": "gpt-5.6-luna",
"prompt_cache_key": "system_message_12_only",
"prompt_cache_options": {
"mode": "explicit",
"ttl": "30m",
},
"input": [
{
"type": "message",
"role": "developer",
"content": [
{
"type": "input_text",
"text": "You are ChatPro. Follow these instructions:\n\n{prompt}",
"prompt_cache_breakpoint": {
"mode": "explicit"
}
},
{
"type": "input_text",
"text": "Produce a summary of this text pasted below..."
}
]
}
]
}
I might experiment a bit. Because otherwise, this whole scheme is anti-developer, who does not “chat” but produces on-demand 0-shot language products.
Commentary: the whole billing scheme is extremely stupid. Retrieving data back into a GPU was a 90% cost savings for us and OpenAI, but moving it out to GPU-local memory programmatically without inference cost is billed so much more. I don’t think so.
(Note: Also see vibe-coded “cache” documentation where the sympomatic AI models now cannot understand the purpose or speakers, where a user message in an example is the user saying, “Answer the current question.”), and they also use a model id “gpt-5.6” not offered on the models endpoint.