Summary
On GPT-5.6 (Chat Completions API), adding a strict response_format={"type":"json_schema"} appears to prevent prompt
cache writes entirely.
The request succeeds normally (HTTP 200), the schema is clearly processed, and
prompt_tokens_details.cache_write_tokens is still reported — but its value remains 0 on every request, so no
prompt cache is ever created.
The exact same request works correctly with:
response_format={"type":"json_object"}- no
response_format - gpt-5-mini using the same strict schema
According to the Prompt Caching and Structured Outputs documentation, structured output schemas are expected to
participate in prompt caching (or at least schema processing is cached for reuse). The observed GPT-5.6 behavior
therefore appears inconsistent with the documented behavior.
I also observed what may be a separate issue: GPT-5.6 implicit prompt caching appears to write (and bill) the cache
repeatedly without ever reading it.
Environment
- API: OpenAI Chat Completions (
/v1/chat/completions, not Azure) - Models:
gpt-5.6-terra(affected),gpt-5-mini(not affected) - SDK: openai-python 2.41.0
- Tested: 2026-07-13 (JST)
Repro
Two sequential calls, ~3 seconds apart. The system message is ~1.1k tokens of meaningless filler text (identical across
calls, just above the 1,024-token caching minimum); only the short user message differs (test 1 / test 2). Each
pair reuses the same prompt_cache_key. Explicit variants place a breakpoint on the system text block and set
prompt_cache_options to explicit:
client.chat.completions.create(
model="gpt-5.6-terra",
max_completion_tokens=512,
messages=[
{"role": "system", "content": [
{"type": "text", "text": FILLER_1100_TOKENS,
"prompt_cache_breakpoint": {"mode": "explicit"}},
]},
{"role": "user", "content": "test 1"},
],
prompt_cache_key="probe-a",
extra_body={"prompt_cache_options": {"mode": "explicit"}},
# vvv with this present, cache_write_tokens stays 0 vvv
response_format={"type": "json_schema", "json_schema": {
"name": "probe", "strict": True,
"schema": {"type": "object",
"properties": {"ok": {"type": "boolean"}, "note": {"type": "string"}},
"required": ["ok", "note"], "additionalProperties": False}}},
)
Results
Each row = two sequential calls as above. “–” means the cache_write_tokens field does not exist in the usage response
(pre-5.6 models have no write billing).
| # | Model / cache mode | response_format | write (call1 / call2) | cached (call2) | request_id (call1 / call2) |
|---|---|---|---|---|---|
| A | gpt-5.6-terra / explicit | json_schema (strict) | 0 / 0 |
0 |
|
| req_c5dcc811de75404697b700b4d22aa8df / req_613ba628cccc4b5289f301079d13332f | |||||
| B | gpt-5.6-terra / explicit | json_object | 1125 / 0 |
1125 |
req_08cf4645d1ef4cef9253586f54329047 / |
| req_743e4abe926c4d1d9caad54c2d1b08ec | |||||
| C | gpt-5.6-terra / explicit | (none) | 1125 / 0 |
1125 |
req_e837a17a98054ad1abe0724f7617be96 / |
| req_b4e63a71391b43c491e9c7868d7d8679 | |||||
| D | gpt-5-mini / implicit | json_schema (strict) | – / – | 1024 |
req_338b2ecec8fa46e88f8461ef22d92d06 / |
| req_441484809a17431da1dce18738f64f66 | |||||
| E | gpt-5.6-terra / implicit | (none) | 1132 / 1132 |
0 |
req_ad8e1d9569064c51a4c16fbccf73292c / |
| req_d2179dd5ab7d4889a633df4c552d3e2d |
Notes:
- A vs B/C: the only difference is
response_format. With strictjson_schema, prompt cache writes never occur,
even though the schema is clearly processed (prompt_tokens increase by ~32: 1135 → 1167) and the request succeeds
normally. - D: on gpt-5-mini, the same schema coexists with prompt caching as expected. This matches the documented behavior
that structured output schemas are processed once and reused subsequently. - E: this may be unrelated, but GPT-5.6 implicit mode appears to charge cache writes repeatedly
(cache_write_tokens=1132on both sequential calls) without ever reporting cached reads.
Expected behavior
A strict response_format={"type":"json_schema"} should not disable prompt caching on GPT-5.6.
Given an identical cacheable prefix and the same prompt_cache_key, the first request should write the prompt cache and the second request should
If this combination is intentionally unsupported, the API should return a clear error or the limitation should be documented, rather than succeeding
normally while reporting cache_write_tokens=0 for every request.








