OpenAI Responses API 怎样区分文本增量与工具事件
OpenAI Responses API 的流式返回不是“每次收到一段文字”这么简单:文本回答、函数工具参数、文件搜索状态和响应生命周期都通过带有 type 的事件发送。要区分文本增量与工具事件,核心是先按事件类型分流,再用 item_id 和 output_index 维护局部状态。
官方地址:https://platform.openai.com/docs/api-reference/responses-streaming
只把response.output_text.delta交给文本渲染器;遇到response.function_call_arguments.delta时先缓存字符串,等到对应的.done事件再解析和执行工具。不要把所有 delta 拼成一条用户可见文本,也不要在参数尚未完成时调用工具。
- 文本:
response.output_text.delta,可以逐段追加。 - 工具参数:
response.function_call_arguments.delta,必须按调用项单独累积。 - 工具收束:
response.function_call_arguments.done,拿到完整name和arguments。 - 生命周期:
response.created、response.completed、error等,用来更新会话状态。
先按 type 分流,不要按 delta 字段猜事件
Responses API 在 stream=true 时通过服务器发送事件推送生成过程。事件中都有类型标识,但不同事件携带的字段并不相同:文本增量有 delta 和 content_index,函数参数增量也有 delta,生命周期事件则可能带完整 response 或错误对象。因此,判断依据应是完整的 type 字符串,而不是“看到 delta 就显示”。
| 事件 | 用途 | 应用侧动作 |
|---|---|---|
response.output_text.delta | 一段新增文本 | 追加到当前文本缓冲区 |
response.function_call_arguments.delta | 工具参数的局部字符串 | 按 item_id 追加,暂不解析 |
response.function_call_arguments.done | 工具参数已完成 | 检查名称、解析 JSON、进入执行策略 |
response.completed | 响应生成结束 | 关闭生成状态,等待工具结果或最终收束 |
error | 流中发生错误 | 记录错误并停止继续消费 |

文本增量可以显示,工具增量只能缓存
response.output_text.delta 的 delta 是面向用户的文本片段,通常可以直接追加到当前回答。工具参数增量看起来也像普通字符串,但它可能只是 JSON 的半截,例如先收到 {"city":",后面才收到城市名和结尾括号;这时既不能把它显示成回答,也不能立即交给 JSON 解析器。
一个响应可能包含多个输出项,所以缓存键不能只用事件类型。至少要按 item_id 区分不同工具调用,必要时再结合 output_index 和工具定义中的调用关联信息。文本渲染器和工具参数缓存也应使用不同的数据结构,避免调试信息混入用户回答。
import json
def consume_event(event, text_parts, tool_buffers):
# 事件对象来自 SSE 解码层;没有 type 时无法安全决定处理路径。
event_type = event.get("type")
if event_type == "response.output_text.delta":
# 文本增量可以立即显示,但仍按事件顺序追加,避免界面乱序。
delta = event.get("delta", "")
text_parts.append(delta)
return {"kind": "text", "delta": delta}
if event_type == "response.function_call_arguments.delta":
# 工具参数可能只是半段 JSON,先按调用项缓存,不能提前执行。
item_id = event.get("item_id")
if not item_id:
raise ValueError("工具增量缺少 item_id")
tool_buffers.setdefault(item_id, []).append(event.get("delta", ""))
return {"kind": "tool-buffered", "item_id": item_id}
if event_type == "response.function_call_arguments.done":
# done 事件给出完整参数;解析后仍需经过工具白名单和参数校验。
raw = event.get("arguments", "")
args = json.loads(raw)
return {
"kind": "tool-ready",
"item_id": event.get("item_id"),
"name": event.get("name"),
"arguments": args,
}
if event_type in {"response.completed", "error"}:
# 完成与错误负责收束状态,不应被当成用户可见文本。
return {"kind": "lifecycle", "type": event_type}
# 其他事件保留给专门处理器,避免静默吞掉未来新增类型。
return {"kind": "ignored", "type": event_type}
代码只展示分流策略,没有调用真实 API,也不代表已经在本机执行。生产实现还应处理 SSE 解码、断线、重复事件、取消和请求级超时;其中 JSON 解析失败应进入错误状态,而不是重新拼接到用户文本。
工具参数 done 之后才进入执行层
收到 response.function_call_arguments.done 只说明模型给出了完整的函数名和参数,不等于工具已经执行成功。应用侧还要做名称白名单、参数 schema 校验、权限判断和幂等控制。对不允许的工具或不合规参数,应返回可解释的失败状态,不能把模型输出直接当作执行授权。
如果同时出现文本增量和工具事件,界面可以继续显示已经确定的文本,但工具执行状态应在单独区域呈现。工具执行结果通常需要作为下一轮输入交回 Responses API;不要把本地执行结果伪装成模型刚刚生成的文本。

还有一个容易忽略的点:工具参数的局部片段不是可靠的审计对象。审计日志应记录最终解析后的参数摘要、调用项标识和执行结果,而不是把每个 delta 都当成一次调用。跨进程消费时要把调用项状态持久化或交给有序的单一消费者,避免两个消费者同时执行同一个工具。
用生命周期事件收束,而不是看到 done 就宣布成功
response.function_call_arguments.done 只收束“参数生成”这个阶段;响应整体还可能处于进行中,工具本身也可能失败。应用状态建议至少区分 STREAMING、TOOL_READY、TOOL_RUNNING、TOOL_SUCCEEDED、FAILED 和 CANCELLED。response.completed 表示响应生成已完成,不应替代工具业务结果。
排查时先记录 type、sequence_number、item_id 和 output_index,再看文本缓冲、工具缓冲与执行记录是否一一对应。遇到未知事件时保留原始类型并安全忽略,避免新事件导致整个流处理器崩溃;但不要把未知事件当作成功。
为什么工具参数不能边收边执行?因为每个 delta 可能只是 JSON 片段,缺少字段、转义字符或闭合符号时都不能证明参数完整。应该等待对应的 .done 事件,再做解析和策略检查。
只处理 response.output_text.delta 可以吗?如果应用永远不启用工具且不关心生命周期,可以先做最小文本客户端;一旦启用工具、文件搜索或错误恢复,就需要保留未处理事件的记录和明确的状态分支。
官方参考:https://platform.openai.com/docs/api-reference/responses-streaming。事件名称和字段以当前官方参考为准,本文的缓存结构、状态名和 Python 分流代码是独立示例。
VS Code notebooks 怎样固定 notebook 内核选择
- 上一篇
- VS Code notebooks 怎样固定 notebook 内核选择
- 下一篇
- VS Code port forwarding 怎样限制转发端口的访问范围
-
- 科技周边 · 人工智能 | 1小时前 | 模型评估 AI evaluation 事实性评分 格式评分
- AI evaluation 怎样区分事实性与格式性评分
- 119浏览 收藏
-
- 科技周边 · 人工智能 | 1小时前 |
- RAG 怎样按文档版本过滤检索候选
- 346浏览 收藏
-
- 科技周边 · 人工智能 | 1小时前 | GenAI 可观测性 耗时 OpenTelemetry 模型调用 trace
- OpenTelemetry AI 怎样把模型调用耗时纳入 trace
- 101浏览 收藏
-
- 科技周边 · 人工智能 | 1小时前 |
- ONNX Runtime 怎样选择 CPU 与 CUDA provider
- 246浏览 收藏
-
- 科技周边 · 人工智能 | 1小时前 |
- Hugging Face Datasets 怎样用 cast_column 统一字段类型
- 118浏览 收藏
-
- 科技周边 · 人工智能 | 1小时前 |
- Hugging Face tokenizer 怎样按 special tokens 判断截断边界
- 489浏览 收藏
-
- 科技周边 · 人工智能 | 1小时前 |
- Hugging Face pipelines 怎样为批量推理设置 batch size
- 469浏览 收藏
-
- 科技周边 · 人工智能 | 1小时前 |
- OpenAI embeddings 怎样选择维度缩减参数
- 439浏览 收藏
-
- 科技周边 · 人工智能 | 1小时前 | 人工智能 · 结构化输出 · 结构化输出 JSON Schema OpenAI Responses API strict json_schema
- OpenAI Responses API 怎样用结构化输出约束 JSON 形状
- 168浏览 收藏
-
- 科技周边 · 人工智能 | 1天前 |
- AI 流式输出怎样区分文本增量和工具事件
- 491浏览 收藏
-
- 科技周边 · 人工智能 | 1天前 |
- AI 工具调用怎样设计幂等键避免重复执行
- 319浏览 收藏
-
- 前端进阶之JavaScript设计模式
- 设计模式是开发人员在软件开发过程中面临一般问题时的解决方案,代表了最佳的实践。本课程的主打内容包括JS常见设计模式以及具体应用场景,打造一站式知识长龙服务,适合有JS基础的同学学习。
- 543次学习
-
- GO语言核心编程课程
- 本课程采用真实案例,全面具体可落地,从理论到实践,一步一步将GO核心编程技术、编程思想、底层实现融会贯通,使学习者贴近时代脉搏,做IT互联网时代的弄潮儿。
- 516次学习
-
- 简单聊聊mysql8与网络通信
- 如有问题加微信:Le-studyg;在课程中,我们将首先介绍MySQL8的新特性,包括性能优化、安全增强、新数据类型等,帮助学生快速熟悉MySQL8的最新功能。接着,我们将深入解析MySQL的网络通信机制,包括协议、连接管理、数据传输等,让
- 500次学习
-
- JavaScript正则表达式基础与实战
- 在任何一门编程语言中,正则表达式,都是一项重要的知识,它提供了高效的字符串匹配与捕获机制,可以极大的简化程序设计。
- 487次学习
-
- 从零制作响应式网站—Grid布局
- 本系列教程将展示从零制作一个假想的网络科技公司官网,分为导航,轮播,关于我们,成功案例,服务流程,团队介绍,数据部分,公司动态,底部信息等内容区块。网站整体采用CSSGrid布局,支持响应式,有流畅过渡和展现动画。
- 485次学习
-
- PubMedQA
- 深入了解PubMedQA生物医学问答数据集,涵盖其核心功能、使用方法及在临床决策、药物研发等场景的应用,助力提升NLP模型性能。
- 662次使用
-
- H2O EvalGPT
- H2O EvalGPT是H2O.ai推出的开源LLM评估平台,提供详细的大模型性能排行榜、行业特定基准测试及A/B测试功能,助您快速选择最适合项目的高性能大语言模型。
- 682次使用
-
- LMArena
- LMArena是加州大学伯克利分校推出的AI模型匿名评测平台。通过盲测投票机制,用户可对比不同大模型回答并生成实时排行榜,助力开发者优化模型及用户选择最佳AI工具。
- 727次使用
-
- HELM
- 深入了解斯坦福推出的HELM(Holistic Evaluation of Language Models)大模型评测体系。本文解析其核心功能、安装配置步骤及应用场景,涵盖准确性、公平性、鲁棒性等多维度指标,助力开发者全面优化语言模型性能。
- 696次使用
-
- MMBench
- MMBench是由上海人工智能实验室等机构联合推出的多模态基准测试平台,提供细粒度能力评估、大规模数据集及VLMEvalKit工具。本文详细介绍其核心功能、安装使用方法及应用场景,助力开发者全面评估多模态模型性能。
- 528次使用
-
- Go hex.Dumper 怎么流式输出可读十六进制内容
- 2026-10-04 159浏览
-
- CodeGeeX for Jetbrains IDEs正式上线!
- 2023-01-17 284浏览
-
- 技术阿里云实现ocr批量图片和pdf文件表格图片转换excel文档/支持票据图片提取/普通图片文字提取处理
- 2023-01-18 387浏览
-
- 直播预告|FeatureStore Meetup V2
- 2023-01-10 328浏览
-
- 深入浅出特征工程 – 基于 OpenMLDB 的实践指南(上)
- 2023-02-25 426浏览

