Suna:最接近 Manus 的开源实现
一句话:前面四家拆的都是「Agent 怎么想」,这一家值得拆的是「Agent 跑在哪」——沙箱这层的工程量,比 Agent 循环本身大得多。
一、拿的是哪份代码
git clone --depth 1 --filter=blob:none --sparse https://github.com/kortix-ai/suna.git
| 项 | 值 |
|---|---|
| 仓库 | kortix-ai/suna |
| Star | 20,115 |
| 语言 | TypeScript(Bun 运行时) |
| 拉取时间 | 2026-08-19 |
仓库是个 pnpm monorepo,apps/ 下有 11 个应用:
apps/
├── api ← 控制面:账号、计费、权限、连接器
├── kortix-sandbox-agent-server ← 沙箱内的 Agent 监工,本篇重点
├── sandbox ← 沙箱镜像
├── llm-gateway ← 模型网关
├── web / mobile / desktop-electron / cli ← 各端
├── voice-agent
├── kortix-app-runtime
└── whitelabel-demo
这个目录结构本身就是结论:一个「Manus 类」产品,Agent 逻辑只占其中一个 app,剩下十个都是把它变成一个能卖的服务所需要的东西。
二、最大的发现:它不自己写 Agent 循环
apps/kortix-sandbox-agent-server/package.json 里的一句描述:
apps/kortix-sandbox-agent-server/package.json
{
"name": "@kortix/sandbox-agent-server",
"description": "Sandbox-side OpenCode REST supervisor and Kortix API surface.",
...
}
"OpenCode REST supervisor" —— 它是 OpenCode 的监工。
源码目录里满眼都是 opencode:
src/
├── opencode.ts ← 进程管理
├── opencode-config-deps.ts ← 配置依赖
├── opencode-events.ts ← 事件流转
├── opencode-turn-state.ts ← 轮次状态
├── opencode-fork-root.ts ← 温启动 fork 的根会话处理
├── opencode-audit-relay.ts ← 审计中继
├── managed-opencode-env.ts ← 环境管理
├── llm-proxy.ts ← 凭证注入代理
├── egress-shim/ ← 出网管控
├── runaway-turn-guard.ts ← 失控防护
└── routes/ ← abort / files / find / git / pty / port-proxy / web-proxy ...
所以 Suna 的架构是这样的:
它把「Agent 怎么想」外包给了一个成熟的开源 Agent,自己只做「Agent 跑在哪、跑多久、能访问什么、烧了多少钱」。
这个选择很值得琢磨。对照 Kimi CLI 自己写了 52,049 行、DeerFlow 在 LangGraph 上糊了 40 个中间件——Suna 是第三条路:Agent 循环直接用别人的,力气全花在运行时。
子 Agent 的部分也就顺理成章地继承自 OpenCode:
src/opencode-events.ts:43(注释)
// subagent (Task tool) child sessions — so the handler is responsible for ...
子 Agent 在这里是 OpenCode 的 Task 工具产生的 child session,Suna 只负责观测和管控它们。