0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Anthropic API 2026-10-21:temperature は 1.0 でも 400 に

0
Posted at

この記事は Synthorai ブログの記事 Anthropic API 2026-10-21:temperature は 1.0 でも 400 に の転載です。原文(多言語対応)はリンク先をご覧ください。

Anthropic API 2026-10-21:temperature は 1.0 でも 400 に

API バージョン 2026-10-21 で Claude にリクエストを送ると、temperature、top_p、top_k のいずれかを指定しているだけで HTTP 400 が返る。デフォルト値でも例外ではなく、temperature: 1.0 は「temperature: Extra inputs are not permitted」で失敗する。これらは、モデルが次の token を選ぶ際のランダム性を調整するサンプリングパラメータだ。API バージョンはリクエストヘッダー anthropic-version で指定し、Messages API のリクエスト検証と応答の仕様を切り替える。旧バージョンは 2023-06-01。Anthropic が 10 月 21 日に同時リリースした SDK のメジャーバージョン(Python 2.0.0、TypeScript 1.0.0 ほか 5 種類)は、デフォルトで新バージョンを送信する。これらの SDK からはサンプリングパラメータ自体が削除されている。そのため、400 に遭遇するのは、HTTP クライアントから直接送る場合や追加の body フィールドを使う場合など、リクエスト body を自前で組み立てるコードだ。Claude Sonnet 4.6 と Claude Sonnet 5.5 で 8 種類のリクエストを両バージョンに送り、Python SDK の 2 つのバージョンを比較した。Synthorai 経由でも同じテストを行った。

TL;DR

  • 2026-10-21 では、Claude Sonnet 4.6 と Sonnet 5.5 のどちらも temperature、top_p、top_k に 400 を返す。temperature: 1.0 も対象になる。
  • 2026-10-21 は、assistant メッセージ内の document ブロックと、user のテキストブロックに付けた citations も拒否する。
  • Anthropic の Python SDK 2.x は API キーを Authorization: Bearer で送る。両方のヘッダーがある場合、API は x-api-key を使う。
  • Synthorai 経由では、どちらの SDK でも全 32 リクエストが 200 を返した。Anthropic API が 2026-10-21 で拒否する 12 リクエストも含む。

API バージョン 2026-10-21 で 400 になるリクエスト

400 の原因になる変更は 5 つある。3 つのサンプリングパラメータ、assistant メッセージへの document ブロックの直接配置、そして user メッセージのテキストブロックに付けた citations(テキストブロックから文書内の一節を参照する情報)だ。以下の表では、失敗する 6 ケースと引き続き成功する 2 ケースを検証した。各ケースをモデルとバージョンの組み合わせごとに 1 回ずつ、Anthropic API に直接送信した。200 は受理、400 は invalid_request_error による拒否を表す。

リクエスト Sonnet 4.6、2023-06-01 Sonnet 4.6、2026-10-21 Sonnet 5.5、2023-06-01 Sonnet 5.5、2026-10-21
サンプリングパラメータなし 200 200 200 200
temperature: 1.0(デフォルト値) 200 400 200 400
temperature: 0.2 200 400 400 400
top_p: 0.9 200 400 400 400
top_k: 40 200 400 400 400
assistant メッセージ内の document ブロック 200 400 200 400
user のテキストブロックに付けた citations 200 400 200 400
assistant のテキストブロックに付けた citations 200 200 200 200

新バージョンでのエラーメッセージは以下のとおり。

リクエスト 2026-10-21 でのエラーメッセージ
temperature、top_p、top_k "temperature: Extra inputs are not permitted"(パラメータ名はそれぞれ変わる)
assistant メッセージ内の document "messages: `document` blocks can't be placed directly in `assistant` messages; send them in a `user` message. Found at: messages.1.content.0"
user のテキストに付けた citations "messages: text blocks in `user` messages can't have `citations`; remove `citations` from them. Found at: messages.0.content.1"

Claude Sonnet 5.5 は 2023-06-01 の時点で、デフォルト以外のサンプリング値を拒否していた。ただし、メッセージは「`temperature` is deprecated for this model.」で、temperature: 1.0 は受理していた。2026-10-21 ではパラメータ自体がなくなったため、デフォルト値でも失敗する。Claude Sonnet 4.6 は旧バージョンではすべてのケースを受理した。Anthropic の移行ガイドによると、同じルールは token カウントと Message Batch 内の各リクエストにも適用される。Message Batch は、多数のリクエストを割引料金で非同期実行する Batch API だ。2023-06-01 の提供終了日は記載されていない。

各 400 エラーの修正方法

3 つのサンプリングパラメータを削除し、文書を user メッセージに移し、user として送るテキストから citations を取り除く。サンプリングパラメータを指定しないリクエストは、temperature の 1.0 を含むデフォルト値でサンプリングされる。これは 2023-06-01 でパラメータを省略した場合と同じ動作だ。Claude の過去の応答に付いた引用と、文書の "citations": {"enabled": true} は引き続き使える。

Python SDK で両バージョンに対応するリクエストは、次のようになる。

import anthropic

client = anthropic.Anthropic()  # 2.x sends anthropic-version: 2026-10-21

message = client.messages.create(
    model="claude-sonnet-5-5",
    max_tokens=1024,
    # no temperature, top_p or top_k: the parameters no longer exist in 2.x
    messages=[{"role": "user", "content": "Summarize this memo in one sentence."}],
)
print(message.content[0].text)

Claude Sonnet 4.6 のようにデフォルト以外の temperature をまだ受け付けるモデルで、その値が必要なリクエストは旧バージョンに残す必要がある。HTTP で直接送る場合は、ヘッダーを明示的に指定する。

curl https://api.anthropic.com/v1/messages \
  -H "x-api-key: $ANTHROPIC_API_KEY" \
  -H "anthropic-version: 2023-06-01" \
  -H "content-type: application/json" \
  -d '{"model": "claude-sonnet-4-6", "max_tokens": 256, "temperature": 0.2,
       "messages": [{"role": "user", "content": "Pick a number from 1 to 100."}]}'

Anthropic SDK の変更点

2026-10-21 を送るメジャーバージョンは、Python 2.0.0、TypeScript 1.0.0、Go 2.0.0、Java 3.0.0、C# 13.0.0、PHP 1.0.0、Ruby 2.0.0。API バージョンだけでなく、キーの送信方法と、クライアントが保持できる認証情報の数も変わった。ライセンスも MIT から Apache 2.0 に変更されている。Python SDK 1.17.0(最後の 1.x)と 2.3.0 をインストールし、受信した全リクエストのヘッダーと body を記録するローカルのエコーサーバーに接続した。

動作 Python SDK 1.17.0 Python SDK 2.3.0
送信する anthropic-version 2023-06-01 2026-10-21
API キーを送るヘッダー x-api-key Authorization: Bearer
引数としての temperature=0.2 TypeError、リクエストは送信されない TypeError、リクエストは送信されない
extra_body(body への直接フィールド追加)経由の temperature 送信される。受理するかは API が判断 送信される。2026-10-21 では 400
extra_headers={"X-Api-Key": ...} に別のキーを指定 クライアントのキーを置き換える 両方のキーが送信される
api_key と auth_token(API キーの代わりに使う bearer token)の同時指定 両方を送信 クライアント生成時に ValueError
Anthropic API への実リクエスト 200 200

Python SDK のメッセージ用メソッドから temperature 引数が削除されたのは 1.0.0 だ。そのため Python でサーバー側の 400 に遭遇するのは、extra_body(リクエスト body にフィールドを直接追加する SDK オプション)を使う場合か、body を自前で組み立てる HTTP クライアントやライブラリを使う場合に限られる。Bearer ヘッダーは両方の API バージョンで使える。Authorization: Bearer <key> だけを付けたリクエストは 2023-06-01 でも 200 を返した。認証方式と API バージョンは別々に移行できる。

両方のヘッダーを送ると、どちらのキーが使われるか

両方のヘッダーがある場合、Anthropic API は x-api-key を使う。5 通りのヘッダーの組み合わせを両バージョンで試した。

リクエストのヘッダー ステータス(両バージョン共通)
x-api-key のみ 200
Authorization: Bearer のみ 200
両方に同じキー 200
有効な x-api-key と無効な Bearer キー 200
無効な x-api-key と有効な Bearer キー 401 "invalid x-api-key"

Claude の手前にあるプロキシやゲートウェイと API とで、使用したキーの認識が食い違う可能性がある。SDK 2.x では、extra_headers={"X-Api-Key": other_key} で別のキーを追加するコードは、2 つのキーを送るようになる。Authorization にクライアントのキー、x-api-key にもう一方のキーが入る。Anthropic API は other_key で認証するが、Authorization しか読まないプロキシはクライアントのキーを使ったリクエストとして扱う。その結果、キー単位のクォータ、ログ、利用額上限が誤ったキーに紐づく。移行ガイドが示すクライアント側の修正は、別のキーを Authorization: Bearer <other_key> で送ることだ。プロキシ側では両方のヘッダーを読み、API と同じ優先順位(x-api-key が優先)を適用するか、異なるキーが指定されたリクエストを拒否する。

temperature を削除すると何が失われるか

temperature の削除による影響は、temperature: 0 に頼っていたチームが想定するほど大きくない。移行ガイドによると、Claude 4.7 以降はすでにデフォルト値しか受け付けないため、動作は変わらない。Claude Sonnet 4.6 のように別の値を受け付けるモデルでは、出力を安定させるために temperature を下げていたリクエストから、その効果が失われる。代わりになる設定はない。効果の大きさを測るため、2023-06-01 の Sonnet 4.6 に設定ごとに 20 リクエストを送った。すべてのリクエストが異なる内容になるよう、ランダムなリクエスト ID を末尾に追加した。

プロンプト temperature: 0 デフォルト(temperature: 1.0)
「1 から 100 の数字を 1 つ選んで」 2 種類:47(19 回)、42(1 回) 2 種類:47(17 回)、42(3 回)
「コーヒーショップのキャッチコピーを 8 語以内で書いて」 1 種類、20 回とも同じ 1 種類、20 回とも同じ

このような短い回答では、Sonnet 4.6 の出力はデフォルトの temperature でも 0 とほぼ同じ程度に集中した。temperature: 0 を削除しても変化は小さい。また、temperature: 0 も決定性を保証していたわけではない。20 回の試行で 2 種類の数字を返している。設定よりもプロンプトの文面のほうが出力に影響した。リクエスト ID を付けない場合は 42 が最多(temperature: 0 で 20 回中 17 回)だったが、付けると 47 が最多になった。再現性が必要なら、コードで回答を照合するかキャッシュする。サンプリングパラメータは、以前から再現性を保証するものではなかった。

Synthorai での API バージョン 2026-10-21 の扱い

Synthorai は両方の API バージョンと SDK からのリクエストを受け付ける。SDK 2.x に更新したり、anthropic-version: 2026-10-21 を送ったりしても、それまで動いていたリクエストは壊れない。両モデルの 16 ケースの検証を、2 つの anthropic-version の値で Synthorai 経由でも行った。全 32 リクエストが 200 を返し、Anthropic API が 2026-10-21 で拒否する 12 リクエストも成功した。Python SDK 1.17.0(x-api-key を送信)と 2.3.0(Authorization: Bearer を送信)は、どちらも base_url="https://synthorai.io" と同じキーで動作した。extra_body 経由の temperature も使えた。

Synthorai がこのように扱う理由は 4 つある。

  • 同じモデルでも提供元は複数ある。Claude は Anthropic API、Amazon Bedrock、Google Cloud Vertex AI から利用でき、各提供元でバージョン文字列が異なる。Synthorai は各提供元が要求するバージョンを送るため、クライアントの anthropic-version ヘッダーがリクエストの検証方法を決めるわけではない。
  • 移行中は新旧のクライアントが混在する。サービスごとに更新するため、同じアカウントから SDK 1.x の 2023-06-01 と SDK 2.x の 2026-10-21 が数週間にわたって送られる。両方を受け付ければ各サービスの都合に合わせて移行でき、どちらの SDK の認証ヘッダーでも同じキーを使える。
  • コードを変えずにモデルを切り替えられる。Claude Sonnet 4.6 向けに temperature: 0.2 を設定したコードは、モデル名を、そのパラメータを受け付けない Claude Sonnet 5.5 に変えても動き続ける。切り替えだけでリクエストが失敗することはない。
  • デフォルト値の指定で失敗させない。temperature: 1.0 は指定しなくてもモデルが使う値だ。拒否しても出力は変わらず、リクエストが失敗するだけになる。

ただし、200 が返っても、すべてのパラメータが効いたとは限らない。Sonnet 5.5 はデフォルトのサンプリング値しか受け付けないため、Synthorai 経由で temperature: 0.2 を送ると成功するが、ランダム性は下がらない。出力がサンプリング値に依存するなら、実際のプロンプトで指定の有無を比較してほしい。上の測定では、短い回答への影響は小さかった。

更新前の確認事項

利用状況 確認箇所 対応
HTTP で API を直接呼び出している anthropic-version を設定するすべての箇所 2026-10-21 に切り替える前に temperature、top_p、top_k を削除
Python SDK を使っている extra_body と、サンプリングパラメータを追加するラッパー 削除する。代替設定はない
Claude Sonnet 4.6 で低い temperature が必要 出力が本当にその値に依存するか そのリクエストを 2023-06-01 に残すか、測定後にパラメータを削除
履歴に文書や引用を含めて送り直している document ブロックを含む assistant ターンと、citations を含む user ターン 文書を user メッセージに移し、user 側の引用を削除
プロキシやゲートウェイを運用している キーをどのヘッダーから読むか x-api-key に加えて Authorization も読み、API と同じ優先順位を適用
Synthorai 経由で Claude を呼び出している 出力がサンプリング値に依存するか 更新に伴うリクエスト変更は不要。サンプリング値の指定有無で出力を比較

FAQ

Claude へのリクエストが「temperature: Extra inputs are not permitted」で失敗するのはなぜか
anthropic-version: 2026-10-21 で送信されているためだ。このバージョンには temperature パラメータがなく、1.0 を含め、どの値でも 400 になる。新しいメジャーバージョンの SDK は、このバージョンをデフォルトで送る。パラメータを削除するか、デフォルト以外の値をまだ受け付けるモデルでその値が必要なリクエストだけ、2023-06-01 に固定する。

anthropic-version 2023-06-01 は廃止されるのか
Anthropic は 2023-06-01 の提供終了日を発表していない。移行ガイドにも、10 月 21 日の API リリースノートにも記載はない。ヘッダーを明示的に指定したリクエストは従来の動作を維持する。そのため、Claude Sonnet 4.6 の特定のリクエストで temperature を使い続けられる。

Anthropic API は引き続き x-api-key ヘッダーを受け付けるか
Anthropic API は、両バージョンで x-api-key と Authorization: Bearer の両方を受け付ける。変更されたのは SDK が送るヘッダーだけだ。両方がある場合、API は x-api-key を使う。

関連記事

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?