Skip to content

Vertex/Bedrock: empty ThinkingBlock.thinking on Opus 4.8/4.7 — bundled CLI drops thinking.display (post-#831, root cause anthropics/claude-code#71599) #1068

Description

@maxim092001

Summary

SDK users running on Vertex (or Bedrock) with claude-opus-4-8 / 4-7 get ThinkingBlock.thinking == "" (empty) and no thinking_delta events, even with thinking={"type":"adaptive","display":"summarized"}.

This is not the same as the now-fixed #831 (where the SDK didn't forward display). The SDK does now correctly pass --thinking-display (_internal/transport/subprocess_cli.py resolves thinking["display"]--thinking-display). The remaining failure is downstream in the bundled CLI, which strips thinking.display from the request body on non-first-party providers.

Full CLI root-cause analysis, request-body captures, and a live Vertex reproduction are in the CLI issue: anthropics/claude-code#71599. Filing here for SDK-user visibility and to track an SDK-side mitigation, since claude-agent-sdk bundles the affected CLI.

Why it still affects the SDK after #831

#831 made the SDK forward the flag. But the bundled CLI (2.1.177 → 2.1.193, latest) gates thinking.display behind a first-party-only provider allow-list (firstParty | anthropicAws | foundry) that omits vertex/bedrock. So with CLAUDE_CODE_USE_VERTEX=1, the CLI builds thinking: {"type":"adaptive"} (no display), the server applies the Opus 4.8 default display:"omitted", and the SDK parses back a ThinkingBlock with empty thinking + a signature. Direct Anthropic (first-party) is unaffected.

Version boundary: bundled CLI 2.1.150 works; 2.1.177+ (and 2.1.193, latest) broken on Vertex/Bedrock.

Reproduction (SDK)

import os
from claude_agent_sdk import ClaudeAgentOptions, query, AssistantMessage, ThinkingBlock

# Vertex env: CLAUDE_CODE_USE_VERTEX=1, CLOUD_ML_REGION=global, ANTHROPIC_VERTEX_PROJECT_ID=<your-project>
options = ClaudeAgentOptions(
    model="claude-opus-4-8[1m]",
    thinking={"type": "adaptive", "display": "summarized"},  # forwarded correctly since #831
)

async for msg in query(prompt="Reason step by step, then answer: a bat and ball cost $1.10; the bat is $1.00 more than the ball. How much is the ball?", options=options):
    if isinstance(msg, AssistantMessage):
        for b in msg.content:
            if isinstance(b, ThinkingBlock):
                print("thinking len:", len(b.thinking))  # 0 on Vertex; non-empty on direct Anthropic

Observed on Vertex: thinking len: 0 (signature present). On the direct Anthropic API: non-empty.

Verified workaround (no downgrade)

Set the CLI extra-body env var on the subprocess; it re-injects display on the wire (verified against live Vertex — empty → 224-char summarized thinking):

os.environ["CLAUDE_CODE_EXTRA_BODY"] = '{"thinking":{"type":"adaptive","display":"summarized"}}'

Must be type:"adaptive" — Opus 4.8 rejects type:"enabled" with HTTP 400.

Requests for the SDK

  1. Document this Vertex/Bedrock limitation (and the CLAUDE_CODE_EXTRA_BODY workaround) near the thinking docs, linking Vertex/Bedrock: thinking.display:"summarized" stripped from request body → empty thinking on Opus 4.8/4.7 (regression 2.1.150→2.1.177, still in 2.1.193) claude-code#71599.
  2. Optional mitigation: when thinking["display"] is set and a 3P provider is detected (CLAUDE_CODE_USE_VERTEX / CLAUDE_CODE_USE_BEDROCK in env), have the transport set/merge CLAUDE_CODE_EXTRA_BODY with the thinking override so display survives the bundled CLI — until the CLI fix lands.
  3. Bump the bundled CLI to whatever version fixes Vertex/Bedrock: thinking.display:"summarized" stripped from request body → empty thinking on Opus 4.8/4.7 (regression 2.1.150→2.1.177, still in 2.1.193) claude-code#71599.

Related

Metadata

Metadata

Assignees

No one assigned

    Labels

    bugSomething isn't workingdocumentationImprovements or additions to documentation

    Type

    No type
    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions