主导航

遗留 API

WebSocket 模式

使用持久化的 WebSocket 连接和增量输入,以实现更低延迟的智能体工作流。

Responses API 支持 WebSocket 模式,适用于运行时间长、工具调用频繁的工作流。在此模式下,您可以保持与 /v1/responses 的持久连接,并通过仅发送新输入项及 previous_response_id 来继续每一轮对话。

WebSocket 模式兼容“零数据保留”(ZDR) 和 store=false 设置。

为何使用 WebSocket 模式

当工作流涉及大量模型与工具之间的往返交互时(例如智能体编程或带有重复工具调用的编排循环),WebSocket 模式最为有用。

由于连接保持开启且每一轮仅发送增量输入,WebSocket 模式减少了每轮延续的开销,并提升了长链路中的端到端延迟。对于包含 20 次以上工具调用的工作流,我们观察到端到端执行速度最高可提升约 40%。

连接并创建响应

在 WebSocket 模式下,通过从客户端发送 response.create 事件来开启每一轮对话。其载荷与常规的 Responses create 正文一致,但 streambackground 等传输特定字段不适用。

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: falseresponse.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

如果某一轮失败(4xx5xx),服务会从连接本地缓存中剔除所引用的 previous_response_id。这可以防止在失败的延续中复用过期的缓存状态。

压缩与创建新响应

如果您正在使用压缩功能,有两种不同的延续模式:

服务端压缩 (context_management)

当您启用服务端压缩(使用 compact_thresholdcontext_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 连接,并使用以下模式之一继续:

  1. 如果您的前序响应已持久化 (store=true) 且拥有有效的响应 ID,则使用 previous_response_id 和新输入项继续。
  2. 如果您无法继续该链(例如,store=false/ZDR 或 previous_response_not_found),请通过将 previous_response_id 设置为 null(或省略它)来启动新响应,并发送下一轮的完整输入上下文。
  3. 如果您使用 /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
}
© . This website operates independently and is not affiliated with or endorsed by OpenAI, Inc. All brand names, logos, and trademarks are the property of their respective owners.