Responses API 支持 WebSocket 模式,适用于运行时间长、工具调用频繁的工作流。在此模式下,您可以保持与 /v1/responses 的持久连接,并通过仅发送新输入项及 previous_response_id 来继续每一轮对话。
WebSocket 模式兼容“零数据保留”(ZDR) 和 store=false 设置。
为何使用 WebSocket 模式
当工作流涉及大量模型与工具之间的往返交互时(例如智能体编程或带有重复工具调用的编排循环),WebSocket 模式最为有用。
由于连接保持开启且每一轮仅发送增量输入,WebSocket 模式减少了每轮延续的开销,并提升了长链路中的端到端延迟。对于包含 20 次以上工具调用的工作流,我们观察到端到端执行速度最高可提升约 40%。
连接并创建响应
在 WebSocket 模式下,通过从客户端发送 response.create 事件来开启每一轮对话。其载荷与常规的 Responses create 正文一致,但 stream 和 background 等传输特定字段不适用。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
from websocket import create_connection
import json
import os
ws = create_connection(
"wss://api.openai.com/v1/responses",
header=[
f"Authorization: Bearer {os.environ['OPENAI_API_KEY']}",
],
)
ws.send(
json.dumps(
{
"type": "response.create",
"model": "gpt-5.5",
"store": False,
"input": [
{
"type": "message",
"role": "user",
"content": [{"type": "input_text", "text": "Find fizz_buzz()"}],
}
],
"tools": [],
}
)
)客户端可以选择发送带有 generate: false 的 response.create 来预热请求状态。当您已经确定了计划在下一轮发送的工具、指令和/或自定义消息时,此功能非常有用。generate: false 不会返回模型输出,但会准备请求状态,以便下一轮生成的对话能更快开始。预热请求会返回一个响应 ID,您可以使用 previous_response_id 对其进行链接,包括在响应链的后续轮次中。下一节将解释如何使用 previous_response_id 和增量输入来延续会话。
使用增量输入进行延续
要延续运行,请发送另一个 response.create,并包含:
- 将
previous_response_id设置为之前的响应 ID。 input仅包含新项(例如,工具输出和下一条用户消息)。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
ws.send(
json.dumps(
{
"type": "response.create",
"model": "gpt-5.5",
"store": False,
"previous_response_id": "resp_123",
"input": [
{
"type": "function_call_output",
"call_id": "call_123",
"output": "tool result",
},
{
"type": "message",
"role": "user",
"content": [{"type": "input_text", "text": "Now optimize it."}],
},
],
"tools": [],
}
)
)延续的工作原理
WebSocket 模式使用与 HTTP 模式相同的 previous_response_id 链接语义,但它在活动套接字上增加了一个更低延迟的延续路径。
在活动的 WebSocket 连接上,服务会在连接本地内存缓存中保留一个前序响应状态(最近一次响应)。从该最新响应延续是非常快速的,因为服务可以复用连接本地状态。由于前序响应状态仅保留在内存中且不会写入磁盘,因此您可以在兼容 store=false 和零数据保留 (ZDR) 的方式下使用 WebSocket 模式。
如果 previous_response_id 不在内存缓存中,其行为取决于您是否存储了响应:
- 设置
store=true时,服务可能会在可用时从持久化状态中提取旧的响应 ID。延续仍然可以工作,但通常会失去内存延迟优势。 - 设置
store=false时(包括 ZDR),没有持久化的回退机制。如果 ID 未缓存,请求将返回previous_response_not_found。
如果某一轮失败(4xx 或 5xx),服务会从连接本地缓存中剔除所引用的 previous_response_id。这可以防止在失败的延续中复用过期的缓存状态。
压缩与创建新响应
如果您正在使用压缩功能,有两种不同的延续模式:
服务端压缩 (context_management)
当您启用服务端压缩(使用 compact_threshold 的 context_management)时,压缩会在正常的 /responses 生成过程中进行。在 WebSocket 模式下,您按常规方式继续即可:发送带有最新 previous_response_id 和仅含新输入项的 response.create。
独立 /responses/compact
独立的 /responses/compact 终端会返回一个新的压缩输入窗口,而非响应 ID。压缩后,使用该压缩窗口作为 input(加上下一个用户/工具项)在您的 WebSocket 连接上创建一个新响应。
通过省略 previous_response_id 或将其设置为 null 来开始新的链。按原样传递压缩后的输出;请勿修剪返回的窗口。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
# Compact your current window (HTTP call)
compacted = client.responses.compact(
model="gpt-5.5",
input=long_input_items_array,
)
# Start a new response on the WebSocket using the compacted window
ws.send(
json.dumps(
{
"type": "response.create",
"model": "gpt-5.5",
"store": False,
"input": [
*compacted.output,
{
"type": "message",
"role": "user",
"content": [{"type": "input_text", "text": "Continue from here."}],
},
],
"tools": [],
}
)
)连接行为与限制
- 服务器事件和排序与现有的 Responses 流式传输事件模型一致。
- 单个 WebSocket 连接可以接收多个
response.create消息,但它会按顺序运行这些消息(一次处理一个正在进行的响应)。 - 目前不支持多路复用。如果您需要并行运行,请使用多个连接。
- 连接时长限制为 60 分钟。达到限制后请重新连接。
重连与恢复
当连接关闭(或达到 60 分钟限制)时,请打开一个新的 WebSocket 连接,并使用以下模式之一继续:
- 如果您的前序响应已持久化 (
store=true) 且拥有有效的响应 ID,则使用previous_response_id和新输入项继续。 - 如果您无法继续该链(例如,
store=false/ZDR 或previous_response_not_found),请通过将previous_response_id设置为null(或省略它)来启动新响应,并发送下一轮的完整输入上下文。 - 如果您使用
/responses/compact压缩了上下文,请将返回的压缩窗口用作该新响应的基准input,然后附加最新的用户/工具项。
需要处理的错误
previous_response_not_found
1
2
3
4
5
6
7
8
9
{
"type": "error",
"status": 400,
"error": {
"code": "previous_response_not_found",
"message": "Previous response with id 'resp_abc' not found.",
"param": "previous_response_id"
}
}websocket_connection_limit_reached
1
2
3
4
5
6
7
8
9
{
"type": "error",
"error": {
"type": "invalid_request_error",
"code": "websocket_connection_limit_reached",
"message": "Responses websocket connection limit reached (60 minutes). Create a new websocket connection to continue."
},
"status": 400
}