【开源】写了个 Chrome AI 助手,聊聊为什么我没让 AI 去读 DOM 树

最近在做一个叫 MoleClaw 的 Chrome 扩展,一个在任意网页上用的 AI 助手。今天趁文档站刚上线,来跟大家聊聊这个项目,主要分享下设计上踩过的坑和做的一些选择。(求star :smiling_face_with_tear:)

还是先说一下这个东西是做什么

在任意网页上按 Cmd+E 唤起一个搜索框,用自然语言告诉它你要干什么,它就钻到后台去干活,干完了把结果给你。整个过程不打扰你当前在做的事。目前原子操作涵盖了 页面感知,页面操作,导航,浏览器的能力,自动化与定时,工作流,以及最核心的cdp 共计 35+ 的工具,还在持续迭代

名字叫 Mole(鼹鼠),因为它的工作方式就像鼹鼠挖洞——你在地面上提了个需求,它就钻到地下去挖,挖完带着东西浮出来。对应到技术上就是:悬浮球是地面(Content Script),AI 调度在地下(Background Service
Worker),中间靠隧道网络连接(自己写的 Channel 通信系统)。

核心设计哲学

做这个项目最大的体会是一句话:代码管机制和边界,模型管决策和策略。

什么意思呢?代码层面只负责"采样 → 执行 → 回写"这个机械循环,加上预算控制(最多跑几轮、上下文多长截断)、死循环检测(同一个工具+同样参数重复调了 N
次就强制停)。至于"要不要调工具、调哪个、参数填什么、结果满不满意要不要再来一轮"——全部交给模型自己决定。 开发过程中其实也借鉴了 codex 跟 claudeCode 的设计理念,初版的codex逐渐切片的调度机制效果不是很好,最后还是选择结合 cc 的一些调度机制来混合了一下

这样做的好处是代码极简,不到几百行就是完整的调度循环。模型能力上来了,整个系统的上限就跟着上来,不用改代码。

为什么选 Workflow 而不是让 AI 直接读 DOM

这是我想重点聊的。

市面上很多浏览器 AI 助手的做法是:把当前页面的 DOM 树(或者简化版)丢给模型,让模型理解页面结构,然后生成操作指令。这个路径听起来很直觉,但实际用下来问题不少:

  1. Token 成本爆炸

一个普通的电商页面,DOM 树序列化出来几万 token 打底。你每一轮 function calling 都要带上这个上下文,一个"帮我搜个商品"的操作可能要跑 3-5 轮,token 直接起飞。更别提淘宝京东这种重型页面了。

  1. 不稳定

DOM 结构是前端工程师随时可能改的东西。今天这个列表是 .search-result-item,明天改版可能就变了。你让模型去"理解" DOM,本质上是在让一个概率模型去做确定性解析,翻车概率不低。同一个页面,同一个问题,跑两次可能结果不一样。

  1. 慢

先抓 DOM → 序列化 → 发给模型 → 模型理解 → 生成操作 → 执行 → 再抓 DOM… 每一步都有延迟,体验上就是用户干等着。

所以我选了另一条路:声明式工作流(Site Workflow)。

思路很简单——对于那些确定性的、可以预定义的操作(比如"在京东搜商品"“在淘宝看详情”“在 Boss 直聘回消息”),直接用 JSON 声明一系列步骤,这些步骤被打包为一个workflow

这样做的效果是:

  • 零 token 消耗在页面理解上 — 步骤是预定义的,不需要模型去"看懂"页面
  • 确定性执行 — 同一个 workflow 跑一百次结果一样
  • 快 — 没有多余的 LLM 往返,步骤直接顺序执行
  • 可分发 — workflow 定义就是个 JSON 文件,支持远程 Manifest 同步,我更新了 workflow 定义,所有用户自动同步

AI 在这里的角色变了——它不需要去理解 DOM,只需要判断"用户的意图匹配哪个 workflow",然后填参数调用就行。这个判断对模型来说简单得多,准确率也高得多。

当然 workflow 覆盖不到的长尾场景,模型还是可以回退到直接操作页面(page_snapshot + element_action),这两条路不冲突。但体感上,80% 的高频操作用 workflow 就够了。

CDP 是能力层的最强工具,cdp 其实就是完全接管了你的浏览器,抓包,读取 storage,解决图灵验证,是 mole 的能力核心,当然所有的对话都是落在本地的,mole 只是一个本地工具,最终还是需要使用者自行连接 llm 的

Content Script 能干的事其实有限。稍微涉及一点跨域 iframe、反爬检测、网络细节,就全歇菜。所以我接了 Chrome DevTools Protocol(CDP),打通了 10 个协议域:

  • 发 isTrusted=true 的鼠标键盘事件,过反爬
  • 穿透跨域 iframe,搞定验证码、支付表单这些场景
  • 请求拦截和篡改,能注入 headers、mock API、绕 CORS
  • 跨域读写 localStorage/sessionStorage
  • 元素高亮标注,操作的时候用户能看到 AI 在点哪里

这些能力加起来,基本上人在浏览器里能做的事,它都能做。

其他细节

  • LLM 自由选择:兼容任何 OpenAI API 格式的服务,endpoint / key / model 自己配。想用 GPT 用 GPT,想用 Claude 套个兼容层也行,本地 Ollama 也没问题。数据不经过我的服务器
    • MCP 协议:工具注册走的是 MCP(Model Context Protocol),同进程内跑 Server/Client/Transport,也支持 HTTP 远程工具动态扩展
    • 上下文自动压缩:多轮任务跑久了上下文会超,自动压缩历史保留关键信息,不会半路崩掉
    • 子任务拆分:复杂任务可以 spawn 出独立子任务,每个子任务有隔离的上下文,避免信息互相污染

链接

刚开源不久,还在持续迭代。有想法或者建议欢迎提 issue,也欢迎 PR。 :open_mouth:

50 个赞

大佬牛哇

2 个赞

支持一下

2 个赞

牛哇大佬~

1 个赞

workflow 我是想着重开发支持的,相较于 skill 的方式,在浏览器里可以更稳定的实现目标动作,结合 mole 提供的原子操作,还是很有想象空间的 :open_mouth:

1 个赞

workflow对于自己的私域平台、预定义的流程还是非常好用的。我还是采用的老方案,DOM TREE+视觉。token对我们来说可以忽略掉,因为本来就是公司本地部署的模型

1 个赞

视觉方案确实是更加的万能,不过我想更优的token管理对于任务的整体完成时间管控也有更好的结果,mole也保留了视觉的能力,作为兜底方案

是的,视觉作为兜底,某些页面加入了canvas、iframe等无法正常读取的dom

:kissing_face::kissing_face::kissing_face:牛的牛的

:open_mouth:感谢支持

1 个赞

佬,有没有推荐的接入模型

我这边是直接用 gpt-5.4 去跑的 遵循指令方面很稳定

2 个赞

前排前排,已经提前使用过了真的很不错

1 个赞

支持一下

3 个赞

佬可以看一下gemini nexus 也是别的佬写的

好的佬 感谢告知

佬,这个edge上能用嘛

没问题的


还在持续迭代

有点没看懂,那不就是AI+RPA吗?怎么验证AI做对了还是错了呢?如果没有验证能力还不如不要AI,直接纯RPA.

其实更像是浏览器里的ClaudeCode 他会自己探索,计划,审查,并使用已经规划好的workflow

1 个赞