流式输出
通过 Server-Sent Events 流式接收 OpenAI 兼容的 Chat Completion 增量结果。
把 stream 设置为 true,即可通过 Server-Sent Events(SSE)增量接收文本和工具调用内容。
POST
/chat/completions使用标准 Chat Completions 端点,并在请求体中设置 stream: true。
cURL
curl --no-buffer https://glm5.app/api/v1/chat/completions \
-H "Authorization: Bearer $GLM5_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"model": "glm-5.3",
"messages": [
{"role": "user", "content": "写一段四行的版本发布公告。"}
],
"max_completion_tokens": 500,
"stream": true
}'
Python
import os
from openai import OpenAI
client = OpenAI(
api_key=os.environ["GLM5_API_KEY"],
base_url="https://glm5.app/api/v1",
)
stream = client.chat.completions.create(
model="glm-5.3",
messages=[
{"role": "user", "content": "写一段四行的版本发布公告。"}
],
max_completion_tokens=500,
stream=True,
)
for chunk in stream:
content = chunk.choices[0].delta.content
if content:
print(content, end="", flush=True)
事件格式
每个事件以 data: 开头,其中包含一个 chat.completion.chunk 对象:
data: {"id":"chatcmpl_01...","object":"chat.completion.chunk","choices":[{"index":0,"delta":{"role":"assistant"},"finish_reason":null}]}
data: {"id":"chatcmpl_01...","object":"chat.completion.chunk","choices":[{"index":0,"delta":{"content":"发布"},"finish_reason":null}]}
data: {"id":"chatcmpl_01...","object":"chat.completion.chunk","choices":[{"index":0,"delta":{},"finish_reason":"stop"}]}
data: [DONE]
使用函数调用时,工具参数也可能通过 delta.tool_calls 分段到达。
Chunk 字段
| 字段 | 含义 |
|---|---|
id | 同一次调用的多个 chunk 共用的 completion ID。 |
object | 固定为 chat.completion.chunk。 |
created | Unix 秒级时间戳。 |
model | GLM 5 公开模型 ID。 |
choices[].index | Choice 索引;当前通常为 0。 |
choices[].delta.role | 通常在开头出现,值为 assistant。 |
choices[].delta.content | 需要追加到输出缓冲区的文本片段。 |
choices[].delta.tool_calls | 需要按索引累积的函数调用增量。 |
choices[].finish_reason | 输出进行中为 null,结束时常见 stop 或 tool_calls。 |
使用 OpenAI 兼容客户端时,可继续沿用同样的基础解析逻辑:读取每行 data: 事件;遇到 data: [DONE] 结束;存在 choices[0].delta.content 时追加文本;使用工具时累积 delta.tool_calls。
流式错误
如果响应已经开始流式传输,之后才发生错误,错误对象会出现在 SSE 数据流中,然后连接关闭:
data: {"error":{"message":"Internal server error.","type":"server_error","code":"internal_error","param":null}}
因此客户端既要处理开始流式输出前的非 2xx HTTP 状态,也要处理数据流中的 error 对象。
流式输出改善延迟,不减少输入成本
Streaming 可以让界面更早显示模型输出,但不会减少请求 messages 中已经发送的 Token 数量。