Skip to content

[BUG] Claude Fable 5 (Vertex Anthropic) streams a response but no text is rendered — empty thinking block with signature-only delta #31738

Description

@deusmusic00

Description

When using claude-fable-5 through the google-vertex-anthropic provider, the request succeeds, the model streams for ~13s, the agent loop completes cleanly (step=0 → step=1 → exiting loop), no error is logged, but no assistant text is rendered in the UI. Other Vertex Anthropic models with the same adaptive-reasoning format (e.g. claude-opus-4-8) work perfectly.

Root cause analysis

claude-fable-5 only supports the new adaptive-thinking API. Direct API testing confirms:

thinking.type.enabled → rejected: "thinking.type.enabled" is not supported for this model. Use "thinking.type.adaptive" and "output_config.effort" to control thinking behavior.
thinking.type.disabled → rejected: thinking cannot be disabled ("Thinking defaults to adaptive mode when not specified").
Valid output_config.effort values: low | medium | high | xhigh | max.
The model always returns a thinking content block first, and in the common case that block is empty with a signature only (no thinking_delta). Verified via streamRawPredict:

content_block_start index 0 -> { "type": "thinking", "thinking": "", "signature": "" }
content_block_delta index 0 -> { "type": "signature_delta", "signature": "..." } # no thinking_delta
content_block_stop index 0
content_block_start index 1 -> { "type": "text", "text": "" }
content_block_delta index 1 -> { "type": "text_delta", "text": "¡Hola! ..." }
...
message_delta -> stop_reason: "end_turn"
The text part (index 1) is present and well-formed. OpenCode’s handling appears to swallow the response when the leading thinking block is empty/signature-only for this model, so the text block is never surfaced. Behavior differs by config:

Manual model entry with "reasoning": true → on 1.16.2 the request 400s (thinking.type.enabled sent); on 1.17.1 no error but blank output.
Manual model entry with "reasoning": false → blank output, no error.
Why catalog models work but a manual entry doesn’t

claude-fable-5 is not yet in the Models.dev catalog, so it has to be added as a manual provider model. Adding it manually makes OpenCode treat it as a generic Anthropic model and it doesn’t get the Fable/Opus-4.7+ adaptive-reasoning handling introduced in v1.17.0 (“Added Claude Fable reasoning support”) and v1.15.12/v1.16.0 (“adaptive reasoning controls for Anthropic Opus 4.7+”). Catalog-backed models like claude-opus-4-8 get the correct handling and render fine; a user-defined claude-fable-5 does not.

Relevant log (1.17.1)

stream providerID=google-vertex-anthropic modelID=claude-fable-5 ... step=0
("failed to add snapshot files" warnings unrelated)
loop ... step=1
exiting loop # ~13s of streaming, no error, no rendered text

Plugins

No response

OpenCode version

OpenCode Desktop v1.17.1 (also reproduced on v1.16.2)

Steps to reproduce

  1. Configure the google-vertex-anthropic provider and add a manual model:
    {
    "provider": {
    "google-vertex-anthropic": {
    "options": { "project": "", "location": "global" },
    "models": {
    "claude-fable-5": { "name": "Claude Fable 5", "reasoning": true, "tool_call": true }
    }
    }
    }
    }
    (Vertex requires enabling Anthropic data sharing once via setPublisherModelConfig → dataSharingEnabledProvider: "anthropic".)
  2. Select Claude Fable 5, send any prompt.
  3. The stream runs and completes with no error, but no assistant text appears.

Screenshot and/or share link

No response

Operating System

macOS 26.3.1 (Apple Silicon)

Terminal

No response

Metadata

Metadata

Assignees

Labels

No labels
No labels

Type

No type

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions