名称変更は簡単な部分です。注意が必要なのは新しいフィールドが数える対象です。max_completion_tokens は推論と表示される出力の両方を対象とするため、回答だけを基準にした予算では finish_reason "length" で空のレスポンスが返り、課金も発生します。
エラー
{
"error": {
"message": "Unsupported parameter: 'max_tokens' is not supported with this model. Use 'max_completion_tokens' instead.",
"type": "invalid_request_error",
"param": "max_tokens",
"code": "unsupported_parameter"
}
}原因と対処法の概要
| 原因 | 対処法 |
|---|---|
| 推論モデルのファミリーでフィールドが置き換えられた | これらのモデルでは max_tokens の代わりに max_completion_tokens を送信します。 |
| 古いフィールドに固定された SDK またはラッパー | アップグレードするか、ヘルパー経由ではなくフィールドを明示的に設定します。 |
| 複数のプロバイダーに分岐する1つのコードパス | モデルごとに分岐せず、エッジで一度だけ正規化します。 |
| 修正後に回答が空になる | 予算には推論トークンが含まれます。予想される出力より十分大きく設定してください。 |
フィールド名を変更する
呼び出し箇所では単純な置換です。リクエストのその他の部分はすべて変わりません。
# Before
resp = client.chat.completions.create(
model="gpt-5-6-sol", max_tokens=1024, messages=msgs)
# After
resp = client.chat.completions.create(
model="gpt-5-6-sol", max_completion_tokens=1024, messages=msgs)見えない推論に予算を割り当てる
max_completion_tokens は推論トークンと表示される出力を合算して上限設定します。モデルが 1,024 の上限中900トークンを思考に使うと、回答は124トークンになるか、finish_reason "length" の空メッセージになり、そのすべてに課金されます。両方を考慮して予算を設定し、空のレスポンスを信頼する前に finish_reason を確認してください。
モデルごとに分岐せず、一度だけ正規化する
コードのエッジに単一のヘルパーを置けば、残りをプロバイダー非依存に保ち、次のモデルファミリーが登場するたびに編集を繰り返す必要がなくなります。
def token_budget(model: str, n: int) -> dict:
"""One place that knows which spelling a model wants."""
if model.startswith("claude-"):
return {"max_tokens": n}
return {"max_completion_tokens": n}
resp = client.chat.completions.create(
model=model, messages=msgs, **token_budget(model, 4096))関連する拒否も想定する
max_tokens を廃止した同じモデルファミリーでは、temperature や top_p も拒否されることがよくあります。これを修正すると次の問題が表面化することがあるため、未対応のサンプリングパラメータはデフォルト値を設定するのではなく削除してください。
Kunavo経由で呼び出している場合
Kunavo の /v1/chat/completions は GPT-5.x 推論ファミリーで max_tokens を受け付けます。トランスレーターは、2つの表記のうちどちらを送信してもそれを読み取り、上流のフィールドにマッピングします。/v1/responses はその逆の処理を行います。そのため、これらのモデルでは名称変更は不要です。曖昧にせず1つの非対称性を明確に述べると、claude-* モデルでは現在、チャットトランスレーターが max_tokens のみを読み取ります。Claude にはその表記を送信してください。上記のヘルパーもそのように動作します。
よくある質問
max_completion_tokens は単なる名称変更ですか?
呼び出し箇所ではそうですが、意味は異なります。max_completion_tokens は推論トークンと出力をまとめて上限設定しますが、max_tokens は表示される出力だけを上限設定していました。
修正後にレスポンスが空なのはなぜですか?
予算が推論に使われました。finish_reason が "length" で content が空の場合は、上限を引き上げてください。
モデルごとに分岐する必要がありますか?
GPT ファミリーについては Kunavo では不要です。両方の表記を受け付けます。claude-* モデルの場合だけ分岐するか、どこでも1つの正規化ヘルパーを使用してください。