Hotdry.
ai-systems

Cloudflare Agents 开发框架与 Durable Objects 状态管理工程实践

深度解析 Cloudflare Workers 平台上构建 AI Agent 的开发框架,聚焦 Durable Objects 有状态编排与工具绑定的工程实现参数。

当我们讨论边缘计算平台的 AI Agent 部署时,Runtime 层面的架构分析固然重要,但开发者的实际关注点往往更贴近工程实现:如何在 Workers 平台上快速构建一个具有持久状态的 Agent?Durable Objects 的事务模型怎样支撑多轮对话与工具调用?本篇文章将从开发框架、状态管理、工具绑定三个维度,拆解 Cloudflare Agents 的工程化实践路径。

Agent 抽象:持久化执行单元的设计理念

Cloudflare Agents 的核心抽象建立在一个简单但强大的前提之上:每个 Agent 是一个独立的持久化执行单元,由 Durable Objects 底层能力驱动。与传统 Serverless 函数的「无状态 — 请求 — 销毁」模式不同,Agent 实例在 Idle 状态下会进入 Hibernate 状态以节省资源,但状态不会丢失;当新请求到来时,实例被唤醒并恢复执行上下文。这种设计使得构建「每个用户一个 Agent」或「每个会话一个 Agent」的架构成为可能,且在零活跃请求时不产生计算成本。

从代码层面看,开发者通过继承 Agent 基类并定义初始状态来声明一个 Agent。状态类型必须是可序列化的 TypeScript 类型,Agent 实例通过 this.state 访问当前状态,通过 this.setState() 更新状态。状态变更会自动同步到所有连接的客户端,这是通过内置的 WebSocket 通道实现的。前端开发者可以使用 useAgent React Hook 获取状态更新,状态变化时组件会自动重渲染,无需手动处理同步逻辑。

这种架构的优势在于:状态与逻辑在同一执行单元内共置,避免了传统架构中状态存储与业务逻辑分离带来的网络开销和一致性问题。对于 AI Agent 场景,这意味着对话历史、推理中间结果、工具调用上下文都可以保持在内存级访问延迟。

状态分层:热数据与冷数据的边界划分

虽然 Durable Objects 提供了 colocated SQLite 和 KV 存储,但并非所有数据都适合放在 Agent 实例内部。根据 Cloudflare 官方架构建议和社区实践,状态管理应遵循「热数据内联、冷数据外置」的分层原则。

热数据层保留在 Durable Object 内存中,包括:最近 N 轮对话摘要(通常窗口大小控制在 10–20 轮,视模型上下文窗口而定)、当前推理链的工作记忆、短期锁与协调状态、多客户端同步的实时数据。这类数据需要毫秒级访问延迟,且生命周期与单个会话强绑定。

冷数据层应卸载到外部存储:完整对话历史(超过窗口阈值后归档)、向量索引与 RAG 上下文、全局共享知识库、跨会话的用户画像。归档策略通常基于时间窗口或 Token 计数:当对话轮次超过阈值时,Agent 将早期消息序列化并推送至 D1(SQLite)或 R2(对象存储),同时在内存中保留压缩后的摘要。

工程实践中有两个关键参数值得关注。第一是状态窗口大小,建议根据目标模型的上下文窗口动态调整 —— 若使用 128K 上下文窗口的模型,热数据可保留 30–50 轮对话;若使用 8K 窗口模型,则控制在 8–12 轮。第二个参数是归档触发阈值,通常设置为窗口大小的 80%,以避免边界情况下的频繁归档操作。

工具绑定:@callable 装饰器与 MCP 集成

Cloudflare Agents 提供了两种工具绑定范式,分别对应不同的使用场景。

第一种是内置 @callable 装饰器。开发者通过在方法上标注 @callable(),将该方法暴露为 Agent 的远程过程调用入口。前端或外部系统可以通过 Agent Client 像调用本地函数一样调用这些方法,框架自动处理参数序列化、请求路由和结果返回。这种方式适合需要严格类型保证的工具定义场景,例如数据库操作、API 调用、业务逻辑封装。

第二种是MCP(Model Context Protocol)集成。Cloudflare Agents 既可以作为 MCP Server 向 LLM 暴露工具能力,也可以作为 MCP Client 调用外部 MCP Server 的工具。这意味着 Agent 可以动态获取文件系统访问、数据库查询、Webhook 调用等能力,而无需在代码中硬编码所有工具实现。官方示例中展示了 Agent 扮演 MCP Server 角色,向 Claude 等模型提供自定义工具定义的能力。

对于需要 LLM 自行决策调用哪些工具的场景,@cloudflare/ai-chat 包提供了更高级的抽象。它封装了消息持久化、可恢复流式输出、Server/Client 两侧工具执行等能力,开发者只需配置工具列表并启动聊天循环,框架会自动处理模型调用、工具执行结果回填、上下文累积等复杂流程。

有状态编排:多 Agent 协作与工作流

单个 Agent 的能力受限于模型上下文窗口和工具集,当任务复杂度提升时,需要引入多 Agent 协作架构。Cloudflare Agents 支持两种主要编排模式。

串行编排适用于顺序执行的任务链:Planner Agent 接收用户请求,生成任务分解,然后将子任务依次委托给执行 Agent。每个执行 Agent 是独立的 Durable Object,拥有自己的状态和工具集。Planner 通过 Durable Object 间的 RPC(使用 id.get() 获取目标对象并发送请求)协调执行流程。

并行编排适用于可独立处理的子任务:Orchestrator Agent 将任务分发给多个 Worker Agent 并行执行,最后汇总结果。这种模式充分利用了边缘网络的低延迟优势 —— 所有 Worker Agent 可能运行在同一个数据中心,跨对象通信延迟通常在个位数毫秒级。

对于需要人工介入的工作流,官方提供了 Human-in-the-Loop 模式。Agent 在关键决策点暂停执行,等待人类审批后恢复。实现方式是 Agent 内部维护一个 paused 状态,并通过 WebSocket 或 Email 通道向人类审批者发送请求,审批结果通过回调接口回填后继续执行。

边缘推理:Workers AI 与外部模型的接入

Agent 的推理能力依赖于 LLM 调用。Cloudflare Agents 支持两种模型接入方式。

一是Workers AI 内置模型。通过 @cloudflare/ai-chat 包可以直接调用 Cloudflare 托管的模型(如 @cf/meta/llama 系列),优势是网络路径最短 —— 推理请求从 Durable Object 发出后直接在 Cloudflare 内部网络流转到 AI Gateway,延迟可控制在 100ms 以内(取决于模型和请求复杂度)。

二是外部模型接入。通过 OpenAI、Anthropic 等官方 SDK 或自定义 HTTP 调用,Agent 可以接入任何符合 OpenAI Compatible API 的模型。这种方式灵活性更高,但需要关注两个工程参数:超时阈值(建议流式响应超时设置在 60–120 秒区间)和重试策略(指数退避,上限 3 次)。

对于需要高并发或多模型路由的场景,建议在 Control Plane 层(独立于 Data Plane Agent)实现模型选择逻辑:根据请求特征、用户配额、模型负载等因素动态决定使用哪个模型,并将选型结果通过配置下发或运行时查询的方式提供给 Agent。

监控与可观测性:生产部署的关键指标

将 AI Agent 部署到生产环境时,需要关注几类核心指标。

运行时指标:Agent 实例数量(通过 Durable Objects 仪表盘)、平均唤醒延迟(从请求到首字节返回的时间)、Hibernate 命中率(Idle 实例占比)。这些指标直接反映成本效率和系统弹性。

业务指标:对话轮次分布、工具调用成功率、平均响应延迟、多 Agent 协作任务的完成率。建议为每个 Agent 实例添加结构化日志,输出关键决策点和工具调用结果,便于事后分析。

资源指标:SQLite 存储用量(每个 DO 有 1GB 上限)、KV 操作计数、网络出站流量。对于高并发场景,需要监控存储配额使用情况,避免接近上限时触发写入失败。

整体而言,Cloudflare Agents 提供了一套完整的边缘 Agent 开发框架,其核心理念是将状态、逻辑、协作能力封装在 Durable Object 抽象中,让开发者专注于业务逻辑而非基础设施运维。对于需要低延迟、高并发、且希望按需付费的 AI 应用场景,这是一套值得深入评估的技术选型。

资料来源:GitHub cloudflare/agents 官方仓库 及 Cloudflare 开发者文档。

查看归档