
要約 — このレッスンの要点
- ストリーミングとは、GPT の応答を生成しながら逐次受信する方式。ユーザーはすべて生成されるまで待たずに読み始められる。
- SDK では
stream=True(Chat Completions)またはclient.responses.stream(...)(Responses API)を使う。内部的には Server-Sent Events(SSE) を利用。 - Python では
for chunk in streamでチャンクを反復処理。TypeScript ではfor await ... ofで受信できる。 - ストリーミング自体には追加コストは発生しない。消費トークン数は非ストリーミングと同一。
- コード例はOpenAI: Streaming と公式 SDK の README を一次情報とする。
なぜストリーミングを使うか
通常の API 呼び出しは応答全文が生成されてからレスポンスを返します。 長い出力の場合、ユーザーは数秒〜数十秒待たされる可能性があります。 ストリーミングを使うと、生成された文字が即座に届くため、 チャット UI などで体感的な速度が大幅に改善されます。
ストリーミングは SSE(Server-Sent Events) 形式で実装されています。
Python — Chat Completions のストリーミング
from openai import OpenAI
client = OpenAI()
stream = client.chat.completions.create(
model="gpt-4o",
messages=[{"role": "user", "content": "日本の歴史について教えてください"}],
stream=True,
)
for chunk in stream:
delta = chunk.choices[0].delta
if delta.content:
print(delta.content, end="", flush=True)
stream=True を指定するとレスポンスがイテラブルになり、chunk.choices[0].delta.content で
各トークンチャンクを受け取れます。flush=True を指定することで、バッファリングなしに即時出力されます。
Python — Responses API のストリーミング
from openai import OpenAI
client = OpenAI()
with client.responses.stream(
model="gpt-5",
input="日本の歴史について教えてください",
) as stream:
for event in stream:
if event.type == "response.output_text.delta":
print(event.delta, end="", flush=True)
final = stream.get_final_response()
print(final.usage)
Responses API では「イベント型のストリーム」を購読するスタイルです。
response.output_text.delta イベントごとにチャンクテキストが届きます。
TypeScript — Chat Completions のストリーミング
import OpenAI from "openai";
const client = new OpenAI();
const stream = await client.chat.completions.create({
model: "gpt-4o",
messages: [{ role: "user", content: "日本の歴史について教えてください" }],
stream: true,
});
for await (const chunk of stream) {
const delta = chunk.choices[0].delta.content;
if (delta) process.stdout.write(delta);
}
最終メッセージの取得
ストリーム完了後に完全なレスポンス(usage を含む)が必要な場合は、
Responses API では stream.get_final_response() が利用できます。
Chat Completions のストリーミングではチャンクから usage を取得できないモデルもあるため、
正確なトークン消費を計測したい場合は非ストリーミングで再呼び出しするか、
利用するモデル・SDK バージョンの仕様を確認してください。
使いどころの整理
| 方式 | 向いているケース |
|---|---|
| 非ストリーミング | バッチ処理・後処理が多い・応答全文が必要な場合 |
| ストリーミング | チャット UI・ターミナル出力・長文生成のリアルタイム表示 |