Codex 很强,Claude Code 很强,AI 很强。

但所有深度使用 Codex 的人,早晚都会撞上同一堵墙 —— 你的 Codex 在处理需要登录的网页时,体验极其糟糕。

让 Codex 帮查个后台数据,它要重新登录;让它处理一封 Gmail,它说“需要登录”;让它刷一下 X 时间线,它只能干瞪眼。

即便借助 Codex 自带的 Computer Use 强行打开登录态网页,体验也往往不尽如人意:靠视觉识别看屏幕慢如龟速、直接抢占鼠标光标,频繁断连,遇到复杂的页面还容易打回原形。

最后大家还是选择回到原始人模式:自己打开网页,截图,把内容粘给它。一遍,两遍,天天如此。

今天这篇长文,就是来拆掉这堵墙的。

主角叫 ego-lite——一个专门为 AI 而生、又同时给人类用的浏览器。对于频繁依赖 Agent 自动化流程的开发者来说,它提供了一个比 Computer Use 快得多、干净得多、且完全不抢鼠标的浏览器专属解决方案。

读完这篇指南,Codex 的能力边界会被往前推一大块。

一、先说每天都在撞的那堵

深度依赖 Codex 的日常里,痛苦基本长一个样:

  • 终端里是神,网页上是瞎子:Codex 在 CLI 命令行、脚本编写、重构代码上能力极其惊人,但只要任务涉及真实的 Web 世界(尤其带鉴权的私有页面),它就立刻变成了瞎子。
  • 传统自动化工具环境太干净:Playwright、Puppeteer 每次启动都会起一个全新的、极其干净的临时 Profile。里面空空如也,Cookie、Session、会员状态、后台登录全都没有。要让 Codex 查东西,你必须先写脚本模拟登录,遭遇 2FA 验证码时脚本直接崩掉。
  • 视觉交互体验太重:Computer Use 虽然能开网页,但它走的是“截图 -> 视觉模型识图 -> 推算相对坐标 -> 模拟硬件鼠标点击”的视觉闭环。这个过程极度依赖模型对坐标的理解精度,不仅视觉循环速度慢(单次交互可能耗时 3-5 秒),而且它会直接抢占系统鼠标焦点,导致人类用户在旁边连打字都会断行。
  • 截图搬运回归石器时代:最终,大部分人的工作流退化成了:自己手动打开浏览器 -> 复制 Cookie/截图 -> 贴进 Codex -> Codex 提示信息不全 -> 再截一张。本应自动化的 Agent 变成了“截图驱动型 AI”。

这些痛点的本质只有一个:Codex 没有一双能快速、静默地看见真实网络世界的“眼睛”,更没有一只干净不扰人的“手”能帮着操作它。

ego-lite 干的事,就是把“眼睛”和“手”给 Codex 装上。而且是装在它自己的隔离空间里——不碰你的正常浏览器,也不抢键盘鼠标。

二、ego-lite 是什么

一句话定义

ego-lite 是一个 Chromium 内核的浏览器,同时服务人类和 AI Agent。它给 Codex 提供隔离的“任务空间”,并在任务空间里复用真实的登录态。

  1. 它是个真浏览器:它不是普通的无头壳子(headless),也不是一个简单的 WebDriver 封装,而是带有完整 Chromium 内核的真浏览器。人类能正常跑的复杂 JS 单页应用(SPA)、WebAssembly 以及加密验证,它完全支持
  2. 它有“任务空间”(Task Space):这是它与所有同类工具最本质的区别。每个 Codex 任务对应一个独立的空间,空间内部拥有属于自己的标签页与上下文,与人类主界面相隔离。Codex 在隔离空间里打开 10 个标签页进行深度搜索,人类在主窗口阅读文章,两者互不干扰。
  3. 任务空间默认继承登录态:全场 MVP。ego-lite 底层设计实现了配置目录(User Data Directory)安全共享与隔离机制。Codex 介入时,不需要输入账号密码或重新走 2FA 流程,直接复用当前用户的 Session。查 Gmail、看后台、刷数据、回私信,上手就能干。

把它的定位形容为 “Codex 的私人办公室” 再合适不过——独立、干净、而且带着门禁卡。

角色职责划分

在深入具体工作流之前,不妨先把两者的分工看清:

角色 负责的事 交互模式
人类 用自然语言提需求:“帮我查一下后台今天的订单数并汇总” 自然语言交互
Codex 规划任务、决定使用哪个 Task Space、拼出 ego-browser nodejs 命令、执行、读取语义树输出、汇总汇报 CLI 命令行执行 / JS 闭包构建
ego-lite 在隔离空间里真正渲染网页、复用 Cookie 登录态、将 DOM 转换为语义树输出给 Codex Chromium 内部调度 / CDP 桥接

在使用过程中,人类永远不需要手写脚本,那全是 Codex 的活。

三、与其他自动化方案有什么不同

在已经拥有 Computer Use、Playwright 或 browser-use 的前提下,ego-lite 依然不可替代,原因在于它是一条更高效、更不打扰人的浏览器“专用通道”。

\1. 对比 Codex 自带的 Computer Use

Computer Use 是官方给出的通用桌面兜底方案:在没有 API 和标准结构时,靠视觉识别“看屏幕、猜坐标、模拟点击”。

  • 速度与响应:Computer Use 的“视觉截图 -> LLM 坐标识别 -> 模拟硬件鼠标”闭环单次耗时非常明显,且模拟硬件鼠标动作会强制抢占系统光标;ego-lite 走的是 DOM 结构化语义通道,通过语义树(snapshotText)直接读懂页面结构并精准触发点击事件,响应速度高出一个量级,且支持后台静默执行,不抢占键盘鼠标。
  • 登录态稳定性:Computer Use 依赖于桌面上的浏览器实例,频繁开启新窗口或注入插件时,继承登录态极其不稳定;而 ego-lite 在底层架构层面原生支持了配置目录的身份继承。

可以说,Computer Use 是“啥都能干但比较笨重”的桌面级兜底,ego-lite 则是“快速、干净、不打扰人”的浏览器专属通道。

\2. 对比传统自动化工具(Playwright / Puppeteer / browser-use)

  • 传统工具:起一个全新的干净 Profile,里面没有任何 Cookies 或 LocalStorage。要跑自动化,要么写代码重新模拟登录,要么手动导出 Cookie 文件进行注入。一旦 Cookie 过期,脚本直接崩溃。它们是面向“测试工程师”在 CI/CD 环境下设计的,而不是面向“AI Agent 协作”。
  • ego-lite:直接复用真实登录态,Codex 进去就能干活。同时用“隔离任务空间”保证不干扰正常浏览,彻底解决了 Agent 安全、无缝在真实网络世界干活的问题。

\3. 方案综合对比

维度 Playwright / Puppeteer Computer Use browser-use ego-lite
登录态复用 困难(需手动导 Cookie/写登录逻辑) 中等(依赖桌面打开的窗口) 困难(默认新上下文) 原生无缝继承
操作模式 代码/无头 (Headless) 视觉识图 + 硬件鼠标 视觉 + DOM 结合 结构化语义 + 隔离空间
对人类打扰 高(抢占鼠标/屏幕焦点) 中等 零打扰(后台静默执行)
人机接管 无(遇到 Captcha 直接报错崩溃) 需手动终止 Agent 较为繁琐 无缝人机交接(自动弹窗等待)

\4. 关键特性:人机控制权交接

传统自动化工具遇到验证码(Captcha)或二次确认,通常只能报错崩溃,Agent 框架也容易直接卡死。

而 ego-lite 支持人机协同机制:当 Codex 撞上验证码或高风险二次验证时,它会主动把隔离的任务窗口弹到前台,同时暂停 Agent 的执行;人类直接在界面上点完验证码,在终端回复一声“好了”,Codex 便能顺畅接过控制权继续干活。遇到障碍不硬打,交还给人类处理——这是真实场景里极其地道的机制。

四、安装:一条命令,两分钟

目前优先支持 macOS(支持 Apple Silicon M 系列及 Intel 架构)。

\1. 执行安装脚本

打开终端,直接运行官方安装脚本:

1
sh skills/ego-browser/scripts/install.sh

脚本自动完成的事项

  • 自动检测系统的 CPU 架构(arm64 或 x64),从官方 CDN 下载最新的 DMG 安装包;

  • 将 ego

    lite.app

    解压并安装到 /Applications 应用程序目录;

  • 自动移除 macOS 的

    com.apple

    .quarantine 属性,直接绕过 Gatekeeper 的首次安全拦截;

  • 启动应用进入首次 Onboarding 指引(支持一键导入 Chrome 历史数据与 Cookie),并将 ego-browser CLI 工具自动注册到系统的 PATH 路径中。

\2. 环境验证与 Troubleshooting

安装完成后,打开新的终端标签页,校验环境变量:

1
command -v ego-browser

常见坑点排查:若终端提示 command not found: ego-browser,通常是因为 ~/.local/bin 没有包含在当前的 shell 环境变量中。在你的 ~/.zshrc 或 ~/.bashrc 中补上导出配置即可:Bashexport PATH=”$HOME/.local/bin:$PATH” 重新加载配置:source ~/.zshrc

\3. 运行时验证

执行以下极简脚本,测试 Node.js 桥接与 CLI 的连通性:

1
2
3
ego-browser nodejs <<'EOF'
cliLog('ego-browser ready')
EOF

若终端正确打印出 ego-browser ready,即代表整个底层交互环境配置完毕。

将它设计成 CLI 而非普通依赖库的原因很纯粹:CLI 是 Codex 最自然的操作接口。不需要额外的 import 或繁琐配置,一条命令接一个 heredoc 即可完成交互。

五、第一次运行:自动化任务的底层逻辑

在实际日常使用中,代码全部由 Codex 自动拼装运行。

例如给出这样一句指令:

“用 ego-browser 打开

google.com

,把页面上有什么告诉我。”

Codex 收到后,会在后台静默拼装并运行如下代码:

1
2
3
4
5
6
7
8
9
10
11
ego-browser nodejs <<'EOF'
// 1. 创建隔离空间,避免污染正常标签页
const task = await useOrCreateTaskSpace('inspect google page')
cliLog('task space id: ' + task.id)

// 2. 打开网页并等待渲染与网络加载完成
await openOrReuseTab('https://google.com', { wait: true, timeout: 20 })

// 3. 提取结构化语义树输出给 Codex
cliLog(await snapshotText())
EOF

这段逻辑建立了名为 inspect google page 的隔离空间,在内部打开目标页面,并将其解析为语义树输出。

snapshotText() 是最核心的观察 API。它返回的是一棵带有结构注释的语义树(基于 Accessibility Object Model 构建):

1
2
3
- Heading level=1 "Example Domain" [loc=1:1]
- Paragraph "This domain is for use in illustrative examples..."
- Link "More information..." [ref=@1] [url=https://www.iana.org/domains/example] [loc=1:2]
  • [ref=

    @N

    ]:给每一个可交互元素分配的临时引用编号;

  • [url=…]:可交互链接的真实目标 URL;

  • [loc=…]:底层 DOM 的稳定物理定位器,防止 DOM 重新渲染导致编号漂移。

需要特别关注的是,

@N

编号仅在最近一次 snapshotText() 的结果中有效,页面一旦发生刷新、滚动或 Ajax 动态加载,索引就会重建。若要在多步脚本中长期引用特定元素,使用 loc=… 或 CSS 选择器会更加稳妥。

六、核心概念:任务空间

任务空间(Task Space)是 ego-lite 的灵魂。 这是整套流程中最值得在提示词里跟 Codex 交代清楚的概念。

\1. 隔离的浏览上下文

  • 每个 Task Space 拥有独立的标签页集合(Tabs Group),在逻辑与视图上互相隔离;
  • 所有 Task Space 共享宿主浏览器的真实登录凭证,免除鉴权烦恼;
  • 生命周期管理:关闭 Task Space 内部的所有标签页,系统即判定该 Task Space 已销毁并自动释放资源。

通过这种设计,Codex 在自己的房间里折腾,人类在客厅正常工作,互不打扰,但门禁卡(登录态)完全通用。

\2. 多轮任务的状态保持

每次 Codex 跑完一段 heredoc,Node.js 运行时进程就会退出。面对跨多轮的复杂任务,每一轮开头都需要找回同一个空间以恢复之前的页面上下文:

1
2
3
4
5
6
7
8
9
10
ego-browser nodejs <<'EOF'
// 在多轮会话中通过唯一名称锁定任务空间
const task = await useOrCreateTaskSpace('order-analysis-session')

// 获取当前空间中的活动标签页,无需重复 openTab
const currentTab = await getActiveTab()
cliLog('Current URL: ' + currentTab.url)

// 继续后续操作...
EOF

提示词习惯:在交互时,如果希望 Codex 跨多轮都在同一个空间内操作,可以在需求里明确说明:“接着刚才那个任务继续,别开新空间。” 这样可以有效防止 Codex 每轮都创建新空间导致状态丢失。

七、三种工作流的按需选择

针对不同的网页结构,系统提供了三条工作流:

工作流一:语义工作流(默认推荐)

Codex 使用 snapshotText() 获取语义树,再通过编号、loc 定位器或 CSS 选择器进行精准交互。

1
2
3
4
5
6
7
8
9
10
11
ego-browser nodejs <<'EOF'
const task = await useOrCreateTaskSpace('search something')
await openOrReuseTab('https://www.google.com/search?q=ego+browser', { wait: true })

// 提取语义树
const text = await snapshotText()
cliLog(text)

// 使用 @N 编号进行语义点击
await click('@1')
EOF

适用场景:绝大多数标准 Web 站点、包含完整 DOM 结构的电商页面、文档站、论坛、SaaS 后台管理系统。

工作流二:视觉工作流(画布类应用)

面对 Google Docs、Google Sheets、飞书文档、Notion、Figma、Excalidraw 等“画布型”(Canvas/Virtual DOM)应用,真正的文本内容被绘制在 中,或者 DOM 结构被极度扁平化,snapshotText() 会失效。

此时需要切换为 截图 + 视觉坐标 + 真实键盘输入 的组合打法:

1
2
3
4
5
6
7
8
9
10
11
12
13
ego-browser nodejs <<'EOF'
const task = await useOrCreateTaskSpace('edit-canvas-doc')

// 1. 截取当前视口的高清图像
const screenshotPath = await captureScreenshot()
cliLog('Screenshot saved at: ' + screenshotPath)

// 2. 视觉识图后确定坐标 [X, Y],点击指定区域获取焦点
await click([420, 260], { label: 'click into editor canvas' })

// 3. 触发真实物理键盘文本输入
await typeText('Hello world from ego-lite visual workflow!')
EOF

提示词习惯:遇到这类画布应用时,在提示词中补充一句:“这个页面是画布类应用,用视觉工作流,别用 DOM 输入”,Codex 就会自动切换模式。

工作流三:直接 DOM / CDP 模式

用于获取浏览器内部状态、执行复杂 DOM 遍历、注入长段 JS 逻辑或直接调用 Chrome DevTools Protocol 原语:

1
2
3
4
5
6
7
8
9
10
11
// 执行原生的 JavaScript 动态数据抓取
const data = await js(String.raw`(() => {
const items = [...document.querySelectorAll('article.post-item')]
return items.map(el => ({
title: el.querySelector('h2')?.innerText.trim(),
price: el.querySelector('.price')?.innerText.trim(),
link: el.querySelector('a')?.href
}))
})()`)

cliLog('Extracted Data: ' + JSON.stringify(data, null, 2))

八、五大实战场景拆解

以下演示了自然语言需求与 Codex 后台脚本的映射关系:

场景一:搜索与结构化数据抓取

自然语言需求:“帮我搜一下 claude code setup,把 Google 前 5 条结果的标题和链接整理成 JSON 读给我。”

Codex 自动拼装运行的后台脚本:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
ego-browser nodejs <<'EOF'
(async () => {
try {
const task = await useOrCreateTaskSpace('google-search-task')
await openOrReuseTab('https://www.google.com/search?q=claude+code+setup', { wait: true, timeout: 15 })

// 执行 DOM 树解析,抓取结构化结果
const searchResults = await js(String.raw`(() => {
const nodes = [...document.querySelectorAll('div.g')].slice(0, 5)
return nodes.map(node => {
const titleEl = node.querySelector('h3')
const linkEl = node.querySelector('a')
return {
title: titleEl ? titleEl.innerText : null,
url: linkEl ? linkEl.href : null
}
}).filter(item => item.title && item.url)
})()`)

cliLog('RESULT_JSON:' + JSON.stringify(searchResults))
} catch (err) {
cliLog('ERROR: ' + err.message)
}
})()
EOF

场景二:复用登录态(提取带鉴权 SaaS 后台指标)

自然语言需求:“去我的 SaaS 仪表盘后台看一下今天的 GMV 和新增订单数,直接汇报结果。”

Codex 自动拼装运行的后台脚本:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
ego-browser nodejs <<'EOF'
(async () => {
const task = await useOrCreateTaskSpace('check-saas-dashboard')

// 继承已有 Cookies,无需 Auth 即可访问受保护路由
await openOrReuseTab('https://app.mysaas.com/dashboard', { wait: true })

// 提取语义树判定界面状态
const snapshot = await snapshotText()

if (snapshot.includes('Login') || snapshot.includes('Sign In')) {
cliLog('STATUS: LOGIN_REQUIRED - 凭证失效,请手动登录')
return
}

// 获取指标卡数据
const metrics = await js(String.raw`(() => {
return {
gmv: document.querySelector('#stat-gmv')?.innerText,
orders: document.querySelector('#stat-orders')?.innerText,
timestamp: new Date().toISOString()
}
})()`)

cliLog('DASHBOARD_METRICS:' + JSON.stringify(metrics))
})()
EOF

场景三:自动填表与复杂文件上传

自然语言需求:“去表单页面填写信息,邮箱写 test@example.com,标题写 ‘AI 自动化报告’,再把桌面上的 report.pdf 传上去,提交后告诉我结果。”

Codex 自动拼装运行的后台脚本:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
ego-browser nodejs <<'EOF'
(async () => {
const task = await useOrCreateTaskSpace('form-submit-task')
await openOrReuseTab('https://example.com/upload-form', { wait: true })

// 填入文本
await fillInput('input[type="email"]', 'test@example.com')
await fillInput('input[name="title"]', 'AI 自动化报告')

// 处理文件上传组件(无需操作系统文件选择器弹窗)
await uploadFile('input[type="file"]', '/Users/username/Desktop/report.pdf')

// 点击提交按钮
await click('button[type="submit"]', { label: 'Submit Form Button' })

// 等待网络空闲及页面响应
await waitForNetworkIdle({ timeout: 10000 })

cliLog('SUBMIT_STATUS:' + await snapshotText())
})()
EOF

场景四:跨多轮的深度追问与多页联动研究

  • 第一轮需求:“帮我研究下 AI Agents 架构,先搜索一下。” 底层行为:useOrCreateTaskSpace(‘agent-research’) -> 搜索并渲染页面。

  • 第二轮需求:“点进第一个结果,看看它的核心结论。” 底层行为:useOrCreateTaskSpace(‘agent-research’) -> 获取先前标签页 -> click(‘

    @1

    ‘) 打开详情。

  • 第三轮需求:“接着刚才的任务,往下滑动,并把页面里的结构图截个图。” 底层行为:useOrCreateTaskSpace(‘agent-research’) -> 复用上下文 -> scrollDown() -> captureScreenshot()。

在整个 3 轮交互中,任务空间一直处于维持状态,DOM 与历史状态完全保留。

九、无缝接入 Codex 工作流

把配置成本降到最低,只需在 Codex 的全局 Prompt 或配置中加上约束。

建议将以下配置写入项目根目录的 .codex/instructions.md 或全局 AGENTS.md 提示词库中:

markdown

1
2
3
4
5
6
7
8
9
10
## 浏览器自动化准则 (ego-lite 集成)

当遇到任何网页浏览、搜索、SaaS 后台数据查阅、登录态处理需求时,必须遵循以下规则:

1. **优先选择通道**:使用 `ego-browser nodejs <<'EOF' ... EOF` 运行指令,绝不可优先调用开销大且抢占光标的重型 Computer Use 工具。
2. **任务空间声明**:所有脚本首行必须通过 `await useOrCreateTaskSpace('特定语义名称')` 初始化或复用任务空间,并在任务彻底结束时调用 `completeTaskSpace()`
3. **工作流选择策略**
- **默认 (DOM 页面)**:走语义工作流,先调用 `snapshotText()`,然后通过 `@N``loc` 定位器进行交互;
- **画布页面 (Google Docs/Sheets/Figma/Canvas)**:显式采用视觉工作流,使用 `captureScreenshot()` -> 坐标推算 -> `click([x, y])` -> `typeText()`
- **长文本处理**:对于过长的 DOM 树,在 JavaScript 闭包内部提取特定的子树,避免打印全量 HTML。

在实际使用中,有几个非常实用的提示词习惯:

  • 面对超长页面,可加上:“页面很长,只看当前视口内容即可。
  • 面对画布应用,主动强调:“用视觉工作流,别用 DOM 输入。
  • 面对多轮连续任务,明确指示:“接着刚才那个任务,别开新空间。

十、客观的边界与局限

没有任何工具是完美的,ego-lite 目前同样存在明确的边界:

  1. 操作系统支持:目前的极速安装脚本与自动化挂载对 macOS(尤其 Apple Silicon)支持最为完善,Linux 与 Windows 尚未提供开箱即用的安装包,尚需手动编译配置。
  2. 生态与 API 稳定性:由于其面向极客与 Agent 开发者,部分 CLI 拓展参数与内嵌 API 在版本快速迭代中可能发生微调,生产环境脚本建议锁定版本,并以官方最新的 SKILL.md 定义为准。
  3. 画布应用性能开销:在 Notion、Figma、Google Sheets 等强 Canvas 渲染的应用中,强制使用的“截图 + 视觉坐标”闭环,其响应流畅度自然无法与原生 DOM 操作相比。
  4. 登录态授权的安全界限:任务空间继承了真实的登录身份,相当于将门禁卡交给了 Agent。面对涉及资金交易、敏感身份重置或高风险删除操作的站点,切记谨慎授权。

写在最后

每一个深度依赖 Codex 的开发者,都曾被“登录态网页”折磨过。直接跑 Playwright 会缺失 Cookie,用 Computer Use 又嫌它笨重抢光标,手动截图搬运更是效率黑洞。

ego-lite 提供了一个极佳的折中解:隔离的任务空间 + 复用的登录态 + 结构化语义通道

从今天起,告别慢吞吞的视觉识别和截图搬运。装一个 ego-lite,把 Codex 接进去。试过之后会发现:Codex 的能力边界,从来不是模型决定的,而是由人类愿意给它多少“真实世界”决定的。