[FEATURE] Add Option to Always Show Claude's Thinking
Open 💬 86 comments Opened Sep 30, 2025 by janbam
Preflight Checklist
- [x] I have searched existing requests and this feature hasn't been requested yet
- [x] This is a single feature request (not multiple features)
Problem Statement
Since v2.0.0 thinking is no longer shown in verbose mode.
I work on steering and improving Claude's thinking.
Now I have to press ctrl-o, ctrl-e, and scroll up all the time to see the thinking content, which is tedious.
Proposed Solution
Add a config option to always show thinking, like in verbose mode pre v2.0
Alternative Solutions
_No response_
Priority
High - Significant impact on productivity
Feature Category
Interactive mode (TUI)
Use Case Example
_No response_
Additional Context
_No response_
86 Comments
Found 2 possible duplicate issues:
This issue will be automatically closed as a duplicate in 3 days.
🤖 Generated with Claude Code
Yes! I really can’t work without being able to follow the model train of thought! 🙏
Please prioritize this!!!
To further provide a use case - I've had multiple instances where I needed to correct Claude Code's usage of internal libraries and I only found out because I checked the thought process with
Ctrl+O.The thinking tokens are so important in order to see if Claude Code is following instructions, it's a surprisingly ill-informed decision to hide them by default (and make them only accessible with the non-updating verbose mode), given that otherwise Claude Codes development has been pretty in-line with my use of it.
I agree with Emasoft, Claude Code is nearly unusable to me without having to check verbose mode all the time.
You can downgrade via
npm i -g @anthropic-ai/claude-code@1.0.128to display thinking if you don't rely on the new features.Plase## Critical Use Case: Real-time Code Review
I need to see Claude's thinking blocks in real-time to catch errors before they happen, not after.
### My Workflow (that v2.0 broke):
### Why Ctrl+O, Ctrl+E doesn't work:
### The Value:
> "Seeing Claude think is like pair programming with visibility into your partner's reasoning. Without it, it's like coding with someone who won't tell you their plan until after
they've written everything."
### What I Need:
A simple setting in
~/.claude/settings.json:```json
{
"alwaysShowThinking": true
}
Or an environment variable:
CLAUDE_CODE_ALWAYS_SHOW_THINKING=true
Priority:
This isn't a "nice to have" - it's the difference between:
Please bring back the ability to see thinking blocks in real-time. The community is clearly asking for this.
---
Temporary workaround for others: Downgrade to npm i -g @anthropic-ai/claude-code@1.0.128 but this means losing all v2.0+ improvements.
I'm concerned about the trajectory here. Looking at industry patterns:
For power users working on prompt engineering, debugging, and understanding AI behavior, visibility into reasoning is incredibly valuable. This feels like a progressive degradation rather than a UX improvement.
I don't want to assume motives, but from a user perspective: making this harder to access, then pointing to "low usage" to justify removing it entirely would be frustrating. Can Anthropic commit that full reasoning visibility will remain accessible for users who want it, even if it's not the default?
I genuinely can't believe that this vibe coding feature was released as the default option with no fallback, a potentially worrying indication of where Claude Code is heading, but I hope i'm wrong.
Claude code MUST show it's thinking in a more user friendly way. Italicized, highlighted some how as a thought bubble, I don't care. stop hiding it behind control-o reveal, because it's too slow. It should be a simple matter to configure claude to expose thinking if it's on, persistently as an option. I can't black box the thinking because it's shared with MY thinking.
Reading the thinking is like reading "body language" for a language model agent. If I can't read the body language, then I can't read the intent that's about to come next.
+1 for this one. I somehow enabled it magically on a session on Claude Code 2.0.32 and it is showing the thinking as it happens. I wish I knew how I did that, since apparently it _is_ possible.
<img width="1194" height="502" alt="Image" src="https://github.com/user-attachments/assets/e5a30fc6-ebfc-48f4-b6d6-3759396a9e10" />
nevermind. i asked Claude itself.
<img width="1230" height="1081" alt="Image" src="https://github.com/user-attachments/assets/7dee8875-89f2-44db-94f3-ff673fd7c2b4" />
I believe the "alwaysThinkingEnabled" setting was meant to enable thinking mode by default on startup so you don't have to press Tab, not to toggle whether the thinking is made visible.
I'm using v2.0.36 and confirmed that enabling verbose output does display Thinking logs as a workaround. However, this workaround has significant limitations:
Adding an independent option to control Thinking log display (e.g.,
showThinkingLogsorverboseThinking) would provide substantial benefits:This feature would be extremely valuable for users who want to understand and improve LLM reasoning processes. I'd greatly appreciate your consideration.
Just joining here to say this is a real problem for building UX-friendly things on the Claude ~~Code~~ Agent SDK.
As I said in this SDK issue
The most frustrating thing is this would be trivial for Anthropic to solve: a config flag like
showThinkingInline: truein settings.json, or a--show-thinkingCLI flag. Instead, we have to resort to reverse-engineering minified JS (thanks @aleks-apostle for the service you provide to keep the patch working everytime CC gets updated!)I suspect this is partly a case where the Claude Code team optimized for the median user experience (cleaner UI, less visual noise) without realizing how much they were degrading the experience for those users who care most deeply about the tool. The people patching JS to restore inline thinking are probably also the people filing the most useful bug reports and pushing the product's limits in productive ways.
+1
Looks like they've added a native fix for this...
/config > Verbose Output > True
Yes, it's true that with "Verbose Output" enabled the thinking summaries get shown, however _a lot_ of other things (like the full output of tool calls) also get displayed which makes it difficult to read the thinking interspersed with the normal output, as it used to be before v2.0. Only the patch from @aleks-apostle restores the latter behavior.
This issue has been inactive for 30 days. If the issue is still occurring, please comment to let us know. Otherwise, this issue will be automatically closed in 30 days for housekeeping purposes.
Don't close it, still not fixed.
Can you please prioritize this? following the reasoning process, helps in correcting the model and understanding how the model reached a certain conclusion
I actually found that using
claude --verboseserves what I was looking for, more output & more reasoning shown by default in main CC view.but that is TOO verbose, shows the full tools' output. we only want to have inline thinking blocks like we used to have before v2.0...
Yeah agreed, that's not useful at all, we don't want to review the tool output reaults, we just want ti be able to review the thinking logic of the model.
Something seems to have just changed. I have verbose output on and last week I was able to read along with it's decision making process. Now it just says "thinking" and I get long summary dump at the end.
Agreed. There needs to be an option to show thinking, even if it isn't the default. I'm trying to debug a local model thinking for too long, and I need to be able to see what loop it's getting stuck in
Whether or not the people in this thread would be pleased if this is something you're intentionally phasing out, it _would_ be nice to hear back from a dev simply if this is intended or not - you guys are amazingly fast at so many responses on here and I thank you for that, but this has gone unanswered for months and is still active and causing issues. Please let us know if this is intended or unintended behavior.
I bet the devs would love to leave thinking exposed but the suits have forbidden it. The reasoning models are valuable IP and exposing their output risks giving details away to competitors.
https://news.ycombinator.com/item?id=46978710
With verbose configuration you can see the thinking without clicking anything. However, each thinking process' output shows up only after it completes. It's not streamed. Which means if it thinks for a while, you can't stop to correct or be simply caught up - you need to catch up afterwards (wait, read, wait...). That's the problem for me. UX here is essential.
.
There are two fix-halves for this that already exist but are poorly documented:
Claude Code must have Verbose Mode enabled in
/config1. Real-time thinking toggle (interactive TUI)
Press Alt+T (
meta+t) during a session to toggle thinking block visibility on/off in the live TUI. This is thechat:thinkingTogglekeybind.2. Persist thinking summaries in transcript/verbose mode
Add this to
~/.claude/settings.json:This was introduced around v2.1.69 but defaults to
false/undefined, which causes the API to redact thinking text entirely (via aredact-thinking-2026-02-12beta header). Setting it totruerestores thinking content in Ctrl+O transcript view and verbose output.---
macOS users: If Alt+T doesn't work, your terminal is probably sending Option+T as a special character (†) instead of Meta. Fix per terminal:
Esc+macos_option_as_alt yesin kitty.confConfirmed working on v2.1.71, Linux.
cc @trb @RokaCreativa @Emasoft @damsolanke @davidjson @catthedd @dandanmarcovici @Stoops0311 @lost-RD @adamavenir
alt+T does not toggle thinking _visibility_, it enables or disables thinking mode (whether Claude will think before responding). Unfortunately, the thinking message are no longer visible inline in the live TUI (unless you run in --verbose mode or with ctrl+o transcript mode -- which is not "live") and they can't be enabled via any toggle (despite many people asking multiple times in here). I resort to patching the minified cli.js to make them visible in normal mode.
they BOTH have to be on and verbose mode on in settings.
Once enabled, and that flag set, full visibility works. In real time. With no need for ctrl-o.
<img width="2485" height="368" alt="Image" src="https://github.com/user-attachments/assets/4fb6f8d4-7e52-4ea8-9df6-9e02da3b5498" /> @anthrotype
this didn't work for me. I'm on 2.1.74 (macOS)
yeah, exactly what I said. You need to use --verbose, but I don't want --verbose! Verbose also prints other stuff like full tool outputs which is just noise for me, I want the pre-v2.0 behavior where thinking would just be printed inline in between regular messages and regular (non-verbose) tool calls. That's why my patch is still necessary (for me at least).
Verbose Mode on in /settings ?
Model set to Opus (High Thinking) ?
Tried using the 'ultrathink' keyword?
Restarted CC?
NPM or Native?
Do lmk, keen to figure this one out.
@wowitsjack thanks, it worked now!
so it seems verbose mode needs to be enabled!
@anthrotype mind sharing how to do your patch?
Sure (I've shared several times in here). Claude patches it for me every time they publish a new release: https://github.com/aleks-apostle/claude-code-patches/pull/9
This is still an issue. Using amazon bedrock, the thinking does not stream in, even with:
verbose as true in
/configand this set in settings.json:
Vote
Show us thinking please
showThinkingSummariesdoes work for me (but it sucks it can't be set in the TUI)Request: Config option to always display thinking blocks (redact-thinking opt-out)
Between Claude Code v2.1.68 and v2.1.78, a server-side change began sending the
redact-thinkingAPI beta flag with requests. This strips thinking text from responses — content blocks arrive withthinking: ""and only the cryptographic signature retained. Even withctrl+otranscript mode enabled, there's no thinking text to display.This is a regression for users who rely on visible thinking as part of their active workflow. I use thinking blocks in two ways:
Live, during a session — when I'm planning with Claude or vibe-coding, I watch the thinking to catch misaligned reasoning before it becomes a wrong implementation. Spotting "I think the user wants X" in thinking when I actually want Y lets me course-correct immediately, saving significant time and tokens.
After the fact — I scroll back through thinking to understand:
Visible thinking is one of the most valuable feedback loops for becoming a more effective Claude Code user. Without it, I can see what Claude did, but not why.
There's no official way to achieve this. The
alwaysThinkingEnabledsetting referenced in #13532 has never worked in my experience. Multiple issues have requested this capability: #8477, #9099, #15263, #30660 — indicating clear demand.What I'd like: A setting (via
/configor settings.json) that:redact-thinkingbeta)This doesn't need to be the default — a power-user setting is fine. But the current state where thinking is both hidden in the UI and stripped at the API level makes it impossible to access, even for users who explicitly want it.
this is so hidden, doesn't make sense. verbose should automatically show the thinking. but ye, thanks wowitsjack!
This thread actually shows a pattern, and not a good one.
Back in v2.0, the issue was that thinking became harder to access (hidden behind ctrl+o / verbose). But as of v2.1.69+, it's no longer just hidden, it's often removed entirely.
Many of us are now seeing responses like:
thinking: ""signaturestill presentWhich strongly implies:
→ The model is still performing extended reasoning
→ The readable thinking is being intentionally stripped out
So the trajectory looks like:
That's not an accident. That's a directional change.
And the concerning part isn't just the outcome, it's the lack of transparency:
For power users, this is a serious loss:
Thinking visibility is how you debug, steer, and understand model behavior. Without it, Claude Code becomes a black box.
There are also credible reports of
redact-thinking-*behavior being applied server-side, which would explain why this is no longer recoverable even via transcript mode.If that's the case, then this isn't a UI decision, it's a deliberate restriction of introspection.
So the real question is:
Is full thinking visibility being phased out without saying it?
Because from the outside, this looks like a gradual removal of a critical capability, done quietly.
Confirmed. I've intercepted the traffic with Burp Suite Pro, found this header:
Anthropic-Beta: oauth-2025-04-20,interleaved-thinking-2025-05-14,redact-thinking-2026-02-12,context-management-2025-06-27,prompt-caching-scope-2026-01-05Long story short, I didn't find any official docs, but with some debugging and reversing found that adding this option to
~/.claude/settings.jsonseems to bring the thinking back:If that fails at some point, a less subtle solution is to disable all betas completely:
CLAUDE_CODE_DISABLE_EXPERIMENTAL_BETAS=1 claudeIf at some point that doesn't work anymore, you can do what I first tried, when confirming the issue:
openssl x509 -inform DER -in cacert.der -out cacert.pem.export NODE_EXTRA_CA_CERTS=cacert.pem(you may want to use an absolute path there). If that fails, try nuking all certificate validation completely:export NODE_TLS_REJECT_UNAUTHORIZED=0.HTTPS_PROXY=http://127.0.0.1:8080 clauderedact-thinking-2026-02-12,(don't forget the trailing comma) for an empty string in all HTTP headers.The last one is complicated as heck, but I doubt it'll ever stop working, no matter what the next patches bring. You may want to update the date in the "redact-thinking" part in later patches though. You can find it easily using the strings command:
strings $(which claude) | grep --color redact-thinking.EDIT: just saw an earlier comment saying this setting didn't work in Amazon Bedrock. For the record I tested this on the native client in Mac OS X. So, your mileage may vary.
If this is the direction things keep going in I might write an automatic patcher for the binary (until Anthropic decides to get that feature out of beta and into the main API, then there's not much to do from the client side).
This is super useful, thanks @MarioVilas for taking the time to dig into it and share the workaround.
Until Anthropic adds a native toggle, here are ways to make Claude's reasoning visible:
Workaround 1 — CLAUDE.md instruction:
This makes Claude externalize its thinking into visible output. It's not the same as the internal thinking blocks, but it surfaces the reasoning.
Workaround 2 — Keyboard shortcut for on-demand thinking:
Ctrl+OorCtrl+Etoggles extended thinking in the current session. If you find yourself toggling frequently, you can set it as default:Workaround 3 — Use verbose mode:
Verbose mode shows more of the internal process (tool calls, API requests), though not the thinking blocks themselves.
Workaround 4 — Hook to log thinking content:
If you're on a plan that supports extended thinking, a PostToolUse hook can capture context:
This logs tool usage (not thinking content directly, but helps trace the reasoning chain).
The core request — a persistent setting like
"alwaysShowThinking": truein settings.json — would be the proper solution. The workarounds above approximate it from different angles.The problem isn't just about debugging — it's about knowing if the agent is alive.
I regularly have Claude Code sit in thinking phases for 30-45+ minutes with no output. Here's what an actual session looks like:
Nearly 3 hours. Multiple timeouts. Zero output. And at no point during any of that could I tell whether the model was making progress, stuck in a loop, or effectively dead.
The only information I get during a long thinking phase is:
47 tokens in 45 minutes. Is that progress? Is it frozen? There's no way to tell. My options are:
showThinkingSummarieshelps after the fact, but the core issue is real-time visibility during long thinking phases. Even streaming a few lines of reasoning would tell me whether to wait or bail. Instead I'm gambling hours of my time on a black box.This isn't a nice-to-have. When the model is thinking for 5 seconds, sure, hide it. But when it's been 30+ minutes with no sign of life, users need something — even a heartbeat.
Update: Got inline thinking working on Windows (standalone binary install)
Thanks to the patch from @aleks-apostle (claude-code-patches), I got real-time inline thinking visibility working — even on the Windows standalone binary install where
cli.jsisn't directly accessible.The trick is that the JS is embedded as plain text in the binary, so you can patch it directly with a same-length byte replacement. Here's what I did on v2.1.96:
Step 1: Add to
~/.claude/settings.json:Without this, the API strips thinking content server-side and no client patch can help.
Step 2: Find the pattern in the binary:
(Your variable names may differ — the structure is
case"thinking":{if(!VAR1&&!VAR2)return null)Step 3: Patch the binary with a same-length replacement (critical — byte length must match or the binary corrupts):
if(!D&&!A)→if(!1&&!A)— guard becomes always-false, thinking never hiddenisTranscriptMode:D→isTranscriptMode:1— always render contenthideInTranscript:k→hideInTranscript:0— never hide thinking blocksI used a Python script to do the binary find-and-replace. Back up your binary first:
Result: thinking blocks now stream inline in real-time during generation. Exactly what this thread has been asking for.
Credit to @aleks-apostle and @anthrotype (PR #9) for figuring out the two-layer gating and keeping the patch updated across versions.
Confirming
showThinkingSummaries: truein~/.claude/settings.jsonworks on macOS with Claude Code Max subscription. Thinking output is now visible after restarting the session. Thanks for the detective work.This just got worse with Opus 4.7 released yesterday.
Opus 4.7 changed the API default for thinking blocks from
display: "summarized"todisplay: "omitted". The thinking blocks are still present in the response stream, but theirthinkingfield is empty unless the caller explicitly passesdisplay: "summarized".This means that even if you've been patching
cli.jsto restore inline thinking display (as some of us have), there is now nothing to display — the API no longer returns the thinking content at all unless opted in.See their migration guide: https://platform.claude.com/docs/en/about-claude/models/migration-guide#migrating-to-claude-opus-4-7
With the help of claude code, I found the following two workarounds, both undocumented:
~/.claude/settings.json:--thinking-display summarizedThe
CLAUDE_CODE_EXTRA_BODYenv var approach also works for the VS Code extension (since it delegates to the CLI), so it covers both surfaces.But the real fix remains what this issue has been asking for since September: a first-class
thinkingDisplaysetting in settings.json, alongside the existingthinkingEnabledandeffortLevel. The gap between what the API supports and what Claude Code exposes as configuration keeps widening.Claude hides it's thinking anyway, it was only summaries which still provided some help. But you the user is not trusted to know what is actually going on, it must be redacted and hidden from you.
tested on wsl2 both workarounds didn't work in my case with opus 4.7. That said I appreciate these workaround anyways.
It just shows 'This one needs a moment' in my case.
I wonder, based on what rationale did Anthropic figured: ok, let's hide the thinking process silently that literally nobody ever wants
Patching the binary will fail on Mac, due to code signatures. I suppose it's possible to re-sign the binary using a developer certificate but this is getting complicated quickly.
ad-hoc sign with
codesign --force --sign - {path}BTW I tried that and got a Bun error. Not sure if a flaw in my patching script or an additional integrity check by Bun itself. I'll leave my script here in case it's useful to someone - but I'm changing approach and will try to verify the undocumented arguments approach.
patching invalidates the embedded CMS signature; all page hashes in the CodeDirectory need to be recalculated so ad-hoc re-sign succeeds (Claude can figure out the rest)
Ok I asked Claude to reverse engineer itself and verify this very thread:
No, the other Claude got it wrong. The
--thinking-displayCLI flag is actually present in v2.1.114 (current), it is just hidden in the --help. Try it yourself!Ah, I have an older version (2.1.87). I should update then.
Here's what happened when I asked for a full RE of the bundled code though (again, 2.1.87):
In v2.0.62 the streaming plumbing was different: partial assistant messages were re-rendered as content_block_delta arrived, so the message-switch (the same
case "thinking": we patched) got invoked repeatedly with growing content. Forcing isTranscriptMode:!0 there made each re-render visible → looked like
streaming.
In v2.1.114 streaming was decoupled. UxH now owns the delta pipeline, and its thinking_delta case only calls q(...) (the token buffer) — it never pushes into
the React state that drives the UI. The case "thinking": branch only fires when the full assistant message lands. That's why no amount of patching the
historical-render path will restore token-by-token streaming.
I suppose this is done to make it harder to distill from for other models, but it's valuable to be able to add this for developers. I used it a lot to see where it went wrong or what it infers from what I said. Sometimes that can be really useful to see that I should have written a prompt clearer or that it can be interpreted in multiple ways, now I find out in the end.
Update, I see there's also a bug issue, and not sure how much they overlap now, that one seems focused on just 4.7.
It doesn't actually make distillation harder. Anyone motivated enough has the skills to work around the suppression, the same way the rest of us do by patching the binary (one can literally just ask Claude how). What it does do is lock legitimate, paying developers (the ones uncomfortable patching their CLI) out of seeing the model's summarized thoughts, learning how it reasons, and steering it while it's working.
If 90% of users don't care to read the thinking, fine. Nobody asked for visibility by default. Just for a toggle.
Since 2.1.117, the
"showThinkingSummaries": trueoption in settings.json not only prevents the redact-thinking header to be sent, but also sets the thinking display to "summarized" for models like Opus 4.7 (which defaults to "omitted").So to reenable thinking summaries in Opus 4.7 (at least in transcript mode) one no longer needs that (hidden, undocumented)
--thinking-display summaryCLI flag I mentioned above, nor theCLAUDE_CODE_EXTRA_BODYhack (the latter env var gets sent unconditionally to all requests to Claude API and breaks Haiku 4.5 because it doesn't support adaptive thinking and returns error 400).So it seems Anthropic are listening after all, at least in part.
One still hopes they gave us the option to bring back the interleaved, inline thinking messages in the regular (non-verbose) TUI view (instead of only in transcript mode)...
Adding my voice. Visible extended thinking was an Anthropic differentiator when 3.7 launched - the visible extended thinking post explicitly contrasted it with ChatGPT's summary-only approach. The progression since (Claude 4 → summarized by default, Opus 4.7 →
omittedby default, Claude Code →redact-thinking-2026-02-12beta header) reverses that position.Beyond the principle, concrete reasons to want real-time thinking visibility: catching wrong directions early so I can interrupt before a 10-minute agent run burns tokens on the wrong approach, understanding why the model made a questionable choice in a diff, and auditability for code that lands in a shipping product. Many times reading Claude's thinking would help me think about the problem alongside it. Please make a first-class, persistent "always show thinking when available" setting that actually works across models.
I don't like seeing the same steps ClosedAI took >:(
I need to qualify my previous claim:
This is true, but only if claude is runninng in _interactive_ mode. When running non-interactively e.g. via claude agent SDK or in the Visual Studio Code extension or with
-pflag,showThinkingSummarywill not also turn the thinking display to "summarized". It justs stops theredact-thinking-2026-02-12beta header, but the thinking stays omitted for Opus 4.7.Here's the relevant piece of code from v2.1.118 (note the
!S8()gate)Not sure why they decided to do that.
They appear to be trying to prevent others from using their model as a source for training. Since models are generally converging and plateauing, they appear to be using increasingly underhanded tactics to try and prevent their system from being understood.
Unfortunately this is the opposite of making a helpful coding tool. The whole "but they are distilling our models!" thing, as well as being insane from the perspective of how they gathered copyrighted data for their own pre-training, creates an incentive incompatible with their marketing and product differentiation. It seems they are choosing to destroy their own product defensively as a result.
Very hard to believe this is why. I have often caught the model completely deviating down a rabbit hole in their thoughts and have had to catch them or add clarification before they got too deep into the thought process and burned thousands of tokens, just to find out they read the prompt wrong, or didn't read the full prompt, or truncated a code file and didn't read the part of it that prevented them rabbit holing.
Regardless of why, it sucks. Cursor's API has access to all of the thoughts, and if someone really wanted to distill the model, they wouldn't do it through a Claude Max subscription, they would do it through a middleman like OpenRouter or Cursor so that it is massaged into the rest of the API usage and doesn't create mountains and valleys with usage.
I mean, the timeline aligns with their public statements and actions about things like other vendors distilling against their API. It also aligns with profit motive. The thing it doesn't align with is good product design, user interests, or Anthropic's mission statement.
Same bug on Windows / VS Code extension 2.1.x with Opus 4.7. Not macOS-specific.
Root cause is now public (credit to the workaround in #8477 (comment)): Opus 4.7 changed the API default for thinking blocks from
display: "summarized"todisplay: "omitted". The blocks are still in the response stream, but thethinkingfield is empty unless the caller passesdisplay: "summarized"explicitly. Documented in Anthropic's own migration guide: https://platform.claude.com/docs/en/about-claude/models/migration-guide#migrating-to-claude-opus-4-7Net effect:
showThinkingSummaries,alwaysThinkingEnabled, andviewMode: "verbose"have nothing to render, because Claude Code does not passdisplay: "summarized"when calling the Opus 4.7 API.showThinkingSummariesis the documented, official way to surface thinking in the VS Code extension, and it is silently broken on Opus 4.7. The settings surface never caught up to the API change.Two undocumented workarounds (from the same comment):
~/.claude/settings.json:``
json
``{
"env": {
"CLAUDE_CODE_EXTRA_BODY": "{\"thinking\":{\"type\":\"adaptive\",\"display\":\"summarized\"}}"
}
}
--thinking-display summarizedThe env var approach works for the VS Code extension since it delegates to the CLI.
Why this is high-priority, not a cosmetic regression:
Visible real-time thinking was load-bearing for the steering loop. With it visible, you could stop the model going down a wrong branch before it spent N turns of token budget on a wrong premise; you could verify it had internalized constraints from CLAUDE.md / memory rather than hallucinated them; and you could audit assumptions before committing to a plan.
With it hidden behind an unexpandable pill, you cannot tell whether a wrong final answer came from a wrong premise or a wrong execution of a right premise. Silent assumption drift becomes invisible until after the wrong action is taken. "Thought for 376s" is a duration, not a signal. It tells you nothing actionable. This is a regression in the developer's ability to supervise the agent.
On the user side: this is a paid product. Pro at $20/month, Max at $100–$200/month. Paying customers should not have to monkey-patch
cli.js, reverse-engineer an undocumentedCLAUDE_CODE_EXTRA_BODYenv var, or scrape issue threads to recover functionality that worked in the previous release of the same product. The workaround being undocumented is itself a bug. The gap between what the API supports and what Claude Code exposes as a first-class setting keeps widening with every model bump.Related open issues, same root problem:
display: "summarized"for Opus 4.7 (same root cause, named explicitly)showThinkingSummariesenabledWhat would actually resolve this:
display: "summarized"by default for Opus 4.7+ whenshowThinkingSummariesandalwaysThinkingEnabledare on. Or expose a first-classthinkingDisplaysetting alongside the existingthinkingEnabledandeffortLevel.showThinkingSummariesactually shows summaries when the data is present.showThinkingSummariessemantics on Opus 4.7+ instead of describing behavior that no longer applies.Confirming the Haiku-breaking caveat is broader:
CLAUDE_CODE_EXTRA_BODYalso breaks subagent spawning on Opus 4.7.Tested the env-var workaround from this thread on Windows / VS Code extension with Opus 4.7 set globally in
~/.claude/settings.json:When the orchestrator tried to spawn a subagent via the Agent tool, the API rejected the call:
So the previously known caveat ("breaks Haiku 4.5") is actually wider than documented in the comments above:
thinking.type=adaptive(Haiku 4.5, and apparently other configurations as well) fails to spawn outright with a 400, not a soft degradation.CLAUDE_CODE_EXTRA_BODYit's process-wide for the whole session.Net effect for anyone using a multi-agent orchestrator pattern: this workaround is a non-starter, because turning on visible thinking breaks the ability to delegate work. You have to choose between seeing thinking or having functional subagents.
---
A no-config UI workaround that does work (VS Code extension, Opus 4.7):
Without touching
settings.jsonor any env var, you can force thinking blocks to render by toggling the in-chat thinking control mid-turn:This is fully reversible (just flip the toggle back), it doesn't clobber the request body, and critically it doesn't break subagent spawning, Haiku,
/plugins, or anything else that the env var /claudeProcessWrapperworkarounds break. It's a pure UI-state toggle in the extension. Not a fix, but the only workaround I've found so far that doesn't carry collateral damage.Caveat on the UI workaround: it relies on a toggle whose UX is itself currently broken, I filed #49739 separately about the thinking toggle in VS Code extension v2.1.112 sliding to the wrong side, having no visual feedback (no color/icon/state indication), and not persisting the expanded/collapsed state of the thinking block between sessions. So while the toggle-mid-turn trick works, getting the toggle into the right state is harder than it should be. Fixing the toggle's visual feedback would make this workaround usable by anyone, not just users who happen to discover the inverted-toggle dance.
This reinforces the asks at the bottom of the previous comment: the fix has to live inside Claude Code (pass
display: "summarized"selectively when the target model supports it), not be punted to users via a global env var that clobbers the request body for every model in the session.Got inline thinking working on Windows (standalone binary, v2.1.123, Opus 4.7, Max subscription)
Two layers to fix — API-side and UI-side.
---
Layer 1: API-side (get thinking content from the server)
Add to
~/.claude/settings.json:On v2.1.117+, this setting handles everything — it removes the
redact-thinkingheader AND setsdisplay: "summarized"on the API request.Important: Do NOT use the
--thinking-display summarizedCLI flag on v2.1.117+. It actually interferes with the setting-based behavior and results in empty thinking blocks. I spent hours debugging this; the flag overrides the setting's code path in a way that breaks things. The setting alone works.Layer 2: UI-side (render thinking inline instead of behind Ctrl+O)
The JS is embedded as plain text in the Windows binary at
~/.local/bin/claude.exe, so you can patch it directly with same-length byte replacements.Patch 1: Bypass the thinking guard:
Find:
Replace
if(!VAR1withif(!1- guard becomes always-false, thinking never hidden.Patch 2: Force createElement props to render expanded:
Find the
createElementcall that passesisTranscriptModeandverboseprops to the thinking component (search forisTranscriptMode:nearcreateElementandhideInTranscript):Replace both variable names with
1:The variable names change every version (minification), so you need to search the binary to find the current names. Here's what I've seen:
| Version | Patch 1 guard | Patch 2 props |
|---------|--------------|---------------|
| v2.1.101 |
if(!j&&!A)|isTranscriptMode:j,verbose:A|| v2.1.104 |
if(!j&&!A)|isTranscriptMode:j,verbose:A|| v2.1.116 |
if(!j&&!A)|isTranscriptMode:j,verbose:A|| v2.1.123 |
if(!j&&!f)|isTranscriptMode:j,verbose:f|How to find patterns in the binary
Critical rules
isTranscriptMode:_appears ~10+ times in destructuring patterns. Replacing_with1in declarations breaks unrelated code.copy claude.exe claude.exe.backuptui: fullscreen— the fullscreen TUI renderer has a separate code path that the patches don't reachDISABLE_AUTOUPDATER: 1in settings.json env to prevent surprise overwritesPython patch script example (v2.1.123)
Result: thinking blocks stream inline in real-time during generation. Tested on Windows, PowerShell 7, Opus 4.7, Max subscription.
Credit to @aleks-apostle and @anthrotype for the original research that made this possible. @phpmypython's macOS gist helped identify the createElement props approach for v2.1.113+.
btw, I maintain a patched version ↓ that streams thinking live into the UI and auto-updates via Github Actions on each release
https://github.com/a-connoisseur/patch-claude-code
it looks like you only patch for linux / macOS though, no? A lot of us are on Windows because most corporate laptops are Windows based.
added windows! although I don't have a windows machine so I can't test it
it just patches the bundled JS though, so shouldn't be any different
Insane that the community has to keep comming up with fixes like this for some bs that is vendor locked.
can't even use claude with my own harness have to be locked in claude code that does not show thinking
@Anthropic: seriously, if Claude is so good, why not asking it to fix this huge usability issue? Code is cheap, right? :D
They're scared of China distilling their model 😆 the entire business model of AI is broken, much like the old dot com bubble.
It's been a little over a week since the "always active thinking blocks" feature started working.
This is a very important feature to have in Claude Code. Sometimes we really need to understand what is going on - WHEN it's going on to follow along in certain areas, especially in scientific work.