Skip to main content

簡潔な回答

コンテンツフィルターが作動した場合、同じ内容であってもストリーミングと非ストリーミングモードでは結果が大きく異なることがあります:
  1. 非ストリーミング:公式ルートでコンテンツセーフティフィルターが作動した場合、APIYI は別の公式ルートで自動的にリクエストを再生成します。クライアントは完全な結果を取得でき、課金は1回のみ行われます。
  2. ストリーミング:生成されるとすぐに出力がクライアントへ送信されるため、ストリームの途中でルートを切り替えることはできません。リクエストは finish_reason: "content_filter" で終了し、すでに生成された部分については通常通り課金されます。
  3. 選び方:ユーザーに対して token ごとに逐次表示するコンテンツ(チャット、エージェントの返答など)にはストリーミングを使用し、完了後にプログラムが処理するコンテンツ(スクリプト、絵コンテ、翻訳、構造化データなど)には非ストリーミングを使用してください。

フィルタリングが行われる2つのポイント

プロバイダーのコンテンツセーフティフィルターは2つのポイントで介入する可能性があり、どちらもストリーミングモードで確認できます: いずれの場合もHTTPステータスは 200 となり、ストリームは data: [DONE] で正常に終了します。HTTPエラーログには何も出力されません。何が発生したかは、ストリームの最後のイベントでのみ確認できます。

ストリーミング vs 非ストリーミング

非ストリーミングリクエストに対する自動フェイルオーバーは成功率を大幅に向上させますが、100%ではありません。プロバイダーの利用規約に明らかに違反しているコンテンツは、別のルートであってもモデル自体によって拒否される場合があります。そのレスポンス形式については、OpenAI モデルの拒否はどのような形式ですか? をご覧ください。

テスト結果

2026-09-25 (UTC+8) に、gpt-5.6-terra に対して同一のパラメータ(max_tokens=35000、temperature=0、reasoning_effort=high)を使用し、両方のモードで同じ一連の映画絵コンテスクリプトを送信しました。 ストリーミングモードで同じ内容を再試行しても、結果は基本的に同じです。フィルタリングがトリガーされるかどうかは、運ではなく主にコンテンツに依存します。

中断されたストリーミングの例

choices を含む最後のイベントにはコンテンツがなく、終了理由のみが含まれます:
生成段階で出力が中断されると、結合されたテキストの末尾に改行なしで英語の拒否メッセージが直接追加されます。 例えば、中国語の絵コンテが文の途中で終了し、直後に I'm sorry, but I cannot assist with that request. が続きます。このテキストを変更せずに継続リクエストに渡すと、モデルはそのコンテキスト内の拒否メッセージを認識し、再びブロックされる可能性が高くなります。続行する前にその文を削除してください。

選び方

ストリーミングを使用

  • ユーザーが出力をすぐに確認する必要があるチャット、カスタマーサポート、エージェントの応答
  • ユーザーが生成を途中で停止できるシナリオ
  • 日常会話ではコンテンツフィルタリングがトリガーされることは稀であるため、ストリーミング体験の方が重要

非ストリーミングを使用

  • 台本、絵コンテ、小説の章などの長文のクリエイティブライティング
  • 一括翻訳、情報抽出、構造化JSON
  • ユーザーに表示する前に解析および保存を行う結果
  • センシティブなプロットに触れやすいコンテンツ(戦闘、負傷、犯罪)
1つのプロダクトで両方を併用することも可能です。チャットにはストリーミングを使用し、台本や絵コンテの生成には非ストリーミングを使用します。後者の場合は stream を false に設定するだけで、それ以外の設定は変更する必要はありません。 非ストリーミングリクエストは、レスポンス全体が生成された後にのみ返されます。推論モデルによる長い出力には30〜100秒以上かかる場合があるため、これらのリクエストに対するクライアントのタイムアウトは少なくとも300秒に設定してください。詳細はAPIのタイムアウトを回避するには?を参照してください。UIで進捗状況を示す必要がある場合は、「生成中」の状態を表示し、生成が完了した時点で結果を表示してください。

どうしても stream を使用する必要がある場合

1

stream の読み取り中に finish_reason を記録する

choices を含む最後のイベントの finish_reason が content_filter である場合、レスポンスはフィルタリングされています。HTTP ステータスコードには依存しないでください。
2

末尾の拒否メッセージを削除する

生成段階で出力が中断された場合、テキストの末尾は英語の拒否メッセージで終わります。部分的な出力をどう処理するかを決定する前に、それを削除してください。
3

ストリーミングなしで再試行する

プラットフォームが自動的にルートを切り替えられるよう、中断された部分を非ストリーミングリクエストとして再送信します。これは、ストリーミングで継続するよりもはるかに高い確率で成功します。
4

ブロックされ続ける場合は言い換える

同じタスクに対して非ストリーミングリクエストでも失敗する場合は、センシティブな詳細をより一般的な表現に言い換えて再試行してください。同じ内容を変更せずにそのまま再送信しないでください。
以下は最小限の例です。stream を読み取り、フィルタリングされた場合は拒否メッセージを削除して、ストリーミングなしで再試行します。
この例では、最も簡単なアプローチとして、ストリーミングなしでレスポンス全体を単純に再生成しています。ワークフローで部分的な出力を保持する必要がある場合は、partial をコンテキストとして渡してモデルに継続を依頼しますが、その継続リクエストもストリーミングなしで送信してください。

よくある質問

はい、課金されます。プロバイダーが実際にそのコンテンツを生成したため、実際の入力および出力 tokens に対して課金されます。フィルタリングをトリガーしやすいコンテンツの場合は非ストリーミングの方が安価です。成功した試行のみが課金されます。
いいえ、できません。フィルタリングはプロバイダーによって強制されており、APIYI が無効化したり厳しさを変更したりすることはできません。プラットフォームができることは、フィルタリングされた非ストリーミングリクエストを別の公式ルートで再試行することです。
フィルタリングの厳しさは公式ルートによって多少異なり、またモデルは毎回出力の言い回しを変えるため、ボーダーライン上のコンテンツは一度通過しても次回は遮断される可能性があります。明らかにセンシティブなコンテンツは一貫してブロックされます。
生成段階での中断はコンテンツがすでに送信された後に発生するため、クライアントはすでに前半を受信して表示しています。その時点で別のルートで最初から再生成しても、すでに表示された内容と整合しなくなります。そのため、ストリーミングリクエストはクライアント側で content_filter を確認した際に対処する必要があります。

関連ドキュメント

OpenAI モデルの拒絶とはどのようなものですか?

モデル自体が拒絶した場合のレスポンス形式と検出方法

ストリーミング呼び出し vs 非ストリーミング呼び出し

両モードにおける統合、課金、およびよくある誤解

API タイムアウトを回避するにはどうすればよいですか?

長時間の非ストリーミング出力に対するタイムアウト設定

コンテンツの安全性とコンプライアンス

プラットフォームのコンテンツ安全性とコンプライアンスポリシー