簡単な回答
これは API の失敗ではありません。思考バジェットが出力バジェットを使い果たしていることが原因です。gpt-6.1-sol などの推論モデルは、まず推論トレースを生成し、その後で回答を書き込みます。両方の処理で max_tokens の上限を共有します。思考中にバジェットを使い切ると、回答の生成が始まる前に途中で打ち切られるため、空の結果が返されます。
max_tokens を引き上げる(まずは 1000 以上が安全です)か、推論の強度を下げると、この問題は解消します。
確認できる内容
よくある形式は2つあります。 1つは明示的なエラーで、HTTP ステータスは 429 または 500 です(message フィールドはローカライズされる場合があるため、一部のレスポンスでは中国語のメッセージが表示されます)。
completion_tokens は 300、reasoning_tokens は 300、text_tokens は 0 です。つまり、モデルは 300 token を生成し、そのすべてを思考に使い、出力テキストを一文字も書かなかったということです。
呼び出しログではリクエストが成功し、課金されたことが示されていますが、これは矛盾ではありません。モデルはコンテンツ(推論トレース)を実際に生成しており、表示可能なテキストがなかっただけです。
これが起こる理由
推論モデルの出力には、2つの段階があります。max_tokens(またはmax_completion_tokens、max_output_tokens)は、表示される回答の長さではなく、両方の段階を合わせた長さを制限します。
そのため、max_tokensが200~500のように小さく設定されていて、タスクに十分な推論が必要な場合、思考中に予算を使い切ってしまいます。finish_reasonがlengthになり、内容が空になります。
3つの確認
1
ステップ1: finish_reasonを確認する
lengthの場合、出力が途中で切り詰められています。モデルが回答を拒否したわけではありません。stopの場合でもコンテンツが空のままであれば、ステップ2と3に進んでください。2
ステップ2: usage内のreasoning_tokensを確認する
usage.completion_tokens_details.reasoning_tokensを確認し、completion_tokensと比較します。2つの値が近い、または等しい場合、予算の大部分が思考に使われています。3
ステップ3: リクエスト内のmax_tokensを確認する
max_tokensを小さい値(例えば300)に明示的に設定している場合、それがほぼ確実に原因です。設定していない場合は、SDKまたはフレームワークによって小さいデフォルト値が設定されていないか確認してください。修正方法
max_tokens を増やす
直接的な修正方法です。通常のチャットには 1000~2000、複雑な推論や長文の出力には 4000 以上を使用します。推論のオーバーヘッドは予想以上に大きくなる場合があります。
推論の強度を下げる
モデルが
reasoning_effort に対応している場合は、high から medium または low に下げます。思考の消費量が大幅に減少します。ストリーミングに切り替える
stream を true に設定します。推論トレースが個別のイベントとして届くため、モデルの処理内容を確認でき、回答が気付かないうちに消えることもありません。モデルファミリー別パラメータリファレンス
よくある質問
ログには成功と表示されているのに、なぜエラーが返されたのですか?
ログには成功と表示されているのに、なぜエラーが返されたのですか?
ログには、上流サービスが生成を完了し、課金を確定したことが記録されています。表示されるテキストが空かどうかは確認されません。生成が成功することと、回答が空でないことは別の事象です。
単純に再試行すれば解決しますか?
単純に再試行すれば解決しますか?
通常は解決しません。同じ prompt と同じ
max_tokens では、モデルは再び予算を推論に使う可能性が高くなります。再試行するより、パラメータを変更するほうがはるかに効果的です。空のレスポンスでも課金されますか?
空のレスポンスでも課金されますか?
はい。推論用の tokens は実際に消費されるため、出力 tokens として課金されます。正確な量は呼び出しログで確認できます。
すべてのモデルがこのように動作しますか?
すべてのモデルがこのように動作しますか?
いいえ。この問題が発生するのは、思考ステージを持つ推論モデルだけです。
gpt-4o や deepseek-chat などの通常の非推論モデルは、max_tokens の全体を表示用の出力に使います。max_tokens の値が大きいと、料金は高くなりますか?
max_tokens の値が大きいと、料金は高くなりますか?
いいえ。
max_tokens は上限であり、実際の消費量ではありません。モデルは処理が完了すると停止し、実際に生成された tokens に対してのみ支払います。関連
max_tokensとは何ですか?
パラメータの意味、命名の経緯、モデルごとのデフォルト値
ストリーミングと非ストリーミング
長いレスポンスや推論モデルではストリーミングを推奨
モデルエラーのトラブルシューティング方法
400、401、429、503の一般的な切り分け
ログで課金を確認する方法
リクエストが課金されたかどうかと、その金額を確認