AI・機械学習
上級

ストリーミングAPI(ストリーミングエーピーアイ)

LLMプロバイダが提供するストリーミング対応のAPIエンドポイント。stream パラメータや専用エンドポイントによりトークンの逐次送信を有効化し、OpenAI・Anthropic・Google各社で実装仕様が異なる。

0 回閲覧
0 いいね

ストリーミング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/completionsstream: trueSSE + JSONdata: [DONE]
Anthropic/v1/messagesstream: trueSSE + typed eventsmessage_stop event
Google Gemini/v1beta/models/*/streamGenerateContent専用エンドポイントSSE + JSON arrayストリーム終了
Mistral/v1/chat/completionsstream: trueSSE + JSON (OpenAI互換)data: [DONE]
Cohere/v2/chatstream: trueSSE + typed eventsstream-end event
Meta Llama API/v1/chat/completionsstream: trueSSE + 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)が適用される場合もあり、レイテンシー要件がなければバッチが経済的です。