Skip to content

[Bug] 长驻 Responses WebSocket 会在上游 60 分钟硬限制处被动断开 #6104

Description

@itv3

版本

截至 upstream/main d45135d87df16d48637f04ccd245727bc955ba54(2026-08-23)。

问题

Responses WebSocket 连接池把本地最大连接年龄直接设为 60 分钟:

实测上游在约 60 分钟处存在硬断开。由于本地退休线与上游硬限制重合,长驻、leased 或 pinned 连接可以越过本地最大年龄,最终让业务轮次直接撞上上游断开;后台池清理无法处理仍被会话持有的 lease。

影响

  • 长对话可能在约 60 分钟边界出现被动断线。
  • 若下一轮带 previous_response_id 或工具输出,断线后的恢复还需要遵守现有完整回放/严格亲和规则,不能简单丢弃续链状态。

建议修复

  1. 区分上游硬限制与本地退休线,例如上游 60 分钟、本地提前 5 分钟退休。
  2. lease 暴露只读 ShouldRetire(),长驻 ingress 在每个新 turn 发送前检查年龄并走现有安全换连逻辑。
  3. lease 在持有期间跨过退休线时,Release() 后立即淘汰,不再回到空闲池。
  4. 空闲连接一旦越过退休线,即使残留 pin 也应移除。

已验证补丁

参考补丁:itv3/sub2apiplus@122d01d9e

补丁包含连接池退休、跨 turn 主动换连及回归测试;service 全量测试、handler 全量测试和 go build ./... 均通过。

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions