Devin ↗ 在其自己的服务中运行 Agent 循环。每个 session 都在一台机器上工作,Devin 在那里运行命令、编辑文件并打开浏览器。Devin Outpost 将该机器迁移到你选择的基础设施。Devin Outpost 模板会让每个 session 在自己的 Linux sandbox 中运行:由一个 Durable Object 为该 session 启动的 Container。
你需要:
- 有权管理 outpost 和服务用户的 Devin Enterprise 组织
- 可访问 Containers 的 Cloudflare Workers 付费计划账户
- 手动部署时需要 Node.js 24 ↗ 以及正在运行的 Docker ↗ daemon
-
打开 Devin 组织的 outpost 设置。在此 URL 中,将两处
my-org都替换为你的组织 slug:https://my-org.devinenterprise.com/org/my-org/settings/enterprise-environment?tab=outposts -
创建或选择一个 outpost,并复制其 outpost ID 以用于
DEVIN_OUTPOST_ID。 -
对于
DEVIN_API_TOKEN,请使用具有 Run outpost workers 权限的 Devin 服务用户 token。
关于 outpost 的更多信息,请参阅 Devin Outposts 概览 ↗。
Deploy to Cloudflare 按钮会创建 Worker、cron 触发器、Durable Object 命名空间和 container 应用。
部署流程提示时请输入这些值:
| 变量 | 值 |
|---|---|
DEVIN_OUTPOST_ID |
你的 Devin Outpost ID |
DEVIN_API_TOKEN |
具有 Run outpost workers 权限的 Devin 服务用户 token |
部署完成后,创建 Devin session 时从 Virtual environment 菜单中选择你的 outpost。
当你需要向 container 镜像添加依赖、工具或环境变量时,请手动部署。
-
从 Devin Outpost 模板创建项目:
npm create cloudflare@latest -- cloudflare-devin-outpost --template=cloudflare/sandbox-sdk/templates/devinyarn create cloudflare cloudflare-devin-outpost --template=cloudflare/sandbox-sdk/templates/devinpnpm create cloudflare@latest cloudflare-devin-outpost --template=cloudflare/sandbox-sdk/templates/devin -
进入项目目录并登录你的 Cloudflare 账户:
cd cloudflare-devin-outpost npx wrangler login -
在
wrangler.jsonc中,将空的DEVIN_OUTPOST_ID值替换为你的 outpost ID。默认的
DEVIN_API_URL是https://api.devin.ai/opbeta。仅当你的 Devin 环境使用其他 API URL 时才更改此值。 -
将 Devin API token 存储为 Worker secret:
npx wrangler secret put DEVIN_API_TOKENWrangler 提示时输入你的服务用户 token。不要将 token 添加到
wrangler.jsonc。 -
部署 Worker 和 container:
npm run deployWrangler 会构建 container 镜像并部署 Worker、container 应用和 cron 触发器。
-
使用 Wrangler 输出中的 Worker URL 检查部署:
curl https://<YOUR_WORKER>.workers.dev/Worker 会返回:
{ "service": "devin-outpost", "status": "ok" }
在 Devin 中创建 session,并从 Virtual environment 菜单中选择你的 outpost。Worker 默认每 10 秒检查一次新 session,因此 session 的 sandbox 会在你创建后不久启动。
cron 触发器每分钟运行一次 Worker。每次运行期间,Worker 每 10 秒向 Devin 查询你的 outpost 的 session,如果你设置了 DEVIN_RECONCILE_INTERVAL_MS 则使用该毫秒间隔。Worker 会将每个 session 的状态发送给该 session 的 Durable Object:
| Devin 状态 | 模板的行为 |
|---|---|
pending、running |
如果该 session 的 sandbox 未运行,则启动它;如果有 snapshot 则从 snapshot 启动。 |
suspended |
等待 Devin CLI 退出,保存 sandbox 的 snapshot,然后停止它。 |
terminated |
停止 sandbox 并忘记其 snapshot。 |
Durable Object 只负责启动和停止其 container。在 sandbox 内,Devin CLI(devin worker start)会领取 session 并运行它。
你的 Worker 通过 cron 触发器连接到 Devin 并列出 session。它将每个 session 发送到各自的 Durable Object,由后者启动和停止 container。container 中的 Devin CLI 连接到 Devin、领取 session 并运行它。到 Devin 的每条连接都从 Cloudflare 发起,因此没有入站连接。
当 Devin 挂起 session 时,Devin CLI 会退出。sandbox 会继续运行,直到 Durable Object 保存其磁盘的 snapshot。session 继续时,sandbox 会从该 snapshot 启动,Devin CLI 会再次领取该 session。snapshot 会保留 session 的文件和已安装软件包。它不会保留正在运行的进程。如果 Devin CLI 在 session 仍在运行时退出,模板会保存 snapshot 并从中启动新的 sandbox。
更多信息请参阅 使用 snapshot 保存并恢复 sandbox。
每个 session 都在自己的 container 中运行,不会与其他 session 共享文件或进程。在 container 内,Devin 以 root 运行,可以访问互联网,并持有 Devin API token。在 session 中运行的代码可以读取该 token。请为不得共享访问权限的每组用户部署单独的 outpost。
更多信息请参阅 Sandbox 安全。