GPT-6 Astra Streamingガイド:レスポンスAPIイベント、ツール、エラーハンドリング
堅牢なGPT-6 Astraストリーミングインターフェースを、型付けされたResponses APIイベント、インクリメンタルテキスト、ツール状態、終端結果、キャンセル、および再接続ロジックを用いて構築します。

ストリーミングは、GPT-6 Astraが処理中にイベントを配信することで、知覚上のレイテンシを改善します。基盤となる計算が無料になるわけでも、障害ケースがなくなるわけでもありません。実運用のクライアントは、段階的な出力を組み立て、ツールの進行状況を表示し、終了状態を区別し、接続が失敗した場合に復旧する必要があります。
タイプされたイベントから始める
stream: true を設定し、SDKの型付きイベントストリームを反復処理します。
const stream = await client.responses.create({
model: "gpt-6-astra",
input: "移行計画を5つのステップで説明してください。"、
stream: true
});
for await (const event of stream) {
switch (event.type) {
case "response.output_text.delta":
process.stdout.write(event.delta);
break;
.completed: 応答.完了
console.log("\n完了");
break;
.失敗
console.error("失敗", event.response.error);
break;
case "error":
console.error(event.message);
break;
}
}
.created、response.output_text.delta、response.completed、errorなどの一般的なテキストライフサイクルイベントがあります。完全なイベントユニオンには、出力アイテム、コンテンツパート、注釈、拒否、失敗、その他のイベントも含まれます。未知のイベントタイプを安全に処理して、新しく追加されたイベントが古いクライアントをクラッシュさせないようにしてください。
アセンブラを構築せよ、テキスト追記ループではなく
レスポンスには、複数の出力アイテムやコンテンツ部分を含めることができます。すべてのデルタを1つのグローバル文字列に追加するのではなく、レスポンス、出力アイテム、コンテンツ部分ごとに状態をインデックス化します。利用可能な場合は、文書化された識別子やシーケンスデータを使用して重複を排除し、確定したローカル状態のみをレンダリングします。
注釈や引用はテキストとは別に届くことがあります。連結時にそれらを削除するのではなく、オフセットや関連性を保持してください。最終的な応答オブジェクトが利用可能な場合は、それを信頼できるものとして扱ってください。
ターミナル状態は交換可能ではありません
.completedは正常完了を意味します。response.failedは失敗を示します。response.incompleteはトークン制限やその他の理由を反映している可能性があり、有用な部分的な出力を含むことがあります。トランスポートレベルのerrorは、通常の応答終了イベントなしで発生する可能性があります。
ソケットが閉じたという理由だけでリクエストを成功とマークしないでください。response.created が到着したらすぐにレスポンスIDを永続化し、終了ステータスは別途保存してください。
ストリームツールのアクティビティを正直に表示する
ツール呼び出しには、モデルの計画、引数の生成、サーバーまたはクライアントの実行、ツールの結果、再開された生成というフェーズがあります。UIは、対応するイベント/状態が存在する場合にのみ「検索中」または「承認待ち」と表示する必要があります。進行状況のパーセンテージを偽装してはいけません。
クライアント実行関数の場合、API契約が明示的にインクリメンタル消費をサポートしていない限り、解析前に完全な引数を組み立ててください。それらを検証し、一度だけ実行し、コールIDを使用して結果を返します。重複したイベントをストリーミングしても、重複した副作用を引き起こしてはなりません。
バックプレッシャーとUIパフォーマンス
トークンサイズの差分は、ブラウザがレンダリングすべき速度よりも速く到着することがあります。バッファリングを短時間行い、制御されたペースでUIを更新します。これにより、レイアウト処理を削減しつつ、知覚される遅延を実質的に損なうことはありません。フレームワークがサポートしている場合は、メモリ内のバッファを制限し、後続の処理を一時停止します。
生のイベントログをビューモデルから分離してください。イベントログはデバッグをサポートし、ビューモデルはデルタを結合して安定したユーザー可視コンテンツにします。ログ記録の前に、機密性の高いツールペイロードを編集してください。
切断、タイムアウト、キャンセル
切断時は、状態を回復するまで操作を不明として分類します。モデルの応答がサーバー側で継続している可能性があり、外部ツールがすでに動作している可能性があります。書き込みの自動再実行は避けてください。
リクエストの期限とアイドルストリームタイマーを使用しますが、「テキストデルタなし」と「アクティビティなし」を区別してください。長時間のツール呼び出しでも正常である可能性があります。キャンセルは、自身のキャンセル可能なツールに伝播する必要があります。完了したエフェクトのロールバックを保証することはできません。
応答状態を継続する場合、最後にコミットされた応答とツール結果を保持します。WebSocket固有の復旧では previous_response_not_found が報告される可能性があります。公式のエラーガイドでは、状態を解決できない場合、完全な入力コンテキストと previous_response_id: null を使用して再試行することを推奨しています。
可観測性
.createdへの応答時間、最初のテキストデルタ、最初のツールイベント、終端イベントを記録します。総所要時間、イベント数、終端ステータス、切断、再試行、ユーザーキャンセルも記録します。すべてのイベントを1つのアプリケーションリクエストIDとOpenAIレスポンスIDに関連付けます。
不正な注文、重複配送、不明なイベント、ツールのタイムアウト、表示テキスト後の遅延障害、書き込み後の接続喪失をテストします。ストリーミングの正確性は状態機械の正確性です。
ブラウザとサーバーの実装パターン
多くの製品では、アプリケーションサーバーがOpenAI接続を保持し、サニタイズされたイベントストリームをブラウザに中継する必要があります。これにより、API資格情報がクライアントに渡らず、認可が一元化され、サーバーが内部ツールの引数を隠すことができます。ブラウザはレンダリングに必要なイベントのみを受け取ります:ステータス、安全なテキスト差分、引用、承認プロンプト、および最終結果です。
粗いチェックポイントを保持し、すべての文字を保存しないようにします。すべての差分を保存すると書き込みが過剰になり、完了時のみ保存すると切断時に失われる情報が多くなります。通常は短い間隔またはコンテンツパートの境界がより良い妥協点です。再接続時には、最新の確定済みビューを送信し、トランスポート設計に従って次の既知のイベントから続行します。
モデレーションと安全性にはストリーミングポリシーが必要です。最終的な応答が存在する前に部分的なテキストがユーザーに届くため、完了時のみ実行される下流のレビューでは手遅れになる可能性があります。リスクに応じて、生成前の制御、段階的なセーフガード、バッファリング、または制限付きストリーミングを選択してください。リスクの高いワークフローでは、即時性の一部をレビューのために意図的に犠牲にすることもあります。
最後に、ブラウザのリフレッシュ後に再開されたレスポンスが分析で二重にカウントされないようにしてください。OpenAIのレスポンスIDと安定したアプリケーションリクエストIDが、すべてのセグメントを1つの論理的なタスクに結合する必要があります。
よくある質問
ストリーミングはトークンコストを削減しますか?
いいえ。生成されるトークンの数ではなく、配信方法が変わります。
部分的な出力をすぐに表示できますか?
はい、ただし進行中としてマークし、拒否、不完全、または失敗の結果に備えてください。
接続が切れた場合、再試行すべきですか?
まずは復旧または調整を行ってください。特にツールが副作用を引き起こす可能性がある場合です。盲目的なリプレイはアクションを重複させる可能性があります。
SSE と WebSocket のイベント処理は同一ですか?
レスポンスの概念は共有していますが、トランスポートと継続の動作が異なります。選択したモードのガイドに従ってください。
結論
信頼性の高いGPT-6 Astraストリーミングには、型付けされたイベント処理、構造化されたアセンブラ、明確な終端状態、冪等なツール実行、バックプレッシャー、そして復旧が必要です。ユーザーの進捗認識を最適化しつつ、不完全なテキストや切断された接続を誤って成功とみなして報告しないようにします。






























































































