产品发布 · 小互解读

Cloudflare 发布了一个浏览器 Kitesurf:专给 AI Agent 用,CPU 和内存省 3 到 7 倍

Chromium 是给人做的,标签页、主题、扩展、60 帧滚动,Agent 一样都用不上。12 周,他们把这些全砍了重写一个。
一分钟速览
  • Cloudflare 从零写了个浏览器,整个跑在自家 Workers 上,专门给 AI Agent 用,今天免费公测。
  • 取舍很干脆:标签页、主题、扩展、像素级完美全砍掉,换来 CPU 省 3-4 倍、内存省 5-7 倍。
  • 12 周做完,第一版是 AI 移植的,他们把「怎么让 AI 写复杂项目还不失控」的答案也一起写出来了。
⚑ 下面所有数字来自 Cloudflare 的发布博客和随发布公开的跑分图与测试报表,属厂商自评口径,目前没有第三方独立复现。每个数字都能在文末列出的原文或原图里找到出处。
开场

Kitesurf 是什么

简单来说,Cloudflare 给 AI Agent 单独打造了一款「专款专用」的轻量级浏览器,并且把它直接跑在 Cloudflare Workers 的 V8 isolateCloudflare Workers 跑代码的方式:不给每段代码开一台虚拟机,而是在一个 V8 引擎进程里开很多个互相隔离的小格子,起停很快、开销很小。(V8 隔离区)里,那是一种比虚拟机轻得多的代码运行小格子。

今天在 Browser Run 里免费公测。迁移成本几乎是零:接口上加一个参数就切过去,现有的 Puppeteer、Playwright 代码一行不用改。

动机

为什么要自己做浏览器:Chromium 是给人做的

「我们该不该自己做个浏览器」这个问题,在 Cloudflare 内部每隔几个月就被提一次,提了好几年,每次都被搁置,技术难度和「能解决什么独特问题」这两头,始终没找到平衡。

这次答案变成「做」,是因为两边同时到了临界点。平台这边成熟了:Workers 上跑 WebAssembly 已经很稳,Dynamic WorkersCloudflare Workers 的一个能力:代码运行时动态创建新的隔离环境去跑另一段代码,并且能限定它能碰什么。、基于 SQLite 的 Durable Objects、Worker 之间的直接调用凑齐之后,以前做不了的复杂应用变得可能。需求那边逼上来了:Browser Run(Cloudflare 的无头浏览器自动化产品)随着 AI 起来增长很猛,Agent 干很多活离了浏览器就是不行。

卡住的地方在这儿:传统浏览器都是为人类设计的,要好看的界面、标签页、丰富的扩展、流畅的 60 帧滚动。这些东西让它极其吃内存和 CPU,吃到「给每个 Agent 配一个实例」贵得不可行。结果就是网页世界的大部分只对最贵、最聪明的模型开放,别的 Agent 应用被挡在门外。

但 AI Agent 并不需要这些花架子。他们把两边在乎的东西摆出来对了一遍,这段是全篇的思想基础:

人要的,Agent 一样都用不上

给人做的那半台浏览器

  • 标签页
  • 主题皮肤
  • 浏览器扩展
  • 跨设备同步
  • 像素级完美的渲染
  • 60 帧丝滑滚动
Agent 真正在乎的

留下来的那半台

  • token 数
  • 上下文窗口
  • 扩展性
  • 性能
  • 成本
  • 结构化、机器能读的内容
本站按原文那三条对比整理。原文的原话是:CSS 解析稍微差一点、渲染不那么精确,Agent 完全无所谓。

还有一条容易被忽略:威胁模型不一样了。人开浏览器,访问的是自己认识的网站;AI 开浏览器,是被任务指到哪儿就去哪儿。提示注入、工具安全这类新问题,在这个场景里才是首要的。

于是 12 周前他们又问了一次那个老问题,这次全票通过:做。舍弃所有只有人类才需要的视觉和功能,只保留 AI 用得上的核心能力。

核心优势

核心优势:省钱省资源、完全无状态、兼容性极强

一、极其省钱省资源(核心价值)

跟标准 Chromium 比,这是最直接的一笔账。对手是热池里的 Chromium,已经预热好、随时能接活的那种。

Kitesurf 相对热池 Chromium 的三笔账
CPU 省了3.1 – 3.8 倍

截图 3.1 倍,抓正文 3.8 倍

内存 省了4.7 – 7.0 倍

截图 4.7 倍,抓正文 7.0 倍

墙上时间 多花了1.7 – 1.8 倍

抓正文慢 1.7 倍,截图慢 1.8 倍

条的长短按倍数画,蓝色是省下来的、土色是多花的。省的是账单上的 CPU 和内存,亏的是等待时间。

数据来自官方跑分表:14 个网址的语料,每项跑 5 次取中位数。本站画的示意图。

原始数字全在这儿:

指标KitesurfChromium(热池)差距
CPU · 截图380 ms1,173 ms省 3.1 倍
CPU · 提取 HTML229 ms877 ms省 3.8 倍
内存 · 截图57.8 MiB271.0 MiB省 4.7 倍
内存 · 提取 HTML39.4 MiB273.7 MiB省 7.0 倍
墙上时间 · 截图1,148 ms637 ms慢 1.8 倍
墙上时间 · 提取 HTML820 ms472 ms慢 1.7 倍
来源:Cloudflare 博客的对照表。注意对手是热池里的 Chromium,冷启动的 Chromium 是什么数,官方没给。

意义:内存和 CPU 就是账单本身。省下 3 到 7 倍,意味着同样的钱能同时跑好几倍数量的 Agent,这才是这款浏览器存在的理由。

小缺点 / 折中点:它在页面渲染的墙上时间(wall time)上比 Chromium 慢 1.7 到 1.8 倍。官方给的解释是:一个已经见过这个页面的即时编译器(JIT),永远比冷启动的软件渲染器快;差距主要出在光栅化和 JPEG/PNG 编码这两块,还在继续优化。用一点点等待时间换 3 到 7 倍的资源,对 AI 自动化任务来说很划算。

数据与解释均来自 Kitesurf 发布博客

二、完全无状态、高度隔离

整套东西跑在 Workers 上,每一次页面加载都当成不可信输入,每一个会话都从头开始。三个组件里只有引擎记事,其余全部无状态,没有状态要重建,从崩溃里恢复就等于重开一个再把请求放一遍。

好处很实在:某个页面崩了不会牵连整个系统,卡住的渲染可以直接杀掉重来,同时开一千个也不用一直养着它们。

三、兼容性极强:改个参数就能接上

它说的是标准的 CDPChrome DevTools Protocol,Chrome 开发者工具跟浏览器之间说话用的协议。Puppeteer、Playwright 这些自动化工具都靠它遥控浏览器。(Chrome DevTools Protocol)。这意味着你原本在用的 Puppeteer、Playwright、chrome-remote-interface,或者任何会说 MCP 和 CDP 的 AI 框架,改一个 URL 参数就能无缝切换接入,代码一行不用动。

规范符合度上,它已经通过了 WPTWeb Platform Tests,一套公开的、庞大的浏览器规范符合度测试集,用来检查一个浏览器把网页标准实现到了什么程度。(Web Platform Tests)里的 215,000 多项测试,每周还在加几百项。

Kitesurf 通过的 Web Platform Tests 子测试数随时间增长的曲线,从 5 月初接近零起步,6 月中和 6 月下旬两次大幅跳升,7 月底逼近 22 万
通过的测试数随时间的变化。5 月初几乎从零起步,6 月 14 日和 6 月 21 日前后两次跳升贡献了主要增量,之后一路缓慢爬升。来源:Cloudflare 博客。

分区看更能说明问题:Agent 真正用得上的那几块覆盖不错,但同一张表上也摆着明显偏低的:

测试分区子测试通过率测试分区子测试通过率
encoding字符编码99.5%streams76.4%
selection选区98.8%fetch网络请求58.6%
dom文档对象模型97.0%wasmWebAssembly51.1%
svg矢量图96.9%domparsingDOM 解析45.1%
xhr老式异步请求94.7%webidl接口定义43.5%
htmlHTML 规范94.1%webmessaging跨窗口消息26.0%
css样式84.0%close-watcher关闭手势0.0%
数据取自官方的 WPT 覆盖报表。官方文字里只举了 streams 当例子(「连这种对 Agent 没那么重要的,现在支持得也不错了」),没有提右列 fetch 的 58.6% 和 wasm 的 51.1%,而这两块对 Agent 场景并不算无关紧要。这里只把数字并置,原因官方没说,本站不揣测。

最后是那项传统测试:它能跑 Doom。他们的原话是,不管你有多少测试,一个项目不跑起 Doom 就不算真的完成。

Kitesurf 跑 Doom 的实录。来源:Cloudflare 博客。
架构

技术架构:三个模块加一个网络出口

整张图最该记住的是三件事:谁有状态、谁无状态、谁能碰网络。

CDP 客户端(Puppeteer / Playwright)指过来 Engine ① 唯一对外 · 唯一有状态(存会话) PageScript 每页一个隔离环境 PageRenderer 出像素 · 卡住就杀掉重开 ② 这两个都无状态,用完就扔 图片 / 字体 / CSS / 脚本 SandboxOutbound ③ 唯一能碰网络 · 跨域策略 · cookie 各存各的 · 违规 403 互联网(不可信)
本站画的合成示意图。官方的图分散在四处,这里按「谁有状态 / 谁无状态 / 谁能碰网络」三条线合成一张。

Engine(引擎):唯一对外的组件,接 CDP 的 WebSocket 和 HTTP 接口,并且存着每个会话的状态。名字听着最唬人,反而是三个组件里最简单的一个。

PageScript(脚本与解析):每打开一个新页面或跨进程 iframe,就用 Dynamic Workers 起一个长生命周期的隔离环境,里面有干净的全局对象和 DOM 文档。HTML 和 CSS 的解析用了 Blitz(模块化渲染引擎)和 Stylo(Firefox 的高性能 CSS 解析器)的一部分,两个都是 Rust 写的。

这里有个细节值得说:网页里的 eval 怎么办? Workers 出于安全原因至今不原生支持 eval;又不能另起一个隔离环境去处理,因为那样就拿不到页面的全局对象了。他们的解法是用 Boa JS(一个 Rust 写的 JavaScript 引擎)编译到 Workers 上跑。等于在一个运行时上面再跑一个运行时,他们自己承认这看着不优雅,实际上也确实不优雅,但足够应付代码里偶尔出现的 eval。等 Workers 原生支持 eval,就把 Boa 换掉。

PageScript 内部结构图:Engine 每次导航起一个隔离环境,里面依次是初始化、按顺序跑页面脚本、JS 引擎(V8 或 Boa)、DOM;CSS 图片字体和 fetch 请求都指向 SandboxOutbound
PageScript 内部:先初始化 window 和 document,再按顺序跑页面的脚本;脚本交给 JS 引擎执行(普通代码走 V8,eval 走 Boa),执行结果读写那个活的 DOM,注意 DOM 本身是跑在 WebAssembly 里的。图右下两条箭头是这个隔离环境唯一的对外通道,都指向 SandboxOutbound。来源:Cloudflare 博客。

PageRenderer(渲染):从 PageScript 拿到算好的页面对象(他们叫「场景」),取字体和图片,光栅化成图像缓冲,按客户端要的 JPEG / PNG / PDF 返回。它不持有页面状态,只有一份可丢弃的缓存,所以这次调用失败或者卡住,引擎可以直接把它杀掉重启,每次渲染请求都是自包含、可重试的。

SandboxOutbound(网络出口):渲染一个不可信的网页,必然要去互联网上抓任意资源,图片、字体、CSS、JavaScript、Wasm 文件。这是浏览器能做的最危险的操作之一。Kitesurf 把它收敛到一个组件,其余任何东西都碰不到网络,这条由 Dynamic Workers 强制。它负责执行跨域策略、注入浏览器形状的请求头、过滤响应,每个页面的 cookie 单独一罐,不符合策略的一律 403。

Kitesurf 一次请求的时序图:CDP 客户端发起导航,Engine 起隔离环境,PageScript 解析 HTML 建 DOM 跑脚本,循环里 Engine 调 PageRenderer 出帧,帧再回传给客户端
官方的时序图,一次请求在里面走一圈:客户端发起导航 → Engine 起一个新的隔离环境 → PageScript 解析 HTML、建 DOM、跑脚本 → 之后进入循环,Engine 每要一帧就调一次 PageRenderer,画好的像素原路回传给客户端。来源:Cloudflare 博客。
方法

它是怎么在 12 周里造出来的

这一节是整篇里最能拿走用的一段:怎么让 AI 干一件复杂又容易失控的活。

起点是一个开源项目 obscura,Rust 写的无头引擎,主打「没有 Chrome、没有 Node.js、没有依赖」。

obscura 项目页面截图,标注它是一个用 Rust 写的、面向 AI 自动化的无头引擎
给了他们最初灵感的开源项目 obscura。来源:Cloudflare 博客。

他们让 AI Agent 试着把它移植到 Workers 上,一开始效果很差。转折点是:给了 AI 一份扎实的计划,加上一个清楚的成功定义,详细到 Agent 能一直循环下去、卡住时知道回来提问。然后就跑通了。被这个勉强能跑的原型震到之后,团队才放开手做。

接下来是他们自己抛出的核心问题:

从原型走到一个能在生产里扛住规模的完整浏览器,要大量的工作和迭代。我们不否认,用 AI 加速这个过程是关键。但在这么复杂的项目里怎么用 AI,既保住代码和结果的质量、又不掉速度?

答案是:尽可能多地提供测试。

Kitesurf 发布博客

用的是 WPT,它给 AI Agent 提供了明确的球门:哪个特性做到了、哪个没做到,一测便知。人只做两件事:挑选和排序要交给 Agent 的特性,以及盯架构、看 Agent 的思路对不对。

人只管两件事 挑哪些特性交给 Agent · 盯架构、看思路 AI Agent 改代码 跑 Web Platform Tests · 自动判分 哪些过了、哪些没过 再改 WPT 测不出真实网站 → 另加一层:同时跑 Chromium,逐步比对渲染输出
本站画的示意图。这个循环之所以转得动,全靠中间那一步能自动判分。

但 WPT 只测到规范符合度,测不出「能不能渲染和操作真实网站」。所以他们又补了一层:集成测试加视觉回归测试,用 Puppeteer 在真实网站上跑多步操作,同时跑 Chromium 和 Kitesurf,不光比断言结果,每一步的渲染输出也逐张比对,把不该有的差异标出来。

这套方法可以脱开浏览器看:想让 AI 干一件复杂又容易失控的活,先给它一个能自动判分的靶子,人退到「挑题」和「看架构」这两个位置上。靶子测不到的地方,再补一层能自动比对的检查。

动手前定死的四条规矩

除了测试,还有四条在写第一行正式代码之前就定死了。每一条后面都跟着「所以会怎样」。

规矩一

能用 Rust 就用 Rust,直接编到 WebAssembly

不走 Emscripten 那一套模拟层,用 wasm-bindgen 直接编。所以会怎样:编出来的二进制不会又肥又慢,跑起来尽可能贴近底层。

规矩二

异常处理是生存问题,不是卫生问题

浏览器要渲染整个不可靠、有时还有敌意的网页世界,而且永远不能把手里的页面弄丢。他们定的铁律是:任何失败都降级成一个空白帧或者一个缺失的元素,绝不允许会话直接死掉。每个边界都接住错误、默认给一个安全的空结果、日志留够能查。

规矩三

每次页面加载都当成不可信输入

你在自己笔记本上开浏览器,访问的是你信任的网站,几个页面之间共享点资源没事。Agent 不一样,它被指向任务要求的任何地方,来自任意来源的任意代码。所以每个会话都从头开始,每个组件只能碰它这份工作严格需要的资源。

规矩四

能无状态就无状态

状态是让故障变贵的东西。没有状态要重建,从崩溃里恢复就等于重开一个再把请求放一遍。所以会怎样:无状态的组件天生可丢弃、可并行,卡住了立刻杀、一千个同时跑、按需要扩缩而不用一直养着。这正好对上自动化的负载形态:一阵一阵地来。

Kitesurf 的隔离设计示意图,各组件之间用边界隔开
官方的隔离设计图。Workers 平台本身只提供隔离环境之间的边界,剩下的「谁能碰什么」还得在应用层自己定。来源:Cloudflare 博客。
选型

适合接什么活,不适合接什么活

这一节是给你判断「我这个活该不该换过去」用的。

接得了

这些活现在就能交给它

  • 需要渲染页面、但能接受「不是全功能像素级完美 Chromium」这个代价的 AI Agent
  • 一次性的自动化动作:从页面里抓正文
  • 一次性的自动化动作:生成 PDF
  • 一次性的自动化动作:截图
接不了

这四件事去用 Chromium

  • 播视频改用 Chromium
  • 渲染 WebGL改用 Chromium
  • 跟机器人挑战做 TLS 指纹层面的握手改用 Chromium
  • 开一个十分钟、需要持久状态的登录会话改用 Chromium
左右两栏都来自官方原文。接不了的那四件,Browser Run 默认的 Chromium 照样可用,两者在同一个产品里切换。

官方给的定位是一句挺准确的话:把 Kitesurf 想成一个短命、完全隔离、无状态的引擎,只在一个任务的时长内存在,适合一阵一阵涌进来的 AI 负载。

网站兼容性方面,现在能正确渲染的包括:TodoMVC 的各个版本(原生、React、Vue、Angular、Preact)、Wikipedia、Hacker News、Cloudflare 博客,以及 Cloudflare 仪表盘的大部分。要判断某个具体网站行不行,最快的办法是直接去公开的 playground 输网址试一下。

Kitesurf 渲染真实网站的实录。来源:Cloudflare 博客。
上手

怎么体验,以及开源计划

公测免费:目前在 Cloudflare 的 Browser Run 产品里开放免费测试,有按账号的额度限制。用法就是在接口上加一个参数:

拿 Kitesurf 截一张图
curl -X POST 'https://api.cloudflare.com/client/v4/accounts/<accountId>/browser-run/screenshot?browser=kitesurf' \
  -H 'Authorization: Bearer <apiToken>' \
  -H 'Content-Type: application/json' \
  -d '{"url": "https://example.com"}' \
  --output "screenshot.png"
关键就是末尾那个 browser=kitesurf。CDP 端点同理,加上它就切过去了。

在线 Playground:官方提供了公开的 kitesurf.cloudflare.app,输入任意网址就能直接看 Kitesurf 的渲染效果,还能交互。

里面有个别处看不到的东西:他们把 Chrome DevTools 注入进了界面,而且专门实现了 Memory 面板需要的那几条 CDP 指令,所以你能看到每个隔离环境(包括各个 frame)的 WebAssembly 占用。

Kitesurf playground 截图:左边渲染出的 Wikipedia 首页,右边是注入的 Chrome DevTools Memory 面板,列出三个 JavaScript 虚拟机实例的内存占用
playground 实拍:左边是 Kitesurf 渲染出来的 Wikipedia 首页,右边 Memory 面板列着三个实例,Main 25.6 MB、PageRenderer 24.5 MB、Engine 19.4 MB,总 JS 堆 69.5 MB。这三行正好对应前面那张组件图。来源:Cloudflare 博客。

官方列了正在做的四件事:更全的 CDP 覆盖;截图和 PDF 的渲染保真度(他们的理由是 AI 常常看图比看文字效果更好);更多 WPT 覆盖;以及效率,CPU、内存、墙上时间的基准一直在跑。

开源计划:他们说准备把 Kitesurf 开源,「等我们准备好,希望很快」。目标是让客户能在自己的账号里部署自己的那一份。

🧰 上手卡 · Kitesurf
价格公测期间免费,有按账号的额度限制
门槛有 Cloudflare 账号的话,在 Browser Run 的 CDP 端点或 Quick Actions 接口加 browser=kitesurf 即可,现有 Puppeteer / Playwright 代码不用改;只想看效果就直接开公开 playground 输网址
同一条思路的另一件,站内解读过
Cloudflare 发布 @cloudflare/computer:给每个 AI Agent 配一台「虚拟电脑」
Kitesurf 是「给每个 Agent 配一个浏览器」,那篇是「给每个 Agent 配一台电脑」,同一个「按 Agent 的用法重做基础设施」的路子。
来源
Introducing Kitesurf(跑在 Cloudflare Workers V8 隔离环境里的 Agent 专用浏览器)Cloudflare 博客·原文·2026-08-06
本站说明
跑分表、WPT 增长曲线与覆盖率、组件结构图、playground 截图、两段视频均来自官方发布,图注中已逐一标注;三张示意图(人与 Agent 各要什么、用测试当靶子的循环、组件关系合成图)为本站绘制。WPT 分区表由官方覆盖报表整理成中文,右列偏低的几项官方文字未提及。Kitesurf 是 Cloudflare Agents Week 第四天发布的其中一项,同日另有 WebMCP、MCP V2、AI Search 与 AEO 等,各有各的发布页,这里不展开。