← 返回文章列表

我为什么把 ChatGPT Web 和 Codex 分开用

复杂规划交给 ChatGPT Web,Codex 留在仓库里读代码、修改和验证。本文记录 gpt-oracle-web 如何连接两段工作,以及它怎样验证发送、超时和清理。

Codex
ChatGPT Web
Token
Browser Automation

Codex 里的需求梳理、方案比较、代码审查、日志和测试,共用同一份有限上下文。规划阶段耗得越多,实现时可用的空间就越少。

我已经有 ChatGPT Web 订阅,于是把复杂规划、架构审查和根因分析放进 Web 对话,让 Codex 留在仓库里读文件、改代码和跑测试。

我用 gpt-oracle-web 连接这两段工作。它从 Codex 接收问题和证据文件,通过登录状态有效的 Chrome 打开 ChatGPT Web,再把结果交回当前任务。

它没有省掉推理成本:Codex 仍要整理材料和读取回答,ChatGPT Web 也受订阅用量限制。变化的是 Token 消耗的位置。

我怎样分工

Codex 定义问题,选择支撑结论的文件,排除密钥、用户数据和无关目录。ChatGPT Web 负责方案权衡、风险检查和验证要求。Codex 对回答做判断,再完成修改和测试。

gpt-oracle-web 的规划与实现分工

Oracle 是顾问,不是执行器。网页回答不能修改仓库,不能替 Codex 获取授权,不能取代回归测试。

什么时候值得调用 Oracle

ChatGPT Web 页面有五档思考强度。机械修改不需要 Oracle。边界清楚的复杂规划、审查和诊断使用第四档。高风险、强耦合或多视角任务使用第五档。

Skill 根据任务选档。Prompt 的长度不决定档位,风险、耦合和判断面决定档位。

Skill 选择第四档时传入 extra-high,选择第五档时传入 max。如果用户绕过 Skill 直接运行 wrapper,且没有传档位,wrapper 默认使用第五档。

Wrapper 使用 --browser-model-strategy current,不更换网页当前模型。CLI 里的模型字符串不是网页模型和思考强度的证据。

证据来自页面。第四档需要回读“第 4 项,共 5 项”,第五档需要回读“第 5 项,共 5 项”。页面显示的标签、位置和总档数会写入 browser.modelSelection。

页面没有给出证据,本次咨询就停止。Runtime 不猜网页背后的模型。

浏览器自动化如何落地

Runtime 使用 Chrome DevTools Protocol。Prompt 通过 Input.insertText 写入,附件通过 DOM.setFileInputFiles 挂载。它不用截图坐标定位这两步。

Oracle Chrome 跟随系统、Chrome Profile 和 ChatGPT 账号的语言设置,不再强制 en-US。Runtime 依据 ARIA 状态、控件位置和页面状态工作,不把英文文案当作唯一匹配条件。

网页五档控件不是标准 select,发送按钮也需要网页接收可信输入事件。Runtime 读取 ARIA slider,发送键盘事件。键盘路径不成立时,CDP pointer 接手。

Pointer 落下前,Runtime 重新定位元素,读取 viewport,用 elementFromPoint 检查落点。命中对象不符,点击不会发生。

Oracle Chrome 使用 1280×720 的窗口。选档和发送前,Runtime 恢复这个尺寸。用户改变窗口后,旧 viewport 和坐标作废,当前动作从元素定位开始。

其他窗口盖住 Oracle Chrome 不会改变 DOM 目标。最小化窗口或持续拖动边框可能让 Chrome 暂停合成,运行会按 fail-closed 规则结束。

ChatGPT Web 没有供订阅账户设置这五档强度的公开 API。OpenAI API 使用另一套额度。复制网页私有请求需要 Cookie 和短期字段,还会绑定未公开协议。

发送成功必须有证据

附件卡片出现,不代表文件处于可发送状态。发送按钮亮起,不代表消息进入了会话。这些状态需要分开核对。

Runtime 记录上传前的附件卡片、file input 和上传状态。上传后,界面需要产生新的附件信号。多文件合包显示“10 个文件”也可以通过这项检查,不依赖本地文件名。

附件准备窗口是 300 秒。发送按钮处于 disabled 状态时,Runtime 保持轮询,不用 Enter 跳过等待。

promptSubmitted=true 表示发送动作发生。新 conversation URL 或 committed user turn 才能证明消息进入会话。回答捕获结束后,Codex 才使用结果。

Oracle Web 的发送与验证状态

任一步缺少证据,Runtime 关闭本次 Chrome,删除本次临时 Profile,不把草稿当成回答。

所有阶段共用同一个超时

Wrapper 默认传入 --timeout 45m 和 --browser-timeout 45m。--browser-timeout 约束 Chrome 中的执行和回答捕获,--timeout 不能替代它。

Chrome browser run 开始时,Runtime 创建一个 deadline。提交、答案等待和延迟复查共用它,各阶段不重置计时。答案在期限前结束,运行进入清理。

部分 ChatGPT 回答不会渲染 action bar。Runtime 检查 assistant turn 的内容是否保持稳定,页面是否没有停止按钮,是否没有强思考状态。这些条件持续一个静默窗口后,该 turn 进入完成态。

隔离登录态并精确清理

Wrapper 把指定的 Chrome Profile 复制到临时目录,让 Oracle Chrome 使用已有登录状态。这个副本不携带 Local Storage 和 Sessions,旧对话路由、标签页恢复数据和上一次窗口状态不会进入新咨询。

复制 Profile 的运行不解密源 Profile 里的 Cookie,也不会再走一次 Cookie 同步。Runtime 使用副本里的登录数据,再结合 /api/auth/session 和页面状态验证登录结果。失败时,日志保留 sessionStatus、sessionResolved、backendStatus 和 cfBlocked 等探测结果,不再把所有问题都归到 Cookie。

第一次发送前,Runtime 要求 ChatGPT 处于新会话页。如果 Profile 恢复到 /c/... 旧对话,运行会在写入 Prompt 前停止,避免把新材料发进旧会话。

每次咨询拥有 session ID、Chrome PID、CDP port、target ID 和临时 userDataDir。Chrome 启动后,这组信息写入 session metadata。

自定义 slug 支持 3–12 个词。末尾的日期和唯一后缀会保留。slug 超出限制时,命令报错,不截断。

运行完成、失败、超时或收到 SIGINT、SIGTERM、SIGQUIT 时,Runtime 先写入终态,再关闭 metadata 记录的 Chrome PID,删除对应的 Profile 副本。

清理程序不看窗口标题、页面语言或创建时间,不使用 pkill 和 killall。它处理本 session 记录的 PID 和 userDataDir,不接触 Codex 进程、普通 Chrome 和其他 Profile。

我实际做过的验证

离线测试覆盖安装、受管版本升级、slug、附件、提交、无 action bar 回答、五档证据、中断写盘和精确清理。新用例还覆盖 Cookie 不解密、浏览器语言、登录探测证据、新会话门禁,以及从 a6d4e88 受管版本升级。当前测试结果为 All offline tests passed。

网页测试包含第四档单附件、第五档单附件和第四档 10 个附件。修正 browser timeout 后,又用 5 分钟覆盖值做了一次第四档测试。

收尾测试的 metadata 记录了结果:

{
  "status": "completed",
  "timeoutSeconds": 300,
  "browserTimeoutMs": 300000,
  "verified": true,
  "source": "thinking-time-control",
  "chromeAlive": false,
  "profileExists": false
}

这里的 300 秒是测试覆盖值,用来证明两层 timeout 进入了运行。普通调用的默认值是 45 分钟。

安装与调用

项目支持 macOS、Codex Desktop、Claude Code、Google Chrome 和 @steipete/oracle 0.17.3。安装器校验 Runtime patch 和 hash manifest,可以从仓库记录的受管旧版本升级。未知版本、混合状态和本地改动会让安装停止。

git clone https://github.com/yaoziyaoguai/gpt_oracle_web.git
cd gpt_oracle_web
./scripts/install.sh
./scripts/verify.sh

仓库更新后可以重新安装:

git pull --ff-only
./scripts/install.sh
./scripts/verify.sh

Codex 任务在下一次调用时读取安装目录中的 Skill。运行中的咨询不更换规则,新调用会创建新 session、新 Chrome 和新 conversation。

调用时可以对 Codex 说:

使用 $oracle-web 审查这个复杂任务。选择支撑结论的文件,让网页给出规划、风险和执行建议,交给 Codex 实现并运行测试。

发送项目文件前,先用 dry run 核对文件清单和体积:

oracle-web --dry-run summary --files-report \
  --browser-thinking-time extra-high \
  -p "审查失败恢复设计,返回修改方案和验证要求" \
  --file "src/recovery/**"

它真正节省的是规划上下文

这套工作流主要省下 Codex 任务里的规划回合。材料整理、回答读取、实现和验证仍会消耗 Codex Token,ChatGPT Web 也仍受订阅用量限制。

它不改变当前 Codex 的模型和 reasoning effort,不绕过 ChatGPT 订阅限制,不承诺网页背后的隐藏模型名称。

代码、Patch、安装脚本和测试放在 GitHub。

分享这篇文章

复制链接,或分享到你常用的地方。

评论

发表评论

0 / 1000

KEEP READING

全部文章