Sakura

把 Codex 式的编程 Agent 做成库。

循环归你。一个用途一个 Agent,或者一群 Agent,只要几行。

GitHub
npm install sakura-agent
import { createAgent } from "sakura-agent";

const agent = await createAgent({ model });   // read, write, edit, bash, sessions, compaction, goals
const run = agent.run("Add tests for parse() and make them pass.");

类 Codex,用代码表达

你熟悉这个形状:带 read、write、edit 和 bash 的循环,可续接的会话、压缩、目标、审核。Sakura 就是这个循环,做成你可以 import 的库,里面没有任何东西是封死的。

改参数,不是翻开关

一个特定用途的 Agent,就是几个参数。

await createAgent({ model, tools: ["read"], rules: ["Review only; change nothing."] });
await createAgent({ model, goal: { objective: "Make all tests pass", verify: "npm test" } });
await createAgent({ model, subAgents: {} });

想让它在哪运行,就在哪

工具可以跑在另一台机器上;每个有风险的调用都可以被审核。

const environment = await createSshEnvironment({ host: "agent@box", cwd: "/srv/job" });
await createAgent({ model, environment, plugins: [...corePlugins(), reviewPlugin({ llm: reviewerModel })] });

一群 Agent,就是一个数组

每个 Agent 有自己的目录、环境和会话。

const results = await Promise.all(jobs.map(async (job) => {
  const agent = await createAgent({ model, cwd: job.dir, confine: true, tools: job.tools, rules: job.rules, sessionFile: job.session });
  return (await agent.run(job.task).result).reason;
}));

仓库里有可运行的示例:examples/fleet.ts(离线)。

安全

Sakura 不带沙箱。confine 约束的是文件工具,不是 shell;给 Agent shell 时要同时开启审核,或者把不可信的任务放在你自己提供的隔离环境里。

实测

真实运行里测到的,带着条件。不是保证。

项目结果条件
提示缓存 请求中位数 98.8% 的输入来自缓存;按 token 总量 95.7% 一次真实编码会话,deepseek-v4.1-flash,经 OpenCode Go,20.8 小时,1,817 次请求;压缩和审核请求不计;缓存由供应商负责
无人值守 20.8 小时,1,817 次请求,1,766 次工具调用,无供应商错误,无崩溃,约 160 MB 同一会话,最初 20.8 小时
审核 审核 445 次,审核模型技术失败 0 次,拒绝 2 次 同一会话之后 15 小时,在限制了审核对话长度之后
基准测试 还没有完整分数,所以不公布 —

安装

sakura-agent 是这个库,发布在 npm 上。

npm install sakura-agent

sakuracode 是用同一个 SDK 做的类 Codex 终端:Markdown、斜杠命令、续接、分叉、目标、MCP、exec --json。没有沙箱;每次工具调用都经过审核。

npm install -g sakuracode
需要 Node 26 或更新版本

常见问题

如何并行运行多个编程 Agent?

每个 Agent 是一个对象,有自己的目录、环境和会话文件;用 Promise.all 启动即可。见 examples/fleet.ts。

没有沙箱,如何审核 Agent 的命令?

加上 reviewPlugin({ llm }):明确的情形由硬规则决定,其余交给审核模型,熔断器会让一直被拒绝的运行停下来。这是判断,不是墙。

哪些模型可用?

任何支持带流式输出和工具调用的 Chat Completions 的模型(已用 DeepSeek、Kimi 和 OpenCode Go 试过)。

崩溃后如何恢复?

会话文件只追加,且消息完整后才写入;在同一个文件上重新运行 Agent 即可。