本页目录
长回复一次性返回会让用户盯着空白等好几秒。开启流式后,模型每生成一小段就推送一次,首字延迟通常能压到几百毫秒。
开启方式
bash
curl https://api.apione.ai/v1/chat/completions \
-H "Authorization: Bearer $APIONE_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"model": "claude-sonnet-4-6",
"stream": true,
"messages": [{ "role": "user", "content": "写一段 200 字的产品介绍" }]
}'数据格式
响应的 Content-Type 为 text/event-stream,每个分片是一行 data:,最后以 data: [DONE] 结束:
text
data: {"id":"chatcmpl-01J8Z","choices":[{"delta":{"role":"assistant"},"index":0}]}
data: {"id":"chatcmpl-01J8Z","choices":[{"delta":{"content":"APIONE"},"index":0}]}
data: {"id":"chatcmpl-01J8Z","choices":[{"delta":{"content":" 是一个"},"index":0}]}
data: {"id":"chatcmpl-01J8Z","choices":[{"delta":{},"finish_reason":"stop","index":0}],
"usage":{"prompt_tokens":18,"completion_tokens":126,"total_tokens":144}}
data: [DONE]- 正文增量在
choices[0].delta.content,把它们按顺序拼接即可。 usage只出现在最后一个带内容的分片上,要计费就别提前 break。- 流中可能出现空的 keep-alive 注释行(以
:开头),直接忽略。
SDK 写法
python
stream = client.chat.completions.create(
model="claude-sonnet-4-6",
messages=[{"role": "user", "content": "写一段 200 字的产品介绍"}],
stream=True,
)
for chunk in stream:
delta = chunk.choices[0].delta
if delta.content:
print(delta.content, end="", flush=True)javascript
const stream = await client.chat.completions.create({
model: "claude-sonnet-4-6",
messages: [{ role: "user", content: "写一段 200 字的产品介绍" }],
stream: true,
});
for await (const chunk of stream) {
process.stdout.write(chunk.choices[0]?.delta?.content ?? "");
}流中出错怎么办
HTTP 状态码在响应头阶段就已确定,因此流已经开始后才发生的错误不会改状态码,而是以一个错误分片下发:
json
data: {"type":"error","error":{"message":"upstream timed out","type":"upstream_error","code":"upstream_timeout","retryable":true}}重要
已经推给用户的内容无法撤回。稳妥做法是:收到错误分片时保留已输出的部分,在界面上提示「生成中断」,由用户决定是否重试;不要静默重发整段请求,那会重复计费。
注意事项
- 反向代理(Nginx 等)需要关闭响应缓冲,否则分片会被攒到一起再下发。
- 浏览器端不要用
EventSource——它只支持 GET,无法带请求体;用fetch读ReadableStream。 - Serverless 平台常有 30s 响应上限,长回复要确认平台支持流式响应。
联系我们
文档没写清楚,或者需要人工协助?按问题类型选一个渠道即可。