Amazon Bedrock の Claude 3 モデル(Sonnet 4.6 / Opus 4.8 / Sonnet 5)で Adaptive thinking の呼び方とレスポンス形式の違いを確認してみた

Amazon Bedrock の Claude 3 モデル(Sonnet 4.6 / Opus 4.8 / Sonnet 5)で Adaptive thinking の呼び方とレスポンス形式の違いを確認してみた

Sonnet 4.6・Opus 4.8・Sonnet 5 の3モデルで、Adaptive thinkingの呼び方とレスポンス形式がどう変わったかを検証してみました。モデル世代が進むにつれて思考テキストの省略化とデフォルト化が進んでいる様子をお見せします。
2026.07.06

こんにちは!AI 事業本部のこーすけです。

2026 年 6 月 30 日に Claude Sonnet 5 が Amazon Bedrock で利用可能になりました。
今回はSonnet 4.6・Opus 4.8・Sonnet 5 の 3 モデルを並べて、thinking(思考)の呼び方とレスポンス形式の違いを検証してみました。

前提知識

Adaptive thinking とは

Claude が問題の複雑さに応じて「考えるかどうか・どれだけ考えるか」を自動で決める仕組みです。Adaptive thinking が発生すると、レスポンスに reasoningContent ブロックが追加されます。

モデルごとに「Adaptive thinking をどう有効化するか」が違います。

モデル Adaptive thinking のデフォルト 有効化の方法
Sonnet 4.6 オフ additionalModelRequestFields{"thinking": {"type": "adaptive"}} を指定(オプトイン)
Opus 4.8 オフ 同上
Sonnet 5 オン

注意: 実際に Adaptive thinking が発生するかどうかはリクエストごとにモデルが判断します。簡単な質問では Adaptive thinking がスキップされ、直接回答されることがあります。

思考テキストの表示(display)とは

Adaptive thinking が発生したとき、その思考テキストをレスポンスに含めるかどうかを制御するのが display パラメータで、モデル世代によってデフォルトが違います。

  • "summarized": 思考の要約テキストが返る — Sonnet 4.6 / Opus 4.6 までのデフォルト
  • "omitted": 思考テキストは省略され、空の text と signature だけが返る — Sonnet 5 / Opus 4.7 以降のデフォルト

Anthropic の Adaptive thinking ドキュメント:Controlling thinking displayに明記されています。
https://platform.claude.com/docs/en/build-with-claude/adaptive-thinking

"omitted": Thinking blocks are returned with an empty thinking field. The signature field still carries the encrypted full thinking for multi-turn continuity. This is the default on Claude Sonnet 5, Claude Opus 4.8, Claude Opus 4.7 (...). This is a silent change from Claude Opus 4.6, where the default was "summarized".

この 2 つの軸(Adaptive thinking のデフォルト × display のデフォルト)を頭に入れて、実際のレスポンスを見ていきます。

検証環境・前提

  • Python 3.12 + boto3
  • リージョン: us-east-1
  • Bedrock で 3 モデルのモデルアクセスが有効化済みであること
  • 東京リージョンからは Sonnet 5 の Geo 推論プロファイル(jp.)が提供されていないため、Global 推論プロファイル(global. プレフィックス)を使用

検証に使う共通セットアップです。Adaptive thinking が発生しやすいよう、少し探索が必要な問題を固定の質問として使います(単純な計算だと Adaptive thinking がスキップされることがあるためです)。

import json

import boto3

client = boto3.client("bedrock-runtime", region_name="us-east-1")

SONNET_46 = "global.anthropic.claude-sonnet-4-6"
OPUS_48 = "global.anthropic.claude-opus-4-8"
SONNET_5 = "global.anthropic.claude-sonnet-5"

QUESTION = "3桁の素数のうち、各桁の和が 10 になる最小のものを求めてください"

def show_content(model_id: str, **kwargs) -> None:
    res = client.converse(
        modelId=model_id,
        messages=[{"role": "user", "content": [{"text": QUESTION}]}],
        inferenceConfig={"maxTokens": 4096},
        **kwargs,
    )
    content = res["output"]["message"]["content"]
    print(json.dumps(content, ensure_ascii=False, indent=2, default=str))

各モデルの thinking の呼び方とレスポンス

Sonnet 4.6: thinking を有効化して呼ぶ → 要約テキストが返る

Sonnet 4.6 で Adaptive thinking を使うには、additionalModelRequestFields で明示的に有効化します。

show_content(
    SONNET_46,
    additionalModelRequestFields={"thinking": {"type": "adaptive"}},
)

実行結果はこうなりました。

{
    "reasoningContent": {
      "reasoningText": {
        "text": "I need to find 3-digit prime numbers where the sum of digits equals 10, and find the smallest one.\n\n3-digit numbers start from 100. I need the digits to sum to 10.\n\nLet me systematically go through 3-digit numbers starting from 100 where digit sum = 10:\n\n100: 1+0+0 = 1, no\n...\n\nLet me think about this more systematically. A 3-digit number is written as ABC where A is hundreds, B is tens, C is units.\nA + B + C = 10, A ≥ 1, A,B,C are digits (0-9)\n\nStarting from smallest:\n\n\nWhen A=1, I need B+C=9. The candidates are 109, 118, 127, 136, 145, 154, 163, 172, 181, and 190. Now I need to check which of these are prime, starting with the smallest.\n\nTesting 109: it's not divisible by 2, 3, 5, or 7 (the primes up to √109), so 109 is prime. That makes it the smallest 3-digit prime with digit sum 10.",
        "signature": "***"
      }
    }
  },
  {
    "text": "## 解法\n\n### 条件の整理\n- 3桁の数(100〜999)\n- 各桁の和 = 10\n- 素数\n- **最小**のもの\n\n### 候補を小さい順に列挙\n\n3桁の数 $\\overline{ABC}$ で $A+B+C=10$、$A \\geq 1$ を満たす最小の数から順に確認します。\n\n| 数 | 各桁の和 | 素数判定 |\n|---|---|---|\n| **109** | $1+0+9=10$ ✓ | 確認が必要 |\n| 118 | $1+1+8=10$ ✓ | — |\n| 127 | $1+2+7=10$ ✓ | — |\n\n### 109 の素数判定\n\n$\\sqrt{109} \\approx 10.4$ なので、10以下の素数(2, 3, 5, 7)で割り切れるか確認:\n\n- **÷2**:奇数なので❌\n- **÷3**:$1+0+9=10$(3の倍数でない)❌\n- **÷5**:末尾が9なので❌  \n- **÷7**:$109 = 7 \\times 15 + 4$(余り4)❌\n\n→ **109 は素数** ✓\n\n## 答え\n\n$$\\boxed{109}$$"
  }

一般的なチャット UI で「思考中の内容」が見えるのは、この要約テキストのおかげです。なお thinking を指定しない場合(デフォルト)は、reasoningContent なしの text のみが返ります。

Opus 4.8: thinking を有効化して呼ぶ → 空 text + signature が返る

Opus 4.8 も呼び方は Sonnet 4.6 と同じオプトイン式です。

show_content(
    OPUS_48,
    additionalModelRequestFields={"thinking": {"type": "adaptive"}},
)

結果はこちらですが、返ってくる構造が変わります。text が空になり、signature だけが入っています

{
    "reasoningContent": {
      "reasoningText": {
        "text": "",
        "signature": "***"
      }
    }
  },
  {
    "text": "# 解答\n\n## 各桁の和が10になる3桁の数を小さい順に調べる\n\n3桁の数は 100 から始まります。百の位を 1、十の位を 0 とすると、一の位は 9 になり、和が 10 になります。\n\nこれより小さい数(100〜108)はすべて各桁の和が 10 未満なので、**各桁の和が 10 になる最小の3桁の数は 109** です。\n\n## 109 が素数かどうか確認\n\n$\\sqrt{109} \\approx 10.4$ なので、10 以下の素数(2, 3, 5, 7)で割れるか調べます。\n\n- 2 で割れない(奇数)\n- 3 で割れない(各桁の和 10 は 3 の倍数でない)\n- 5 で割れない(末尾が 5 でも 0 でもない)\n- 7 で割れない($109 = 7 \\times 15 + 4$)\n\nよって **109 は素数**です。\n\n## 答え\n\n$$\\boxed{109}$$"
  }

これが前提知識で説明した display のデフォルト変更(Opus 4.7 以降は "omitted")です。呼び方は Sonnet 4.6 と同じなのに、レスポンスの中身が変わっていました。ちなみに Opus 4.8 も thinking 未指定なら text のみが返ります。

Sonnet 5: 何も指定せずに呼ぶ → Adaptive thinking が発生して空 text + signature が返る

Sonnet 5 は thinking の指定が不要です。

show_content(SONNET_5)

thinking を指定せずとも、Opus 4.8 の thinking 有効時と同じ構造が返ってきます。

{
    "reasoningContent": {
      "reasoningText": {
        "text": "",
        "signature": "***"
      }
    }
  },
  {
    "text": "**答え:109**\n\n**理由:**\n\n3桁の数で各桁の和が10になる最小の数を探します。100から順に確認すると、\n\n- 100→1, 101→2, 102→3, 103→4, 104→5, 105→6, 106→7, 107→8, 108→9, **109→1+0+9=10**\n\nしたがって、各桁の和が10になる最小の3桁の数は **109** です。\n\n次に109が素数かどうかを確認します。\n\n- 109は2でも3でも5でも7でも割れません(√109 ≈ 10.4 なので、10までの素数で確認すれば十分)。\n  - 109 ÷ 2 = 54.5(割れない)\n  - 109 ÷ 3 = 36.33...(割れない)\n  - 109 ÷ 5 = 21.8(割れない)\n  - 109 ÷ 7 = 15.57...(割れない)\n\nよって109は素数です。\n\nしたがって、条件を満たす最小の3桁の素数は **109** です。"
  }

3 モデルの比較まとめ

ここまでを整理するとこうなります。

Sonnet 4.6 Opus 4.8 Sonnet 5
Adaptive thinking のデフォルト オフ(オプトイン) オフ(オプトイン) オン
Adaptive thinking 有効時の思考テキスト 要約テキストが返る 空 text + signature 空 text + signature
thinking 未指定時の構造 text のみ text のみ reasoningContent + text(Adaptive thinking 発生時)

つまり Sonnet 4.6 → Opus 4.8 で「思考テキストの省略化」(display の既定が omitted に)、Opus 4.8 → Sonnet 5 で「Adaptive thinking のデフォルト化」という 2 段階の変化が起きています。API の挙動としては、Sonnet 5 は Opus 4.8 で Adaptive thinking を常に付けた状態がデフォルトになったモデルと捉えると分かりやすいです。

そのため、thinking 未指定のモデル ID を差し替えた場合、Opus 4.8 まではレスポンス構造が変わらないのに、Sonnet 5 では thinking がデフォルトになったため reasoningContent が現れる挙動になりハマってしまいます。

display を明示して Sonnet 4.6 と同じレスポンスに揃える

display は明示すれば上書きできます。Sonnet 5 や Opus 4.8 でも display: "summarized" を指定すれば、Sonnet 4.6 と同じようにテキスト入りのレスポンスが返ります。指定方法は thinking の設定に display を足すだけです。

show_content(
    SONNET_5,
    additionalModelRequestFields={
        "thinking": {"type": "adaptive", "display": "summarized"}
    },
)

結果はこちらになります。Sonnet 4.6 の thinking 有効時と同じく、reasoningText.text に要約テキストが入ります。

{
    "reasoningContent": {
      "reasoningText": {
        "text": "I need to find the smallest 3-digit prime number whose digits sum to 10. Starting with 109, I'm checking if it's prime by testing divisibility against primes up to its square root—since 11² exceeds 109, I only need to check 2, 3, 5, and 7.\n\n109 is odd, so not divisible by 2. The digit sum is 10, which isn't divisible by 3, so 109 isn't either. It doesn't end in 0 or 5, so 5 doesn't divide it. And 109 ÷ 7 ≈ 15.57, so 7 doesn't divide it either. Therefore 109 is prime, making it the answer.",
        "signature": "***"
      }
    }
  },
  {
    "text": "## 解答\n\n3桁の数のうち、各桁の和が10になる最小の数を小さい順に確認します。\n\n**候補を探す**\n\n各桁の和が10になる3桁の数を、小さい順に列挙します。\n\n- 100番台で最小になるのは、百の位が1のとき\n- 1 + 十の位 + 一の位 = 10 → 十の位 + 一の位 = 9\n- できるだけ小さくするには、十の位を0にして一の位を9にする\n\n→ **109**(1+0+9=10)\n\n**109が素数か確認**\n\n$\\sqrt{109} \\approx 10.4$ なので、10以下の素数(2, 3, 5, 7)で割れるか確認します。\n\n- 2で割れない(奇数)\n- 3で割れない(各桁の和が10で、3の倍数ではない)\n- 5で割れない(一の位が9)\n- 7で割れない(109 ÷ 7 = 15.57…)\n\nしたがって、**109は素数**です。\n\n## 答え\n\n$$\\boxed{109}$$"
  }

終わりに

本記事では、Sonnet 4.6・Opus 4.8・Sonnet 5 の 3 モデルを並べて、Adaptive thinking の呼び方とレスポンス形式の違いを確認しました。整理すると、Sonnet 4.6 → Opus 4.8 で思考テキストが既定で省略されるようになり(display の既定が "omitted" に)、Opus 4.8 → Sonnet 5 で Adaptive thinking 自体がデフォルトになった、という 2 段階の変化が起きています。

特に注意したいのが、チャットアプリのように会話履歴を保存して送り返す構成です。reasoningContent ブロックが「空 text + signature」で返ってくるため、「Adaptive thinking が発生すれば必ずテキストが入っている」という前提で履歴を扱っている実装は、text が欠落した時点で ValidationException になります。

以下のドキュメントより、ReasoningTextBlockにはtextが必須なためです。
https://docs.aws.amazon.com/bedrock/latest/APIReference/API_runtime_ReasoningTextBlock.html

Opus 4.8 では明示的に thinking を有効化しているぶんレスポンスの変化に気づきやすいのですが、Sonnet 5 はデフォルトで Adaptive thinking が発生するため、モデル ID を差し替えただけのつもりが突然この挙動を踏むことになりました。

対応としては、Sonnet 4.6 と同じスキームで扱い続けたい場合は display: "summarized" を明示するのが簡潔だと思います。

新しいモデルが出るたびにレスポンス形式も少しずつ変化していくので、こうした小さな検証を挟む習慣をつけていきたいです。
最後まで読んでいただきありがとうございました!

参考リンク


Claudeならクラスメソッドにお任せください

クラスメソッドは、Anthropic社とリセラー契約を締結しています。各種製品ガイドから、業種別の活用法、フェーズごとのお悩み解決などサービス支援ページにまとめております。まずはご覧いただき、お気軽にご相談ください。

サービス詳細を見る

この記事をシェアする

AWSのお困り事はクラスメソッドへ

関連記事