Midscene.js 全景拆解:从 DOM 标注到纯 VLM,一个 GUI Agent 的六个设计决策

沿着 Midscene 从 1.0 前 DOM+LLM 标注到 1.0 后纯 VLM 视觉定位的演进,用决策地图拆解六个关键选择:定位方式、模型分工、Instant Actions、Deep Think、跨平台统一 API、开源模型自托管。看清哪些是被 VLM 能力硬约束推出来的,哪些只是产品化包装。

传统 UI 自动化最难的从来不是”点哪里”,而是”这个元素在下一版会不会换 class name”。Playwright、Puppeteer、WebDriver 把这层痛喂给工程师十年,现在有人换了个思路:既然模型能看图,为什么还要维护选择器?

Midscene 是字节 web-infra 团队开源的 GUI Agent 框架,2026 年上半年从 GitHub 趋势榜第二一路涨到 14k star。表面上看它是”把截图丢给多模态模型、返回点击坐标”的又一个自动化工具;但如果只这么看,就会错过它更值钱的部分——在 1.0 版本里,它把”提取 DOM 做兜底”这条 fallback 明确砍掉了。

这不是一个小决定。这意味着团队公开赌一件事:VLM(视觉语言模型)的 Visual Grounding 能力已经稳到可以撑起生产级 UI 自动化,不再需要 DOM 做保险。

这篇文章想做两件事:一是用决策地图格式,把 Midscene 六个能观测到的关键设计选择拆开,每个选择配上约束、反事实、收敛度;二是回答一个更根本的问题——“看图点按钮”这件事,为什么直到 2025-2026 年才真正成立?

先给一句可证伪的核心判断:

Midscene 之所以敢在 1.0 砍掉 DOM 备胎,是因为一旦 VLM 能稳定输出像素级坐标,DOM 标注就从”补充信息”退化成”技术债”——它多消耗 token(一个电商首页动辄多传 5000+ tokens),限制可覆盖场景(Canvas、跨域 iframe、桌面原生 UI 全部拿不到 DOM),却不再给决策提供 VLM 之外的独立信号。

如果这句判断错,能怎么证伪?很简单:如果 VLM 的坐标输出误差还在 20-40px 量级(2024 上半年之前的 GPT-4o、Claude 3.5 就是这个水平),那 Midscene 就必须留着 DOM 做兜底、否则复杂控件根本点不准。这个约束一旦松开,DOM 才变技术债。

名词速查

这篇涉及几个不太日常的词,先摊开一张表,避免阅读中断:

名词一句话解释
Playwright / Puppeteer微软 / Google 出的浏览器自动化框架,用 DOM 选择器(CSS/XPath)定位元素后调用 .click() / .fill()
DOM 选择器#login-btndiv.card > a:nth-child(2) 这种基于 HTML 结构的元素定位串
VLM (Vision-Language Model)多模态大模型,既能看图又能读文字,如 GPT-4o、Qwen2.5-VL、豆包 Seed
Visual GroundingVLM 的一项子能力:输入”图 + 一句自然语言”,输出目标物体在图上的坐标(bbox 或点)。这是 Midscene 一切设计的地基
UI-TARS字节 2025 年开源的、专门为 GUI 操作训练的 VLM,Visual Grounding 能力对齐了 GPT-4o 级别但开源可自托管
Deep ThinkMidscene 提供的可选定位策略:先粗定位到一个区域,再在裁剪后的小图上二次定位,用两次调用换更准的坐标
Instant ActionsMidscene 的 aiTap / aiInput / aiScroll 一族接口,跳过 LLM 规划、直接把”我要点哪个”交给 VLM 定坐标

一、决策地图:Midscene 的六个岔路口

Midscene 从 0.x 走到 1.x,能观测到六个明确的设计岔路。每个岔路我用一样的三段结构:约束 → 传导 → 收敛度。收敛度指”业内普遍走这条路吗”——收敛度高说明这是共识,低说明是 Midscene 押的独门。

决策 1:怎么定位元素——选择器 vs 视觉?

约束:Playwright / Puppeteer 十年的经验告诉我们,脆弱的不是 DOM 本身,而是”人写的选择器”:一个 #login-btn 在改版后变成 #authBtn,几百个 e2e 用例集体炸掉。业界不是没试过修,从 XPath 到 Accessibility Locator、从 Testing Library 的 getByRole 到 Playwright 的 getByText——每一次都是把”人给元素起个稳定名字”的负担挪个位置,没能消掉。

传导:Midscene 的选择是彻底跳过这一步。用户描述”登录按钮”,模型看图直接给坐标。这条路能成立的前提是:模型看到”登录按钮”四个字后,能可靠地在截图上找到那颗按钮,并输出准确的 (x, y)。这个能力叫 Visual Grounding,2024 年 Qwen2-VL 发布之后才真正跨过”生产可用”的门槛,2025 年 UI-TARS、Qwen2.5-VL、豆包 Seed 又把它推到 90%+ 的 UI 定位准确率。

收敛度。同期还有 Browser Use、Anthropic Computer Use、Skyvern,全部走视觉路线。这是行业共识,不是 Midscene 的独门。真正独门的是接下来那步。

决策 2:为什么 1.0 砍掉 DOM 兼容?

这是我认为 Midscene 最值得盯的一个决策。

约束:0.x 版本的 Midscene 用的是混合方案:JavaScript 先从页面 DOM 里提取元素 + 坐标 + 类型,把这些”候选元素”标注到截图上(画方框 + 编号),然后把标注图 + DOM 摘要一起丢给通用 LLM(比如 GPT-4o),让模型输出”我要点第几号”。这是当时通用 LLM 数值输出不准(不敢直接让它输出像素坐标)时的自然选择——让 LLM 做选择题,别让它做填空题。

这个方案的问题在官方博客里说得很直白:

  • 1280×800 分辨率下,eBay 首页要传 6000 tokens 输入,搜索结果页 9000 tokens——这些额外 token 全部是 DOM 树,不是截图
  • 遇到 <canvas>、跨域 iframe、原生 App 时,DOM 直接消失,方案降级。
  • 图像分辨率超过约 2000×768 就不好处理。

我们可以手算一下这条约束的量级。假设一个现代 SPA 首页大概 300-500 个可交互元素,每个元素的角色 + 层级 + 文本平均 15-20 tokens,光 DOM 侧就要 4500-10000 tokens。而一张 1280×800 的截图,在 GPT-4o 的 tile 编码规则下大概是 1105 tokens——DOM 端的 token 消耗,普遍是截图端的 5-10 倍

传导:一旦 VLM 具备可靠的 Visual Grounding(决策 1 的前提),DOM 端的这几千 tokens 就从”补充信号”变成”纯浪费”——模型看图就能点,DOM 只是让上下文更贵、让延迟更长、让 Canvas/原生 App 场景强制降级。

Midscene 1.0 的选择是只保留纯视觉路线,DOM 只在数据提取场景按需附带。这一刀砍下去,等于对外承诺:“如果你选了我推荐的 VLM,我保证不用 DOM 也能定位。”

收敛度。这是押注。同期 Playwright MCP、Steel Browser 这类 agent-friendly browser stack 依然保留 accessibility tree 做主定位、视觉做备胎;Anthropic Computer Use 也是”截图 + 坐标 + 键鼠”混合。Midscene 是我见过最激进的”只留一条路”派——赌 VLM 能力已经稳到不需要备胎

反事实:如果 2026 年 VLM 的坐标误差回退到 30px 以上,Midscene 会被迫加回 DOM fallback;反过来说,Midscene 敢砍 fallback,本身就是对当前 VLM 能力的一份公开信号。

决策 3:模型分工——单模型 vs 三角色(Base / Planning / Insight)?

约束:GUI 任务其实是三件不同的活拼在一起:

  • 规划(Planning):把”注册一个 GitHub 账号”拆成”打开注册页 → 填用户名 → 填邮箱 → 点提交”这样的步骤序列。这是文本推理任务。
  • 定位(Locate):截图上”提交按钮”在 (x=612, y=384)。这是纯视觉任务。
  • 理解 / 断言(Insight):从截图里提取”用户余额 = 128 元”,或判断”这个页面是不是登录成功的样子”。这是视觉+推理混合。

这三件事对模型能力的要求根本不一样。一个纯 Visual Grounding 模型可能坐标定得极准,但让它规划一个 20 步的注册流程就会崩;一个通用推理强模型可能规划得漂亮但坐标经常偏 50 像素。

传导:Midscene 提供两档配置:

  1. 默认单模型:一个多模态模型(豆包 Seed / Qwen3.x / GLM-V / Gemini 3.x 都行)从头包到尾。开箱即用,多数场景够用。
  2. 多模型协作:允许你把 Planning 和 Insight 单独指到能力更强但更贵的模型上,让 Base 只做便宜的元素定位。

官方的原话很克制:

“从默认模型开始,仅在遇到明确的能力瓶颈时引入专用模型。”

收敛度。这是标准的”简单默认 + 可选高级”分层设计。真正有意思的是把 Locate 和 Planning 在接口层分开——这就引出下一条。

决策 4:agent.ai() 全流程 vs Instant Actions?

约束:如果我已经明确知道下一步就是”点登录按钮”,为什么还要跑一遍规划?

我自己在写 ego-browser skill 相关内容的时候踩过这个坑。让 LLM 一步”规划 + 执行”最简单的点击,会得到一段长达几百 token 的思考链:“我看到页面上有一个搜索框、一个登录按钮、一个横幅广告……用户的意图应该是点击登录按钮,因为……”——规划 token 消耗是定位 token 消耗的 5-10 倍,而且延迟高一到两秒。 而其实我早就知道要点哪个按钮,我只是不知道它在第几个像素上。

Midscene 明确把这两件事拆成两组 API:

场景接口内部流程
我知道要做什么,只需要它点准aiTap("登录按钮") / aiInput("你好", "搜索框") / aiScroll(...)VLM 只做 Locate,跳过 Planning
我给一个模糊目标,让它自己想怎么做agent.ai("注册一个新账号并验证邮箱")完整 Planning → Locate → Act → 验证循环

对应的 v0.14 官方例子把差别说得很清楚:

// 传统 planning:一次调用触发完整"想 + 干"链
await agent.ai('在搜索框中输入 "Headphones",按下回车键');

// Instant Actions:跳过 planning,只让 VLM 定坐标
await agent.aiInput('Headphones', '搜索框');
await agent.aiKeyboardPress('Enter');

传导:这是把决策 3 里的”能力分工”落到了 API 层——用户按”这次到底需不需要规划”选接口,而不是让框架帮你猜。 已知操作用 Instant Actions(快、省、稳),探索性任务用 agent.ai()(灵活但贵慢)。

收敛度中偏低。Playwright MCP / Browser Use 也在往这个方向靠,但 Midscene 是把它做成一等公民 API 的少数之一。传统认知里”AI 自动化”约等于”给个自然语言意图就自动完成”,Midscene 反过来告诉你:很多时候你其实已经想清楚了,缺的只是那颗按钮的坐标,别让 LLM 陪你重新想一遍。

决策 5:一次定位 vs Deep Think 二次聚焦?

约束:VLM 再好,也有一个共同弱点——目标越小、越挤、越同质,坐标越容易漂。 想象 Coze 工作流编辑器侧边栏那种十几个近似的小图标挤在一起,或者一个复杂 iOS 设置页里连续三个开关。让模型在整张 1280×800 图上一次性给出精确坐标,误差经常 20-40 像素——刚好错到隔壁那个按钮上。

传导:Midscene 加了个可选参数 deepThink: true

  1. 第一次调用:VLM 在完整截图上大致定位到”目标应该在这块区域”,输出一个粗 bbox。
  2. 第二次调用:把这个 bbox 裁出来放大成新图,再让 VLM 精定位。
  3. 把第二次的坐标反变换回原图。

这本质上是空间维度的 Chain-of-Thought——用两次前向换一次更准的输出。代价是延迟翻倍、token 翻倍;收益是复杂 UI 的定位准确率显著提升。

有个隐藏约束值得注意:deepThink 只对原生视觉定位模型(Qwen2.5-VL、UI-TARS 类)生效,对 GPT-4o 这种”看图但不做 Visual Grounding”的通用多模态模型没意义。因为这类模型看更大的图或更小的图,坐标误差量级差不多——放大裁剪救不了它。

收敛度。业界很少有框架把”二次定位”做成一等参数暴露给用户;更多的是内部隐式做或者不做。Midscene 把这个策略选择权交给用户,是承认”没有一个模型能同时兼顾快和准”——要准就多付一次调用。

决策 6:跨平台胶水 vs 统一截图接口?

约束:Playwright 只管浏览器;Appium 只管移动端;WinAppDriver 只管 Windows;macOS 桌面要用 AppleScript / Accessibility API。一套自动化脚本想同时覆盖 Web + Android + iOS + 桌面,工程师要学四套 API、四种元素模型、四种等待机制。

传导:Midscene 的观察是——如果所有平台都能截图、都能接受”在 (x, y) 处点击”这两条原语,那 VLM 之上完全可以只有一套 API。 每个平台只要写一个薄薄的 adapter:把截图捞出来 + 把坐标翻译成对应平台的点击事件。

于是 aiTapaiInput 在 Chrome 上就是 CDP 事件,在 Android 上就是 adb shell input tap,在 iOS 上就是 WDA 的坐标点击,在 macOS 上就是 CGEvent。上层用户完全看不到这个差异。

benchmark 层面这条策略是有数据支撑的:AndroidWorld 93.1% / MobileWorld 78.6% / AppControlBench 96.7% Pass@1,说明”截图 + VLM”这条路在原生 App 上(那里根本没 DOM)反而比 Web 表现更好。这不是意外——原生 App 的控件更规整、干扰更少,正是 Visual Grounding 的舒适区。

收敛度。Anthropic Computer Use、UI-TARS、Simular AI 都在这条路上;差别是 Midscene 把 API 表面做得更薄、更贴近开发者习惯(aiTap('登录') 比”用鼠标点击第 3 号窗口的 (612, 384) 像素”直接得多)。

二、一次亲身对比:为什么”Instant Actions”是 Midscene 最值钱的一步

我在维护 ego-browser 相关 skill 的时候,反复被同一件事咬到:让 LLM 自己规划”下一步做什么”,在简单场景下是纯粹的浪费。

举个具体的:让 agent”打开 GitHub 通知页面标记全部为已读”。这是一个五步的直线任务:

  1. 打开 /notifications
  2. 找到 “Mark all as read” 按钮
  3. 点击它
  4. 处理确认弹窗
  5. 验证列表清空

如果全交给 agent.ai() 完整规划:

  • 每一步都要重新截图 + 重新描述当前页面 + 重新推理”接下来该干什么”
  • 因为模型不知道”我上一步刚点了 Mark all”,它可能会再规划一次点击(除非上下文里明确告诉它状态)
  • 每步 300-800 token 规划输出 + 一次坐标输出

如果拆成 Instant Actions:

await page.goto('/notifications');
await agent.aiTap('Mark all as read 按钮');
await agent.aiTap('确认对话框上的 Confirm 按钮');
await agent.aiAssert('通知列表已清空');

每一步都是”我人类知道要干嘛,你只负责认按钮和点它”。 Token 消耗直降到只剩定位那一次调用的量级,速度快 3-5 倍。

这就是 Midscene 决策 4 那把刀最锋利的地方:它承认 LLM 的规划能力不是每次都必要,反而定位能力是每次都必要。前者可以外包给写代码的人(用 if / for / try),后者才是必须让模型做的。这是把”AI 应该做什么、人应该做什么”的分工,从口号落到了 API 层面。

这个洞察不是 Midscene 独家的——2026 年上半年整个 agent 领域都在往”planning cheap / locate expensive”这个共识收敛(可以参考我 8 月那篇 Agent 如何控制浏览器:从 HTTP、DOM、CDP 到视觉与混合自动化,那里我从另一个角度也拆过类似的六阶段闭环)。但 Midscene 是我见过把它做进 API 命名的最干脆的一家。

三、反事实断点:如果没有 Visual Grounding,这套设计会崩在哪一步?

想彻底理解 Midscene 的形状,把它的地基抽掉试试。

假设:把它切换到 2024 年初的 VLM(GPT-4V early、Claude 3 Opus early),Visual Grounding 误差 30-50 像素。会发生什么?

断点 1:决策 5 的 deepThink 从”可选参数”变成”默认必开”,甚至要开三层。每次交互 3-5 次前向调用,延迟到 5-10 秒。工程上勉强能用,产品上不能用。

断点 2:决策 2 的”砍掉 DOM 兼容”根本走不通。工程师会强烈要求 fallback,一旦坐标点偏就需要 DOM 补救,否则脚本靠人工重跑。1.0 里保留 DOM 提取通道会成为唯一现实选项。

断点 3:决策 6 的跨平台统一 API 会失效。因为 Web 端至少还有 DOM 兜底,而原生 App 场景根本没退路,VLM 坐标一漂就直接死。跨平台的胶水层会分裂成”Web(视觉+DOM)“和”原生(视觉+人工修)“两套。

也就是说,决策 2、5、6 的形状全部由 Visual Grounding 的精度决定——这条能力线一旦回退,Midscene 的产品形态会自动倒退到 0.x 那种”标注 + 选择题”的混合方案。

反过来看:Midscene 敢在 1.0 押上这三条,是对 VLM 现状的一份公开信任状。它选谁做默认模型(豆包 Seed / Qwen3.x / GLM-V / Gemini 3.x),就是它相信谁在 Visual Grounding 上过了生产门槛。

四、共同祖先:这其实是老 Agent 循环的一次 GUI 再实例化

如果把 Midscene 放回 Agent 老架构:

感知 (Sense) → 决策 (Plan) → 执行 (Act) → 验证 (Verify) → 循环

它做的其实是把每一格换了个新的 primitive:

阶段传统 Web 自动化Midscene 视觉 Agent
感知DOM 树 + Accessibility 树屏幕截图(+ 可选 DOM,仅提取时)
决策人写的脚本(Playwright locator + .click()LLM 规划(可选)或人写 Instant Actions
执行Playwright API → CDP / WebDriverVLM 输出坐标 → 平台原生点击 API
验证Assertion on DOMVLM 断言 on 截图(aiAssert

从这个视角看,Midscene 不是”发明了一种新自动化”,而是把感知层从”字符树”换成了”像素图”,把定位从”字符串匹配”换成了”视觉 grounding”。这条主线在 CV 领域从 SAM(Segment Anything)到 GroundingDINO、再到 UI-TARS,已经走了三年——Midscene 是把这条主线的下游成果封装成开发者友好的 API 的一家。

理解了这一点,就会明白为什么它 API 命名叫 aiTap 而不是 visualClick它想强调的不是”用视觉”,而是”这次点击是被 AI 定位的”。定位方式(视觉 or DOM)是实现细节;决策权(AI 还是人)才是抽象边界。

小结

一句话压缩:Midscene 1.0 的形状 = Visual Grounding 现在够稳(→ 砍 DOM 备胎、砍跨平台胶水) × Planning 太贵 Locate 便宜(→ 拆出 Instant Actions) × 少数场景仍需二次聚焦(→ Deep Think 作可选)。

反事实断点:把 VLM 换回 2024 上半年的水平,决策 2、5、6 会自动倒退,产品会变回一个”DOM+标注+LLM 选择题”的混合方案。

给读者的 takeaway:看一个 AI 产品的设计选择,看它砍了什么比看它加了什么更值得盯——加的东西可能只是功能,砍的东西一定是团队对某项模型能力的公开信任。

想动手 5 分钟看看差异?

如果你现在手边正好有一个自动化痛点(哪怕只是”每周登录 XX 后台点几个按钮导数据”),最便宜的验证路径:

  1. 装 Midscene 的 Chrome 扩展(浏览器插件,不需要写代码)。
  2. 用它的 Playground 在自己的目标页面上分别试两句:
    • “点击登录按钮”(这走 planning + locate)
    • 然后打开开发者模式看 aiTap 直接调用(这走 pure locate)
  3. 观察两者的响应时间和 token 消耗。差异会告诉你——你的自动化任务,到底需不需要花钱让 LLM 规划。

成本大概是几毛钱 API 调用 + 一杯咖啡的时间。比读完这篇再决定”要不要引入 Midscene”划算得多。


参考资料