把 Agent 搬上边缘网络:每个会话,都是一个休眠的持久化单元。
Cloudflare 官方 Agents SDK 研究——基于 Durable Objects 的 Agent 运行时:一个 Agent 即一个有状态、可休眠、按需唤醒的执行单元,能跑百万个而空闲零成本。本文梳理其架构、Project Think 基类、52 个示例,以及与 pi-on-cf 的演进脉络。
传统编码 Agent 假设自己在一台开发者笔记本上:有持久文件系统、shell、长驻进程。Workers 没有这些——于是 Cloudflare 的做法是:把 Agent 变成 Durable Object,给它身份、SQLite 存储和 WebSocket,让它在边缘上休眠、唤醒、重生。
这就是「Agent = 有状态的执行环境」:空闲时零成本,被调用时瞬时醒来。
这个研究从一条推文开始——Cloudflare DX 工程师 Harshil 用 Pi 的可移植内核在 Workers 上做了个实验,然后官方把它产品化了。
把 Earendil 的 Pi 编码 Agent 整体搬上 Workers:每会话一个 DO 存会话树+工作区,AI Gateway 调模型,Worker Bundler 在 Worker 内打包生成的 React 应用。
受 Pi 启发的 opinionated 聊天 Agent 基类:agentic loop、流恢复、内置 workspace、客户端工具、子代理,全部基于 DO SQLite,开箱即用。
Harshil 正在用 Think 构建的新项目。搜索不到公开仓库——大概率和 pi-on-cf 一样,是"用官方基建重做一遍"的进化版。
整个 SDK 的基石:一个 Agent 类就是一个 DO 子类,装饰器生成类型安全的 RPC,前端 hook 直连 WebSocket。写一个计数器就 20 行。
// 服务端:Agent = Durable Object import { Agent, routeAgentRequest, callable } from "agents"; export class CounterAgent extends Agent<Env, CounterState> { initialState = { count: 0 }; @callable() increment() { this.setState({ count: this.state.count + 1 }); return this.state.count; } }
Agent 的 state 自动同步给所有连接的客户端,方法像本地函数一样远程调用。
Agents SDK 在 DO 之上封装了 WebSocket 连接、RPC 与浏览器客户端——这是 pi-on-cf 里 Harshil 手搓的部分,现在是内置的。
四种模式覆盖「延迟 → 定点 → 周期 → 秒级轮询」,任务持久化到 SQLite——Agent 休眠、被驱逐、重启,一个都不丢。
// 四种模式:延迟 / 定点 / cron / 间隔 await this.schedule(60, "sendReminder", { message: "Check your email" }); await this.schedule(new Date("2025-12-31T09:00:00Z"), "yearEndTask"); await this.schedule("0 8 * * *", "dailyDigest", { userId }); await this.scheduleEvery(30, "poll", { source: "api" }); // 回调就是 Agent 的方法;底层 = DO alarms + SQLite,重启不丢 async dailyDigest(payload) { /* 生成并发送 */ }
聊天 Agent 不用手动 schedule(),类上直接声明,启动时自动 reconcile:
getScheduledTasks() {
return { hourlyQueueDigest: {
schedule: "every 1 hour",
prompt: "检查积压的后台任务"
}};
}
从持久状态到电话语音,从 MCP 到按调用付费——不是每个都要用,但每个都有对应原语。
核心 SDK 之外,每个能力独立成包,按需引入。
继承 Think 类 + 实现 getModel() / getSystemPrompt(),就得到一个完整聊天 Agent。以下能力全部内置。
每个 Agent 自带 this.workspace——DO SQLite 上的虚拟文件系统。read/write/edit/list/find/grep/delete/bash 工具自动注入;bash 走 just-bash 沙箱、默认禁网、文件变更自动回写。
对话中断后可从持久化状态恢复——正是 pi-on-cf 里"无法恢复的活动流"痛点。DO 被驱逐、部署更新、断线重连,都能接着聊。
技能目录格式一等支持:模型先看目录,需要时 activate_skill / read_skill_resource。技能是"按需指令"而非常驻提示词,支持本地目录 / R2 / 脚本执行。
直接声明 Telegram 等入口(getMessengers()),webhook 验证、线程→子代理路由、流式投递全内置。每个聊天线程一个独立子代理,防上下文串味。
agentTool(Researcher, ...) 一行把另一个 Think 实例挂成工具:子代理拥有自己的消息、流、工具与存储,父代理广播子时间线实时渲染。
getModel / getSystemPrompt / getTools / getScheduledTasks / maxSteps / sendReasoning / configureSession / getSkills…… 一个类即一个完整 Agent,可组合可覆盖。
examples/ 目录是可运行的自包含 demo。标 ⭐ 的是含金量最高的四个。
仓库 design/ 下 30+ 份决策记录:sub-agents、workspace、chat recovery、voice……"为什么"都在这里
github.com/cloudflare/agents/tree/main/design →"Pi 的可移植抽象不需要它的终端宿主——它们需要一组能力:持久身份、协调状态、文件、模型访问、流式、以及一种受约束的执行生成代码的方式。Cloudflare 提供了这些运行时。"