Kitesurf:为 AI Agent 重做浏览器,并把它运行在 Cloudflare Workers 上

2026-08-06 50 预计阅读时间: 1 分钟
来源: blog.cloudflare.com AI 摘要 Original link

Disclaimer: This article is an AI-assisted summary. Read it together with the original source when precision matters. The summary may omit context, version differences, or edge cases and is not official documentation.

预计阅读时间:9 分钟

传统浏览器围绕人类设计:页面需要可视化,交互依赖鼠标和键盘,会话状态长期保存在本地。AI Agent 的需求不同,它更关心结构化输入、确定性操作、并发执行、失败重试和可控成本。Cloudflare 推出的 Kitesurf 正是在这个方向上重新定义浏览器:它面向 Agentic Cloud,运行于 Cloudflare Workers 的 V8 isolates,并强调无状态、高扩展性和成本效率。

Agent 需要的不是一块远程屏幕

让模型操作传统浏览器,常见做法是启动 Chromium,再通过 Playwright、Puppeteer 或 Chrome DevTools Protocol 控制页面。这套方案能力完整,但也带来了明显的运行负担:浏览器进程需要启动时间和内存,容器需要调度,长连接与会话状态还会增加扩容难度。

Kitesurf 的关键变化不是简单地“把浏览器部署到云端”,而是把 Agent 的使用方式放在设计中心。对模型而言,一个浏览器工具更适合暴露这样的能力:

  • 接收 URL、动作和约束,而不是模拟鼠标轨迹。
  • 返回文本、链接、表格或其他可消费结果,而不是只返回屏幕画面。
  • 每项任务可以独立执行,失败后能够安全重试。
  • 大量短任务可以按需并发,不依赖固定浏览器服务器池。
  • 调用成本能够随实际任务量变化。

来源摘要没有披露 Kitesurf 的具体 API、页面兼容范围或动作协议,因此不能直接假设它与 Playwright API 兼容。可以确定的是,它被定位为一个完全建立在 Workers 之上的无状态 Agent 浏览器,而不是传统远程桌面式浏览器。

V8 isolates 与无状态模型改变了调度方式

V8 isolate 是 Cloudflare Workers 的核心运行单元。将 Agent 浏览任务放入这种运行环境,最直接的架构意义是:任务不必绑定到一台长期运行的浏览器主机。

一个典型调用可以被理解为:Agent 提交任务,浏览器执行一次受约束的网页操作,然后返回结构化结果。下一次请求不应默认依赖上一次请求所在的 isolate。需要保留的数据,例如登录凭据引用、任务进度、抓取结果或审计记录,应显式写入外部存储。

这种无状态边界有几个实际效果:

  • 横向扩展更自然:独立任务可以分发给不同 isolate。
  • 重试更清晰:调用方可以使用任务 ID 和幂等键避免重复副作用。
  • 闲置成本更低:不必仅为等待下一条指令持续维护完整浏览器进程。
  • 状态管理更严格:Cookie、认证会话和多步骤导航不能依赖隐含的本地进程状态。

最后一点也是主要代价。购物结算、复杂后台操作或需要持续登录的长流程,通常不能粗暴拆成互不相关的 HTTP 请求。团队需要明确哪些状态由浏览器工具管理,哪些状态由 Agent 工作流、Durable Objects、KV、数据库或队列管理。具体选择取决于 Kitesurf 最终开放的接口和一致性要求。

可以这样实践:给 Agent 定义稳定的浏览器工具契约

由于摘要没有给出正式 API,下面是一个可改造的假设示例,不是 Kitesurf 的真实接口。它展示如何让 Cloudflare Worker 充当 Agent 与浏览器服务之间的适配层。正式接入时,需要把 KITESURF_ENDPOINT、请求字段和响应结构替换为官方定义。

创建一个最小项目:

mkdir agent-browser-adapter
cd agent-browser-adapter
npm init -y
npm install -D wrangler
mkdir src

新增 wrangler.toml

name = "agent-browser-adapter"
main = "src/index.js"
compatibility_date = "2025-01-01"

[vars]
KITESURF_ENDPOINT = "https://replace-with-browser-service.example/v1/tasks"

新增 src/index.js

export default {
  async fetch(request, env) {
    if (request.method !== "POST") {
      return Response.json(
        { error: "POST / required" },
        { status: 405, headers: { Allow: "POST" } }
      );
    }

    const input = await request.json();
    if (!input.url) {
      return Response.json({ error: "url is required" }, { status: 400 });
    }

    const task = {
      task_id: crypto.randomUUID(),
      url: input.url,
      action: input.action ?? "extract_text",
      max_steps: Math.min(input.max_steps ?? 5, 20),
      output: "structured_json"
    };

    const response = await fetch(env.KITESURF_ENDPOINT, {
      method: "POST",
      headers: {
        "Authorization": `Bearer ${env.KITESURF_API_TOKEN}`,
        "Content-Type": "application/json",
        "Idempotency-Key": task.task_id
      },
      body: JSON.stringify(task)
    });

    const body = await response.text();
    return new Response(body, {
      status: response.status,
      headers: { "Content-Type": "application/json" }
    });
  }
};

配置密钥并启动本地开发环境:

npx wrangler secret put KITESURF_API_TOKEN
npx wrangler dev

然后提交一个浏览任务:

curl http://localhost:8787 \
  -H 'Content-Type: application/json' \
  -d '{
    "url": "https://example.com",
    "action": "extract_text",
    "max_steps": 3
  }'

这个适配层刻意限制了 max_steps,并为任务生成幂等键。实际系统还应增加域名白名单、超时、响应大小限制、内容类型校验和审计日志。不要允许模型不受约束地访问任意 URL,否则可能引入 SSRF、内网探测、恶意页面提示注入和数据外泄风险。

接入 Agent 工作流时要控制边界

浏览器变成 Agent 工具后,网页内容也就变成了不可信输入。页面可以包含诱导模型泄露凭据、改变目标或调用高风险工具的文本。浏览器返回的数据不应直接获得“系统指令”级别的信任。

生产接入至少应检查以下事项:

  • 为可访问域名、HTTP 方法、下载类型和响应体大小设置上限。
  • 将浏览动作与写操作分开,提交订单、发送消息等操作要求二次授权。
  • 密钥保存在 Secret 管理系统中,不放进 Prompt、日志或浏览器返回内容。
  • 为每次任务记录调用方、目标域名、动作、耗时、费用和结果摘要。
  • 使用幂等键处理 Worker 重试,避免重复提交表单或重复触发业务动作。
  • 用真实业务页面测试 JavaScript 兼容性、登录流程、验证码和反自动化策略。

采用建议

Kitesurf 最值得关注的地方,是它把浏览器从“需要长期维护的远程进程”改造成面向 Agent 的云端执行能力。无状态和 Workers isolate 模型适合大批量、短生命周期、可独立重试的网页任务,例如内容提取、链接检查、资料收集和受约束的页面操作。

但团队不应只看并发和启动速度。正式采用前,还要验证页面兼容性、状态持久化方式、地域与数据合规、可观测性、单任务成本以及失败语义。先选择只读、可回放的流程做试点,再逐步开放登录态和写操作,能更准确地判断这种 Agent-first 浏览器是否适合现有系统。


相关推荐