ドキュメントガイドストリーミング
ストリーミング
3 方言の SSE イベント形式と解析時の注意点。
3 つの方言すべてが Server-Sent Events(SSE)でのストリーミングに対応しています。モデルの生成に合わせて増分が送られるため、完全なレスポンスを待つ必要がありません。イベント形式は方言ごとに異なり、公式 API と一致します。
OpenAI 形式(Responses)
リクエストボディに "stream": true を指定します。イベントには response.created、response.output_text.delta、response.completed などのタイプフィールドが付きます:
stream = client.responses.create(
model="claude-fable-5",
input="Tell me a story",
stream=True,
)
for event in stream:
if event.type == "response.output_text.delta":
print(event.delta, end="", flush=True)data: {"type":"response.created", ...}
data: {"type":"response.output_text.delta","delta":"Once"}
data: {"type":"response.output_text.delta","delta":" upon"}
data: {"type":"response.completed","response":{..., "usage":{...}}}Anthropic 形式(Messages)
こちらも "stream": true を指定しますが、イベントは SSE の名前付きイベント(event: + data: の 2 行)です:message_start → content_block_start → 複数の content_block_delta → content_block_stop → message_delta → message_stop。
event: message_start
data: {"type":"message_start","message":{...}}
event: content_block_delta
data: {"type":"content_block_delta","index":0,"delta":{"type":"text_delta","text":"Once"}}
event: message_stop
data: {"type":"message_stop"}Gemini 形式
:streamGenerateContent アクションに ?alt=sse を付けて呼び出します。各 data: 行は GenerateContentResponse の断片で、増分テキストは candidates[].content.parts[].text に入ります。alt=sse なしでは完全な JSON 配列(非ストリーミング)が返ります。
curl "https://api.soleapi.com/v1beta/models/gemini-2.5-pro:streamGenerateContent?alt=sse" \
-H "x-goog-api-key: $SOLEAPI_API_KEY" \
-H "Content-Type: application/json" \
-d '{"contents": [{"parts": [{"text": "Tell me a story"}]}]}'解析時の注意点
- SSE イベントは空行で区切られますが、TCP の分割により 1 イベントが複数回の読み取りにまたがることがあります。バッファリングして完全なフレームが揃ってから解析してください。自前パーサで最も多い落とし穴です。
- 長い生成では読み取りタイムアウトを 5 分以上に延ばしてください。推論系モデルが長時間無出力のときにクライアント側で切断されるのを防ぎます。
- 接続断からの再試行は新規リクエストとして扱ってください(ストリームは途中再開できません)。非ストリーミング呼び出しへのフォールバックも検討してください。
- UI 描画では増分をスロットリングでまとめ、delta ごとに再描画が走らないようにしてください。
- ストリーミングリクエストのトークン使用量は最後のイベントで通知され、課金はストリーム終了後に確定します。