Cloudflare Computer celld示例实战:Celld JavaScript运行时上的聊天Agent(完整教程)
【免费下载链接】computerGive your agent a computer 👾项目地址: https://gitcode.com/GitHub_Trending/computer1/computer
Cloudflare Computer是一个把虚拟文件系统装进 Durable Object 的持久化工作区项目,口号就是 "Give your agent a computer 👾"。本文带你实战它的celld 示例:一个运行在 Celld JavaScript 运行时上的聊天 Agent——Agent 拥有持久化工作区(Workspace),能用 8 个文件工具读写自己的文件,还能在隔离的 Dynamic Worker 里执行 JavaScript 模块,全程只需一个终端就能跑起来。
为什么这个 celld 示例值得看
大多数 Agent 示例都依赖容器或重型运行时,而 celld 示例展示了一条"轻"路线:
- 只依赖一个 Durable Object:聊天历史和工作区文件存在同一个 SQLite 数据库里,没有额外存储;
- 不写 RPC 接口:Agent 通过 src/index.ts 中的
withWorkspace混入直接获得工作区能力; - 终端即客户端:用 AI SDK TUI 做聊天界面,一条
npm run chat命令进入对话。
注意:该示例是原型(Prototype),当前 celld 为 v0.1.0 级别,适合学习和实验。
celld 聊天 Agent 架构解析
整体数据流非常简单:
终端(npm run chat) │ AgentClient WebSocket ▼ /agents/celld-agent/<name> ▼ CelldAgent(AIChatAgent + withWorkspace) ├─ 聊天历史(SQLite) ├─ @cloudflare/computer Workspace(同一 SQLite) │ └─ read / ls / find / grep / write / edit / delete 工具 ├─ celld-javascript 运行时后端 │ └─ 当 env.LOADER 可用时提供 exec 工具 └─ Cloudflare Workers AI(REST API)关键设计点:
- 单对象持久化:
CelldAgent同时是聊天对象和工作区宿主,--name每指定一个新名字,就多一个独立的 Agent 实例(独立历史 + 独立工作区); - 工具由框架生成:src/index.ts 中
onChatMessage()调用getWorkspace(this)拿到 Workspace,再传给createAITools()(源码见 packages/computer/src/tools/ai.ts),模型的工具循环自动获得全部文件工具; - 执行后端可插拔:只有当 celld 注入了
env.LOADER时才注册celld-javascript后端,实现见 src/celld-javascript-backend.ts。
快速上手:5步跑通聊天Agent
仓库地址:https://gitcode.com/GitHub_Trending/computer1/computer
第一步:安装 celld 并确保 PATH 可用
curl -fsSL https://celld.dev/install.sh | sh export PATH="$HOME/.local/bin:$PATH" celld --versioncelld deploy还需要esbuild在 PATH 中,安装本仓库依赖后它就在node_modules/.bin里。
第二步:安装依赖并构建工作区包
工作区包通过dist目录解析,部署前必须先构建:
npm install npm run build --workspace @cloudflare/computer export PATH="$PWD/node_modules/.bin:$PATH"第三步:配置 Cloudflare 凭据
celld 不提供托管的 Workers AI 绑定,Agent 直接用账户 ID + API Token 调 Workers AI REST API。创建具有 Workers AI 读权限的 API Token 后:
export CLOUDFLARE_ACCOUNT_ID=<account-id> export CLOUDFLARE_API_TOKEN=<api-token>⚠️ Token 只放在本地环境变量里,不要写进 wrangler.jsonc 等被跟踪的文件。
第四步:启动本地服务
npm run dev:local --workspace @example/computer-celld这一步(由 script/local-dev.mjs 驱动)会自动:启动本地 S3 兼容 shim(script/local-s3-shim.mjs)、部署 Worker、启用 celld Worker Loader 作为env.LOADER,并监听http://127.0.0.1:8080。
第五步:打开终端聊天
另开一个终端:
npm run chat --workspace @example/computer-celld想给 Agent 起独立身份:
npm run chat --workspace @example/computer-celld -- --name demo聊天客户端是 cli/chat.mjs,支持--worker URL、--name NAME、--title TITLE三个参数,也可作为celld-chat命令使用。
聊天Agent能做什么:8个Workspace工具
Agent 通过@cloudflare/computer/tools自动获得这些工具:
| 工具 | 用途 |
|---|---|
read | 读取工作区文件 |
ls | 列出目录 |
find | 按路径查找 |
grep | 搜索文件内容 |
write | 创建或替换文件 |
edit | 做定向替换修改 |
delete | 删除文件或目录 |
exec | 在 celld Dynamic Worker 中执行 ECMAScript 模块(仅当env.LOADER注入时存在) |
这些工具直接操作CelldAgent拥有的 Workspace,因此文件操作是完整可用的。
exec 工具使用要点:只能跑完整模块
exec不是"跑一个文件名"或"跑一段脚本",它要求传入一个完整的 ECMAScript 模块源码,并且必须有默认导出。导出的函数会收到(input, ctx)两个参数,ctx里包含env、cwd、stdin:
export default async function main(input, ctx) { console.log("cwd:", ctx.cwd); return { received: input }; }两个新手常见的"坑"要知道:
- 隔离区看不到文件系统:
ctx.cwd只是元数据,目录并未挂载进 Dynamic Worker,ctx.fs方法会直接抛错。需要文件操作时,用read/write等工具在exec外部完成; - 输出不是流式的:结果会缓冲到执行结束才返回,而非实时流式打印。
快速验证:一条命令的冒烟测试
不确定链路通没通?跑一下非交互的 WebSocket 冒烟测试:
npm run smoke --workspace @example/computer-celld它会通过 Agents WebSocket 协议发一条消息,并要求回复里包含celld smoke reply(可用CELLD_PROMPT/CELLD_EXPECT自定义,实现见 script/smoke.mjs)。
文件导读
| 文件 | 作用 |
|---|---|
| examples/celld/README.md | 示例完整说明 |
| examples/celld/src/index.ts | 聊天 Agent 与 Worker 入口 |
| examples/celld/src/celld-javascript-backend.ts | celld Worker Loader 运行时后端 |
| examples/celld/cli/chat.mjs | AI SDK 终端聊天客户端 |
| examples/celld/wrangler.jsonc | celld 支持的 Worker 配置(含 Durable Object 定义) |
| examples/celld/script/local-dev.mjs | 本地部署与启动脚本 |
总结
celld 示例用最小依赖演示了 Cloudflare Computer 的核心思想:SQLite 是文件系统的唯一真相源,执行运行时是可插拔的。把 Celld JavaScript 运行时接进来之后,一个聊天 Agent 就同时拥有了持久记忆(聊天历史)、持久工作区(文件工具)和隔离执行能力(exec)。如果你想对比其他运行时,可以继续看 examples/think-compare-runtimes/ 里"同一任务在多运行时并行对比"的示例。
【免费下载链接】computerGive your agent a computer 👾项目地址: https://gitcode.com/GitHub_Trending/computer1/computer
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考