開發文件

串流輸出

開啟串流後,模型邊生成邊回傳,使用者幾秒內就能看到第一個字。長回覆、對話介面和 Agent 情境都建議開啟。

開啟方式

在請求主體裡加 "stream": true,回應改為 text/event-stream(SSE)。官方 SDK 都封裝好了串流介面:

from openai import OpenAI

client = OpenAI(api_key="sk-...", base_url="https://api.flyrouter.ai/v1")

stream = client.chat.completions.create(
    model="gpt-6.1-sol",
    messages=[{"role": "user", "content": "寫一首關於秋天的短詩"}],
    stream=True,
)
for chunk in stream:
    if chunk.choices and chunk.choices[0].delta.content:
        print(chunk.choices[0].delta.content, end="", flush=True)

各協定的事件格式

OpenAI Chat Completions:每個區塊是一行 data: {...},增量文字在 choices[0].delta.content,最後以 data: [DONE] 結束。需要統計用量時,加上 "stream_options": {"include_usage": true},最後一個區塊會帶 usage。

Anthropic Messages:事件依次為 message_start → content_block_start → 若干 content_block_delta → content_block_stop → message_delta → message_stop。文字增量在 content_block_delta 的 delta.text,用量在 message_delta.usage。

claude_stream.py
from anthropic import Anthropic

client = Anthropic(api_key="sk-...", base_url="https://api.flyrouter.ai")

with client.messages.stream(
    model="claude-sonnet-5-5",
    max_tokens=4096,
    messages=[{"role": "user", "content": "寫一首關於秋天的短詩"}],
) as stream:
    for text in stream.text_stream:
        print(text, end="", flush=True)
    final = stream.get_final_message()
print("\n", final.usage)

Gemini:呼叫 streamGenerateContent 並帶上 ?alt=sse,見 Gemini 原生介面。

注意事項

  • 大模型在思考階段可能幾秒到幾十秒沒有文字輸出,這是正常的,不要過早斷開。用戶端的讀取逾時建議設為 10 分鐘以上。
  • max_tokens 較大(幾萬以上)時請務必使用串流,非串流請求容易在等待中逾時。
  • 中途斷開連線時,已生成的部分照常計費。
FlyRouter

一組 Key,直飛全球大型模型