Crewlet · 基建提案

中心化 Agent + 动态 Sandbox 架构

从 per-tenant VM 到 ephemeral compute · 让 onboarding 从分钟级降到秒级

STATUS · DRAFT DATE · 2026-05-11 AUTHOR · Engineering
TL;DR
把 Crewlet 从"每个用户一台 Fly VM 装 agent + frontend + sandbox"的整体式架构,重构为 中心化 stateless agent + 按需启停的 sandbox service + 持久化共享存储 的三层解耦模型。 Onboarding 不再阻塞在 VM 配置上,免费用户零基建成本,付费用户拿到稳定私有环境。 Anthropic 在自己的 managed agents 实践中走的也是同一条路。

01当前架构的问题

现在每接入一个新用户,都要在 Fly.io 上配一台 VM,里面装着 agent loop、tenant 前端、所有持久化状态。 这套结构把前端、agent、工具执行、持久化四种关注点强行打包在一个进程里, 任何一层的故障会击穿整层。更要命的是它把 onboarding 流程拉长到了无法接受的程度—— 用户注册到第一次看到 Crewlet 的价值之间,隔着一次基建配置。

User A User B FLY VM · TENANT A tenant-web (Frontend) apps/crewlet · Agent Loop + WS Plugins · Tools · Shell exec Session · Memory · Skills · Cron FLY VM · TENANT B tenant-web (Frontend) apps/crewlet · Agent Loop + WS Plugins · Tools · Shell exec Session · Memory · Skills · Cron CONSOLE-API · 工作区控制面 Credential Proxy (因为 Fly VM 不可信) Workspaces · OAuth · Billing
FIG 1当前架构 · 每用户一台 VM,前端 / agent / 工具 / 持久化全部打包

02Anthropic 的范式 · Brain · Hands · Session

Anthropic 在他们自己的 Claude managed agents 平台上踩过完全一样的坑:单容器把一切打包在一起, 故障即灾难、调试不可能、每个 session 都吃完整的初始化成本。他们的总结值得直接抄。

"If a container failed, the session was lost. Failures became catastrophic. Every session paid full initialization costs upfront."
— Anthropic Engineering · Managed Agents

他们的解法是把 agent 基建解耦成三个独立抽象—— Brain(agent + harness,stateless,可随时唤醒)、 Hands(sandbox/工具,作为通用 execute(name, input) 接口)、 Session(durable 事件日志,活在 Claude context window 之外)。 三层之间不互相假设对方的存在位置。

关键收益:移除强制 container 初始化之后, time-to-first-token 提升 ~60% (p50)、90%+ (p95)。这跟我们 onboarding 的痛点直接对应。

BRAIN
Agent
→ 中心化部署
Stateless agent loop。所有用户共用同一集群。崩了直接 wake(sessionId) 续上。
HANDS
Sandbox
→ Sandbox Service · 按需
Ephemeral compute。Cattle, not pets。session 完了即销毁,下次重建。
SESSION
Persistent State
→ Postgres + Shared Storage
结构化数据进 Postgres,agent 工作 fs 进共享存储。活在 sandbox 之外。

03新架构 · 三层解耦

Users FRONTEND → Vercel / CF Pages app.crewlet.dev /content (Tier 1) /workspace (Tier 2) BRAIN · AGENT SERVICE → Stateless cluster Agent loop (streamText) Tool registry · LLM call OAuth · External APIs HANDS · SANDBOX → Sandbox Service Sandbox · Tenant X Sandbox · Tenant Y on-demand spin-up SESSION · PERSISTENT STATE → 活在 sandbox 之外,跨会话 / 跨故障保留 POSTGRES · 结构化业务数据 workspaces · biz_profiles proposals · conversations · sessions SHARED STORAGE · agent fs memory · skills · session JSONL subpath / volume mount per workspace read / write mount
FIG 2新架构 · 前端 / 中心 agent / sandbox / 持久化 各自独立伸缩

各层职责

原语设计 · 借鉴 Claude Managed Agents

上面是高层职责划分,每一层内部应该长什么样则参考 Anthropic 自家的 Claude Managed Agents 平台。 他们把 agent 系统拆成四个独立可寻址的概念,每个都是干净边界。 我们不直接用他们的服务(绑死 Claude + Beta + plugin 要全改 MCP),但抄这种切法。

Claude Managed Agents 原语 我们的实现对应 带来的好处
Agent
model + system prompt + tools + MCP + skills
Postgres agents 表 + 中心 service 的 tool registry 同一 agent 定义跑在不同 environment 上 · 一次配置 N 次复用
Environment
容器模板 · packages · network · mounts
Sandbox image + 启动参数(Postgres environments 表) Tier 1 / Tier 2 用不同 env · 重度任务换大 env · 不需要为不同任务维护不同 agent
Session
运行中的 agent 实例 + 持久化 state
Postgres sessions + 共享存储 subpath 跨 sandbox 实例 resume · 中心服务崩了不丢 · 可中断 / steer
Events
SSE 双向流(user turn · tool result · status)
WebSocket 流 + Postgres 事件日志(append-only) 客户端断线重连不丢 token · 历史完全可回放 · agent 步骤可观测

这种拆法的本质:每个原语都是数据,独立寻址、版本化、复用。 今天 crewlet 把 agent 配置、environment、session state 全部塞在同一个进程里, 改一个要重启整套。四原语模型彻底解开这个绑死。

额外值得借鉴的实现细节

04对比 · Onboarding 时序与成本

架构差异最直接的体现在用户 onboarding 上。下图把"新用户从填表到看到第一个 Proposal"这条路径放在同一条时间轴上对比。

0s 30s 60s 90s 120s ~3min 现状 Fly VM 注册 VM 配置 + 拉镜像 + 初始化 前端加载 填表 Agent 调研 + Proposal first value 新架构 Sandbox 注册 即时 填表 sandbox Agent 调研 + Proposal (streaming) first value ─── 用户在等 VM ─── ─── 用户在跟 agent 互动 ─── 用户感知到的操作 基建配置等待 后台异步任务(用户无感)
FIG 3Onboarding 时序对比 · 新架构把基建等待移出关键路径

关键不是"总时长缩短了多少秒",而是把基建等待从用户感知的关键路径上移出去了。 新架构里用户始终在"做事"——填表、看 streaming,sandbox 拉起在后台跑。

每用户成本对比

$0 $2 $4 $6 $8+ ~$8 ~$0.01 免费试用用户 ~$5 ~$5 付费用户 (1h/天) ~$7 ~$10 付费用户 (8h/天) Fly VM Sandbox 单位:美元 / 用户 / 月 不含 LLM、Postgres 成本
FIG 4每用户基建成本对比 · 免费用户从 ~$8 → ~$0,付费用户基本持平或略涨

免费用户那一栏是决胜负的地方。今天的模型一台 VM ≈ $5 长期占用 + 维护成本, 而漏斗转化率通常是 5–10%。新模型让免费用户的基建成本压到接近 0(按需 ephemeral + 共享存储免费/极低成本), 让我们可以放心地把试用入口做宽。付费用户成本基本持平,本来就该花的钱。

05Tier 1 / Tier 2 · 同一套基建,两种产品形态

这套架构同时支持两种产品形态,共用同一个 agent loop 代码,区别只在 sandbox 生命周期和工具集。

注册 day 0 day 3 day 7 · 付费 → Tier 2 Tier 1 ephemeral session session session subpath: tier1/{workspace_id} (持久) Tier 2 long-lived always-on (15min auto-stop) 付费瞬间 subpath: tier1/ → tier2/ 数据零迁移(workspace_id 不变) Sandbox 实例 共享存储 subpath
FIG 5Tier 1 / Tier 2 sandbox 生命周期 · 转化时仅 subpath 变更,无数据迁移
Tier 1 · 免费试用 Tier 2 · 付费私有环境
入口 /content · Content Generation 完整 Crewlet workspace
用户操作 填表单 → 看 Proposed Actions 持续接入 integrations · 执行 actions
Sandbox 模式 Ephemeral · 跑完即删 Long-lived · 15min auto-stop
共享存储 subpath tier1/{workspace_id} tier2/{workspace_id}
Compute 成本 ~$0.01 / session $3 ~ $10 / 用户 / 月
容忍延迟 1–2 min agent 调研 异步执行无强约束

转化的瞬间

Workspace ID 从用户首次注册就发。Tier 1 阶段所有数据都以这个 workspace_id 落 Postgres + 共享存储 subpath。 付费时只是给同一个 workspace 把 sandbox 模式从 ephemeral 切到 long-lived、subpath 从 tier1/ 迁到 tier2/不存在"数据迁移"

06对 Sandbox Service 的需求清单

先不绑定具体供应商。这套架构对 sandbox service 层有以下硬需求和软需求,据此对市面方案打分。

硬需求

软需求

候选供应商

方案 核心机制 启动量级 风险
Daytona 容器 + FUSE volume ~90ms warm pool FUSE 不适合 block storage (SQLite 风险)
E2B Firecracker microVM ~150ms 创建 持久化模型较弱
Fly Sprites Firecracker + NVMe checkpoint/restore ~300ms 较新 · 跟现有 Fly 账号关系待评估
Blaxel microVM + 内存 snapshot resume ~25ms 较新 · 价格不透明
Modal Function as compute sub-second cold start 更偏向 task runner,sandbox 抽象较弱
自建 Firecracker 可控 工程量巨大,违背项目初衷
选型决策延后
供应商选型不在本文档内拍板。P0 PoC 用 2–3 个候选方案跑同一个测试脚本, 实测启动延迟、volume 持久化、SQLite over FUSE 性能(如果用 FUSE 方案),再做决策。 架构本身不绑定任何具体供应商。

07迁移路径

分阶段,最小可发布优先,每阶段独立可验证。

阶段 交付 范围
P0 Sandbox provider PoC。30 行脚本验 ephemeral + 持久存储 + 多租户隔离 + 启动延迟分布。在 2–3 个候选供应商上跑同一组测试,得出 p50/p95 数据再选型。 ~1 周
P1 Tier 1 · Content Generation MVP。新 /content 入口、中心 agent service、ephemeral sandbox 集成、复用现有 crewlet agent loop。Postgres schema(workspaces / proposals / biz_profiles)。 ~3-4 周
P2 转化漏斗。Tier 1 → Tier 2 升级流程、付费、long-lived sandbox 模式、workspace_id 不变。 ~2 周
P3 Plugin 系统接回。Slack / GitHub / PostHog / Vercel 等 integrations 在中心服务直调(删除 credential proxy)。 ~2-3 周
P4 老 Fly VM 用户迁移或下线。视存量决定平行运行或一次性迁移。 视情况

P0 是必经的卡口。Sandbox provider 选型 / 性能假设 / 持久化机制三件事在 P0 里同时验证, 不通过则 P1 的部分子系统(特别是 memory)走 fallback 方案。

08待决策 · 开放问题

  1. Tier 1 agent 工具集边界。研究 agent 只用 read_file / write_file / web_search / save_proposal,还是也要 memory tools?决定 PoC 是否要测某种形式的向量库 over 网络存储。
  2. Tier 1 用户回访的 fs 保留策略。无限保留?30 天后清理 subpath?这是产品决策。
  3. Frontend 部署目标。Vercel vs Cloudflare Pages?决定 build pipeline。
  4. Postgres 托管选型。Supabase 继续?还是换 Neon / RDS?
  5. 老 Fly VM 用户的迁移承诺。是否做兼容层让现有付费用户透明切换。
  6. Sandbox provider 最终选型。基于 P0 实测结果决定(见 §06 候选清单)。
  7. 是否将 plugin 改造为 MCP server 形态。短期不动,但长期方向需要早表态——影响 Tier 2 plugin 接入设计。