
Claude Sonnet 5.5 で cache read 価格が半額に改定、値下げ効果を実測してみた
はじめに
2026年10月7日に、Anthropic の Haiku 5.5 のリリース発表の中で、Claude Sonnet 5.5 の cache read 料金が半額になる案内がありました。
この記事では、Amazon Bedrock の Sonnet 5.5 でも cache read 料金が改定されていることを確認し、Converse API でプロンプトキャッシュを効かせたチャットを実行して、その効果を実測した結果を紹介します。
料金改定内容
案内によると、cache read は50%安くなり、100万トークンあたり $0.20 から $0.10 になるとされています。
Anthropic は、この値下げの効果を次のように説明しています。
Because cache reads make up a large share of models’ token consumption, this reduces the cost of Sonnet 5.5 on most agentic tasks by around 20%.
Bedrock の単価
Bedrock の単価は Price List API の get-products で引けます。サービスコードは AmazonBedrockFoundationModels で、モデルは servicename で絞ります。
aws pricing get-products --region us-east-1 --service-code AmazonBedrockFoundationModels \
--filters 'Type=TERM_MATCH,Field=servicename,Value=Claude Sonnet 5.5 (Amazon Bedrock Edition)' \
'Type=TERM_MATCH,Field=regionCode,Value=us-east-1'
次の表は us-east-1 の単価です。Sonnet 5.5 の列は上の結果から、Sonnet 5 の列は Price List API の Bulk API(index.json)から取り出しました。単位は USD / 1M tokens です。
| Sonnet 5(Global) | Sonnet 5.5(Global) | Sonnet 5(Geo) | Sonnet 5.5(Geo) | |
|---|---|---|---|---|
| 入力 | 2.00 | 2.00 | 2.20 | 2.20 |
| 出力 | 10.00 | 10.00 | 11.00 | 11.00 |
| cache write(5分) | 2.50 | 2.50 | 2.75 | 2.75 |
| cache write(1時間) | 4.00 | 4.00 | 4.40 | 4.40 |
| cache read | 0.20 | 0.10 | 0.22 | 0.11 |
改定前の Sonnet 5.5 の cache read は、現在の Sonnet 5 と同じでした。
AWS の料金ページの Anthropic の欄にも、10月7日から Sonnet 5.5 の cache read 料金を従来より50%引き下げたとの注記があります。
キャッシュの利用条件
Bedrock のドキュメントによると、キャッシュがヒットする条件は次の3つです。
- 先頭から同じ内容が続くこと。チェックポイントは tools → system → messages の順に処理され、前段を変えると後段のキャッシュも無効になります。
- チェックポイントまでのプレフィックスが最小トークン数以上であること。Sonnet 5.5 は 512、Sonnet 5 は 1,024 です。
- TTL 内に再利用されること。TTL は5分か1時間で、ヒットのたびに延びます。1時間を選ぶと cache write の単価が高くなります。
この条件に合うのは、固定の長い system プロンプトやドキュメントに質問を重ねるチャット、tools 定義が長いエージェントなどです。
Converse API でのキャッシュ利用
Converse API では、キャッシュしたい範囲の末尾に cachePoint を置きます。今回は system の末尾と、各ターンの最新のユーザーメッセージの末尾の2か所です。2ターン目のリクエストは次の構造になります。
{
"modelId": "global.anthropic.claude-sonnet-5-5",
"system": [
{"text": "<固定ドキュメントを含む指示文>"},
{"cachePoint": {"type": "default"}}
],
"messages": [
{"role": "user", "content": [{"text": "<1問目>"}]},
{"role": "assistant", "content": [{"text": "<1問目の回答>"}]},
{"role": "user", "content": [{"text": "<2問目>"}, {"cachePoint": {"type": "default"}}]}
],
"inferenceConfig": {"maxTokens": 300}
}
今回の条件は次のとおりです。
- system:約16,400トークンの固定ドキュメントと、「ドキュメントだけを根拠に、3文以内の日本語で答える」旨の指示
- 質問:短い日本語の20問を、会話の履歴を引き継ぎながら順に送る
- 回答:maxTokens 300 を上限として設定
リクエストは AWS CLI で送ります。
aws bedrock-runtime converse --region us-east-1 \
--cli-input-json file://<リクエスト>.json --output json
2ターン目の usage は次のとおりです。
"usage": {
"inputTokens": 4,
"outputTokens": 300,
"totalTokens": 16983,
"cacheReadInputTokens": 16433,
"cacheWriteInputTokens": 246,
"cacheDetails": [
{
"ttl": "5m",
"inputTokens": 246
}
]
}
1ターン目に書き込んだ 16,433 トークンが、2ターン目で cache read として読まれています。
チャットを回すスクリプト(Python)
questions.txt に質問を1行1問で書き、document.txt に固定ドキュメントを置き、AWS の認証情報は環境変数などで AWS CLI に渡して実行します。
#!/usr/bin/env python3
"""使い方: chat-driver.py <model-id> <cache|nocache> <turns>"""
import json, subprocess, sys
model, mode, turns = sys.argv[1], sys.argv[2], int(sys.argv[3])
cache = mode == "cache"
questions = [l.strip() for l in open("questions.txt", encoding="utf-8") if l.strip()]
doc = open("document.txt", encoding="utf-8").read()
system_text = ("あなたは Amazon Bedrock のドキュメント担当アシスタントです。"
"次のドキュメントだけを根拠に、日本語で、3文以内で簡潔に答えてください。\n\n"
"<document>\n" + doc + "\n</document>")
history = []
for i in range(turns):
user = {"role": "user", "content": [{"text": questions[i]}]}
if cache:
user["content"].append({"cachePoint": {"type": "default"}})
system = [{"text": system_text}]
if cache:
system.append({"cachePoint": {"type": "default"}})
req = {"modelId": model, "system": system, "messages": history + [user],
"inferenceConfig": {"maxTokens": 300}}
path = f"request-{i+1:02d}.json"
json.dump(req, open(path, "w", encoding="utf-8"), ensure_ascii=False)
proc = subprocess.run(
["aws", "bedrock-runtime", "converse", "--region", "us-east-1",
"--cli-input-json", "file://" + path, "--output", "json"],
capture_output=True, text=True, check=True)
resp = json.loads(proc.stdout)
# 回答は text ブロックだけを履歴へ戻す(reasoningContent は戻さない)
blocks = resp["output"]["message"]["content"]
answer = "".join(b["text"] for b in blocks if "text" in b)
u = resp["usage"]
print(f"turn {i+1:02d} in={u['inputTokens']} out={u['outputTokens']} "
f"cr={u.get('cacheReadInputTokens', 0)} cw={u.get('cacheWriteInputTokens', 0)} "
f"stop={resp['stopReason']}", flush=True)
history += [{"role": "user", "content": [{"text": questions[i]}]},
{"role": "assistant", "content": [{"text": answer}]}]
チャットの費用の実測
値下げの効果
Sonnet 5.5(Global)で会話を実行したときの費用です。単価は前述の表のとおりです。費用の単位は USD、input は毎ターン 4 トークンです。累計の削減率は、そのターンまでの累計費用で改定前と改定後を比べた値です。合計は全ターンの値です。
| ターン | output | cache read | cache write | 費用(改定前) | 費用(改定後) | 累計の削減率 |
|---|---|---|---|---|---|---|
| 1 | 216 | 0 | 16,433 | 0.0433 | 0.0433 | 0.0% |
| 2 | 300 | 16,433 | 246 | 0.0069 | 0.0053 | 3.3% |
| 3 | 269 | 16,679 | 276 | 0.0067 | 0.0051 | 5.8% |
| 5 | 242 | 17,151 | 201 | 0.0064 | 0.0046 | 9.6% |
| 10 | 153 | 18,114 | 208 | 0.0057 | 0.0039 | 15.2% |
| 15 | 300 | 19,269 | 312 | 0.0076 | 0.0057 | 18.0% |
| 20 | 300 | 20,606 | 75 | 0.0073 | 0.0053 | 20.0% |
| 合計 | 5,302 | 350,380 | 20,681 | 0.1750 | 0.1399 | 20.0% |
累計の削減率は、改定前の費用に占める cache read の割合の半分になります。この条件では20ターン目までの累計で cache read が改定前の費用の約4割を占め、削減率は20.0%になりました。
合計の計算式は次のとおりです。
改定前: 80 × 2.00 + 5,302 × 10.00 + 350,380 × 0.20 + 20,681 × 2.50 = 174,958.5(÷ 1,000,000 = $0.1750)
改定後: cache read が 350,380 × 0.10 = 35,038 になるので 139,920.5($0.1399)
削減額: 350,380 × (0.20 − 0.10) ÷ 1,000,000 = $0.0350
削減率: 0.0350 ÷ 0.1750 = 20.0%
改定前の費用に占める cache read は 40.1% で、これが半額になったため、削減率は 40.1% × 50% ≒ 20% になります。今回実測した条件での削減率は 20% でした。
キャッシュあり・なし
同じ system プロンプトと質問を、Sonnet 5.5 で cachePoint なしでも実行しました。次の表は、改定後の単価で計算した、そのターンまでの累計費用(USD)です。
| ターン | キャッシュなし | キャッシュあり |
|---|---|---|
| 1 | 0.0354 | 0.0433 |
| 2 | 0.0714 | 0.0485 |
| 3 | 0.1077 | 0.0536 |
| 5 | 0.1820 | 0.0634 |
| 10 | 0.3732 | 0.0868 |
| 20 | 0.7950 | 0.1399 |
1ターン目だけキャッシュありが高いのは、同じ 16,433 トークンを、入力の単価(2.00)ではなく cache write の単価(2.50)で処理するためです。2ターン目の累計で逆転し、20ターン目の累計ではキャッシュありが82%安くなりました。
Sonnet 5 との費用比較
同じ system プロンプトと質問を Sonnet 5 でも実行し、Sonnet 5.5 の実測と並べました。費用は Global の単価で計算しました。
| output | cache read | cache write | 費用 | |
|---|---|---|---|---|
| Sonnet 5 | 5,340 | 355,591 | 21,638 | $0.1787 |
| Sonnet 5.5 | 5,302 | 350,380 | 20,681 | $0.1399 |
1ターン目の cache write はどちらも 16,433 トークンで、Sonnet 5 から 5.5 に切り替えても入力トークンは大きく増えていません。
出力量が同等であれば、cache read の単価が 0.20 から 0.10 に下がる分が、そのまま節約になります。
まとめ
Claude Sonnet 5.5 の cache read 単価が半額になりました。
今回のように長い system プロンプトをチャットで繰り返し送る処理では、費用に占める cache read の割合が大きくなるため、値下げの効果が大きく出ることを確認できました。
Sonnet 5.5 を利用しているがキャッシュを利用していない場合、キャッシュを活用する余地がないか見直すことをおすすめします。










