Bug
For the adaptive-thinking model class (supportsReasoningBinary: claude-sonnet-5, claude-opus-4-7, claude-opus-4-8, claude-opus-5, claude-fable-5), the thinking content is never visible in the UI, even though thinking tokens are billed.
Root cause
- Thinking text arrives empty. The Anthropic API defaults the adaptive model class to
thinking.display: "omitted" — thinking blocks are present (and billed), but their text is stripped server-side. Zoo Code never sends display, so the stream handler's thinking_delta/content_block_start(thinking) cases never receive any text. The UI shows an empty reasoning block with only the elapsed-seconds timer.
- AWS Bedrock docs (adaptive thinking) confirm the default: "The thinking block uses the same shape as any other thinking block (empty text with a signature under the default omitted display)."
- The Bedrock provider in this repo already works around it (
thinking: { type: "adaptive", display: "summarized" }), while the direct Anthropic API handler and the Vertex handler do not.
- No thinking-token telemetry. The API reports reasoning tokens inside
usage.output_tokens_details.thinking_tokens (on both message_start and message_delta). Every other provider already surfaces this as reasoningTokens on the usage stream chunk (gemini, openai, openrouter, nanogpt, poe, …) — the Anthropic and Vertex handlers are the only ones missing it.
Repro
- Any adaptive-class model (e.g.
claude-opus-4-7) with reasoning enabled
- Ask a multi-step question; the reasoning block shows no text (or only an empty block), while billed output tokens include thinking tokens.
Suggested fix
src/api/transform/reasoning.ts: return { type: "adaptive", display: "summarized" } from getAnthropicProviderReasoning (SDK 0.109.x already types ThinkingConfigAdaptive.display; "summarized" returns the server-side summary at no extra cost — billing is on full thinking tokens).
src/api/providers/anthropic.ts + src/api/providers/anthropic-vertex.ts: parse usage.output_tokens_details?.thinking_tokens into reasoningTokens on the message_start / message_delta usage yields (additive, no behavior change; output_tokens already includes these for billing).
A fix PR is in progress from my fork.
Impact
- Users of Opus 4.7 / Opus 4.8 / Opus 5 / Sonnet 5 / Fable 5 are paying for thinking they cannot see — the core transparency value of extended thinking is lost.
- Per-turn thinking telemetry (did the model actually think this step?) is unavailable for Anthropic models while it works for all other providers.
Bug
For the adaptive-thinking model class (
supportsReasoningBinary:claude-sonnet-5,claude-opus-4-7,claude-opus-4-8,claude-opus-5,claude-fable-5), the thinking content is never visible in the UI, even though thinking tokens are billed.Root cause
thinking.display: "omitted"— thinking blocks are present (and billed), but their text is stripped server-side. Zoo Code never sendsdisplay, so the stream handler'sthinking_delta/content_block_start(thinking)cases never receive any text. The UI shows an empty reasoning block with only the elapsed-seconds timer.thinking: { type: "adaptive", display: "summarized" }), while the direct Anthropic API handler and the Vertex handler do not.usage.output_tokens_details.thinking_tokens(on bothmessage_startandmessage_delta). Every other provider already surfaces this asreasoningTokenson theusagestream chunk (gemini, openai, openrouter, nanogpt, poe, …) — the Anthropic and Vertex handlers are the only ones missing it.Repro
claude-opus-4-7) with reasoning enabledSuggested fix
src/api/transform/reasoning.ts: return{ type: "adaptive", display: "summarized" }fromgetAnthropicProviderReasoning(SDK 0.109.x already typesThinkingConfigAdaptive.display;"summarized"returns the server-side summary at no extra cost — billing is on full thinking tokens).src/api/providers/anthropic.ts+src/api/providers/anthropic-vertex.ts: parseusage.output_tokens_details?.thinking_tokensintoreasoningTokenson themessage_start/message_deltausage yields (additive, no behavior change;output_tokensalready includes these for billing).A fix PR is in progress from my fork.
Impact