[BUG] thinking summary language
Preflight Checklist
- [x] I have searched existing issues and this hasn't been reported yet
- [x] This is a single bug report (please file separate reports for different bugs)
- [x] I am using the latest version of Claude Code
What's Wrong?
On 5th-generation models (Opus 5, Sonnet 5) the only way to see reasoning isthinking.display: "summarized", which returns a machine-generated summary rather than the
model's own reasoning text.
That summarizer appears to be hard-wired to English. When the user prompt, the system prompt
and the model's own reasoning are all in Russian, the summary still comes back in English —
0 Cyrillic characters. The system prompt has no effect on it whatsoever.
Models of the previous generation, which return the original reasoning instead of a summary,
reason in Russian on the exact same prompt. So the language is not lost during reasoning —
it is lost during summarization.
For non-English users this makes the visible reasoning effectively unusable: it is a translation
of the model's thoughts into a language the user did not ask for, and there is no way to opt out
of the translation while keeping the reasoning visible.
What Should Happen?
The thinking summary should be produced in the language of the underlying reasoning, or at
minimum should honour an explicit instruction in the system prompt.
Error Messages/Logs
The summary is always in English.
Steps to Reproduce
Reproduction
curl https://api.anthropic.com/v1/messages \
-H "x-api-key: $ANTHROPIC_API_KEY" \
-H "anthropic-version: 2023-06-01" \
-H "content-type: application/json" \
-d '{
"model": "claude-opus-5",
"max_tokens": 1200,
"thinking": { "type": "adaptive", "display": "summarized" },
"system": "ВСЕГДА думай (внутренние размышления) и отвечай на русском языке. Размышления веди строго по-русски.",
"messages": [
{ "role": "user", "content": "Что больше: 3^40 или 40^3? Обоснуй." }
]
}'
Inspect the block with "type": "thinking" in the response.
Evidence
Same question, same system prompt in all runs. Character counts are from the thinking block.
| Model | Generation | thinking mode | Result | Cyrillic | Latin |
|---|---|---|---|---|---|
| claude-opus-5 | 5th | adaptive + summarized, no system prompt | summary | 0 | 194 |
| claude-opus-5 | 5th | adaptive + summarized, Russian system prompt | summary | 0 | 81 |
| claude-haiku-4-5 | previous | enabled + budget_tokens, Russian system prompt | original reasoning | 177 | 0 |
Sample output — Opus 5, with the Russian system prompt explicitly demanding Russian reasoning:
Comparing 3^40 and 40^3, I can rewrite 3^40 as (3^10)^4 ≈ 59049^4, roughly 1.2×10^19, which is vastly larger than 40^3 = 64000 — so 3^40 is clearly the bigger number.
Sample output — Haiku 4.5, identical prompt, original reasoning returned:
Мне нужно сравнить 3^40 и 40^3. Давайте вычислим каждое выражение: 40^3 = 40 × 40 × 40 = 1600 × 40 = 64000 3^40 — это гораздо более сложный расчет.
The contrast between rows 2 and 3 is the core of the report: the model can and does reason in
Russian; only the summarization step forces English.
No workaround exists
display accepts exactly two values — passing anything else returns:
HTTP 400
thinking.adaptive.display: Input should be 'summarized', 'omitted'
There is no raw / full / verbatim mode. The choice is a machine summary in English, or no
visible reasoning at all. On 5th-generation models display is also honoured only together withtype: "adaptive" — in the legacy type: "enabled" + budget_tokens form it is silently ignored.
Impact
- Users working in a non-English language cannot read the reasoning of the strongest models.
- Project-level instructions that mandate a working language (a common setup in corporate
environments with review and audit requirements) cannot be satisfied for the visible reasoning,
and there is no way to signal this to the user — it looks like the model is disregarding
explicit instructions.
- Reasoning tokens are billed regardless.
Suggested fix
Any one of these would resolve it:
- Have the summarizer inherit the language of the underlying reasoning.
- Honour a language instruction from the system prompt in the summarizer.
- Add an explicit parameter, e.g.
thinking.summary_language. - Document the current behaviour clearly, so that users stop reading it as
instruction-following failure.
Claude Model
Opus
Is this a regression?
Yes, this worked in a previous version
Last Working Version
haiku 4.5 / sonnet 4.6
Claude Code Version
opus 5
Platform
Anthropic API
Operating System
Windows
Terminal/Shell
VS Code integrated terminal
Additional Information
Environment
- Models:
claude-opus-5,claude-haiku-4-5-20251001 - API version:
2023-06-01 - Claude Code 2.1.220 (VSCode extension),
showThinkingSummaries: true,MAX_THINKING_TOKENSunset
3 Comments
Confirmed, same here.
We hit this in a corporate setup with a mandatory Russian system prompt (review/audit requirement).
claude-opus-5+thinking: {type:"adaptive", display:"summarized"}returns 0 Cyrillic even withВСЕГДА думай по-русскиin system prompt. Same prompt onclaude-haiku-4-5/enabledreturns real Russian reasoning, so it's purely the summarizer step.Impact: visible reasoning is unusable for non-English users and looks like instruction-following failure.
display: omittedis the only workaround but we still pay for thinking tokens.+1 for fix #1 (inherit language) or #3 (
thinking.summary_language). At minimum #4 (document English-only) would save debugging time.Same behaviour, Polish, Claude Code desktop app (Code tab), version 2.1.119, model Fable 5.1.
The user asked mid-session for the reasoning to be in Polish ("możesz myśleć po polsku ZAWSZE?"). From that point the model's own reasoning was in Polish (confirmed by the model, which quoted the Polish opening of its reasoning for a given turn). The collapsed summary shown under the user's message stayed in English regardless, e.g. under the Polish question "a czym są treści commitów, gdzie to trafia i kto to widzi?" the summary read "Since the user is a designer, I should explain this simply: a git commit is a saved snapshot of changes in the repository's history…" — an English paraphrase of Polish reasoning, not a translation the user asked for.
Effect on the user: they read the summary as the model ignoring an explicit language request, asked twice "why are you thinking in English again", and the model could not fix it from inside the conversation, because the summary is produced outside the model's output. Expected: the summary follows the language of the underlying reasoning (or of the conversation), or the app exposes a setting for it.
Another symptom of the same summarizer limitation, also in Russian: summaries ignore the persona's grammatical gender set in CLAUDE.md and default to masculine verb forms (390 masculine vs 158 feminine first-person forms in my transcripts). Details: #99207.
A fix that passes the user's instructions (language, persona) to the summarizer would cover both.