版本
截至 upstream/main d45135d87df16d48637f04ccd245727bc955ba54(2026-08-23)。
问题
Responses WebSocket 连接池把本地最大连接年龄直接设为 60 分钟:
实测上游在约 60 分钟处存在硬断开。由于本地退休线与上游硬限制重合,长驻、leased 或 pinned 连接可以越过本地最大年龄,最终让业务轮次直接撞上上游断开;后台池清理无法处理仍被会话持有的 lease。
影响
- 长对话可能在约 60 分钟边界出现被动断线。
- 若下一轮带
previous_response_id 或工具输出,断线后的恢复还需要遵守现有完整回放/严格亲和规则,不能简单丢弃续链状态。
建议修复
- 区分上游硬限制与本地退休线,例如上游 60 分钟、本地提前 5 分钟退休。
- lease 暴露只读
ShouldRetire(),长驻 ingress 在每个新 turn 发送前检查年龄并走现有安全换连逻辑。
- lease 在持有期间跨过退休线时,
Release() 后立即淘汰,不再回到空闲池。
- 空闲连接一旦越过退休线,即使残留 pin 也应移除。
已验证补丁
参考补丁:itv3/sub2apiplus@122d01d9e
补丁包含连接池退休、跨 turn 主动换连及回归测试;service 全量测试、handler 全量测试和 go build ./... 均通过。
版本
截至
upstream/maind45135d87df16d48637f04ccd245727bc955ba54(2026-08-23)。问题
Responses WebSocket 连接池把本地最大连接年龄直接设为 60 分钟:
openAIWSConnMaxAge = 60 * time.MinutecleanupAccountLockedsessionLease,下一轮仅按空闲时长决定是否 ping:openai_ws_forwarder_ingress.go实测上游在约 60 分钟处存在硬断开。由于本地退休线与上游硬限制重合,长驻、leased 或 pinned 连接可以越过本地最大年龄,最终让业务轮次直接撞上上游断开;后台池清理无法处理仍被会话持有的 lease。
影响
previous_response_id或工具输出,断线后的恢复还需要遵守现有完整回放/严格亲和规则,不能简单丢弃续链状态。建议修复
ShouldRetire(),长驻 ingress 在每个新 turn 发送前检查年龄并走现有安全换连逻辑。Release()后立即淘汰,不再回到空闲池。已验证补丁
参考补丁:
itv3/sub2apiplus@122d01d9e补丁包含连接池退休、跨 turn 主动换连及回归测试;
service全量测试、handler全量测试和go build ./...均通过。