2026年代理模型平台的演进:Cloudflare Agents SDK与Flue框架
2026年,代理模型已进入生产阶段。随着Codex、Claude Code、OpenCode、Pi和Project Think等软件的成熟,团队们已将代理模型作为实际的、可承载的基础设施投入使用,而不仅仅是原型。
然而,构建能够在生产环境中稳定运行的代理仍然是一项挑战。在构建我们的首个代理框架<Project Think>的过程中,我们了解到了这一点。在与客户合作运行代理的过程中,我们发现每个代理在云环境中都面临一系列分布式系统问题:当代理中断时,如何能够自动且优雅地从中断处恢复而不丢失上下文或浪费令牌?代理如何安全地运行不受信任的代码?代理如何有效地使用其训练所需的工具?
单靠一个框架无法解决这些问题。这些问题与状态、存储和计算相关,这意味着它们依赖于代理运行的基础平台。因此,我们将对<Project Think>进行硬化的经验带入了<Cloudflare Agents SDK>,作为底层基础层,提供持久执行、动态代码执行、持久文件系统和动态工作流,任何基于Agents SDK构建的框架均可使用。
与此同时,一个新的层在框架之上出现了。像<Flue>这样的框架将一种项目结构、约定、集成和开发者体验捆绑到一个代理框架之中,使得构建代理更加高效。
为了应对这些扩展挑战,已经出现了新的三层架构,专为构建生产级人工智能而设计。各部分是如何组合的,从面向用户的开发体验到基础平台原语:
1. **框架 (Flue)** — 项目结构、约定、集成、CLI以及用于构建代理的开发者体验。
2. **框架 (Pi, Project Think)** — 代理循环,调用工具、读取结果、管理上下文,确保任务完成。
3. **运行时/平台 (Cloudflare Agents SDK)** — 所有上层依赖的计算、状态和存储原语。
Agents SDK就是这个底层:它为任何框架和任何代理框架提供原语,如持久执行。Flue,作为来自<Astro>团队的新开源框架,是第一个在其上构建的框架。以下是其相关内容。
### Flue
<Flue>本周发布了1.0 Beta,基于<Pi>框架构建,与<OpenClaw>相同。作为代理框架,它与众不同之处在于其方式:你并不是编写代理的操作,而是描述它所知道的内容。定义代理需要的上下文——模型、技能、沙箱和指令——代理就能自动解决你给出的任何任务,无需编写调度循环。
这种声明式模型使得编写代理变得简单:这是一个拦截错误报告的初步代理,它在沙箱中重现错误并在25行代码内诊断问题。

### Flue开发者体验
Flue的强大在于代理并非孤立存在。它们被设计为与用户的工作环境相结合,并与用户偏好的工具集成:
- **通用代理**:在Slack、GitHub、Linear或Discord中投放代理,预配置的通道自动处理事件验证和派发代码。
- **无头,但准备好UI**:代理不应躲在黑盒子中。Flue代理可以完全以无头形式运行用于后台任务,但<@flue/react>提供原生前端钩子,能够将代理的状态、工具执行和实时消息流入你的前端应用,而不需要你自己从头建立实时管道。
- **生态系统准备就绪**:Flue通过像`flue add channel slack`这样的命令,轻松添加和升级集成,生成Markdown蓝图,供你的代码代理读取、修改,并整洁地集成到你的代码库中。
### 设计用于生产,而不仅仅是原型
将代理从本地终端转移到生产环境也引入了传统的分布式系统故障。主机崩溃、LLM提供者的API超时和意外重启,都可能使正在运行的代理的短期记忆消失。
Flue通过持久流来解决这个问题。执行历史中的每个事件都被添加到一个仅附加日志中。通过处理每个提示、工具响应和模型选择作为不可更改的分类帐,代理的状态永远不会不稳定。如果某个进程崩溃,另一个进程可以接着日志继续执行。
### 随处部署,包括Cloudflare
Flue是一个多云框架。在<http://node.js/>上,每个代理作为持久进程运行。你可以将其部署到任何虚拟机或容器中,在GitHub Actions中运行,也可以嵌入到现有的服务器中。当你将目标设置为Cloudflare时,每个代理变成一个持久对象。
通过将每个Flue代理运行在自己的持久对象内部,Cloudflare可以自动扩展到所需的多个代理,每个代理都有自己的隔离存储和计算。你不必预置服务器、管理稳定会话或担忧喧闹的邻居。当Flue代理部署到Cloudflare时,它们经过Agents SDK的`runFiber()`、`stash()`和`onFiberRecovered()`方法实现持久执行。Flue还使用`@cloudflare/codemode`和`@cloudflare/shell`进行针对持久工作区的沙箱代码执行。
### 代理平台所需的关键功能
Flue对Cloudflare目标的有效工作源于它与Agents SDK内置的核心原语的清晰映射。你甚至可以<https://github.com/withastro/flue/blob/0fd59475d303d8e8d5bc184a9d3fc4ed58c0de93/packages/runtime/src/session.ts#L13>深入挖掘Flue源代码,以了解基础框架Pi是如何适应Cloudflare Agents SDK的。
以下是Flue如何在底层利用Agents SDK,以及在规模上可靠运行任何现代代理框架所需的条件。
- **每个代理框架需要持久执行**
代理的执行并不是一次性请求。模型流式发送令牌、调用工具、等待结果,可能还需要请求人工批准或委托给子代理。这个序列可能需要几秒或几分钟,任何时候过程都可能被中断或崩溃。发生这种情况时,所有存储在内存中的代理状态将丢失:流式连接、待处理工具调用、代理的执行进度。当然,对话历史会保存在磁盘上,但用户见到的是永远不能结束的加载状态。这将形成糟糕的用户体验。
通过提供内置的检查点机制,<a href="https://developers.cloudflare.com/agents/runtime/execution/durable-execution/"><u>Fibers</u></a>解决了这个问题。`runFiber()`在代理执行开始之前记录到持久对象的SQLite存储,并在执行进度中通过`stash()`进行检查点。当中断后启动新的代理实例时,`onFiberRecovered()`将传递最后的检查点,因此你的代理知道执行被中断了、进展到哪里,并可以决定如何继续。
```javascript
import { Agent } from "agents";
import type { FiberRecoveryContext } from "agents";
class MyAgent extends Agent {
async doWork() {
await this.runFiber("my-task", async (ctx) => {
const step1 = await expensiveOperation();
ctx.stash({ step1 });
const step2 = await anotherExpensiveOperation(step1);
this.setState({ ...this.state, result: step2 });
});
}
async onFiberRecovered(ctx: FiberRecoveryContext) {
if (ctx.name !== "my-task") return;
const { step1 } = (ctx.snapshot ?? {}) as { step1?: unknown };
if (step1) {
const step2 = await anotherExpensiveOperation(step1);
this.setState({ ...this.state, result: step2 });
}
}
}
```
Flue在其Cloudflare目标上使用`runFiber()`正是为了此。通过`onFiberRecovered()`钩子,您的框架可以决定如何恢复执行过程,无论是尝试修复执行状态的完整重建模型,还是重播某些执行环节。
#### 执行代码比给代理分配工具更好
代理框架为模型提供了访问外部世界的工具。然而,工具的表面迅速扩大,随着列表越来越长和上下文窗口充满工具定义,模型在选择正确工具方面的能力逐渐下降。一个更好的模式是:给模型一个可以执行代码的工具。模型编写调用所需API的TypeScript函数,由框架运行。我们在介绍<Code Mode>时曾提及过这个问题。
问题在于这些代码的执行环境。要安全地运行LLM生成的代码,你需要一个沙箱。但是,典型的沙箱在执行每个工具调用时会显得缓慢、成本高昂且低效。这就是为什么Agents SDK提供了`@cloudflare/codemode`,它封装了<Dynamic Workers>,在仅提供你所需绑定的工作中安全地执行LLM生成的代码。

Code Mode为每个代码片段创建一个新的动态工作器,运行后弃用。隔离启动时间低于10毫秒,每次加载费用仅$0.002,远远快于每次需要执行短代码时启动容器的成本。Flue在其Cloudflare目标上使用`@cloudflare/codemode`来支持其代码工具。代理在工作区内编写JavaScript并通过代码模式运行。
#### 多数工作区任务无需完整容器
代理框架通常需要文件系统,无论是读取文件、写入输出、搜索代码还是理解差异。编码代理尤其需要依赖文件系统。但是,如果框架在无服务器环境中运行,如何获得在执行间持久的文件系统?
通常的答案是使用容器。这可行,但对于代理来说,实际需求来说成本过高。代理执行中大多数文件系统操作都是文本的。例如一个审查代理,它读取文件、在源代码中查找或写入补丁,这并不需要完整的Linux启动。
`@cloudflare/shell`为你的代理提供持久的虚拟文件系统,存储在其持久对象中,后端存储为SQLite。它提供类型化文件操作——读取、写入、编辑、搜索、grep、diff——可供代理框架作为工具使用。
Flue代理在Cloudflare目标上,通过虚拟文件状态API编写JavaScript进行更多操作,避免了容器的开销,极大提高了执行效率:
```javascript
async () => {
const files = await state.glob("src/**/*.ts");
const results = [];
for (const file of files) {
const content = await state.readFile(file);
const todos = content.match(/\/\/ TODO:.*/g);
if (todos) results.push({ file, todos });
}
return results;
}
```
这为需要进行文件系统操作的代理提供了更快、更经济的沙箱环境。对于那些需要完整操作系统的代理来运行npm install、git或者编译器,Cloudflare Containers也提供了这样的需求。我们也在构建`@cloudflare/workspace`,以保持特定持久对象的虚拟文件系统与容器保持同步,允许在需要时无缝转换从轻量级Worker到Linux环境。
### 动态工作流:让代理编写自己的工作流以一致地重复任务
但当代理需要做的不仅仅是读取文件或执行单个代码片段时会发生什么?当它需要协调一个巨大的多步骤流水线,并且必须随时间一致重复时,比如成功解决错误的代码审查或产生良好结果的研究工作流程?一个框架不能单靠自身提供持久多步骤执行。它需要平台来保存每一步、重试失败并在中断后恢复。
这种模式正在获得关注。Claude Code最近发布的动态工作流功能,Claude在运行时编写一个JavaScript脚本,将工作交给数十个子代理,由运行时持久化执行。
`@cloudflare/dynamic-workflows`为任何在Agents SDK上运行的框架提供该功能。代理在运行时生成工作流,而工作流引擎持久保存每一步,重试失败,并可以长时间暂停或等待外部事件,如人工批准。
从Agent类,`runWorkflow()`连接你的代理与工作流引擎。代理启动工作流并可以进入待机模式。工作流通过RPC回调到代理以报告进度、更新状态或请求批准。当工作流完成时,代理便会唤醒并获得结果。
### 直接访问Cloudflare生态系统
除了计算和存储,代理框架需要访问外部能力:网络浏览、邮件、记忆、搜索、推理。一个框架不应为每个功能单独集成、管理API密钥或担心凭证在代理生成代码中泄露。
代理类通过<bindings>为你的框架提供访问Cloudflare的入口:<AI Gateway>用于每个代理的消费追踪和限制,<Browser Run>用于网页自动化,<Email Service>用于收件流程,<Agent Memory>用于持久记忆,<AI Search>用于检索,<Containers>用于需要完整操作系统的工作负载,以及在14个以上模型提供者中的推理。Bindings提供能力而不暴露凭证:你的代理能够使用它们,但密钥不会进入代理生成的代码。

### 将你的代理带入代理云
我们知道这种方法有效,因为它正是我们用来构建<Project Think>的确切架构基础,我们的首个代理框架。虽然<Project Think>依然是我们高优化的、即开即用的原生Cloudflare代理体验方案,但Agents SDK确保更广泛的开源生态系统能够利用那些经过实战考验的原语,包括Flue。
如果你今天使用Flue构建代理,你只需几次点击即可部署到Cloudflare。如果你正在构建自己的代理框架或代理,可以直接使用Agents SDK,免费获得平台集成。
- Agents SDK: [developers.cloudflare.com/agents](https://developers.cloudflare.com/agents)
- Flue: [flueframework.com](https://flueframework.com/), [npm install @flue/runtime](https://www.npmjs.com/package/@flue/runtime)
- Think: [docs](https://github.com/cloudflare/agents/blob/main/docs/think/index.md)
- Cloudflare社区: [community.cloudflare.com](https://community.cloudflare.com/)
---
原文链接:[点击查看](https://blog.cloudflare.com/agents-platform-flue-sdk/)
然而,构建能够在生产环境中稳定运行的代理仍然是一项挑战。在构建我们的首个代理框架<Project Think>的过程中,我们了解到了这一点。在与客户合作运行代理的过程中,我们发现每个代理在云环境中都面临一系列分布式系统问题:当代理中断时,如何能够自动且优雅地从中断处恢复而不丢失上下文或浪费令牌?代理如何安全地运行不受信任的代码?代理如何有效地使用其训练所需的工具?
单靠一个框架无法解决这些问题。这些问题与状态、存储和计算相关,这意味着它们依赖于代理运行的基础平台。因此,我们将对<Project Think>进行硬化的经验带入了<Cloudflare Agents SDK>,作为底层基础层,提供持久执行、动态代码执行、持久文件系统和动态工作流,任何基于Agents SDK构建的框架均可使用。
与此同时,一个新的层在框架之上出现了。像<Flue>这样的框架将一种项目结构、约定、集成和开发者体验捆绑到一个代理框架之中,使得构建代理更加高效。
为了应对这些扩展挑战,已经出现了新的三层架构,专为构建生产级人工智能而设计。各部分是如何组合的,从面向用户的开发体验到基础平台原语:
1. **框架 (Flue)** — 项目结构、约定、集成、CLI以及用于构建代理的开发者体验。
2. **框架 (Pi, Project Think)** — 代理循环,调用工具、读取结果、管理上下文,确保任务完成。
3. **运行时/平台 (Cloudflare Agents SDK)** — 所有上层依赖的计算、状态和存储原语。
Agents SDK就是这个底层:它为任何框架和任何代理框架提供原语,如持久执行。Flue,作为来自<Astro>团队的新开源框架,是第一个在其上构建的框架。以下是其相关内容。
### Flue
<Flue>本周发布了1.0 Beta,基于<Pi>框架构建,与<OpenClaw>相同。作为代理框架,它与众不同之处在于其方式:你并不是编写代理的操作,而是描述它所知道的内容。定义代理需要的上下文——模型、技能、沙箱和指令——代理就能自动解决你给出的任何任务,无需编写调度循环。
这种声明式模型使得编写代理变得简单:这是一个拦截错误报告的初步代理,它在沙箱中重现错误并在25行代码内诊断问题。

### Flue开发者体验
Flue的强大在于代理并非孤立存在。它们被设计为与用户的工作环境相结合,并与用户偏好的工具集成:
- **通用代理**:在Slack、GitHub、Linear或Discord中投放代理,预配置的通道自动处理事件验证和派发代码。
- **无头,但准备好UI**:代理不应躲在黑盒子中。Flue代理可以完全以无头形式运行用于后台任务,但<@flue/react>提供原生前端钩子,能够将代理的状态、工具执行和实时消息流入你的前端应用,而不需要你自己从头建立实时管道。
- **生态系统准备就绪**:Flue通过像`flue add channel slack`这样的命令,轻松添加和升级集成,生成Markdown蓝图,供你的代码代理读取、修改,并整洁地集成到你的代码库中。
### 设计用于生产,而不仅仅是原型
将代理从本地终端转移到生产环境也引入了传统的分布式系统故障。主机崩溃、LLM提供者的API超时和意外重启,都可能使正在运行的代理的短期记忆消失。
Flue通过持久流来解决这个问题。执行历史中的每个事件都被添加到一个仅附加日志中。通过处理每个提示、工具响应和模型选择作为不可更改的分类帐,代理的状态永远不会不稳定。如果某个进程崩溃,另一个进程可以接着日志继续执行。
### 随处部署,包括Cloudflare
Flue是一个多云框架。在<http://node.js/>上,每个代理作为持久进程运行。你可以将其部署到任何虚拟机或容器中,在GitHub Actions中运行,也可以嵌入到现有的服务器中。当你将目标设置为Cloudflare时,每个代理变成一个持久对象。
通过将每个Flue代理运行在自己的持久对象内部,Cloudflare可以自动扩展到所需的多个代理,每个代理都有自己的隔离存储和计算。你不必预置服务器、管理稳定会话或担忧喧闹的邻居。当Flue代理部署到Cloudflare时,它们经过Agents SDK的`runFiber()`、`stash()`和`onFiberRecovered()`方法实现持久执行。Flue还使用`@cloudflare/codemode`和`@cloudflare/shell`进行针对持久工作区的沙箱代码执行。
### 代理平台所需的关键功能
Flue对Cloudflare目标的有效工作源于它与Agents SDK内置的核心原语的清晰映射。你甚至可以<https://github.com/withastro/flue/blob/0fd59475d303d8e8d5bc184a9d3fc4ed58c0de93/packages/runtime/src/session.ts#L13>深入挖掘Flue源代码,以了解基础框架Pi是如何适应Cloudflare Agents SDK的。
以下是Flue如何在底层利用Agents SDK,以及在规模上可靠运行任何现代代理框架所需的条件。
- **每个代理框架需要持久执行**
代理的执行并不是一次性请求。模型流式发送令牌、调用工具、等待结果,可能还需要请求人工批准或委托给子代理。这个序列可能需要几秒或几分钟,任何时候过程都可能被中断或崩溃。发生这种情况时,所有存储在内存中的代理状态将丢失:流式连接、待处理工具调用、代理的执行进度。当然,对话历史会保存在磁盘上,但用户见到的是永远不能结束的加载状态。这将形成糟糕的用户体验。
通过提供内置的检查点机制,<a href="https://developers.cloudflare.com/agents/runtime/execution/durable-execution/"><u>Fibers</u></a>解决了这个问题。`runFiber()`在代理执行开始之前记录到持久对象的SQLite存储,并在执行进度中通过`stash()`进行检查点。当中断后启动新的代理实例时,`onFiberRecovered()`将传递最后的检查点,因此你的代理知道执行被中断了、进展到哪里,并可以决定如何继续。
```javascript
import { Agent } from "agents";
import type { FiberRecoveryContext } from "agents";
class MyAgent extends Agent {
async doWork() {
await this.runFiber("my-task", async (ctx) => {
const step1 = await expensiveOperation();
ctx.stash({ step1 });
const step2 = await anotherExpensiveOperation(step1);
this.setState({ ...this.state, result: step2 });
});
}
async onFiberRecovered(ctx: FiberRecoveryContext) {
if (ctx.name !== "my-task") return;
const { step1 } = (ctx.snapshot ?? {}) as { step1?: unknown };
if (step1) {
const step2 = await anotherExpensiveOperation(step1);
this.setState({ ...this.state, result: step2 });
}
}
}
```
Flue在其Cloudflare目标上使用`runFiber()`正是为了此。通过`onFiberRecovered()`钩子,您的框架可以决定如何恢复执行过程,无论是尝试修复执行状态的完整重建模型,还是重播某些执行环节。
#### 执行代码比给代理分配工具更好
代理框架为模型提供了访问外部世界的工具。然而,工具的表面迅速扩大,随着列表越来越长和上下文窗口充满工具定义,模型在选择正确工具方面的能力逐渐下降。一个更好的模式是:给模型一个可以执行代码的工具。模型编写调用所需API的TypeScript函数,由框架运行。我们在介绍<Code Mode>时曾提及过这个问题。
问题在于这些代码的执行环境。要安全地运行LLM生成的代码,你需要一个沙箱。但是,典型的沙箱在执行每个工具调用时会显得缓慢、成本高昂且低效。这就是为什么Agents SDK提供了`@cloudflare/codemode`,它封装了<Dynamic Workers>,在仅提供你所需绑定的工作中安全地执行LLM生成的代码。

Code Mode为每个代码片段创建一个新的动态工作器,运行后弃用。隔离启动时间低于10毫秒,每次加载费用仅$0.002,远远快于每次需要执行短代码时启动容器的成本。Flue在其Cloudflare目标上使用`@cloudflare/codemode`来支持其代码工具。代理在工作区内编写JavaScript并通过代码模式运行。
#### 多数工作区任务无需完整容器
代理框架通常需要文件系统,无论是读取文件、写入输出、搜索代码还是理解差异。编码代理尤其需要依赖文件系统。但是,如果框架在无服务器环境中运行,如何获得在执行间持久的文件系统?
通常的答案是使用容器。这可行,但对于代理来说,实际需求来说成本过高。代理执行中大多数文件系统操作都是文本的。例如一个审查代理,它读取文件、在源代码中查找或写入补丁,这并不需要完整的Linux启动。
`@cloudflare/shell`为你的代理提供持久的虚拟文件系统,存储在其持久对象中,后端存储为SQLite。它提供类型化文件操作——读取、写入、编辑、搜索、grep、diff——可供代理框架作为工具使用。
Flue代理在Cloudflare目标上,通过虚拟文件状态API编写JavaScript进行更多操作,避免了容器的开销,极大提高了执行效率:
```javascript
async () => {
const files = await state.glob("src/**/*.ts");
const results = [];
for (const file of files) {
const content = await state.readFile(file);
const todos = content.match(/\/\/ TODO:.*/g);
if (todos) results.push({ file, todos });
}
return results;
}
```
这为需要进行文件系统操作的代理提供了更快、更经济的沙箱环境。对于那些需要完整操作系统的代理来运行npm install、git或者编译器,Cloudflare Containers也提供了这样的需求。我们也在构建`@cloudflare/workspace`,以保持特定持久对象的虚拟文件系统与容器保持同步,允许在需要时无缝转换从轻量级Worker到Linux环境。
### 动态工作流:让代理编写自己的工作流以一致地重复任务
但当代理需要做的不仅仅是读取文件或执行单个代码片段时会发生什么?当它需要协调一个巨大的多步骤流水线,并且必须随时间一致重复时,比如成功解决错误的代码审查或产生良好结果的研究工作流程?一个框架不能单靠自身提供持久多步骤执行。它需要平台来保存每一步、重试失败并在中断后恢复。
这种模式正在获得关注。Claude Code最近发布的动态工作流功能,Claude在运行时编写一个JavaScript脚本,将工作交给数十个子代理,由运行时持久化执行。
`@cloudflare/dynamic-workflows`为任何在Agents SDK上运行的框架提供该功能。代理在运行时生成工作流,而工作流引擎持久保存每一步,重试失败,并可以长时间暂停或等待外部事件,如人工批准。
从Agent类,`runWorkflow()`连接你的代理与工作流引擎。代理启动工作流并可以进入待机模式。工作流通过RPC回调到代理以报告进度、更新状态或请求批准。当工作流完成时,代理便会唤醒并获得结果。
### 直接访问Cloudflare生态系统
除了计算和存储,代理框架需要访问外部能力:网络浏览、邮件、记忆、搜索、推理。一个框架不应为每个功能单独集成、管理API密钥或担心凭证在代理生成代码中泄露。
代理类通过<bindings>为你的框架提供访问Cloudflare的入口:<AI Gateway>用于每个代理的消费追踪和限制,<Browser Run>用于网页自动化,<Email Service>用于收件流程,<Agent Memory>用于持久记忆,<AI Search>用于检索,<Containers>用于需要完整操作系统的工作负载,以及在14个以上模型提供者中的推理。Bindings提供能力而不暴露凭证:你的代理能够使用它们,但密钥不会进入代理生成的代码。

### 将你的代理带入代理云
我们知道这种方法有效,因为它正是我们用来构建<Project Think>的确切架构基础,我们的首个代理框架。虽然<Project Think>依然是我们高优化的、即开即用的原生Cloudflare代理体验方案,但Agents SDK确保更广泛的开源生态系统能够利用那些经过实战考验的原语,包括Flue。
如果你今天使用Flue构建代理,你只需几次点击即可部署到Cloudflare。如果你正在构建自己的代理框架或代理,可以直接使用Agents SDK,免费获得平台集成。
- Agents SDK: [developers.cloudflare.com/agents](https://developers.cloudflare.com/agents)
- Flue: [flueframework.com](https://flueframework.com/), [npm install @flue/runtime](https://www.npmjs.com/package/@flue/runtime)
- Think: [docs](https://github.com/cloudflare/agents/blob/main/docs/think/index.md)
- Cloudflare社区: [community.cloudflare.com](https://community.cloudflare.com/)
---
原文链接:[点击查看](https://blog.cloudflare.com/agents-platform-flue-sdk/)
评论
暂无评论。