Cloudflare 新命令行 cf:为 Agent 重做的一套工具

Cloudflare 把整个 API 的 3000 多个操作搬进命令行,输出默认 JSON、配置改用 TypeScript,第一用户从人换成 Agent。

作者:Cloudflare09-29 · 约 8 分钟
🎧 听播客版0:00 / --:--
0:00 / --:--

Cloudflare 的命令行工具 Wrangler,用户正在变成 Agent。Cloudflare 自己给的数字:今年早些时候,Agent 已占 Wrangler 使用量的四分之一,一年前还只是个位数百分比;上周这个比例到了 48%。

而且 Agent 比人用得更狠:每天用到的不同命令数差不多是人的两倍,一次用到六个以上命令的概率接近人的四倍。

整个网络的流量也在往同一个方向走。下面是 Cloudflare Radar(Cloudflare 公开的网络流量统计页面)的截图:网页(HTML)请求里,机器发出的占 57.5%,人只占 42.5%;再看所有响应的内容类型,JSON 占 33.1%,比 HTML 的 12% 高出不少。这里的“机器”指所有自动化程序,AI Agent 只是其中一部分,所以它不能直接当成 Agent 的占比,但能说明机器读的数据格式已经比网页还常见。

Cloudflare Radar 两张图:上图为机器与人类对 HTML 页面的请求占比,机器 57.5%、人类 42.5%;下图为各内容类型占比,JSON 33.1%、HTML 12%、图片 12.7%、JavaScript 8.1%、纯文本 6.4%、视频 3.7%、其他 24%
Cloudflare Radar 截图(近一周数据):上,机器与人类的 HTML 页面请求占比;下,各类响应的内容类型占比。

回到 Cloudflare 自己的工具:Wrangler 只覆盖大约 280 个操作,而 Cloudflare 一共有几千个操作。Agent 能调用的 Cloudflare 功能,因此被 Wrangler 的命令清单卡住了。所以 Cloudflare 做了一个新的命令行工具 cf,目标是把整个 Cloudflare API 都搬进命令行,并且整套设计都以 Agent 为第一用户。目前是开放测试版,用 npm i -g cf 安装。

下面按 Agent 用起来会卡在哪,讲 cf 的四个改动。

一个工具,能做 Cloudflare 上的所有事

先看 Wrangler 为什么停在 280 个。它是各个产品团队各自手写的:同样是查看一个资源的信息,有的叫 d1 info,有的叫 hyperdrive get,有的叫 workflows describe;有些团队写了几千行定制体验,结果几乎没人用。团队多了,命令风格很难统一。

cf 换了一种做法:不再手写命令,而是从 API 的 OpenAPI 规范(描述每个接口有哪些参数的标准文档)直接生成。Cloudflare 每个 API 本来就有这份规范,用来生成 API 文档和各语言 SDK;在规范里多标注一点信息,一条叫 Forge 的统一生成流水线就能顺带产出命令行命令。结果是命令从大约 280 个扩到覆盖 3000 多个 API 操作。

对使用者最直接的变化是:你可以让 Agent 用同一个工具,连着做完“建一个 Worker(Cloudflare 上跑的一小段服务端代码)、部署、监控、用 Cloudflare Access 保护起来、买一个域名、前面再挂 WAF(网站防火墙)”这一串事,中间不用换工具,也不用你去控制台点。

官方演示:在终端里用 cf 构建并部署 Worker、注册域名、创建访问保护(Access)应用和策略。

输出默认是 JSON,不是给人看的表格

Agent 用 Wrangler 时,几乎每条命令都会自己加上 --json,再用 jq(命令行里筛选 JSON 字段的小工具)只取需要的几项。但 Wrangler 只有一部分命令支持 --json,其余命令输出的是为人排版的表格。Agent 也能读懂表格,只是比用一条 jq 更费时间、更费 token。

官方演示:先是 Wrangler,加 --json 报“未知参数”,去掉后输出给人看的表格;再是 cf,默认输出 JSON,接一条 jq 就取出需要的字段。

cf 直接反过来:JSON 是默认输出。给人看时会排版美化,给 Agent 看时压缩掉多余空白,省上下文。Cloudflare 的判断是,这个工具大多数命令人很少直接碰,你真正的用法是让 Agent 先筛选结果,再按你要的格式汇报,给你一张你根本不会细看的表格没有意义。

但有些事确实需要人来定,比如搜一个域名并购买。这类命令如果用一长串命名参数拼出来很难写,cf 把 API 的要求拆成一组带校验的输入,让人像填表单一样一步步填。

官方演示:注册域名时,cf 先列出年限、价格、自动续费等条目,再问一句“是否继续”,确认后才注册。

你也可以直接让 Agent 代办;演示里加上 --force,命令就跳过确认,直接返回 JSON 结果。

官方演示:同一条注册命令加上 --force,不再询问确认,直接返回 JSON 结果。

3000 个命令,Agent 怎么找到要用的那一个

命令一多,光把命令清单塞给 Agent 就会撑爆上下文。cf 加了一个 cf cli search:Agent 用自然语言说出想做什么,一个小型搜索索引会根据每个命令的 API 描述和参数,返回匹配的命令列表。Agent 第一次运行 --help 时,cf 会自动告诉它有这个命令可用,不用你在提示词里交代。

官方演示:先用 cf cli search 描述要做的事(例如“查看队列里卡住的消息”),再运行匹配到的命令 cf queues messages peek。

配置文件改成 TypeScript,编辑器会替 Agent 纠错

Wrangler 用 TOML 或 JSONC 写配置。Cloudflare 的观察是:TOML 没有可访问的规范,JSONC 虽然可以链接一份规范,Agent 很少去看。cf 的新配置文件叫 cloudflare.config.ts,用 TypeScript 写。好处是,用了 LSP(语言服务协议,编辑器据此提供补全和报错)插件的 Agent,比如 Claude Code 和 Codex,可以直接读到每个字段是什么、能填什么,给出的修改更准。Cloudflare 说,即使 Agent 事先没见过这个格式,也能顺利找到并修改配置,包括 env 这种和 Wrangler 里同名但含义已大幅变化的部分。

还有一个副作用:配置可以用代码生成。Cloudflare 内部有些 Wrangler 配置文件原本超过 5000 行,里面为每个开发者复制了很多份自定义环境;改成从同一个基础配置按环境生成后,缩短了 40%。一个多环境的 Worker,只需要根据 Vite 自带的 mode 参数切换两套配置:

import { bindings, defineConfig } from "cf/config";
import * as entrypoint from "./index.js" with { type: "cf-worker" };

export default defineConfig(({ mode }) => ({
  worker: {
    name: "example-worker",
    entrypoint,
    compatibilityDate: "2026-09-27",
    env: {
      Environment: bindings.text(`This is ${mode} environment`),
    },
  },
}));

bindings 是 Worker 能连接的东西(环境变量、密钥、KV 缓存、D1 数据库、R2 存储、队列、AI、向量库、另一个 Worker)的统一入口,编辑器可以自动补全并解释每一项,等于给 Agent 一份可以直接查的清单:

env: {
  API_URL: bindings.text(
    mode === "production" ? "https://example.com" : "https://staging.example.com",
  ),
  API_TOKEN: bindings.secret(),
  CACHE: bindings.kv({ id: mode === "production" ? "production-namespace-id" : "staging-namespace-id" }),
  DATABASE: bindings.d1({ name: `example-${mode}-database` }),
  UPLOADS: bindings.r2({ name: `example-${mode}-uploads` }),
  AI: bindings.ai(),
  // 还有 queue、vectorize、worker 等
}

triggers 则把“什么会让这个 Worker 跑起来”集中到一处:网页请求、定时任务、队列消息、收到邮件,以前散在配置文件各处,现在写在同一个块里:

triggers: [
  triggers.fetch({ pattern: "example.com/*" }),
  triggers.scheduled({ schedule: "0 * * * *" }),
  triggers.queue({ name: "jobs", maxBatchSize: 10 }),
  triggers.email({ addresses: ["你的收件邮箱"] }),
],

现在这份配置只支持 Worker,官方的计划是让它管理整个 Cloudflare:接下来会加策略、域名区域(zone)、DNS 等,全部用同一种带类型的配置来写。

本地开发默认换成 Vite

Wrangler 诞生时 Vite 还不存在,所以它用 esbuild 打包,本地开发服务器(默认在 8787 端口)也是自己写的,想改就得深入 Miniflare(Cloudflare 的本地运行环境)内部。现在 Vite 生态成熟,有大量插件和带热更新(HMR,改代码后页面自动刷新)的开发服务器,打包用 Rust 写的 Rolldown 做 tree-shaking(剔除没用到的代码)。cf 默认建立在 Vite 和 Cloudflare Vite 插件之上,配合 Vitest 插件做测试,得到和 Workers 线上运行环境一致的开发测试环境。

Cloudflare 说,大多数 Worker 可以很顺利地让 Agent 帮你迁过去。但不是所有项目都能马上搬:仍然依赖 esbuild 的 JavaScript Worker,以及 Rust 和 Python 写的 Worker,cf 会继续把开发和部署交给 Wrangler 处理。

从 Wrangler 迁移

已有的 Worker,运行 cf migrate 即可:已经用 Vite 构建的,会被转换成 cloudflare.config.ts;还靠 Wrangler 跑 esbuild 的,构建仍交给 Wrangler。新项目用 cf init 起步,cf init 和 cf deploy 会替你装好 Cloudflare Vite 插件并生成配置文件;静态网站依旧不需要配置文件,在项目里运行 cf deploy 就能部署。

时间表方面:开放测试结束后,Cloudflare 会发布 Wrangler 的最后一个大版本,它会引导你和你的 Agent 改用 cf,之后 Wrangler 再维护 18 个月,给大家留出迁移时间。cf 本身是开源的,问题可以提到 GitHub 的 cloudflare/cf 仓库。

为什么不给 Wrangler 打补丁,而是换新工具

这里有个反直觉的点。Wrangler 有多年文档、博客和第三方教程被大模型学进去,Agent 对它已经很熟;换一个 Agent 没见过的新工具,听上去更容易出错。Cloudflare 的看法是恰恰相反:要在旧工具里做这么大的改动,就得让 Agent 忘掉学过的旧用法,比如同名的 env 含义变了;而全新的工具反而干净,官方可以靠设计上的取舍、能注入的上下文和可追加的 AGENTS.md 文件(项目里写给 Agent 看的说明),把新用法直接教给 Agent。这类给 Agent 的引导,官方说目前只做了几项,后续还会增加;其中让 Agent 自己找命令的办法,官方认为以后会成为更多命令行工具的标配。

该怎么看

这篇讲的不只是 Cloudflare 多了一个命令行,而是一个更大的转向:工具的主要用户从人变成 Agent 后,产品设计的默认值都要反过来。 输出格式默认给机器,找命令靠搜索而不是背,配置要让编辑器能检查,旧习惯不惜断代。如果你在做面向 Agent 的工具或 API,这四点可以直接对照。

两点要注意:开头的 48% 是 Cloudflare 统计的 Wrangler 使用量里 Agent 的占比,不代表所有开发者;cf 目前是开放测试版,配置格式现在只支持 Worker,DNS、策略等其余产品的配置还在计划中。

来源
Introducing cf: the agentic CLI for the entire Cloudflare APIMatt “TK” Taylor, Samuel Macleod(Cloudflare)·查看主材料
↑ 正文结束
✓ 本篇全文免费开放

会员可复制、下载全文 Markdown,还能让你的 AI 订阅和提问。

阅读原文 ↗
📮 新解读第一时间进邮箱

读完觉得有用?留个邮箱,每篇新解读发布就送达,随时退订。