# 网络代理与 Codex 恢复 ## 本机代理端口 45678 怎么填 先确认 45678 是代理应用的 **HTTP 或混合端口**,而不是纯 SOCKS、控制接口或订阅端口。 两项地址均默认填入 `http://127.0.0.1`,端口为空;使用本机代理时只需填写端口。端口栏的“例如 45678”只是提示,不是已保存的值。默认地址且端口留空时继续自动发现代理,不会误连到 80 端口;已有的显式地址和端口不被默认值覆盖。 | 设置项 | 建议值 | |---|---| | HTTP 使用代理 | 开启 | | HTTP 地址 / 端口 | `http://127.0.0.1` / `45678` | | WebSocket 使用代理 | 开启 | | WebSocket 地址 / 端口 | `http://127.0.0.1` / `45678` | 这两个地址写的是本地代理入口,不是模型 API,也不是 `ws://` 或 `wss://` 地址。WSS 经 HTTP CONNECT 建立隧道后,仍使用 TLS 连接模型服务器。HTTP 项负责登录、令牌刷新、HTTP 模型请求和 SSE;WS 项负责模型 WebSocket 连接。代理应用还必须把实际 API 域名送到可用的出口,并允许 CONNECT / WebSocket 长连接。 **开启 WS 代理不等于取消五次重试。** 正确选路后,第一次连接成功就不重试;代理节点断流、TLS/握手失败、网络切换或服务端故障仍可能触发恢复。如果发生 SSE 降级,HTTP 项也必须有可用的网络路径。 ## 不改 DSH 核心 实现全部位于外部 `dsh-oauth-login` 插件。它使用 Undici 的公开 dispatcher 接口和 AsyncLocalStorage 区分插件请求中的 HTTP / WS;不改 DSH 核心文件、Pi AI 文件、全局代理环境变量或 OAuth 凭据文件。插件之外的请求继续交给原 dispatcher。 页面设置单独存入凭据文件旁的 `.dsh-oauth-proxy.json`,权限 0600。没有新文件时,两项都沿用旧的自动发现流程。开关关闭意味着该协议直连;开关开启、默认地址且端口留空(或两栏均清空)意味着允许自动发现,不代表一定找到代理。自定义地址须填写端口,也可粘贴完整的带端口代理 URL。显式地址优先于旧环境变量;错误地址会明确失败,不会偷偷改走直连。 UI 保存影响新请求。正在进行的调用使用开始时取得的配置完成。WS 配置变化后,通过 Pi AI 的公开连接清理接口关闭旧会话连接,不重置 SSE 降级标记。已有降级会话继续使用 SSE;新会话才重新尝试 WS。首次安装这版服务端代码仍需要受控重启 DSH。 ## 重试与降级分别由谁负责 这里是 DSH 经 Pi AI 调用 Codex 服务,不是替换官方 Codex CLI 的网络实现。保持 DSH 的默认预算:首次调用失败后最多再重试五次,使用原有退避与取消规则。Pi 的单次调用仍是 `maxRetries: 0`,不叠加第二层重试。 Pi AI 0.82.1 已有 `auto` 传输恢复:首个 WS 事件前失败,可以在同一次 SDK 调用中转 SSE;首个事件后发生传输故障,会给当前会话记下 SSE 降级状态,下一次调用使用 SSE。原来的缺口是 DSH 没把裸 `WebSocket error` 当作可重试故障,于是下一次调用根本没有发生。 插件现在只把 Codex 路由的裸 `WebSocket error`,以及关闭码 1000、1001、1005、1006、1011、1012、1013 对应的明确错误改为 `TRANSPORT`。协议、消息过大、策略拒绝及未知错误不据此扩大重试范围。直接 `stream` 和正常 Agent 使用的 `prepareCall().stream` 都覆盖,保持同一会话 ID 和已准备的请求快照。 不会强制 WS 重试五次才降级,也没有专门改成两次。认证、额度和用户取消不应被包装成网络故障。网络错误恢复也不能回放已经执行的工具。 ## 已覆盖的验证 - `npm run check`:类型检查、插件回归和客户端/服务端构建。 - `tests/http.spec.ts`:使用两个本机 CONNECT 代理、真实 HTTPS/WSS 和受信任的测试证书,验证四种开关组合、独立端口、环境变量覆盖、并发隔离、回调直连、错误地址不直连、保存不打断已有请求。没有关闭 TLS 验证。 - `node scripts/verify-network-recovery.mjs [result.json]`:真实 Harness Agent Loop、构建后的插件和真实 Pi Codex SDK,仅替换网络事件。覆盖首事件前后故障、默认五次预算、SSE 降级状态、连接缓存更新、取消、认证失败、丢弃失败文本和工具只执行一次。 - `node scripts/verify-network-settings-ui.mjs `:在已有 Harness 开发环境中使用 React DOM 和 `~/.codex/playwright-runtime` 的固定浏览器。测试真实设置组件与构建后的 API,覆盖保存/重新加载、冲突保护、输入校验、账户加载失败和明暗/窄屏显示。不是现用 DSH 的安装验收。 这些检查不读取真实 OAuth 密钥,不调用真实模型,也不证明某个用户的代理节点或上游服务此刻可用。安装后仍需核对实际 Host 加载版本,再做一次经用户允许的真实调用。