开源项目第172期:agentOS — 以库的形式给 AI Agent 一个操作系统,冷启动 92x 更快、内存 47x 更少

0 阅读8分钟

引言

"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

快速上手

npm install @rivet-dev/agentos @agentos-software/pi

创建服务端(server.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):

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));

运行:

# 终端 1:启动服务端
npx tsx server.ts

# 终端 2:运行客户端
npx tsx client.ts

也可以直接在 VM 里执行 Node.js 和 Shell:

// 写入并执行 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)倍数
p504.8 ms440 ms92x 更快
p955.6 ms950 ms170x 更快
p996.1 ms3,150 ms516x 更快

agentOS 在 Intel i7-12700KF 上测量。E2B 是截至 2026 年 3 月冷启动最快的主流沙箱。

每实例内存占用

工作负载agentOS最便宜沙箱(Daytona)倍数
完整 coding agent(Pi + MCP + filesystem)~131 MB~1,024 MB8x 更小
简单 Shell 命令~22 MB~1,024 MB47x 更小

每执行秒成本(自托管,完整 coding agent)

宿主机agentOSDaytona倍数
AWS ARM$0.00000058/s$0.000018/s32x 更便宜
Hetzner ARM$0.000000066/s$0.000018/s281x 更便宜

Daytona 基准:0.0504/vCPUh+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:

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。

文件系统挂载

支持在启动时或运行时动态挂载:

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" },
  ],
});

权限控制

网络出口默认拒绝,按需开放:

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

// 定时触发 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:

// 客户端 A 和 B 连接同一个 agent handle
const conn1 = handleA.connect(); // 只读观察
const conn2 = handleB.connect(); // 也可以发 prompt

Agent-to-Agent 委派

通过 bindings 实现 agent 委派其他 agent:

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-codeAnthropic Claude Code(beta)
Codex@agentos-software/codexOpenAI Codex(beta)
OpenCode@agentos-software/opencodeOpenCode(beta)

常用命令行工具(作为 npm 包安装): gitripgrepjqsqlite3duckdbcurlvim,以及元包 commonbuild-essentialeverything

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):

const vm = agentOS({
  software: [pi],
  // 当工作负载需要时,按需启动完整沙箱并挂载其文件系统
  sandbox: { provider: "e2b", mountpoint: "/sandbox" },
});

平时用轻量 agentOS VM,遇到需要真实 Linux 的任务时临时挂载沙箱。


参考资源

官方链接


总结

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 和技能工具,每一个都经过真实工作流验证。没有炒作,只有真正好用的工具。

访问我的个人主页,获取更多见解和有趣的产品。