posts/cloudflare-kitesurf-agent-browser.md
Kitesurf 不该替代 Chromium,它该做便宜快车道
7 倍。
不是速度快 7 倍,是做 HTML 提取时,内存从 Chromium 的 273.7 MiB 降到 39.4 MiB,差不多只剩七分之一。
紧接着还有另一个数字。Kitesurf 完成同一类任务,墙钟时间反而慢了 1.7 倍。
一个更省,一个更快。好家伙,Cloudflare 把新浏览器的优点和缺点一起写在了同一张表里,营销部看了可能想把表格藏起来,工程师看了倒会觉得这事靠谱了几分。
Kitesurf 是 Cloudflare 用 12 周做出来的智能体浏览器。它不跑完整 Chromium,没有标签页、扩展、设备同步,也不追求像素级还原。它把页面拆进多个 Workers 和 V8 isolate,用 Rust、WebAssembly、Dioxus Blitz,再套一层 Chrome DevTools Protocol,让 Puppeteer、Playwright 和现有 Agent 客户端还能连得上。
圈里很容易把它写成一句话,Cloudflare 要干掉 Chrome 了。
我自己的判断正好相反。
Kitesurf 不该替代 Chromium。它真正该替代的,是智能体工作流里那一大堆根本用不着完整 Chromium 的短任务。
这不是浏览器大战,是浏览器开始分层。
Cloudflare 删掉的,是给人用的那一半
人打开浏览器,要看视频、拖窗口、装扩展、保存登录、滚动得顺滑,最好每个像素都别跑偏。Agent 打开网页,很多时候只想拿一段 DOM、抽一个表格、点一次按钮、截一张图,然后结束。
两种需求硬塞进同一个进程,当然能跑。问题是贵。
完整 Chromium 像一辆装满露营装备的越野车,Agent 只是下楼拿个快递,也得把整辆车点着。一次没什么,几百个并发任务一起点火,内存、CPU、冷启动和实例池都开始找你收钱。
Cloudflare 的做法有点子牛逼,它没有继续优化那辆车,而是承认有些任务只需要一辆电瓶车。
Kitesurf 的 Engine 负责对外接 CDP,也就是 Chrome DevTools Protocol,并保存会话状态。PageScript 在独立 isolate 里处理 DOM、脚本、HTML 和 CSS。PageRenderer 只负责把页面场景变成 PNG、JPEG 或 PDF,失败了就杀掉重来。网络访问又被收口到 SandboxOutbound,页面脚本不能随便绕出去摸内网或共享别人的 cookie。

图|官方架构里,Engine 与 PageScript 只能经 SandboxOutbound 联网,PageRenderer 默认没有网络权限。
这里最值钱的不是又堆了几个新组件,而是它把故障边界切小了。
渲染器卡住,不必扔掉整个会话。某个页面脚本炸了,默认退化为空 frame 或缺失元素,不让一次坏输入把任务拖死。只要组件能无状态,就做成无状态,崩溃后的恢复靠重放请求,而不是给一坨半死不活的进程做心肺复苏。
这套思路跟 Agent 工作流很像。任务越长、工具越多,越不能把全部状态揉成一个大对象。真正能扛生产流量的系统,通常不是从不失败,而是知道哪一块可以丢、哪一块必须留、失败后从哪里重放。
Cloudflare Workers 的隔离模型在这里也很合拍。Agent 会被任务指向任意网页,页面默认就该按不可信输入处理。每次会话从干净环境开始,cookie 独立,只有指定组件能访问网络。浏览器安全从一台机器里隔开几个 tab,变成一条任务里隔开几种权限。
这块需要注意一下,平台给了 isolate 边界,不代表应用权限自动正确。Cloudflare 自己也写得很坦白,组件能访问什么、页面之间会不会泄漏,仍要在应用层约束。沙箱不是买来就生效的护身符,权限表和测试才是。
七分之一内存,买不到完整网页
Kitesurf 目前通过了约 21.5 万项 Web Platform Tests。官方还拿 14 个 URL 各跑 5 次 Browser Run Quick Actions,对比 Kitesurf 和已经预热的 Chromium。
| 指标 | Kitesurf | Chromium 预热池 | 结果 |
|---|---|---|---|
| HTML 提取 CPU | 229 ms | 877 ms | 约省 3.8 倍 CPU |
| HTML 提取内存 | 39.4 MiB | 273.7 MiB | 约省 7 倍内存 |
| HTML 提取耗时 | 820 ms | 472 ms | 约慢 1.7 倍 |
| 截图耗时 | 1148 ms | 637 ms | 约慢 1.8 倍 |

图|按官方中位数换算,Chromium 预热池记为 1。Kitesurf 更省 CPU 和内存,但单次 HTML 提取更慢。
如果你的任务是批量抓公开文档、提取商品字段、把页面转成 Markdown,内存降到七分之一会直接改变并发账本。同一台资源池能塞进更多短会话,突发流量也不用常年养着一排预热浏览器。
但别只截前两行数据发朋友圈。
Kitesurf 赢的是 CPU 和内存,输的是单任务延迟。测试样本只有 14 个 URL,还是截图和 HTML 提取这类 Quick Actions。它能证明轻引擎路线已经跑通,不能证明复杂业务站点都能从 Chromium 原样迁过去。
官方列出的限制一点也不含糊。视频不行,WebGL 不行,需要真实 TLS 指纹通过反机器人挑战的页面不行,依赖长期登录状态的十分钟会话也不合适。CDP 只实现了 Agent 常用的一个子集,Workers 又不原生支持 eval,Kitesurf 暂时得在 V8 上跑一层 Rust 写的 Boa JavaScript 引擎来补。
运行时套运行时。
厉害了,也挺拧巴。
更麻烦的是,真实网页失败往往不是进程直接崩。按钮可能还在,但点了没反应。表格能抽出来,但少了懒加载的末尾三页。截图看着像那么回事,价格字段却因为脚本没跑全变成旧值。Kitesurf 的策略是局部错误尽量退化为空元素,这对会话存活很友好,对数据正确性却提出了更高要求。
空元素究竟是网页本来就空,还是轻引擎没实现那段能力?
如果系统回答不了,资源省得越多,错误可能扩散得越快。
真正能省钱的,是路由和验收
所以 Kitesurf 进生产,第一步不该是把 browser=chromium 全局替换成 browser=kitesurf。更稳的做法是让它做便宜快车道,让 Chromium 做高兼容兜底。
可以先按任务特征做一层保守路由。
engine: kitesurf
when:
auth_required: false
video_or_webgl: false
persistent_session: false
pixel_perfect: false
fallback: chromium
verify:
- required_fields_present
- final_url_allowed
- screenshot_not_blank
- business_assertions_pass
这只是起点,真正决定路由的应该是运行数据。
每个域名至少要记录首选引擎成功率、回落率、P50 和 P95 延迟、单任务 CPU 与内存、空 DOM 比例、登录丢失次数、反爬失败原因,以及业务字段验收通过率。跑一段时间后,你会得到一张比浏览器品牌更有用的表,哪些站点适合轻引擎,哪些页面一碰就得回 Chromium。
坦率讲,这张表才是护城河。
浏览器引擎可以换,域名级兼容知识、失败分类和验收条件很难从官网文档里抄到。一个采购页要求总价、币种和库存三个字段同时存在,一个工单页要求提交后出现明确 ticket ID,一个登录流程要求最终域名仍在 allowlist。它们都是业务真相,不是 WPT 能替你验证的东西。
回落也不能只写一句 catch。
如果 Kitesurf 已经点击了提交按钮,再无脑用 Chromium 重跑,可能创建两个订单。短任务无状态,不等于业务动作无副作用。涉及写操作时要带幂等键、提交前快照和动作日志,回落前先判断上一次到底没执行,还是执行了但没拿到响应。
不是哥们,浏览器轻了,分布式系统的账并不会跟着消失。
而且别忘了提示词注入。Kitesurf 把页面隔离做得更细,不等于页面里的文字不会骗模型。页面可以告诉 Agent 忽略原任务、上传本地文件、复制密钥。网络沙箱解决的是代码能去哪,工具策略解决的是模型被说服后能做什么。两层要分开测,不能拿 isolate 给 prompt injection 盖章。
CDP 降低迁移成本,也藏住了平台锁定
Cloudflare 给 Kitesurf 套 CDP,是这次发布里很聪明的一步。
现有 Puppeteer、Playwright、chrome-remote-interface,甚至通过 MCP 接浏览器的 Agent,都不用学习一套全新客户端。很多场景只需给 Browser Run endpoint 加上 browser=kitesurf。客户端接口没变,团队才有机会做 A/B、灰度和自动回落。
可接口兼容不等于运行时可迁移。
Kitesurf 深度依赖 Dynamic Workers、Workers RPC、Browser Run、平台网络策略和隔离模型。你能把客户端从 Kitesurf 切回 Chromium,不代表能把 Kitesurf 从 Cloudflare 搬到另一朵云。
Cloudflare 表示准备好后会开源,并希望允许客户把自己的版本部署到自己的账户。这个承诺很重要,但在代码、许可证、自托管文档和上游补丁真正出现前,它仍然是路线图,不是退出方案。
怎么说呢,CDP 解决了工具调用层的锁定,平台层的锁定反而更值得提前算。
真要接入,可以把可迁移边界留在自己手里。任务描述、域名路由规则、验收器、动作日志、截图和失败分类不要只存在 Cloudflare Dashboard。把这些资产留在自己的仓库和观测系统里,未来换 Browser Run、Browserbase、自建 Playwright,至少不用把眼睛和记忆一起换掉。
Kitesurf 的 Playground 已经可以直接输入 URL,查看 DOM、console、network 和 isolate 内存。对团队来说,最有价值的第一次试用不是截一张漂亮的 Wikipedia,而是拿最常跑、最容易翻车的 20 个页面做一轮兼容清单。
能过的送进便宜快车道,不能过的老老实实回 Chromium。
就这么朴素。
Cloudflare 这次并没有造出一个更完整的浏览器。它做了件更有意思的事,把浏览器从必须整台租用的重机器,拆成了可以按任务选择的执行器。
所以别急着问 Kitesurf 能不能替代 Chrome。
先看你的 Agent 每天开了多少次越野车,只为下楼拿一个快递。