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-agentsakuracode 是用同一个 SDK 做的类 Codex 终端:Markdown、斜杠命令、续接、分叉、目标、MCP、exec --json。没有沙箱;每次工具调用都经过审核。
npm install -g sakuracode常见问题
如何并行运行多个编程 Agent?
每个 Agent 是一个对象,有自己的目录、环境和会话文件;用 Promise.all 启动即可。见 examples/fleet.ts。
没有沙箱,如何审核 Agent 的命令?
加上 reviewPlugin({ llm }):明确的情形由硬规则决定,其余交给审核模型,熔断器会让一直被拒绝的运行停下来。这是判断,不是墙。
哪些模型可用?
任何支持带流式输出和工具调用的 Chat Completions 的模型(已用 DeepSeek、Kimi 和 OpenCode Go 试过)。
崩溃后如何恢复?
会话文件只追加,且消息完整后才写入;在同一个文件上重新运行 Agent 即可。