Python 最小流式示例

先完成Python 环境配置。这里以 Chat Completions 为例;Responses 和其他协议的事件结构不同。

import os
from openai import OpenAI

with OpenAI(api_key=os.environ["QINGYUN_TOP_API_KEY"],
            base_url=os.environ["QINGYUN_TOP_BASE_URL"],
            timeout=60.0, max_retries=0) as client:
    stream = client.chat.completions.create(
        model=os.environ["QINGYUN_TOP_MODEL"],
        messages=[{"role": "user", "content": "用三句话介绍流式输出"}],
        stream=True,
    )
    finished = False
    try:
        for chunk in stream:
            if not chunk.choices:
                continue
            choice = chunk.choices[0]
            print(choice.delta.content or "", end="", flush=True)
            if choice.finish_reason is not None:
                finished = True
    finally:
        stream.close()
    print("\n已收到完成原因" if finished else "\n未确认完成,请检查连接和日志")

业务接入要处理什么

  1. 首字到来前显示等待状态,设置连接、读取与业务总超时。
  2. 按协议解析事件。不要假设一次网络分块就是一个完整 JSON,也不要把所有 SSE 事件都当正文。
  3. 区分文本增量、工具参数增量、完成原因和错误。用量字段可能只在特定配置下返回,不能保证每块都存在。
  4. 用户取消时停止读取并关闭上游连接,避免无意义生成;停止后是否已消耗额度看日志。
  5. 断开后保留已接收内容并显示“未完成”,不要自动从头重复一个可能已被执行的任务。

后端收到分块,浏览器却最后一起显示

检查你的代理、应用服务器和前端读取是否缓冲整份响应,核对 SSE 的 Content-Type、压缩及超时配置。这里只调整你自己的应用链路,不需要在客户端反复换密钥。

下一步:错误处理 · 限流与重试