capability 会为 Agent 添加可复用功能,例如 WebSocket 连接、计划任务或 Agent harness。你可以将它作为字段在 Durable Object 上构造,再通过 lifecycle.use() 将其附加到 Lifecycle。只安装应用所需的功能即可。
Durable Object 会在重启后保留存储的数据。若要继续被中断的工作,功能还需要保存进度,并安排对象再次唤醒。Durable Object 只有一个用于安排唤醒的 alarm。
Lifecycle 负责协调启动、事件分发和持久化任务队列。Capabilities 共享这些服务,因此每项功能都无需各自管理对象的 alarm 或启动流程。capability 可以:
- 在表中存储数据。 例如,
Scheduler会将计划存储在 SQLite 中。Capabilities 在同一数据库中使用不同的表名。 - 将工作安排为任务。 任务会记录稍后要运行的工作。Lifecycle 将任务存储在 SQLite 中、设置 alarm,并在任务到期时调用 capability 的
onJob()钩子。 - 处理匹配的请求。 例如,
MCPClientManager会在请求到达你的onRequest()之前处理其 OAuth 回调 URL。
每个 capability 只实现自己需要的钩子。
此示例在同一个对象中组合 Pi harness 和 scheduler:
flowchart TB
accTitle: Capabilities 共享 Durable Object 的存储和 alarm
accDescr: PiHarness 和 Scheduler 向 Lifecycle 提交作业;Lifecycle 将待处理作业存储在共享 SQLite 数据库中,并管理对象唯一的 alarm。
subgraph DO["一个 Durable Object"]
direction TB
P["PiHarness<br/>Agent 循环与恢复"] -->|"唤醒作业"| L
S["Scheduler<br/>计划回调"] -->|"计划作业"| L
L["Lifecycle<br/>启动、分发与作业队列"] -->|"设置下次唤醒"| A["一个 alarm"]
A -->|"调用"| L
P -->|"Pi 数据"| DB[("共享 SQLite 数据库")]
S -->|"计划"| DB
L -->|"待处理作业"| DB
end
两个 capability 都通过 Lifecycle 安排任务,不会覆盖彼此的 alarm。重启后,Lifecycle 会重新启动它们并分发到期任务。harness 或 capability 会读取已保存的状态,以决定如何继续。Lifecycle 不会自动保存任意 JavaScript 代码的执行进度。
Capabilities 会为 Agent 添加功能。安装前,请先检查 harness 或基类已经提供了什么。
| 你的起点 | 现有功能 | 需要配置的内容 |
|---|---|---|
| Pi 或 OpenCode | Agent 循环、对话存储和恢复 | 使用 harness 的会话和工具 API。应用其他功能时再添加 capabilities。 |
Agent |
WebSocket、共享状态、计划任务和 MCP 连接 | 使用现有的 Agent API。 |
Think 或 AIChatAgent |
Agent 提供的 capabilities,以及对话存储和流式传输 |
使用框架的对话 API。 |
| 普通 Durable Object | 你显式安装的 capabilities | 根据应用需求选择功能。 |
如果起点未提供所需功能,请使用以下 capabilities:
| 你想要…… | 使用 |
|---|---|
| 将浏览器客户端连接到 Agent | WebSockets |
| 使共享值与已连接的客户端保持同步 | State 搭配 WebSockets |
| 稍后运行回调或按周期重复运行 | Scheduler |
| 通过运行时管理 MCP 连接 | MCPClientManager。请先检查 harness 的 MCP 集成,例如 OpenCode 的 MCP 插件。 |
如果你要编写自己的 Agent 循环,可考虑使用 Sessions 保存对话历史,并使用 Streams 保存可重放的输出。
有关对话存储的建议,请参阅选择会话存储。
此对象组合 MCP 连接、计划回调、共享设置和 WebSocket 客户端:
import { DurableObject } from "cloudflare:workers";
import { Lifecycle } from "agents/lifecycle";
import { MCPClientManager } from "agents/mcp/client";
import { Scheduler } from "agents/schedules";
import { State } from "agents/state";
import { WebSockets } from "agents/websockets";
export class MyAgent extends DurableObject {
mcp = new MCPClientManager("my-agent", "1.0.0");
scheduler = new Scheduler({
callbacks: {
dailySummary: async () => {
for (const connection of this.webSockets.getConnections()) {
connection.send("Time for your daily summary");
}
},
},
});
settings = new State({
initialState: { model: "anthropic/claude-opus-5.5" },
onChanged: (_state, source) => this.webSockets.broadcastState(source),
});
webSockets = new WebSockets({ state: this.settings });
lifecycle = Lifecycle.install(this)
.use(this.mcp)
.use(this.scheduler)
.use(this.settings)
.use(this.webSockets);
}import { DurableObject } from "cloudflare:workers";
import { Lifecycle } from "agents/lifecycle";
import { MCPClientManager } from "agents/mcp/client";
import { Scheduler } from "agents/schedules";
import { State } from "agents/state";
import { WebSockets } from "agents/websockets";
type Settings = { model: string };
export class MyAgent extends DurableObject<Env> {
readonly mcp = new MCPClientManager("my-agent", "1.0.0");
readonly scheduler = new Scheduler({
callbacks: {
dailySummary: async () => {
for (const connection of this.webSockets.getConnections()) {
connection.send("Time for your daily summary");
}
},
},
});
readonly settings: State<Settings> = new State<Settings>({
initialState: { model: "anthropic/claude-opus-5.5" },
onChanged: (_state, source) => this.webSockets.broadcastState(source),
});
readonly webSockets: WebSockets = new WebSockets({ state: this.settings });
readonly lifecycle = Lifecycle.install(this)
.use(this.mcp)
.use(this.scheduler)
.use(this.settings)
.use(this.webSockets);
}将 capability 所需的内容(例如回调或另一个 capability)传给其构造函数。在此示例中,WebSockets 接收 State capability,以便将设置同步给客户端。
以下 capabilities 随 agents 包提供,且已趋于稳定:
| 能力 | 导入 | 作用 |
|---|---|---|
WebSockets |
agents/websockets |
接受来自 useAgent 和其他客户端的 WebSocket 连接 |
State |
agents/state |
存储一个经过验证的值,并通过 WebSockets 同步给客户端 |
Scheduler |
agents/schedules |
按延迟、指定日期、cron 表达式或时间间隔运行回调 |
MCPClientManager |
agents/mcp/client |
连接 MCP 服务器并在重启后保留连接 |
以下 capabilities 仍处于实验阶段,其 API 可能随版本变化:
| 能力 | 导入 | 作用 |
|---|---|---|
Streams |
agents/streams |
存储可供读取者重放和持续读取的增量输出 |
Sessions |
agents/sessions |
将对话历史存储为消息树 |
Queue |
agents/queue |
按推送顺序逐个运行后台回调 |
Tasks |
agents/tasks |
使用带有日志记录步骤的方式运行可重放的后台工作 |
RoutedAgents |
agents/routing |
维护独立 Agent 的目录,并将请求转发给它们 |
Browser |
agents/browser |
为 Agent 保持一个持久的 Browser Run 会话 |
例如 PiHarness 这样的 harness 是一种运行完整 Agent 循环的 capability。
如需编写自己的 capability,请参阅构建 capability。
- 在启动前安装。 在字段初始化器或构造函数中调用
use()。首次收到请求、alarm 或 WebSocket 消息时,Lifecycle 会启动;此后调用use()会抛出异常。 - 在 Lifecycle 之前声明字段。 类字段按顺序初始化。请在安装相应能力的
lifecycle字段之前声明每个能力字段。 - 每项能力只安装一次。 每项能力都有稳定 ID,例如
"scheduler"或"mcp"。ID 用于区分其作业和事件;重复安装时,use()会抛出异常。 - 启动顺序。 启动时,Lifecycle 按安装顺序运行每项能力的
onStart(),并将兜底能力放在最后。随后运行你自己的onStart()。 - 请求顺序。 Lifecycle 会在调用你的
onRequest()之前,按安装顺序将每个请求交给各项能力处理。WebSockets会接受所有 WebSocket 升级请求,因此始终最后运行。更多信息,请参阅请求分发。 - 共享闹钟。
Scheduler等需要稍后执行工作的能力,会将工作存储为 Lifecycle 作业,因此不会覆盖彼此的闹钟。 - 宿主上下文。 你注册的回调(例如
Scheduler回调、WebSockets处理程序和可调用函数)会在对象的上下文中运行;在此上下文中,getCurrentAgent()会返回该对象。 - RPC。 原生 Durable Object RPC 会绕过
fetch(),因此不会启动 Lifecycle。对于使用能力的 RPC 方法,请在方法开头调用await this.lifecycle.start()。
Agent 类是一个预设:它是已安装 Lifecycle 和多项能力的 Durable Object,包括 Scheduler、State、WebSockets 和 MCPClientManager。this.schedule()、this.setState() 和 this.addMcpServer() 等方法会调用这些能力。
如需为 Agent 添加其他能力,请在其构造函数中调用 this.lifecycle.use()。请勿重复安装 Agent 已有的能力,否则 use() 会因 ID 重复而抛出异常。