Claude model throws UnsupportedOperationException("Not supported yet.") on thinking blocks from Claude 5 models
メンテナーはふだん 1 日以内に返信
評価
この issue はまだ評価されていません。
説明
🔴 Required Information
Describe the Bug:
Claude.anthropicContentBlockToPart converts only text and tool_use response blocks and throws for every other block type (Claude.java:374-391):
throw new UnsupportedOperationException("Not supported yet.");
So any Messages API response that contains a thinking or redacted_thinking block makes Claude.generateContent throw, and the agent run ends with that exception. ADK Java never sets thinking on the request (Claude.java:142-147). According to Anthropic's thinking docs (checked 2026-10-08), the Claude 5 models (Opus 5 and 5.5, Sonnet 5 and 5.5, Haiku 5.5, Fable 5 and 5.1, and the Mythos models) use adaptive thinking when that field is absent, and their display default is "omitted". Whenever the model decides to think, the response therefore contains a thinking block with empty text and a signature, at the start of the response or right before a tool_use block. Opus 4.8 and earlier, Sonnet 4.6 and earlier, and Haiku 4.5 do not think unless asked, which is probably why this has not come up before.
Skipping these blocks would stop the exception, and the API accepts a history without them, but the same docs mark passing them back, complete and unmodified, as required within a tool-use turn; without them the model loses its earlier reasoning. The request side has the matching gap: partToAnthropicMessageBlock (Claude.java:176-209) sends a thought Part that has text as an ordinary text block, dropping the signature, and throws the same exception for a thought Part that has only a signature.
Steps to Reproduce:
- Use
com.google.adk:google-adk1.11.0 (ormainatce882374) withanthropic-java2.15.0, the version ADK depends on. - Give a
Claudemodel anAnthropicClientwhose response has a thinking block followed by a text block (code below, with a mocked client). - Call
generateContent, or run anLlmAgentthat uses this model throughInMemoryRunner.
Expected Behavior:
thinking and redacted_thinking blocks become thought Parts that keep the block's signature (or the redacted block's data) in thoughtSignature, and the next request sends them back as the same blocks. adk-python has used this mapping since google/adk-python@16952bd39 (src/google/adk/models/anthropic_llm.py), with one difference noted under Additional Context.
Observed Behavior:
java.lang.UnsupportedOperationException: Not supported yet.
at com.google.adk.models.Claude.anthropicContentBlockToPart(Claude.java:391)
at com.google.adk.models.Claude.convertAnthropicResponseToLlmResponse(Claude.java:354)
at com.google.adk.models.Claude.generateContent(Claude.java:158)
The same happens with a summarized thinking block (non-empty text) and with a redacted_thinking block. In an agent run, the Flowable returned by InMemoryRunner.runAsync terminates with this exception on the first model response that contains a thinking block. On the request side, which I tested by putting thought Parts in the history by hand (Claude cannot produce one today), a thought Part with text goes out as a text block (an omitted thought as an empty text block, a summarized one as visible text), and one with only a signature throws the same exception at Claude.java:209.
Environment Details:
- ADK Library Version (see maven dependency): 1.11.0 and
mainatce882374, withanthropic-java2.15.0 - OS: Windows 11 (not OS-specific)
- TS Version (tsc --version): N/A (Java: Microsoft OpenJDK 17.0.19)
Model Information:
- Which model is being used:
claude-opus-5-5as the model name in a mocked reproduction. The mockedAnthropicClientreturns the documented block shape; I did not run it against the live API. Whether a response contains a thinking block is up to the model; per the docs, the models above can return one without being asked.
🟡 Optional Information
Regression:
No. Both conversion methods have thrown for these blocks since Claude was added in 0.1.0; it shows up now because the Claude 5 models think when thinking is not set.
Additional Context:
- I have a draft fix in
Claude.java(+23 lines) that uses the same mapping as google/adk-python@16952bd39: athinkingblock becomesPart(text, thought=true, thoughtSignature=signature), aredacted_thinkingblock becomesPart(thought=true, thoughtSignature=data), and requests convert them back. With the draft, the code below returns a thoughtPartand a textPart, and in a tool-use turn the second request sends[thinking (same signature), tool_use]. I'll link the PR here. - One difference from adk-python: its request side sends a thought with empty text (what
display: "omitted"returns) back asredacted_thinkingwith the signature asdata, not as thethinkingblock the API returned. The draft checks whether the text is present rather than non-empty. - One question before the PR: if the history also holds thought
Parts produced by another model (for example when the same agent ran on Gemini earlier in the session; other agents' thoughts are already skipped inContents), shouldClaudedrop them, or keep sending the ones with text as plain text, as it does today? Sending them as thinking blocks would fail, because Anthropic rejects signatures it cannot decode. - Related, not duplicates: #1221 (streaming support for
Claude, open) changes the same file and drops thinking deltas in the streaming path; #1616 is about the Spring AI bridge dropping reasoning content.
Minimal Reproduction Code:
// The mocked client returns what the Messages API returns when the model thinks with
// display "omitted": an empty thinking block with a signature, then the answer.
AnthropicClient client = mock(AnthropicClient.class);
MessageService messages = mock(MessageService.class);
Message response = mock(Message.class);
when(client.messages()).thenReturn(messages);
when(messages.create(any(MessageCreateParams.class))).thenReturn(response);
when(response.content())
.thenReturn(
List.of(
ContentBlock.ofThinking(
ThinkingBlock.builder().thinking("").signature("EqQBCkYIBxgC...").build()),
ContentBlock.ofText(TextBlock.builder().text("4").citations(List.of()).build())));
Claude claude = new Claude("claude-opus-5-5", client);
LlmRequest request =
LlmRequest.builder()
.contents(List.of(Content.builder().role("user").parts(Part.fromText("2+2?")).build()))
.build();
claude.generateContent(request, false);
// throws java.lang.UnsupportedOperationException: Not supported yet.
(AnthropicClient, MessageService (com.anthropic.services.blocking) and the com.anthropic.models.messages types are from anthropic-java 2.15.0; Content and Part are com.google.genai.types. mock, when and any are Mockito 5, whose default inline mock maker is needed because Message is final.)
How often has this issue occurred?:
- Always (100%) for a response that contains a
thinkingorredacted_thinkingblock.
- 主要言語
- Java
- スター
- 1.7k
- フォーク
- 433
- 平均マージ
- 3日 9時間
- マージ済み PR(30日)
- 46
環境構築
このプロジェクトの開発コンテナを、あなたの GitHub アカウントでブラウザ上に起動します。
- Dockerfile・Docker Compose ファイルなし
- プルリクエストのテンプレートあり
- コントリビューションガイドを読む
はじめの一歩
- issue を最後まで読み、次にプロジェクトのコントリビューションガイドを読みます。
- 着手することを issue にコメントします — 二人が同じ作業をするのを防げます。
- リポジトリをフォークし、ブランチを切って変更します。
- issue 番号を参照したプルリクエストを送ります。
google/adk-java のほかの issue
-
GeminiUtil placeholder user turn ("Continue output. DO NOT look at this line ...") is flagged by prompt injection filters対応中かも @hemasekhar-p が 2 日前に担当しました。 オープンneeds review
難易度 2/5 1〜3時間 初心者へのやさしさ 76/100
google/adk-java#1628 · コメント 1 件 · 担当者 1 名 ·
メンテナーはふだん 1 日以内に返信
-
[spring-ai] ToolConverter silently drops enum and items from tool parameter schemas対応中かも @hirematha が 5 日前に担当しました。 オープンneeds review
難易度 2/5 1〜3時間 初心者へのやさしさ 76/100
google/adk-java#1609 · コメント 2 件 · 担当者 1 名 ·
メンテナーはふだん 1 日以内に返信
-
[spring-ai] Streaming responses ending with CJK punctuation (。!?) are misclassified as partial and never persisted to the session対応中かも @hirematha が 5 日前に担当しました。 オープンneeds review
難易度 2/5 1〜3時間 初心者へのやさしさ 84/100
google/adk-java#1608 · コメント 3 件 · 担当者 1 名 ·
メンテナーはふだん 1 日以内に返信
-
FirestoreSessionService loses event fields on reload, breaking later turns and tool confirmations対応中かも @innoprej が今日担当しました。 オープン
難易度 4/5 3〜5日 初心者へのやさしさ 22/100
メンテナーはふだん 1 日以内に返信
-
[core] Client disconnects don't cancel the model stream (per-step flow is cached) — and there is no public API to cancel an in-flight run対応中かも @hemasekhar-p が 4 日前に担当しました。 オープンneeds review
google/adk-java#1618 · コメント 6 件 · 担当者 1 名 ·
メンテナーはふだん 1 日以内に返信
google/adk-java の issue をすべて見る
似ている issue
-
enhancement good first issue
難易度 2/5 半日 初心者へのやさしさ 66/100
apache/fineract-consumer-facing#175 ·
メンテナーはふだん 1 日以内に返信
-
[BUG] 订单:会员凭订单号即可取消其他会员的待付款订单(取消接口不校验订单归属)対応中かも @dadiyang が今日担当しました。 オープン
難易度 2/5 1〜3時間 初心者へのやさしさ 70/100
macrozheng/mall#1016 ·
-
[Bug] The producer summary counts an unreported client version as a second version and warns about a version mix対応中かも このイシューにリンクされたプルリクエストがオープン中、またはマージ済みです。 オープン
難易度 2/5 1〜3時間 初心者へのやさしさ 74/100
apache/rocketmq-dashboard#6110 ·
メンテナーはふだん 4 日以内に返信
-
Feature:Resolution
難易度 2/5 1〜3時間 初心者へのやさしさ 72/100
intellij-elixir/intellij-elixir#4396 ·
メンテナーはふだん 1 日以内に返信
-
Python 3.15 support対応中かも @amnesiaof が今日担当しました。 オープンL: python L: python:uv
難易度 2/5 1〜3時間 初心者へのやさしさ 72/100
dependabot/dependabot-core#16524 · コメント 1 件 ·
メンテナーはふだん 1 日以内に返信