核心指南

流式传输

让模型边生成边显示

概述

流式响应会把内容分段返回,不必等整段答案生成完。模型的 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 事件;一个网络数据块不一定包含一个完整事件。

正确处理流式内容

本页内容