OpenAI API 流式输出(streaming)怎么写:stream=True、response.output_text.delta 事件、Python 和 Node 示例

用 OpenAI API 做聊天界面,想边生成边显示?在 Responses 请求里设 stream 为 true,按事件类型读取 response.output_text.delta。本文给 Python 和 Node 各一段可运行示例,讲事件生命周期、拼接完整文本、错误事件,以及官方提到的审核风险。

NNathaniel bigo··原创首发·AI 辅助撰写
8 分钟读完
资料核对于 2026-11-05 · 依据官方文档与公开资料整理 其他 账号
本文根据 OpenAI 官方《Streaming API responses》和 Quickstart 整理,资料核对于 2026-11-05。代码里的模型名取自官方当天示例,请以官方模型页为准。本站(bigolab.com)不是 OpenAI 官方网站。API 是按用量计费的独立服务,与 ChatGPT 订阅分开计算,Key 的获取见 /guides/openai-api-key。

适用于谁

  • 用 OpenAI API 做聊天界面、写作工具,希望文字边生成边显示的开发者;
  • 已经能发出第一个请求(见 /guides/openai-api-python-quickstart),想了解流式事件到底是什么的人;
  • 用 Node.js / TypeScript 的前端或全栈开发者。

结论先说

  1. 默认不是流式的。 官方说,普通请求会等整个输出生成完才一次性返回,输出长的时候要等。
  2. 流式的写法:在 Responses 请求里加 stream=True(Node 里是 stream: true),得到的不是一个结果,而是一串事件。
  3. 事件是带类型的,用 event.type 区分。写文本时常看四个:response.created、response.output_text.delta、response.completed、error。
  4. 文字增量在 response.output_text.delta 里,用 event.delta 取。
  5. 流式让内容审核更难。 官方明确提醒,生产应用里流式输出会让部分内容更难评估,审核分数也要等完整输出生成后才有。

OpenAI 流式输出的事件顺序:created、多次 output_text.delta、completed,出错时是 error 事件

图:本站根据 OpenAI 官方《Streaming API responses》 整理的示意图

一、事件长什么样

官方说,Responses API 用语义事件来流式返回,每种事件有预先定义的结构。其中有的只出现一次,有的会随着生成多次出现:

  • response.created:响应开始创建,出现一次;
  • response.output_text.delta:一小段新文字,出现很多次;
  • response.completed:整个响应完成,出现一次;
  • error:出错。

完整事件列表见官方 API 参考里的 streaming 部分,正文不全部列出。

二、Python 示例

先安装并设置密钥(Windows 的设置方式见 /guides/openai-api-key):

pip install openai
python
from openai import OpenAI

client = OpenAI()  # 从环境变量 OPENAI_API_KEY 读取密钥

stream = client.responses.create(
    model="gpt-6-astra",  # 以官方模型页当天为准
    input="用三句话介绍什么是流式输出。",
    stream=True,
)

full_text = ""
for event in stream:
    if event.type == "response.output_text.delta":
        full_text += event.delta
        print(event.delta, end="", flush=True)
    elif event.type == "response.completed":
        print("\n--- 完成 ---")
    elif event.type == "error":
        print("\n出错:", event.message)

print("完整文本长度:", len(full_text))

flush=True 让文字立即显示在终端里。full_text 把增量拼起来,方便流结束后保存或再处理。

三、Node.js 示例

新建一个 stream.mjs 文件(.mjs 可以直接使用 import 和顶层 await):

npm install openai
javascript
import OpenAI from "openai";

const client = new OpenAI(); // 从环境变量 OPENAI_API_KEY 读取密钥

const stream = await client.responses.create({
  model: "gpt-6-astra", // 以官方模型页当天为准
  input: "用三句话介绍什么是流式输出。",
  stream: true,
});

let fullText = "";
for await (const event of stream) {
  if (event.type === "response.output_text.delta") {
    fullText += event.delta;
    process.stdout.write(event.delta);
  } else if (event.type === "response.completed") {
    console.log("\n--- 完成 ---");
  } else if (event.type === "error") {
    console.error(event.message);
  }
}
console.log("完整文本长度:", fullText.length);

运行:node stream.mjs。官方示例里的判断结构与上面一致。

四、常见的几个坑

流式输出出问题怎么办:什么都没显示、文字一次性出现、中途断掉、需要保存完整文本、前端拿不到增量

图:本站根据 OpenAI 官方《Streaming API responses》 整理的示意图,排查表为本站补充

  • 什么也没显示:检查有没有真的加 stream=True;再检查有没有只打印 response.completed 之类的事件,漏掉了 response.output_text.delta;
  • 文字还是一次性出来:终端没有立即刷新(Python 要 flush=True),或者中间的代理、网关把响应缓冲了;
  • 中途断掉:把已收到的文本先保存,再按业务决定要不要重试。重试会重新计费,429 等限流问题见 /guides/openai-api-429-error;
  • 要保存完整答案:像示例那样拼接增量,或者在 response.completed 事件里读完整响应;
  • 想知道用了多少 token:用量见 /guides/openai-api-pricing-billing,价格以官方页面当前显示为准。

五、要给用户看,怎么转给浏览器

官方流式页讲的是 API 和服务器之间的流。网页前端怎么拿到,官方这一页没有展开。本站的一般性建议:密钥只放在你自己的服务器上,不要写进网页或手机 App;服务器收到 OpenAI 的事件后,用你自己的方式(例如服务器发送事件或 WebSocket)转给前端,只转发文字增量就够了。

官方提到的另外两个方向:想要持久的 WebSocket 连接并用 previous_response_id 增量输入,看官方的 Responses WebSocket 模式;流式的函数调用和结构化输出,官方另有专门的指南。

六、关于审核风险

官方在流式页专门有一节“Moderation risk”:生产应用里流式输出会让内容审核更困难,因为部分输出更难评估,这可能影响获批的使用。如果在生成请求时请求审核分数,分数会在完整输出可用后才到,不会跟着增量事件一起出现。

所以做面向公众的产品时,要把审核放进设计里,比如先在服务器收齐、检查,再决定怎么展示,具体做法以官方审核指南为准。

什么时候值得用流式

  • 适合:聊天界面、写作助手、需要让用户尽早看到开头的长回答。官方的理由就是:模型还在继续生成时,你已经可以开始显示或处理开头部分;
  • 不一定需要:后台批处理、只需要最终结果的脚本、要先整体校验再使用的输出。这些场景用普通请求更简单,代码也更短;
  • 需要先想清楚:出错后怎么办。非流式请求要么成功要么失败,流式请求可能已经给用户显示了一半文字才断开,界面上要有“生成中断、重试”的处理,这是本站的一般性建议。

常见问题

Q:旧资料里的 Chat Completions 流式写法还能用吗?

官方流式页对 Chat Completions 单独有一段:流式返回的是 chunk.choices[0].delta,取的是 delta 里的内容,和 Responses 的 event.delta 不是一回事。新项目建议优先用 Responses,两者区别见 /guides/openai-responses-api。

Q:流式会比非流式贵吗?

官方流式页没有这样说明,计费看的是用量,以官方价格页为准,见 /guides/openai-api-price-official-table。

Q:模型名报错怎么办?

示例模型名会更新,先到官方模型页确认你的账号可用的模型。

参考资料

  • OpenAI 官方:Streaming API responses — https://platform.openai.com/docs/guides/streaming-responses
  • OpenAI 官方:Quickstart — https://developers.openai.com/api/docs/quickstart

Nathaniel 的更多内容

  1. 01

    Claude Code 在 Windows 上的常见坑:Git Bash 还是 PowerShell、路径反斜杠、假报错、WSL 怎么选

    Windows 上用 Claude Code,装好之后最容易踩的是:用哪个 shell、路径写法不一致、grep 没匹配就报错、钩子没生效、WSL 和原生怎么选。本文逐条按官方文档整理原因和处理办法,附三段提示词和一张对照表。

    Claude0
  2. 02

    Claude Code Hooks 实战「提交前自动跑测试」:PreToolUse 拦住 git commit,测试不过就退出码 2,附 Windows 注意点

    只写一个完整例子:让 Claude Code 每次要执行 git commit 之前,先自动跑项目测试,没通过就拦下并把输出交给它修。本文按官方 Hooks 文档给出脚本、settings.json 配置、测试方法、排错和 Windows 的两处坑。

    Claude0
  3. 03

    Claude Code 自定义斜杠命令与 Skill 实战:从零写一个「生成更新日志」的 /release-notes,含传参、预执行命令和调试

    概念看过了,还是不知道从哪下手?本文按 Claude Code 官方「Extend Claude with skills」写一个完整可用的例子:用 /release-notes 根据 git 记录生成更新日志,覆盖目录、frontmatter、传参、预执行命令、预授权和调试。

    Claude0
  4. 04

    Claude Code 部署网站:先写 Dockerfile 和 compose 在本机跑通,再按清单上云服务器,别让它直接改线上

    想让 Claude Code 帮你把网站部署到云服务器。本文只写通用做法,按 Docker 官方文档讲:让它写 Dockerfile、.dockerignore 和 compose,在本机跑通,端口和数据卷怎么设,再给出上线清单,并说明为什么不要让它直接动线上机器。

    Claude0
  5. 05

    Claude Code 写爬虫与数据清洗:先查 robots.txt 和网站条款,控制频率,原始数据留一份再清洗

    想让 Claude Code 写爬虫抓数据再清洗。本文先讲合规:robots.txt 不是授权也不是安全措施、网站条款要自己读;再讲怎么用 Python 标准库检查规则、小样本先试、保存原始数据,以及用 pandas 清洗,附四段提示词。

    Claude0
  6. 06

    Claude Code 写 Chrome 扩展:按 Manifest V3 起步,加载未打包的扩展,改了哪些文件要重新加载

    想让 Claude Code 帮你写一个 Chrome 扩展。本文按 Chrome 官方扩展文档讲:manifest.json 的最小写法、在 chrome://extensions 加载未打包的扩展、哪些改动要刷新、怎么看控制台和报错,再给四段提示词,以及权限要尽量少。

    Claude0

同产品的其他教程

  1. 01

    OpenAI API 的 token 怎么算、怎么估算费用:input_tokens 计数接口、tiktoken 和隐藏的输出 token

    发请求前想知道会用多少 token?官方有 Responses 的 input_tokens 计数接口,能把文字、图片、文件、工具定义一起算准;本地 tiktoken 只适合纯文本。本文给 Python 和 Node 示例,讲输出 token 为什么可能比看到的多,以及怎么估算费用。

    ChatGPT0
  2. 02

    OpenAI API Node.js / TypeScript 快速上手:npm install openai、example.mjs 第一个请求,到流式、函数调用、联网搜索

    用 Node.js 调 OpenAI API:设置 OPENAI_API_KEY 环境变量,npm install openai,新建 example.mjs,用 client.responses.create 发出第一个请求。并列出图片、文件、流式、函数调用、联网搜索和错误捕获的 Node 写法。

    ChatGPT0
  3. 03

    OpenAI API 用量层级(usage tiers)与速率限制怎么提升:Free、Build、Launch、Grow 和后台 Limits 页

    OpenAI API 的限速不是固定的:官方按累计购买额度把组织分成 Free、Build、Launch、Grow 四个层级,达到门槛自动升级。本文讲 RPM、TPM 等指标、怎么在后台查自己的限额、响应头怎么读、花费上限和限速的区别,以及怎么让限额变得够用。

    ChatGPT0
  4. 04

    OpenAI API 报错 400、401、403、404、429、500、503 怎么排查:按官方错误码页逐个看原因和解决办法

    调用 OpenAI API 返回 400、401、403、404、429、500、503,各自什么意思?本文按官方 Error codes 页,每个状态码一节,写清官方给的原因和解决办法,并说明 404 在官方页面里的位置、429 的六种情形,附 Python 和 Node 的错误捕获写法。

    ChatGPT0
  5. 05

    OpenAI Realtime API 是什么:语音到语音会话、WebRTC 与 WebSocket、临时密钥和事件机制

    Realtime API 让模型直接处理音频,做可以随时打断的语音助手。本文按官方文档讲它是什么、什么时候用、浏览器接入的流程、session 与事件、可用声音、60 分钟会话上限、安全标识,以及它和转写、文字转语音的分工。

    ChatGPT0
  6. 06

    OpenAI 图像生成 API 怎么用:gpt-image 系列、images.generate 与 Responses 工具、尺寸质量和遮罩编辑

    用 OpenAI API 生成或编辑图片,有 Image API 和 Responses 里的 image_generation 工具两条路。本文按官方文档给 Python 和 Node 示例,讲 gpt-image 模型选择、尺寸质量格式参数、遮罩编辑、被拦截时的错误处理,以及需要组织验证的提醒。

    ChatGPT0

0 条评论

登录 后参与评论

还没有评论,来抢沙发~