Codex WebSocket 与普通 Responses 的区别
两种模式调用的是同一模型和 Responses 语义。WebSocket 的价值是复用持久连接和最近响应状态,不会自动提高回答质量。
应该选哪一种
| 场景 | 普通 HTTP Responses | Responses WebSocket |
|---|---|---|
| 一次请求、一次回答 | 推荐 | 收益很小 |
| 长时间 Codex 代理任务 | 可用 | 推荐测试 |
| 连续多次工具调用 | 每轮建立新请求 | 同连接继续响应状态 |
| 客户端和代理兼容性 | 更广 | 需要完整支持 WebSocket Upgrade |
| 并行任务 | 多请求并行 | 每条连接同时一个进行中响应 |
OpenAI 官方建议在 20 次以上工具调用的长流程中评估 WebSocket,并给出约 40% 端到端提速的参考;实际收益仍取决于网络、工具耗时、模型和代理链路。
普通 HTTP 配置
model_provider = "tidba"
model = "gpt-5.6-sol"
model_reasoning_effort = "xhigh"
[model_providers.tidba]
name = "TiDBA API"
base_url = "https://sub.tidba.com"
env_key = "TIDBA_API_KEY"
wire_api = "responses"
requires_openai_auth = false
这是兼容性最好的基线。先确保短请求和流式输出稳定,再开启 WebSocket。
开启 Responses WebSocket v2
在同一 Provider 上增加 supports_websockets,并启用客户端功能开关。
model_provider = "tidba"
model = "gpt-5.6-sol"
model_reasoning_effort = "xhigh"
[model_providers.tidba]
name = "TiDBA API"
base_url = "https://sub.tidba.com"
env_key = "TIDBA_API_KEY"
wire_api = "responses"
requires_openai_auth = false
supports_websockets = true
[features]
responses_websockets_v2 = true
Base URL 仍填写 HTTPS 地址,不需要手工改成 wss://。Codex 会按 Provider 能力建立相应连接。
连接内发生了什么
- 首轮发送与普通 Responses 相同的模型、指令、工具和输入。
- 服务器通过 WebSocket 持续返回事件。
- 模型请求工具时,客户端执行工具。
- 客户端在同一连接发送新的
response.create,携带新工具结果和previous_response_id。 - 最近响应状态保留在连接内存中,减少后续轮次的设置工作。
单条连接一次只处理一个进行中的响应;并行代理需要多条连接。连接存在时限,客户端必须能重新建连并恢复。
限制与错误处理
previous_response_not_found
连接内无法解析旧响应状态。使用完整输入重试,并把 previous_response_id 置空。
websocket_connection_limit_reached
连接达到当前时限。新建 WebSocket 连接后继续,不能无限复用同一连接。
代理拒绝 Upgrade 或频繁断连
先关闭 responses_websockets_v2 回到 HTTP 基线。如果 HTTP 稳定,问题范围就在 WebSocket 客户端、代理升级或长连接保活。
HTTP 和 WebSocket 都报 502
这通常不是连接模式单点问题。保留 Request ID,按 502 排查步骤检查上游错误和上下文。
如何验证切换有效
- 先分别运行相同的短任务,确认两种模式结果一致。
- 再运行包含多轮工具调用的真实任务。
- 比较 TTFT、总耗时、断连率和失败重试次数。
- 不要只比较一次请求;至少观察一组同类任务的 P50 和 P95。
测量方法见 首 Token 耗时 TTFT 指南。如果只是聊天或单次生成,保持 HTTP 通常更简单。
先从 HTTP 基线开始
确认 Provider 和 Key 正常后,再为长代理任务开启 WebSocket。