ストリーミングAPI(ストリーミングエーピーアイ)
LLMプロバイダが提供するストリーミング対応のAPIエンドポイント。stream パラメータや専用エンドポイントによりトークンの逐次送信を有効化し、OpenAI・Anthropic・Google各社で実装仕様が異なる。
ストリーミングAPIとは
ストリーミングAPIは、LLMサービスプロバイダが提供するトークン逐次送信対応のHTTPエンドポイントです。非ストリーミングAPIが1つのHTTPレスポンスに全出力を含めて返すのに対し、ストリーミングAPIはSSE(Server-Sent Events)やNDJSONなどの形式でトークンを生成順に送信し続けます。2026年現在、OpenAI・Anthropic・Google・Mistral・Cohere・Meta(Llama API)の主要6社すべてがストリーミングAPIを提供しています。
主要プロバイダのストリーミング仕様比較
| プロバイダ | エンドポイント | 有効化方法 | イベント形式 | 終了マーカー |
|---|---|---|---|---|
| OpenAI | /v1/chat/completions | stream: true | SSE + JSON | data: [DONE] |
| Anthropic | /v1/messages | stream: true | SSE + typed events | message_stop event |
| Google Gemini | /v1beta/models/*/streamGenerateContent | 専用エンドポイント | SSE + JSON array | ストリーム終了 |
| Mistral | /v1/chat/completions | stream: true | SSE + JSON (OpenAI互換) | data: [DONE] |
| Cohere | /v2/chat | stream: true | SSE + typed events | stream-end event |
| Meta Llama API | /v1/chat/completions | stream: true | SSE + JSON (OpenAI互換) | data: [DONE] |
OpenAI形式の事実上の標準化
OpenAIのストリーミング仕様(/v1/chat/completions + stream: true + SSE + ChatCompletionChunk)は事実上の業界標準になっています。Mistral、Together AI、Groq、Fireworks AI、Perplexity、LM Studio、Ollama(SSEモード)など多くのプロバイダやローカル推論エンジンがOpenAI互換APIを実装しています。
ストリーミングレスポンスの処理パターン
コールバック方式
onToken や onChunk のようなコールバック関数を登録し、トークン到着ごとに呼び出す方式。OpenAI Python SDKの stream イテレータやAnthropic Python SDKの with_streaming_response がこの方式です。
AsyncIterator/Generator方式
Python の async for やJavaScriptの for await...of で非同期イテレーションする方式。コードの見通しが良く、バックプレッシャー制御も容易です。
Observable/RxJS方式
フロントエンドでは Observable パターンでストリームを扱い、map・filter・scan・debounce などのオペレーターでトークンを変換・集約する方式。複数のストリームの合成や、エラーリトライの宣言的な記述に適しています。
高度なストリーミング機能
Streaming with Tool Use
OpenAI(2024年以降)とAnthropic(2024年以降)は、Tool Use(Function Calling)をストリーミング中に処理する機能を提供しています。モデルがツール呼び出しを決定した場合、ツール呼び出しのJSONがストリーミングで送信され、クライアントはツール実行結果を返してストリームを継続します。
Streaming with Structured Output
JSON Schemaに準拠した構造化出力をストリーミングで受信する機能。OpenAIの response_format: { type: "json_schema" } とAnthropic の tool_use を使った構造化出力はストリーミングに対応しています。パーシャルJSONをリアルタイムでパースするライブラリ(例: partial-json-parser)との併用が必要です。
Stream Cancellation
クライアント側でストリームを途中で終了するキャンセル機能。AbortController(JavaScript)や httpx.AsyncClient.aclose()(Python)でHTTP接続を切断し、サーバー側の生成処理も停止させます。課金はキャンセル時点までの出力トークンに基づきます。
エッジケースと注意点
レート制限
ストリーミングAPIでは、RPM(Requests Per Minute)は非ストリーミングと同一ですが、1リクエストの接続持続時間が長くなるため、同時接続数の制限に引っかかりやすくなります。OpenAIのTier 3では同時接続100本まで、Anthropicでは同時リクエスト数がプランに応じて制限されます。
タイムアウト設定
長い回答(4,000トークン以上)のストリーミングでは、生成に60秒以上かかることがあります。HTTPクライアントのタイムアウトをデフォルトの30秒から120〜300秒に延長する必要があります。
ロードバランサーの設定
AWS ALBのアイドルタイムアウト(デフォルト60秒)、Nginx の proxy_read_timeout(デフォルト60秒)、Cloudflare の100秒制限など、リバースプロキシやCDNのタイムアウト設定がストリーミングを途中で切断する原因になります。
FAQ
Q1: OpenAI互換APIとはどの範囲の互換性?
A1: /v1/chat/completions エンドポイントのリクエスト/レスポンス形式、ストリーミングのSSEフォーマット、ChatCompletionChunk オブジェクト構造が共通です。ただし、Tool UseやStructured Outputなどの高度な機能は互換性が不完全な場合があり、プロバイダ固有の拡張パラメータも存在します。
Q2: ストリーミングAPIのテストはどうすれば?
A2: curl でSSEストリームを直接受信するのが最も簡単なデバッグ方法です。--no-buffer フラグを付けてリアルタイム出力を確認します。CI/CDでは、モックサーバー(例: WireMock、msw)でSSEレスポンスをシミュレートしてテストします。
Q3: ストリーミングとバッチAPIはどう使い分ける?
A3: ユーザー対話(チャットボット、コード補完、検索)にはストリーミング、大量処理(データ分類、翻訳、要約の一括処理)にはバッチAPIが適しています。バッチAPIは50%のコスト割引(OpenAI)が適用される場合もあり、レイテンシー要件がなければバッチが経済的です。