6月30日に出たClaude Sonnet 5の値段表を見て、多くの人は「据え置きか」と思って読み飛ばした。入力100万トークンあたり3ドル、出力15ドル。前世代のSonnet 4.6と同じだ。導入価格として8月31日まで2ドル/10ドルの割引も付く。
ところが実際に本番トラフィックを流し替えた開発者が、請求ダッシュボードの数字が上がっていることに気づき始めた。単価は1円も変わっていないのに、だ。犯人はモデルの賢さでも隠れた課金項目でもなく、Anthropicがこの世代でこっそり載せ替えた新しいトークナイザにある。
🧮 なぜ「単価そのまま」で請求が増えるのか
課金は「トークン数 × 単価」で決まる。単価が同じでも、同じ文章がより多くのトークンに分割されれば、掛け算の答えは大きくなる。トークナイザとは、テキストを「dog」「▁the」のような処理単位(トークン)に刻む部品のこと。ここを差し替えると、1文字あたり何トークンになるかの換算率そのものが変わる。
Anthropicは公式ドキュメントでこう明言している。
Claude Sonnet 5 uses a new tokenizer. The same input text produces approximately 30% more tokens than on Claude Sonnet 4.6.
同じテキストでおよそ3割多くトークンを食う、という意味だ(What's new in Claude Sonnet 5)。これはAPIの形が変わったわけではない。リクエストもレスポンスもストリーミングも構造は同じで、コード変更は要らない。効いてくるのは「トークンで測る・見積もるものすべて」だ。請求額はもちろん、1Mトークンのコンテキストウィンドウに入る実テキスト量は減り、Sonnet 4.6向けにギリギリで詰めたmax_tokensは、同じ出力なのに途中で切れることがある。
だから移行時にまず走らせるべきは新モデルへのcount_tokensの測り直しだ。過去に測ったトークン数を使い回すと見積もりが狂う。
# 同じ messages でも Sonnet 5 では返る数が増える
count = client.messages.count_tokens(
model="claude-sonnet-5",
messages=[{"role": "user", "content": prompt}],
)
print(count.input_tokens)
移行で 400 が返る3つの落とし穴
トークナイザ以外に、Sonnet 4.6のコードをそのまま向けると400エラーで弾かれる挙動変更が3つある。ドキュメントは「ドロップイン交換」と表現しているが、この3点だけは手当てが要る。
まずサンプリングパラメータの禁止。temperature・top_p・top_kを既定以外の値に設定すると400が返る。出力のばらつきを温度で制御していたコードは、パラメータを外してシステムプロンプト側の指示に寄せる必要がある(Opus 4.7で先に導入された制約が、ついにSonnet系にも降りてきた形だ)。
次に手動の拡張思考(extended thinking)の廃止。thinking: {type: "enabled", budget_tokens: N}は削除され、これも400になる。代わりに使うのが既定でオンになった適応思考(adaptive thinking)で、思考の深さはeffortパラメータ(既定high)で調整する。
そして三つ目、その適応思考が既定でオンになったこと自体が地味に効く。Sonnet 4.6ではthinkingフィールドを付けなければ思考なしで走ったが、Sonnet 5では同じリクエストが思考ありで動く。max_tokensは「思考+応答テキスト」の合計に対する上限なので、思考なし前提で切り詰めていたワークロードは応答が切れやすくなる。移行の実体は概ねこうなる。
# Before(Sonnet 4.6)
resp = client.messages.create(
model="claude-sonnet-4-6",
max_tokens=4096,
temperature=0.7, # ← Sonnet 5 では 400
thinking={"type": "enabled", "budget_tokens": 8000},# ← Sonnet 5 では 400
messages=messages,
)
# After(Sonnet 5)
resp = client.messages.create(
model="claude-sonnet-5",
max_tokens=8192, # 思考込みの総量。余裕を持たせる
thinking={"type": "adaptive"}, # 既定でオン。切るなら {"type": "disabled"}
messages=messages,
)
思考を止めたいだけならthinking={"type": "disabled"}で明示的にオフにできる。
英語は約1.4倍、簡体字中国語はほぼ変わらない
ここで一つ、ソース間の食い違いを挙げておきたい。公式ドキュメントは「約30%増」と単一の値で書く一方、発表ブログは「コンテンツ種別によって概ね1.0〜1.35倍」とレンジで書いている。そして独立に実測したSimon Willison氏の記録は、この上限をさらに超える数字を出している。
| 入力の種類 | Sonnet 4.6比のトークン倍率 |
|---|---|
| 英語の散文 | 約1.4倍 |
| スペイン語 | 約1.33倍 |
| Pythonコード | 約1.27〜1.28倍 |
| 簡体字中国語 | ほぼ変わらず |
英語の散文で約1.4倍という実測値は、Anthropic自身が示した「最大1.35倍」のレンジをはみ出している。つまり**「30%」は目安であって保証ではない**。倍率は言語とコンテンツ形状に強く依存し、自然言語ほど増え、既に細かく刻まれていた表意文字はあまり動かない、という傾向が読み取れる。
実務上の含意は明快だ。あなたのプロンプトが英語のドキュメントで埋まっているなら3〜4割増を覚悟し、コード中心なら3割弱、と当たりを付けられる。なお公開されている実測に日本語は含まれていないので、日本語混じりのプロンプトを扱うなら「たぶん3割」と決め打ちせず、自分のワークロードでcount_tokensを回して測るのが唯一まともなやり方だ。
測ってから移す
Sonnet 5は、コーディングとエージェント系タスクで4.6を明確に上回りつつ価格は据え置き、というのが素直な評価だ。1Mトークンのコンテキストと128kの最大出力に対応し、ベンチマーク上はOpus 4.8に迫るとAnthropicは説明している。乗り換える理由は十分ある。
引っかかるのは、値上げが「単価」ではなく「トークン数の増加」という見えにくい経路で来る点だ。価格表を見ただけの人には気づけない。だから移行の順番は、モデルIDを差し替える前に、代表的なプロンプト数本を新旧のcount_tokensに通し、月間コストがどれだけ動くかを先に見ておくこと。そのうえでtemperature系を外し、thinkingを適応思考に直し、max_tokensを思考込みで取り直す。この3手当てと1回の実測を済ませれば、請求ダッシュボードで驚かずに済む。