Skip to content

fix: 保护聚合会话连接并按需纠正错误代理 - #2569

Open
130040167 wants to merge 7 commits into
BigPizzaV3:mainfrom
130040167:codex/fix-managed-session-connection
Open

130040167 wants to merge 7 commits into
BigPizzaV3:mainfrom
130040167:codex/fix-managed-session-connection

Conversation

@130040167

@130040167 130040167 commented Oct 16, 2026 •

Copy link
Copy Markdown
Contributor

问题

启用自定义 API 聚合后,其他配置管理程序修改 Codex 的供应商地址、认证来源等配置,可能让新建或重新加载的会话连到错误代理,出现持续重连、请求发送失败。模型聚合和故障转移都会受到影响。

此外,原生预创建线程可以绕过普通请求包装;新线程首条消息前调用 thread/resume 会触发 no rollout found for thread id。恢复过程如果没有独立超时,还可能长期占住会话恢复入口。

供应商列表分页还可能让复制、排序、删除操作提交不完整的配置,误改隐藏的活动供应商;删除活动供应商、聚合默认成员或最后成员会使实时连接或聚合目录失效。

实现

  • 在创建、预创建、恢复和普通分支入口,为本地自定义聚合会话显式设置内部 codex_plus_managed provider,固定连接到 Codex++ 的本地 Responses 代理。后端只提供策略标识和本地地址,不向 renderer 下发成员凭据。

  • 模型聚合、故障转移共用保护入口;官方登录、同步默认成员登录和远程主机维持原有行为。退出保护时,恢复入口将内部 provider 转回当前配置的目标 provider。

  • 发送前保留已有的每模型窗口、压缩阈值及 metadata 刷新:仅切换模型且启用了对应配置时 resume;实例、原型和本地主机嵌套请求使用相同流程,刷新失败保留旧模型缓存以便下次重试。同线程正在恢复连接时不抢先刷新。

  • 未显式指定 provider 的恢复请求使用有界身份探测,最多等待 800ms;失败或超时保留原生 resume 参数,不丢弃恢复请求。

  • 正常发送不额外读取配置或线程状态;新建和未知线程直接提交首条消息,不预先 resume。连接签名变化或观察到明确连接错误时,在用户下一次发送时按需检查。

  • 仍然有效的空闲受管连接跳过卸载;需要纠正的空闲会话先读取运行时设置,再卸载和恢复,保留本次模型选择、工作目录、权限及服务等级。繁忙会话交回原生处理,不强制打断回复。

  • 检查读取使用 800ms 超时,恢复 RPC 每步使用独立的 5s 超时,不继承用户消息的回调、消息 ID 或 trace。检查读取失败或超时后交回原生发送;恢复 RPC 超时后释放恢复锁,不继续提交消息,也不自动重发失败消息。

  • 恢复关键步骤后核对连接签名;配置变化时停止本次发送。保留确认等待期间产生的异步错误标记,并在成功完成回复后清除临时标记。

  • 升级已有请求和预创建包装,保留原生调用绑定。错误观察限制遍历深度和缓存数量,逐 token 通知不递归扫描,也不新增定时轮询。

  • 供应商分页仅过滤显示,所有卡片操作使用完整配置。删除前保护活动供应商、任何聚合配置的默认成员和最后一个有效成员,并显示原因;底层删除函数执行同样检查。其他非默认成员仍可删除并清理引用。

验证

  • 当前独立 PR 分支全量前端测试 664 项通过、1 项跳过;供应商列表隔离与删除保护专项 6 项通过,差异格式检查通过。

  • 包含供应商保护的集成构建完成 release 构建与隔离管理器验证:禁止删除时配置不写盘,允许删除时保留隐藏活动聚合及其默认成员。本结果不替代当前独立分支的完整 release 验收。

  • 独立上游分支:管理器全量测试 658 项通过、1 项跳过,包含真实模型刷新函数的三入口回归、刷新失败重试、恢复并发保护,以及普通官方和退出受管恢复的探测超时/失败回退。

  • 注入脚本测试 55 项全部通过;cargo test -p codex-plus-core --test plugin_navigation 通过。插件适配夹具加载真实会话连接辅助函数,覆盖未启用聚合保护时模型和插件包装共同存在的原生请求透传。

  • renderer 分片重新组装,manifest 行数契约和 git diff --check 通过;Vite 生产构建通过。

  • 独立分支通过已安装原生后端的三种请求入口、共 30 项隔离检查,覆盖外部配置覆盖、模型选择、故障转移和冷恢复;此前真实客户端专用测试线程还验证了恢复超时、迟到响应不继续提交、会话间隔离及恢复后的消息完成。

  • cargo check -p codex-plus-core --tests 通过。Rust 代理测试与 release 构建均在链接 sherpa-onnx 静态库时遇到 LNK2019 / LNK2001(缺少 __std_* 符号),因此此独立分支未完成 Rust 测试运行、release 产出和该产物的启动验收;没有修改依赖或编译配置。

  • 此前的客户端验证使用包含其他独立修复的集成构建,不等同于此独立分支的完整客户端验收。

边界

保护仅固定会话到本地代理的连接,不保证修复无效 TOML、不可用的上游、失效凭据或已经被终止的代理进程。未知旧会话首次发送保持原生路径,明确连接错误后下一次发送才进入按需检查。

5s 为每个已派发恢复 RPC 的超时,不是整个流程的总耗时上限,也不保证已开始的后端操作被取消。用户消息不自动重放,恢复失败或配置在恢复期间变化时需要重新发送。

@BigPizzaV3 BigPizzaV3 left a comment

Copy link
Copy Markdown
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

复核当前 head f3d91ff5,请先修复以下两项 P2。已核对 CI run 38895326024 的 SHA,Windows/macOS 均成功;本地现有连接保护与 renderer 测试 129 项、插件适配测试 13 项及注入产物一致性检查也通过,下面两条额外回归仍能复现问题。

  1. [P2] 受管 turn 提前返回,跳过已有每模型上下文刷新。 assets/inject/renderer-inject/70-model-catalog.js:748-750 的实例包装、954-956 的原型包装,在 sendCodexManagedSessionTurn 返回后直接退出,后面的 refreshCodexThreadModelBeforeTurn 不会执行。受管发送路径同时更新 __codexPlusThreadModels,下一次也无法补做这次切换的刷新。

    对照复现使用真实包装函数和真实 refreshCodexThreadModelBeforeTurn:聚合 profile 配置 modelWindows={old:200000,new:1000000},先 thread/start(model=old),再 turn/start(model=new)。main 的调用顺序为 thread/start:old → thread/resume:new → turn/start:new;当前 PR 变成 thread/start:old → turn/start:new。请在启用了模型窗口/压缩/metadata 且需要刷新时保留原有流程,或提供经过验证的等价路径;普通消息仍可保持不增加 RPC。当前新测试将该 refresh helper stub 为空,未覆盖这项兼容性,请补对应回归。

  2. [P2] 退出保护时的身份探测缺少超时,并扩大到普通官方恢复。 assets/inject/renderer-inject/30-service-tier.js:690-698 在未启用保护、thread/resume 未显式携带 provider 时,同样先 await sendRequest("thread/read", ...);此处未传 options,也没有复用 800ms 的 readCodexManagedSessionForCheck。探测迟迟不返回时,实际恢复 RPC 始终没有派发,普通官方会话也会受到影响。

    复现:配置普通 official profile、没有 managedSessionConnection,调用该 prepare 函数恢复一个未显式指定 provider 的线程,让 thread/read 返回未完成 Promise;一秒后 prepare 仍未结束,捕获到的该读请求 options 为 undefined。请只在存在受管身份依据时探测,或为该探测设置有限超时,并在超时/失败后恢复原生 resume 语义;补普通官方恢复和退出受管恢复两种回归。

这两项都可以在保留本 PR 连接保护范围的情况下修复。修复后请对新 head 重跑相关回归与双平台 CI。

This branch has not been deployed

No deployments
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants