
在开发基于 OpenAI Realtime API 的低延迟语音应用时,开发者面对的最大挑战往往是其复杂的 WebSocket 事件流(Event Stream)。与传统的 Request-Response 模式不同,Realtime API 将一次对话拆解为了极细粒度的原子事件。


理解 response、output_item、content_part 以及 conversation.item 之间的层级关系与语义区别,是正确处理流式数据、管理多模态状态以及维护对话上下文的关键。本文将对这些核心概念进行深度剖析。
Realtime API 的响应结构遵循一个严格的 1-to-N 嵌套层级。理解这一结构的最佳方式是从生命周期的角度审视一次生成过程。
这是最高层级的容器,代表模型的一次“思考与生成”动作。
response.done) 统一结算的。response.cancel 中断整个生成过程。这是 Response 内部的逻辑单元。一个 Response 可能包含多个 Output Item(例如:模型先说了一句话,紧接着调用了一个工具)。
Message 对象。id、role(如 assistant)和 type(如 message 或 function_call)。这是 Output Item 内部的模态容器。
audio) 和对应的转录文本 (text)。这两者就是同一个 Item 下的两个不同 Part。这是最底层的“墨水”。
delta 事件流的形式传输(如 response.text.delta 或 response.audio.delta)。# 完整数据流示例
response.output_item.added
含义:准备回复一条消息。
数据:{ id: "item_001", type: "message" }
response.content_part.added
含义:这条消息的第 0 部分是文本。
数据:{ item_id: "item_001", content_index: 0, type: "text" }
response.output_text.delta (第 1 次)
含义:由于是流式,这是第一个字。
数据:{ item_id: "item_001", content_index: 0, delta: "你" }
response.output_text.delta (第 2 次 ... 第 N 次)
含义:后续的字。
数据:{ delta: "好" } ... { delta: "啊" }
response.output_text.done
含义:文本部分流结束了,确认最终文本。
数据:{ text: "你好啊" }
response.content_part.done
含义:第 0 部分内容块结束。
response.output_item.done
含义:整条消息结束。为了在客户端精准还原模型的输出,我们需要区分以下几组容易混淆的事件:
层级 | 关键事件 (WebSocket Event) | 语义说明 | 客户端行为建议 |
|---|---|---|---|
Response |
| 生成回合开始/结束 | 切换 UI loading 状态;统计 Token 用量。 |
Item |
| 新消息条目创建 | 在 UI 对话列表中预占一个“气泡”或卡片。 |
Content |
| 新内容块开始 | 准备接收特定类型的数据(准备 Text Buffer 或 Audio Buffer)。 |
Payload |
| 文本数据流 | 将字符追加到 UI;进行流式解析。 |
注意:
output_text是数据流事件,而output_item是结构事件。必须监听output_text.delta才能获取真正的文本内容。
在高并发的流式传输中,数据包是乱序或碎片化的。API 提供了两个索引用于精确定位数据包的归属:
output_index:消息索引。表示当前数据属于 Response 中的第几个 Item。output_index=0 是助手回复的文本,output_index=1 是随后的函数调用。content_index:内容块索引。表示当前数据属于 Item 中的第几个 Part。content_index=0 可能是思考过程 (CoT),content_index=1 是最终回答。JSON 结构示意:
// Response
{
"output": [
// Output Item (output_index = 0)
{
"type": "message",
"content": [
// Content Part (content_index = 0) - 文本
{ "type": "text", "text": "Hello..." },
// Content Part (content_index = 1) - 音频
{ "type": "audio", "audio": "base64..." }
]
}
]
}在 Realtime API 中,Item 有两种存在形态,这经常导致开发者的困惑:response.output_item 和 conversation.item。
response.output_item.* (生成视角)conversation.item.* (存储视角)当模型进行回复时,这两个概念是首尾相连的:
response.output_item.added。此时该 Item 处于“生成中”状态。response.output_text.delta 传输内容。conversation.item 的一部分(API 通常会同步触发 conversation.item.created 事件,虽然它在逻辑上早已存在)。在开发应用时,建议使用 conversation.item 事件来维护主聊天界面的数据源(因为它包含了用户和助手双方的消息),而使用 response.* 事件来处理实时的 UI 反馈(如波形动效、打字机滚动)。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。