Cloudflare 把「Agent 专用浏览器」开源了:内存只要 50MB,代价是比 Chrome 慢八成
3分钟看懂
Cloudflare 在 11 月 13 日把 Kitesurf 开源了,许可证是 Apache 2.0。项目地址 github.com/cloudflare/kitesurf。
一句话概括:它让 AI Agent 打开网页这件事,不再需要为每个任务启动一个 Chromium。
官方自己跑的对比数据(38 个网页各跑 5 次取中位数,2026-11-14 02:40 UTC 那次):
- 截图任务:内存 50 MiB,对比 Browser Run 的 400 MiB、冷启动 Chrome 的 329 MiB
- 截图任务:CPU 387 毫秒,对比 Browser Run 的 1.67 秒、Chrome 的 767 毫秒
- 但更慢:截图墙上时间 1.79 秒,Browser Run 1.20 秒,冷启动 Chrome 1.01 秒
也就是说,它拿"单次更慢"换了"每次便宜一个数量级"。对一天跑几十万次抓取的 Agent 平台,这笔账划得来;对只想快点截一张图的人,不划算。
它到底是什么
Kitesurf 是 Cloudflare 今年 8 月推出的东西,当时叫"跑在 Workers 上的无状态浏览器",9 月补了 WebMCP 支持和更多 API。那时候它只是 Cloudflare 自己托管的一项服务(Browser Run 的一部分)。开源的意思是:你可以把代码拉下来、改、然后部署到你自己的 Cloudflare 账号上。
它不用 Chromium,也没有浏览器容器。整套东西跑在 Cloudflare Workers 里,由几个 Rust 编译成 WebAssembly 的组件拼起来:
- Blitz:解析 HTML、构建 DOM、布局
- Stylo:CSS 解析与计算样式
- Boa:JS 引擎,作为兜底(正常情况下页面 JS 跑在 Dynamic Workers 里)
- Linebender 系列 + Krilla:文字排版、2D 图形、导出 PDF
代码分成三块:Engine 管浏览器会话和客户端连接,PageScript 跑页面和它的 JavaScript,PageRenderer 负责画出来。
关键的一点是它讲 Chrome DevTools Protocol(CDP)。这意味着 Puppeteer、Playwright 这类现成工具能直接连上去,不需要为了它换一套自动化框架。
为什么这件事值得单独说
过去两年,"让 Agent 上网"的做法基本都是:起一个无头 Chrome → 打开页面 → 截图或抽 HTML → 关掉。这条路能用,但成本结构很别扭:一个 Chromium 进程动辄几百 MB 内存,冷启动一秒上下,抓一千个页面就是一千次启动。
Kitesurf 的思路是砍掉"只有人需要"的部分——标签页、主题、扩展、像素级一致的渲染——只保留 Agent 真正在意的:能不能跑 JS、能不能拿到 DOM、能不能截图、能不能生成 PDF。
官方在文档里写得很直白:对截图和 HTML 抽取这类常见 Agent 任务,Kitesurf 用的 CPU 和内存显著少于 Chromium,所以同样的机器能跑更多会话,尤其适合忽高忽低的突发流量。
官方自测:省资源,但慢一点
Kitesurf 官网有一个持续更新的跑分页,最新一次是 2026-11-14 02:40 UTC,38 个页面,每页跑 5 次取中位数。三组对手:Kitesurf(跑在 Workers 上)、Browser Run(页面之间复用 Chrome)、Chrome 冷启动(每次新开)。
截图任务:
| 指标 | Kitesurf | Browser Run | Chrome 冷启动 |
|---|---|---|---|
| 墙上时间 | 1.79 秒 | 1.20 秒 | 1.01 秒 |
| CPU 时间 | 387 毫秒 | 1.67 秒 | 767 毫秒 |
| 内存 | 50 MiB | 400 MiB | 329 MiB |
抽 HTML 任务:
| 指标 | Kitesurf | Browser Run | Chrome 冷启动 |
|---|---|---|---|
| 墙上时间 | 1.37 秒 | 1.10 秒 | 894 毫秒 |
| CPU 时间 | 446 毫秒 | 1.59 秒 | 637 毫秒 |
| 内存 | 29 MiB | 398 MiB | 316 MiB |
三件事值得注意:
- 内存差 8 到 13 倍,CPU 差 3 到 4 倍,这是它真正的卖点。
- 墙上时间它最慢,慢 40% 到 80%。如果延迟是你的第一指标,它不适合。
- 这组数字是厂商自己跑的公开基准,页面、脚本、配置都由 Cloudflare 设定,不是第三方复现。当参考值看,别当定论。
兼容性方面,官网也放了 Web Platform Tests 的结果,最新一次是 2026-11-13 16:24 UTC:
- 子测试通过率 98.3%:1,543,968 个里有 1,517,208 个通过
- 测试文件通过率 77.3%:11,764 个里有 9,093 个
- 跳过 56,854 个文件(其中 56,823 个是没纳入测试集,31 个标了 SKIP)
子测试通过率看着很高,但文件通过率只有七成七,说明"大部分断言能过、一部分页面整体还是不行"。官方承认这仍是实验性项目,正在补标准兼容、渲染保真度和性能。
怎么用:本地跑起来
前置条件官方列得很清楚:Node.js 22 以上、pnpm 9.15.4(仓库锁了版本)、Bazelisk(以 bazel 命令存在)、macOS 上还要装 GNU tar(brew install gnu-tar)。
第一步,拉代码装依赖:
git clone https://github.com/cloudflare/kitesurf.git
cd kitesurf
pnpm install --frozen-lockfile
第二步,启动本地引擎:
pnpm run dev
第一次构建要编译 Rust 核心和它依赖的 crate,会等挺久;之后走 Bazel 缓存就快了。引擎起在 http://127.0.0.1:8787,访问 /health 确认活着。如果 8787 被占,设 KITESURF_PORT 换端口。
第三步,用 Puppeteer 连上去:
import puppeteer from "puppeteer-core";
const browser = await puppeteer.connect({
browserWSEndpoint: "ws://127.0.0.1:8787/devtools/browser",
});
之后 newPage()、goto()、screenshot() 都是老一套。如果你用的是自己的 Agent 框架,把 CDP 端口指给 ws://127.0.0.1:8787/devtools/browser 就行——官方在博客里的原话是"agents love CDP"。
想部署到自己的账号,在仓库根目录跑 pnpm run deploy。
适用场景:谁该用它
- 大批量抓取的 Agent 平台:一天几万到几十万次页面加载,内存和 CPU 是主要成本项,这时候 8 倍内存差会直接体现在账单上。
- 一次性动作(官方叫 Quick Actions):抽正文、生成 PDF、截一张图,抓完就扔,不需要保持状态。
- 突发流量:本来就是无状态、用完即走的设计,扩缩容不需要预热浏览器池。
- 已经在用 CDP 的团队:不用改自动化框架,换个 endpoint 就能试。
- 需要在国内/多区域就近渲染的服务:跑在 Workers 的全球网络上,不需要自己在每个区域养浏览器集群。
不适用场景:谁别碰
官方文档里专门有一节列了"Kitesurf 现在还做不了什么",很实在:
- 要放视频、要跑 WebGL:不行,这两类直接排除。
- 要过硬碰硬的机器人挑战:它没法完成真实 TLS 指纹的握手,遇到 Cloudflare 自己的挑战页、或者别的站点的高级反爬,过不去。
- 需要长时间保持登录态:它不做长会话,需要持久状态和身份的场景请用 Chromium。
- 要求像素级一致:它明确放弃了 pixel-perfect 渲染,做视觉回归测试、UI 截图对比这类工作,结果会和真浏览器有差异。
- 低延迟优先的交互:墙上时间比 Chromium 慢,实时性要求高的别选。
判断某个具体站点能不能用,最快的办法是拿它的公开 playground 试一次,或者本地起引擎打开那一页看。
避坑:最容易踩的四个点
第一,自部署必须要 Workers Paid。 Kitesurf 用 Dynamic Workers 给每个页面建隔离的 Worker,这项能力只在付费计划里。最低消费是每月 5 美元。本地开发用 wrangler dev 不需要付费。
第二,它自己没有鉴权。 官方在 changelog 里专门加了一句警告:部署上线后要自己用 Cloudflare Access 或别的认证层挡住,Kitesurf 不提供内置认证。一个能打开任意 URL、还能跑 JS 的端点裸露在公网,是现成的 SSRF 跳板。
第三,Dynamic Workers 是按"每天新建多少个"计费的。 官方定价页写的是每月含 1,000 个唯一 Dynamic Worker,超出每个每天 0.002 美元;同一个 Worker ID 加同一份代码重复调用只算一次,但代码一变或者 ID 一变就重新计。如果你的实现每次请求都 load(code) 而不给稳定 ID,会被按每次调用计费。这是最容易在账单上炸的一点。
第四,它还在实验阶段。 官方原话是 "under heavy development",重点是补兼容性、可靠性和性能,评审能力有限。放在生产关键路径上要有回退到 Chromium 的方案。
成本和时间
- 代码本身:Apache 2.0,免费商用。但它依赖的开源组件各有各的许可证,仓库的
NOTICE文件里列了第三方声明,商用前值得扫一眼。 - 托管使用:Kitesurf 目前在 Browser Run 里是 beta,按官方文档"免费、但受每个账号的限额约束"。等它转正式,会走 Browser Run 的浏览器小时计费(付费计划每月含 10 小时,超出每小时 0.09 美元)。
- 自部署:Workers Paid 每月最低 5 美元,含每月 1,000 万次请求、3,000 万毫秒 CPU 时间、1,000 个唯一 Dynamic Worker。超出部分:请求每百万 0.30 美元,CPU 每百万毫秒 0.02 美元,Dynamic Worker 每个每天 0.002 美元。
- 上手时间:装 Bun 之外的那套工具链(Node、pnpm、Bazelisk)大概十几分钟;第一次
pnpm run dev的 Rust 编译是最慢的一步,取决于机器,官方没给具体时长,只提醒"给它点时间"。
行动建议
第一步,先别改代码,去 kitesurf.dev 的 playground 拿你实际要抓的两三个页面跑一遍,看渲染对不对、JS 有没有跑起来。这一步五分钟能省掉后面几小时的返工。
第二步,本地 git clone + pnpm install + pnpm run dev,用 Puppeteer 连 ws://127.0.0.1:8787/devtools/browser,把你现有脚本里的 endpoint 换掉,量一下成功率和耗时差异。
第三步,算账。把"每天抓多少次"乘上"每次省多少内存和 CPU",再对比墙上时间变慢带来的重试成本。如果省下来的机器钱覆盖不了延迟损失,就别上。
第四步,真要上生产,先接 Cloudflare Access 挡住端点,再给 Dynamic Worker 用稳定 ID,最后留一条回退到 Chromium 的开关。
参考来源
- Cloudflare 官方博客《Kitesurf is now open source》:https://blog.cloudflare.com/kitesurf-open-source/
- Cloudflare 官方 changelog(2026-11-12):https://developers.cloudflare.com/changelog/post/2026-11-12-kitesurf-open-source/
- Cloudflare 产品文档《Kitesurf》(Last updated Nov 13, 2026):https://developers.cloudflare.com/browser-run/kitesurf/
- 源码仓库(Apache-2.0):https://github.com/cloudflare/kitesurf
- 官方基准页(2026-11-14 02:40 UTC 跑):https://kitesurf.dev/benchmarks
- 官方 Web Platform Tests 页(2026-11-13 16:24 UTC 跑):https://kitesurf.dev/wpt
- Dynamic Workers 定价:https://developers.cloudflare.com/dynamic-workers/pricing/
- Browser Run 定价:https://developers.cloudflare.com/browser-run/pricing/
- 独立报道:Linuxiac《Cloudflare Open-Sources Kitesurf, Its Lightweight Browser Engine for AI Agents》(2026-11-14):https://linuxiac.com/cloudflare-open-sources-kitesurf-its-lightweight-browser-engine-for-ai-agents/