Claude Sonnet 5 を API で動かす - adaptive thinking と effort パラメータの実装

Anthropic は 2026年6月30日に Claude Sonnet 5(モデルID claude-sonnet-5)を公開した。Sonnet ティアでありながらコーディング・エージェント用途で従来の Opus 相当に迫る品質、というのが売り文句で、7月現在は 2026年8月31日まで有効な導入価格(入力 $2 / 出力 $10 per MTok、通常は $3 / $15)が適用されている。

この記事では、Sonnet 5 の API 面で 4.6 世代から変わった 2 点 — thinking パラメータの扱いeffort パラメータ — をエンジニア視点で整理し、実際に手元で動かして挙動を確かめる。

背景: 4.6 世代からの API の変化

Sonnet 5 は Opus 4.7 / 4.8 と同じリクエスト面に揃えられた。既存の Sonnet 4.6 向けコードをそのまま移すと引っかかる点が 2 つある。

1. 手動の extended thinking が廃止された。 従来の thinking={"type": "enabled", "budget_tokens": N} は Sonnet 5 では 400 エラーになる。4.6 では非推奨ながら動いていたが、Sonnet 5 では完全に使えない。代わりに adaptive thinkingthinking={"type": "adaptive"})を使い、思考の深さは effort パラメータで制御する。

さらに、thinking フィールドを省略した場合の既定挙動が変わった。Sonnet 4.6 は「省略=思考なし」だったが、Sonnet 5 は「省略=adaptive thinking が有効」になる。思考を止めたいなら thinking={"type": "disabled"} を明示する必要がある。

2. 非デフォルトのサンプリングパラメータが拒否される。 temperature / top_p / top_k に非デフォルト値を渡すと 400 エラーになる。出力のばらつきはプロンプトで制御する方針に変わった。

effort パラメータoutput_config の中に入れる。low / medium / high / xhigh / max の 5 段階で、Claude API では既定値が high。Sonnet ティアで xhigh が使えるのは Sonnet 5 が初めてで、難しいコーディング・エージェント用途向けの推奨設定とされている。

実際に試す

前提

  • Python 3.10 以上
  • anthropic SDK v0.69.0 以上(pip install -U anthropic で最新化。本稿は 0.69.0 で確認)
  • Anthropic の API キー

API キーは Anthropic Console の「API Keys」から発行し、環境変数に設定しておく。

1
2
pip install -U anthropic
export ANTHROPIC_API_KEY="sk-ant-...." # 自分のキーに置き換える

1. 基本呼び出し(adaptive thinking + effort)

まずは adaptive thinking を有効にし、思考の要約を表示する最小構成。display="summarized" を指定しないと thinking ブロックの本文は空文字列になる点に注意(既定は "omitted")。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
import anthropic

client = anthropic.Anthropic() # ANTHROPIC_API_KEY を環境変数から読む

response = client.messages.create(
model="claude-sonnet-5",
max_tokens=2048,
thinking={"type": "adaptive", "display": "summarized"},
output_config={"effort": "medium"},
messages=[
{
"role": "user",
"content": "13 * 17 を暗算の手順を追って計算し、最後に答えだけを1行で示して。",
}
],
)

for block in response.content:
if block.type == "thinking":
print("=== thinking(要約) ===")
print(block.thinking)
elif block.type == "text":
print("=== 回答 ===")
print(block.text)

print("=== 使用モデル / 停止理由 ===")
print(response.model, response.stop_reason)

期待される出力(要約や表現は実行ごとに変わる):

1
2
3
4
5
6
7
8
9
10
=== thinking(要約) ===
13 × 17 を分解して計算する。13 × 17 = 13 × (10 + 7) = 130 + 91 = 221。
=== 回答 ===
13 × 10 = 130
13 × 7 = 91
130 + 91 = 221

221
=== 使用モデル / 停止理由 ===
claude-sonnet-5 end_turn

response.modelclaude-sonnet-5 を返し、stop_reasonend_turn になっていれば正常。

2. thinking を明示的に無効化する

思考を止めたい(レイテンシ重視の)ケースでは、Sonnet 4.6 と違って省略では不十分で、disabled を明示する。

1
2
3
4
5
6
7
8
9
response = client.messages.create(
model="claude-sonnet-5",
max_tokens=512,
thinking={"type": "disabled"},
messages=[{"role": "user", "content": "『Sonnet 5』を3語以内の英語で言い換えて。"}],
)

text = next(b.text for b in response.content if b.type == "text")
print(text)

thinking ブロックが返らず、テキストのみが即座に返る。

3. やってはいけない例(400 になる呼び出し)

以下は Sonnet 5 では 400 エラーになる。エラーの型を実際に確認しておくと移行時のデバッグが楽になる。

1
2
3
4
5
6
7
8
9
10
try:
client.messages.create(
model="claude-sonnet-5",
max_tokens=512,
# budget_tokens は Sonnet 5 では削除済み -> 400
thinking={"type": "enabled", "budget_tokens": 1024},
messages=[{"role": "user", "content": "hello"}],
)
except anthropic.BadRequestError as e:
print("想定どおり BadRequestError:", e.message)

同様に temperature=0.7 など非デフォルトのサンプリングパラメータを渡しても 400 になる。移行時はこの 2 点をまず外す。

4. トークン数を数え直す

Sonnet 5 は Opus 4.7 世代の新しいトークナイザを使っており、同じテキストでも Sonnet 4.6 比でおよそ 30% 多くトークンを消費する。max_tokens の上限やコスト試算を Sonnet 4.6 のまま流用すると出力が途中で切れることがある。count_tokens で数え直しておく。

1
2
3
4
5
count = client.messages.count_tokens(
model="claude-sonnet-5",
messages=[{"role": "user", "content": "この文章のトークン数を数えます。" * 20}],
)
print("input_tokens:", count.input_tokens)

count_tokens エンドポイントはモデル固有なので、必ず実際に使うモデルID(claude-sonnet-5)を渡すこと。他社のトークナイザ(tiktoken 等)での概算は Claude では大きくずれる。

まとめ

Sonnet 5 への移行で押さえるべき API の要点は次の 3 つ。

  • thinking={"type": "adaptive"} を使う(budget_tokens は 400)。思考を止めるなら disabled を明示する(省略では adaptive が有効になる)。
  • temperature / top_p / top_k の非デフォルト値は渡さない。
  • effort は output_config={"effort": ...} に入れ、難しいコーディング用途では xhigh を検討する。新トークナイザ分、max_tokens とコスト試算は再計測する。

導入価格が有効な 8月31日までは、Sonnet 5 を実ワークロードで試すコストが低い。手元のパイプラインを 1 リクエストだけ差し替えて挙動を確かめるところから始めるとよい。

参照


Claude Sonnet 5 を API で動かす - adaptive thinking と effort パラメータの実装
https://blog.hashito.biz/2026/07/10/try-claude-sonnet-5-adaptive-thinking-effort-api/
著者
hashito
作成日
2026年7月10日
著作権