durable-harness:编程 Agent 崩溃恢复,会话从日志续跑
durable-harness 是一套编程 Agent 崩溃恢复方案:会话存进事件日志,崩溃后接着跑,适合用 Pi、OpenCode 或 fx 的团队。
项目资料
GitHub Ecosystem- 许可证
- Apache-2.0
- 主语言
- TypeScript
- 星标
- 90
- 核查时间
- 2026-10-21
以上快照资料以核查当日为准,可能随版本或运营策略变化。

编程 Agent 崩溃恢复的第一步,是搞清楚未完成的回合存在哪里:Vercel 的文档写道,多数 harness 把正在进行的回合放在运行它的进程内存里,进程一死,回合也跟着消失。durable-harness 是 vercel-labs 组织开源的项目(Apache-2.0),它让 Pi、OpenCode、fx、Claude Code 和 Codex 变成能从崩溃中恢复的编程 Agent,运行在 Workflow SDK 的 World 上。每个会话是一次 workflow run,对话、正在进行的回合,以及每次模型调用和工具调用,都写进这次运行的事件日志,所以进程崩溃后,另一台机器可以从日志接着跑。微信公众号「AI工程化」在 10 月 21 日介绍过它。
核心功能
durable-harness 的核心,是让会话在崩溃后接着跑,同时不让不能重复的工具执行两次。
- 崩溃后从日志续跑:每个回合在 Vercel Queues 里对应一条消息。函数挂掉后,新函数读取日志,从断点继续;日志里已有结果的调用直接读回,不再执行。
- 按工具设定重放规则:工具标成
safe或never。safe的工具(比如只读查询)崩溃后可以重跑:Pi 会重跑,Claude Code、Codex 和 OpenCode 则告诉模型它可以安全地重复调用。never的工具(比如退款或发邮件)从不执行第二次,模型只会被告知这次调用「可能执行过,也可能没有」,它可以先查再决定。 - 哪些 harness 要 Sandbox:Pi、OpenCode 和 fx 跑在你自己的函数里。Claude Code 和 Codex 只能跑在每个会话自己的 Vercel Sandbox 里,自托管也一样,文档给的理由是它们是为单个用户设计、状态存在磁盘上的命令行工具。
- 三种文件位置:
virtual()把文件存进会话日志,跟着会话走;virtual({ durable: false })放在内存里,每个回合结束就清空;sandbox()把命令交给会话自己的 Vercel Sandbox,文件放在 Drive 上。 - 可替换的存储:World 是 Workflow SDK 的存储和队列接口。本地开发默认写进
.workflow-data目录,部署到 Vercel 时会话出现在 Agent Runs 里,自托管可以换成 Postgres World。 - Documents:类型化的 JSON 状态,比如待办清单,和会话一起存在日志里,单个文档不超过 64 KB。
| harness | README 里的包名 | 运行位置 |
|---|---|---|
| Pi | durable-harness/pi-durable(推荐)或 durable-harness/pi | 你的函数,文件在虚拟工作区或 Sandbox |
| OpenCode | durable-harness/opencode | 你的函数,文件在虚拟工作区或 Sandbox |
| fx | durable-harness/fx,agent 来自 libfx | 你的函数,文件在虚拟工作区或 Sandbox |
| Claude Code | durable-harness/claude-code | 仅 Vercel Sandbox(实验性) |
| Codex | durable-harness/codex | 仅 Vercel Sandbox(实验性) |
包名取自 README,运行位置取自 Vercel 文档的 harness 选择表。
典型使用场景
durable-harness 最适合的情况是:回合已经做了实际工作,进程却在中途死掉。
- 给客服 Agent 配退款工具的团队:退款工具标成
never。文档举过一个例子:函数在写回复时挂掉,新函数只重跑被打断的模型调用,客户只被退款一次。 - 在网页里放编程 Agent 的产品团队:回合可以超过单个函数的最长运行时间,断开的客户端重连后,会接着看到仍在运行的回合。
- 想把会话存进自己数据库的团队:用 Postgres World,需要
@workflow/world-postgres5.0.4 或更新版本、Node.js 22 或更高版本,并设置WORKFLOW_TARGET_WORLD和WORKFLOW_POSTGRES_URL。部署在 Vercel 之外时,模型调用还要AI_GATEWAY_API_KEY。
快速上手
README 的例子是 Pi 加 Next.js,先装依赖:
npm install durable-harness @earendil-works/pi-durable @earendil-works/chord @earendil-works/pi-ai just-bash
接着加三个文件:lib/agent.ts 用 Harness.open 打开 Pi 的 durable Harness;app/api/chat/route.ts 导出 chatRoute;next.config.ts 用 withDurableHarness 包住配置。本地开发不需要额外配置。README 没有给出运行后的界面或输出,authorize 只留了一行注释;文档说,生产环境里没有 authorize 的聊天路由会对每个请求返回 401。
小结
durable-harness 适合已经在用 Pi、OpenCode 或 fx、又希望长回合能扛住崩溃的团队,尤其是愿意用 Next.js 和 Vercel 部署,或能自己维护 Postgres 的团队。它不适合两类人:一是需要稳定 API 的生产系统,README 写明它实验性、版本是 0.0.x,npm 上最新是 0.0.1-beta.6;二是想在自己服务器上跑 Claude Code 或 Codex、却不接 Vercel Sandbox 的人,因为文档说这两者只能跑在 Sandbox 里。
限制也要先知道。Sandbox 默认允许所有出站流量,network: 'deny-all' 可以关掉;它默认最长运行 4 小时,模型花费默认没有上限,要用 sandbox({ budget }) 设置。Pi(durable-harness/pi)和 OpenCode 的回合先在聊天请求里跑 60 秒,交接时还在运行的命令会被停下、不会重跑,开头的长安装或构建可能因此被切断,文档把它列为 Vercel Queues 当前的限制。虚拟工作区约 500 个文件,没有网络,也没有 node、python 这类真实二进制。文档还说,Postgres World 只是参考实现,不认证路由、不加密数据。
许可证是 Apache-2.0,主要语言是 TypeScript。仓库 2026-10-16 才创建,截至 2026-10-21 有 90 颗星、6 个未关闭的 issue 或 PR,最近一次推送在 2026-10-19。想找同时调度多个编程 Agent 的界面,可以看 Paseo;durable-harness 管的是单个会话崩溃后能否接着跑。
我们读了 README、LICENSE、仓库元数据、npm 包信息和 Vercel 官方文档,没有安装或运行它。README 里没有性能数据、界面截图、运行输出和价格,这篇文章也就不包含这些内容。