ゲスト

マスターレッスン / Level 5 — API / レッスン 5-4

Level 5 — API

ストリーミング応答

所要時間: 8分  |  更新: 2026-05-06

ストリーミング応答

要約 — このレッスンの要点

  • ストリーミングとは、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・ターミナル出力・長文生成のリアルタイム表示

さらに深く読む