ゲートウェイ
ストリーミングレスポンス (SSE)
OpenAI、Anthropic、Gemini プロトコルで Server-Sent Events を使ってトークンを段階的にストリーミング受信します。
3 つのプロトコルすべてが Server-Sent Events 経由でストリーミングに対応しています。適切なフラグを設定して、到着次第イベントを処理してください。
有効化の方法
| プロトコル | フラグ |
|---|---|
| OpenAI Chat / Responses | JSON ボディに "stream": true |
| Anthropic | JSON ボディに "stream": true |
| Gemini | :streamGenerateContent + ?alt=sse を使用 |
SSE 形式
イベントは空行で区切られた data: 行として到着します。OpenAI ストリームは data: [DONE] で終了します。Anthropic と Gemini はそれぞれ独自の終端イベントを使用します。
data: {"id":"...","object":"chat.completion.chunk","choices":[{"delta":{"content":"He"}}]}
data: {"id":"...","object":"chat.completion.chunk","choices":[{"delta":{"content":"llo"}}]}
data: [DONE]Python
from openai import OpenAI
client = OpenAI(api_key="sk-***", base_url="https://portal.torouter.ai/v1")
stream = client.chat.completions.create(
model="gpt-5",
messages=[{"role": "user", "content": "Count to 5"}],
stream=True,
)
for chunk in stream:
delta = chunk.choices[0].delta.content
if delta:
print(delta, end="", flush=True)from anthropic import Anthropic
client = Anthropic(api_key="sk-***", base_url="https://portal.torouter.ai")
with client.messages.stream(
model="claude-opus-4-7",
max_tokens=256,
messages=[{"role": "user", "content": "Count to 5"}],
) as stream:
for text in stream.text_stream:
print(text, end="", flush=True)Node.js
import OpenAI from "openai";
const client = new OpenAI({
apiKey: "sk-***",
baseURL: "https://portal.torouter.ai/v1",
});
const stream = await client.chat.completions.create({
model: "gpt-5",
messages: [{ role: "user", content: "Count to 5" }],
stream: true,
});
for await (const chunk of stream) {
process.stdout.write(chunk.choices[0]?.delta?.content ?? "");
}推論モデル(例: *-thinking、o1、o3)は回答前に推論用の断片を出力します。対応しているエンドポイントでは、OpenAI SDK が delta.reasoning_content として返すことがあります。