核心指南
流式传输
让模型边生成边显示
概述
流式响应会把内容分段返回,不必等整段答案生成完。模型的 accepted_request_formats 包含 openai_responses 时可以使用 Responses 流;现有应用依赖 Chat Completions 时,继续使用原来的流式写法即可。
Responses 流式传输
curl https://api.tokenlab.sh/v1/responses \
-H "Authorization: Bearer sk-your-api-key" \
-H "Content-Type: application/json" \
-d '{
"model": "gpt-5.6-terra",
"input": "Write a short poem.",
"stream": true
}'Responses WebSocket
连接 wss://api.tokenlab.sh/v1/responses 后发送 response.create 事件。WebSocket 响应会自动使用流式输出,不支持 background 或 response.cancel。generate: false 不会生成模型内容或产生模型费用,而是返回一个可以继续使用的响应 ID。
一个连接同时只处理一个响应,最长保持 60 分钟。事件包含当前响应内递增的 sequence_number。名称为 error 的流事件使用扁平对象;连接和协议错误使用嵌套的 error 对象。
Gemini 流式输出
POST /v1beta/models/{model}:streamGenerateContent?alt=sse 返回 Gemini 格式的 chunks。有些事件只有元数据,中间事件可能没有 finishReason,流也可能直接结束,不会额外添加 Chat Completions 的 [DONE]。
Chat Completions 流式传输
现有客户端使用 /v1/chat/completions SSE 时,可以继续沿用:
import os
from openai import OpenAI
with OpenAI(
api_key=os.environ["TOKENLAB_API_KEY"],
base_url="https://api.tokenlab.sh/v1",
timeout=30.0,
max_retries=0,
) as client:
finish_reason = None
with client.chat.completions.create(
model="gpt-5.6-terra",
messages=[{"role": "user", "content": "Write a short poem."}],
stream=True,
stream_options={"include_usage": True},
) as stream:
for chunk in stream:
if not chunk.choices:
continue
choice = chunk.choices[0]
if choice.delta.content:
print(choice.delta.content, end="", flush=True)
if choice.finish_reason:
finish_reason = choice.finish_reason
if finish_reason != "stop":
raise RuntimeError(f"Stream ended without a complete text answer: {finish_reason}")流结束条件
不同格式的结束标志不同:
- Responses API 流使用
response.completed - Chat Completions 流使用
finish_reason: "stop" - 当达到 token 限制时使用
finish_reason: "length" - 当模型希望使用工具时,会出现 tool/function call 事件
Web 应用示例
在服务器上运行 SDK 流式消费者。浏览器应调用你自己的已认证后端,TokenLab 密钥只放在服务器环境中。将文本增量转发给浏览器,用户停止或断开时取消上游流。使用 SDK 解析 SSE 事件;一个网络数据块不一定包含一个完整事件。