引言
"Give agents an operating system as a library. 92x faster cold starts, 47x less memory, 254x cheaper than sandboxes."
这是「每日一个开源项目」系列的第 172 篇 。今天的项目是 agentOS ------ 一个以 npm 库形式发布的 AI agent 运行时,让你在自己的 Node.js 后端里运行 AI coding agent,不需要启动任何外部沙箱、微VM 或容器。
给 AI agent 一个「执行环境」的问题正在变成基础设施问题:E2B、Daytona、Modal 这些沙箱服务的冷启动通常在几百毫秒到几秒,每个实例至少 1GB 内存,按分钟计费。agentOS 的切入点是:如果 agent 的 VM 是用 V8 隔离 + WebAssembly 实现的,而不是一个完整的 Linux 环境,那么这个 VM 可以嵌进你的进程里,冷启动几毫秒,几十 MB 内存,成本降低两个数量级。
4,265 颗 Star,Apache 2.0,由 Rivet Dev 维护。
你会学到什么
- agentOS 的 VM 隔离模型:V8 隔离 + WebAssembly,和完整沙箱的核心差异
- 性能基准:与 E2B、Daytona 的冷启动/内存/成本对比数据
- 核心功能:bindings、文件系统挂载、权限控制、session via ACP
- 内置 agent 支持:Pi、Claude Code、Codex、OpenCode
- 什么场景适合 agentOS,什么场景需要完整沙箱
前提知识
- 了解 Node.js/TypeScript 基础
- 对 AI agent 工具调用有基本认知
- 了解 V8 或 WebAssembly 的概念会有帮助,但不是必须的
项目背景
概述
agentOS 是一个 npm 包(@rivet-dev/agentos),安装后你可以在 TypeScript/Node.js 代码里直接创建 VM 实例,在 VM 里运行 AI agent,agent 通过 bindings 直接调用你定义的 JavaScript 函数,不需要网络跳转。
架构决策:每个 VM 用一个信任的 sidecar 进程拥有自己的「内核」------ 虚拟文件系统、进程表、管道、PTY、虚拟网络栈。所有 guest 的 syscall 都通过这个 sidecar 代理,不直接接触宿主机。guest JavaScript 跑在 V8 isolate(全 JIT 加速),编译工具跑为 WebAssembly。多个 VM 共享一个 sidecar 进程,每增加一个 VM 只需要一个 V8 isolate 加内核状态,而不是一个新的 OS 进程。
项目信息
- 公司: Rivet Dev
- 主语言: Rust(核心运行时)+ TypeScript(SDK)
- 许可证: Apache-2.0
- 官网 : agentos-sdk.dev
项目数据
- ⭐ GitHub Stars: 4,265+
- 🍴 Forks: 214+
- 📄 许可证: Apache-2.0
- 📅 创建时间: 2024-02-07
快速上手
bash
npm install @rivet-dev/agentos @agentos-software/pi
创建服务端(server.ts):
ts
import { agentOS, setup } from "@rivet-dev/agentos";
import pi from "@agentos-software/pi";
const vm = agentOS({
software: [pi],
});
export const registry = setup({ use: { vm } });
registry.start();
创建客户端(client.ts):
ts
import { createClient } from "@rivet-dev/agentos/client";
import type { registry } from "./server";
const client = createClient<typeof registry>({
endpoint: "http://localhost:6420",
});
const handle = client.vm.getOrCreate("my-agent");
// 订阅流式事件
const conn = handle.connect();
conn.on("sessionEvent", (event) => console.log(event));
// 打开 session,发送 prompt
await handle.openSession({
agent: "pi",
env: { ANTHROPIC_API_KEY: process.env.ANTHROPIC_API_KEY! },
});
await handle.prompt({
content: [{ type: "text", text: "写一个 hello world 脚本到 /workspace/hello.js" }],
});
// 读取 agent 创建的文件
const content = await handle.readFile("/workspace/hello.js");
console.log(new TextDecoder().decode(content));
运行:
bash
# 终端 1:启动服务端
npx tsx server.ts
# 终端 2:运行客户端
npx tsx client.ts
也可以直接在 VM 里执行 Node.js 和 Shell:
ts
// 写入并执行 Node.js 文件
await handle.writeFile("/hello.mjs", 'import fs from "fs"; fs.writeFileSync("/out.txt", "hi")');
await handle.exec("node /hello.mjs");
// 执行 Shell 命令
const result = await handle.exec("cat /out.txt");
console.log(result.stdout); // "hi"
性能基准
这是 agentOS 的核心卖点,基准数据来自 2026 年 3 月 30 日的测量:
冷启动时间
| 百分位 | agentOS | 最快沙箱(E2B) | 倍数 |
|---|---|---|---|
| p50 | 4.8 ms | 440 ms | 92x 更快 |
| p95 | 5.6 ms | 950 ms | 170x 更快 |
| p99 | 6.1 ms | 3,150 ms | 516x 更快 |
agentOS 在 Intel i7-12700KF 上测量。E2B 是截至 2026 年 3 月冷启动最快的主流沙箱。
每实例内存占用
| 工作负载 | agentOS | 最便宜沙箱(Daytona) | 倍数 |
|---|---|---|---|
| 完整 coding agent(Pi + MCP + filesystem) | ~131 MB | ~1,024 MB | 8x 更小 |
| 简单 Shell 命令 | ~22 MB | ~1,024 MB | 47x 更小 |
每执行秒成本(自托管,完整 coding agent)
| 宿主机 | agentOS | Daytona | 倍数 |
|---|---|---|---|
| AWS ARM | $0.00000058/s | $0.000018/s | 32x 更便宜 |
| Hetzner ARM | $0.000000066/s | $0.000018/s | 281x 更便宜 |
Daytona 基准: 0.0504/vCPU−h+0.0162/GiB-h(1 vCPU + 1 GiB 最低配置)。
为什么会有这么大的差距 :Daytona 等沙箱最小实例是 1 vCPU + 1 GiB,即使你只运行一条 ls 命令,也需要分配整个实例。agentOS 的 VM 只需要一个 V8 isolate 和内核状态,简单命令只用 22 MB。
核心功能详解
Bindings:agent 直接调用你的函数
这是 agentOS 与传统沙箱最根本的架构差异。
传统沙箱里,agent 要访问你的数据或调用你的逻辑,只能通过网络 API ------ 沙箱 → HTTP → 你的后端。这意味着凭证要传进沙箱,延迟增加,还多一个攻击面。
agentOS 的 bindings:
ts
const vm = agentOS({
software: [pi],
bindings: {
// 这个函数暴露给 VM 里的 agent,作为一个 CLI 命令
get_user_data: async (userId: string) => {
return await db.users.findById(userId); // 直接访问你的数据库
},
},
});
agent 在 VM 里执行 get_user_data 123,就像执行任意 Shell 命令一样,但实际上是调用你在宿主机上定义的 TypeScript 函数。凭证和数据库连接从不进入 VM。
文件系统挂载
支持在启动时或运行时动态挂载:
ts
const vm = agentOS({
software: [pi],
mounts: [
{ type: "s3", bucket: "my-bucket", mountpoint: "/data" },
{ type: "host", path: "./local-dir", mountpoint: "/workspace" },
{ type: "memory", mountpoint: "/tmp" },
// Google Drive(OAuth 后)
{ type: "gdrive", mountpoint: "/drive" },
],
});
权限控制
网络出口默认拒绝,按需开放:
ts
const vm = agentOS({
software: [pi],
permissions: {
network: {
outbound: [
{ host: "api.github.com", allow: true },
{ host: "*", allow: false }, // 拒绝其他所有
],
},
filesystem: {
read: ["/workspace", "/data"],
write: ["/workspace"],
},
},
});
Sessions via ACP
agentOS 通过 ACP(Agent Client Protocol) 管理 agent 会话:
- 会话自动持久化,无需额外代码
- 可以恢复中断的会话
- 统一的 transcript 格式,跨 agent 调试和比对
Cron 和 Webhook
ts
// 定时触发 agent
registry.cron("0 9 * * *", async () => {
const handle = client.vm.getOrCreate("daily-report");
await handle.openSession({ agent: "pi" });
await handle.prompt({ content: [{ type: "text", text: "生成今日报告" }] });
});
// 外部 webhook 触发
registry.webhook("/github-events", async (req) => {
// 处理 GitHub webhook,委派给 agent
});
多人协作
多个客户端可以实时观察和协作同一个 agent:
ts
// 客户端 A 和 B 连接同一个 agent handle
const conn1 = handleA.connect(); // 只读观察
const conn2 = handleB.connect(); // 也可以发 prompt
Agent-to-Agent 委派
通过 bindings 实现 agent 委派其他 agent:
ts
const vm = agentOS({
software: [pi, claudeCode],
bindings: {
// agent Pi 可以调用这个 binding,启动一个 Claude Code agent 做子任务
run_code_review: async (prUrl: string) => {
const reviewHandle = client.vm.getOrCreate(`review-${prUrl}`);
await reviewHandle.openSession({ agent: "claude-code" });
await reviewHandle.prompt({
content: [{ type: "text", text: `Review PR: ${prUrl}` }],
});
return await reviewHandle.getResult();
},
},
});
内置 Agent 注册表
agentOS 有一个注册表(Registry),通过 npm 包形式分发:
| Agent/包 | npm 包名 | 说明 |
|---|---|---|
| Pi | @agentos-software/pi |
主推的通用 coding agent |
| Claude Code | @agentos-software/claude-code |
Anthropic Claude Code(beta) |
| Codex | @agentos-software/codex |
OpenAI Codex(beta) |
| OpenCode | @agentos-software/opencode |
OpenCode(beta) |
常用命令行工具 (作为 npm 包安装): git、ripgrep、jq、sqlite3、duckdb、curl、vim,以及元包 common、build-essential、everything。
POSIX 基础工具(coreutils、sed、grep、gawk、findutils、diffutils、tar、gzip)开箱即用,不需要额外安装。
agentOS vs 完整沙箱:如何选择
agentOS 本身在文档里明确说:二者不是对立关系,而是互补的。
| 维度 | agentOS | 完整沙箱(E2B/Daytona) |
|---|---|---|
| 冷启动 | 4.8ms(p50) | 440ms+(p50) |
| 最小内存 | ~22 MB | ~1,024 MB |
| 宿主机进程集成 | ✅(in-process,直接 bindings) | ✗(需要网络 API) |
| 原生二进制编译 | 部分(WebAssembly 格式) | ✅(完整 Linux) |
| 浏览器运行 | 通过 Browserbase(beta) | ✅ |
| Dev server 运行 | ✗ | ✅ |
| 成本 | 极低 | 按分钟计费 |
选 agentOS 的场景:
- agent 需要调用你后端的数据库或函数(bindings 直接调用)
- 高并发、高频率的 agent 任务(低内存意味着单机跑更多实例)
- 对冷启动延迟敏感(用户实时等待的场景)
- 自托管,不想接受沙箱服务商的账单
选完整沙箱的场景:
- 需要运行原生编译(C/C++/Rust 工具链)
- 需要启动完整开发服务器(Node/Python HTTP server)
- 需要真实浏览器(不是 headless API)
- 工作负载已经很重,沙箱成本可接受
两者配合(sandbox mounting):
ts
const vm = agentOS({
software: [pi],
// 当工作负载需要时,按需启动完整沙箱并挂载其文件系统
sandbox: { provider: "e2b", mountpoint: "/sandbox" },
});
平时用轻量 agentOS VM,遇到需要真实 Linux 的任务时临时挂载沙箱。
参考资源
官方链接
- 🌟 GitHub : rivet-dev/agentos
- 🌐 官网 : agentos-sdk.dev
- 📖 快速开始 : agentos-sdk.dev/docs/quicks...
- 📦 注册表 : agentos-sdk.dev/registry
- 📊 基准测试 : agentos-sdk.dev/docs/benchm...
- 🏗️ 架构文档 : agentos-sdk.dev/docs/archit...
- 💬 Discord : rivet.dev/discord
总结
agentOS 回答了一个很具体的工程问题:「我想在产品里运行 AI agent,但我不想接受沙箱服务的冷启动延迟、高内存占用和按分钟计费。」它的答案是:用 V8 isolate + WebAssembly 实现一个足够好的 VM,把这个 VM 做成一个 npm 库,让你直接 npm install 进自己的后端。
三个设计决策值得记住:
Bindings 是核心:不是「agent 调用你的 HTTP API」,而是「agent 调用你定义的 TypeScript 函数,通过 VM 内的 CLI 命令形式」。凭证从不进入 VM,延迟几乎为零,agent 的能力完全由你控制。
性能差距是结构性的:完整沙箱最小实例是 1 vCPU + 1 GiB,无论你跑什么工作负载都要付这个底价。V8 isolate 的底价是几十 MB。这不是优化出来的差距,而是隔离层选择不同导致的结构性差距。
与完整沙箱互补,不是替代 :sandbox mounting 这个功能说明团队理解 agentOS 的边界:在需要真实 Linux 环境时,把沙箱文件系统挂进 VM,而不是试图用 WebAssembly 模拟一个完整 OS。
如果你正在构建需要 AI agent 能力的产品,但对沙箱服务的成本和延迟不满意,agentOS 的 npm install @rivet-dev/agentos 是值得评估的选项。
探索 PrimeSkills ------ 精选 AI agent 和技能工具,每一个都经过真实工作流验证。没有炒作,只有真正好用的工具。
访问我的个人主页,获取更多见解和有趣的产品。