流式输出

加上 stream=true 参数,边生成边返回,适合聊天界面并避免长回答超时。

加上 stream: true,模型会边生成边返回,适合聊天界面,也能避免长回答等待过久。可以通过 Chat Completions 流式调用;支持 Claude 原生格式的模型也可以通过 Anthropic Messages 格式流式调用(见本页最后一节)。

示例中的 your-model-id 请替换为模型广场中的模型 ID(也可以调用 GET /v1/models 查看)。

Chat Completions 流式

stream.py
import os

from openai import OpenAI

client = OpenAI(
    api_key=os.environ["MYAIEXP_API_KEY"],
    base_url="https://ai.myaiexp.com/v1",
)

stream = client.chat.completions.create(
    model="your-model-id",  # 替换为模型广场中的模型 ID
    messages=[{"role": "user", "content": "Count from 1 to 5, one number per line."}],
    stream=True,
)

for chunk in stream:
    # 部分分片没有 choices 或 content(例如首尾分片),要先判断
    if chunk.choices and chunk.choices[0].delta.content:
        print(chunk.choices[0].delta.content, end="", flush=True)
print()

返回格式

服务端以 SSE(Server-Sent Events)逐块推送,每一行以 data: 开头,内容是一个 JSON 分片,增量文字在 choices[0].delta.content,最后以 data: [DONE] 结束:

data: {"id":"chatcmpl-...","object":"chat.completion.chunk","model":"your-model-id","choices":[{"index":0,"delta":{"content":"1"},"finish_reason":null}]}

data: {"id":"chatcmpl-...","object":"chat.completion.chunk","model":"your-model-id","choices":[{"index":0,"delta":{"content":"\n2"},"finish_reason":null}]}

data: [DONE]

使用 SDK 时不用自己解析,直接遍历即可。

如果需要在流式中拿到 token 用量,可以在请求里加 "stream_options": {"include_usage": true},用量会出现在最后一个分片的 usage 字段里(该分片的 choices 为空数组)。

Anthropic Messages 流式

通过 /v1/messages 调用时,同样加 "stream": true。返回的是标准 Anthropic SSE 事件,增量文字在 content_block_delta 事件的 delta.text 里。Anthropic SDK 提供了 messages.stream() 辅助方法:

anthropic_stream.py
import os

import anthropic

client = anthropic.Anthropic(
    api_key=os.environ["MYAIEXP_API_KEY"],
    base_url="https://ai.myaiexp.com",  # 注意:不带 /v1
)

with client.messages.stream(
    model="your-model-id",  # 替换为模型广场中的模型 ID
    max_tokens=512,
    messages=[{"role": "user", "content": "Count from 1 to 5, one number per line."}],
) as stream:
    for text in stream.text_stream:
        print(text, end="", flush=True)
print()

事件顺序大致是 message_start → content_block_start → 多个 content_block_delta → content_block_stop → message_delta(含 stop_reason 和输出用量)→ message_stop:

event: content_block_delta
data: {"type":"content_block_delta","index":0,"delta":{"type":"text_delta","text":"1\n2"}}

event: message_stop
data: {"type":"message_stop"}

更多说明见 Anthropic SDK / Messages 格式。

注意事项

  • 首个分片的 content 可能是空字符串,部分分片没有 choices,代码里要先判断(示例已处理)。
  • curl 要加 -N,否则输出会被缓冲,看起来像“一次性返回”。
  • 经过 Nginx 等反向代理时,需要关闭代理缓冲,否则流式会被攒成一块。
  • 思考类 / 推理类模型首字等待时间更长,更适合用流式。
  • 流式也是避免超时的好办法,见 错误排查:超时。

本服务仅供学习与研究用途。请遵守各模型提供方的使用政策。

本页目录