新工具 GitHub · vercel-labs/durable-harness
用 durable-harness 在 Next.js 里跑可恢复的编码 agent 会话
装好 durable-harness 与 Pi harness,给 Next.js 应用加一段 chat 路由,得到崩溃后能从同一 turn 恢复的编码 agent 会话。
效果
原站没有结果截图;README 中可见的是代码片段(agent 模块、chat 路由与 next.config 配置)与 harness 列表。
这是什么
新在哪里:以前编码 agent 多是本地或单机会话,进程崩溃当前 turn 就丢;现在每个会话是一次 workflow run,turn 与工具调用都在事件日志里,可在另一台机器续上。
怎么做到的:在 Next.js 项目里 npm install durable-harness @earendil-works/pi-durable @earendil-works/chord @earendil-works/pi-ai just-bash;在 lib/agent.ts 里用 createRegistry 安装 CodingTools、用 resumeWith + Harness.open 打开 World 存储上的会话;在 app/api/chat/route.ts 用 chatRoute 暴露 GET/POST 并加上自己的 authorize;在 next.config.ts 用 withDurableHarness 包住配置。本地开发默认使用 Workflow SDK 的本地 World,无需配置。
- 适合谁
- 写 TypeScript / Next.js、想让编码 agent 会话持久化的开发者
- 能帮你
- 把编码 agent 会话变成可恢复的 workflow run,崩溃后可续跑且不会重复执行不安全工具调用
评分 三项分开看,不合成总分;热度不等于好用
- 新颖性
- 全新做法 · 2026-10-16 出现
- 热度
- 未知
- 易上手
- 门槛较高
怎么评的
三项都由本站记录的事实按固定规则算出,编辑不能直接改档位;规则改动会写进更新说明。
新颖性
- ●●● 全新做法,且有来源依据的出现时间在最近 30 天内
- ●●○ 老工具新用法或近期刚开放,且有来源依据的时间在最近 30 天内
- ●○○ 出现时间超过 30 天、未核实到精确日期,或已不再是新做法
- 其他 出现时间未核实、晚于今天,或新颖类型未核实时按最低一档处理,不靠猜测加分
热度
- ●●● 最近一次每周人工确认为“热门”:最近 14 天里独立讨论、实际案例、持续时间、传播平台、相对关注五项门槛全部满足(规则 heat-v1)
- ●●○ 最近一次人工确认为“观察中”:前三项至少一项达到,或讨论增长 ≥ 50%,且至少 2 个独立案例
- ●○○ 最近一次人工确认为“未进入跟踪”
- 其他 还没有人工确认过的热度记录时显示“未知”。热度只统计本站已接入的信源,不代表全网
易上手
- ●●● 准备门槛低且难度入门:不需要新账号或付费,首次尝试不超过 30 分钟,公开可用,会复制粘贴即可
- ●●○ 准备门槛中等,或门槛低但需要改少量代码或配置
- ●○○ 准备门槛高:需要商业软件或付费服务、首次尝试超过 2 小时、特殊硬件或网络、排队或邀请且无替代方案,或需要专业知识
- 其他 只有介绍、还没有站内步骤,或关键步骤已失效时显示“暂不可试”;门槛未核实时显示“未核实”
怎么尝试
- 时间 首次约 60 分钟
- 费用 免费:仓库为 Apache-2.0 开源,npm 包可直接安装;模型调用费用原站未说明。
- 账号 不需要新账号
- 环境 Node.js + pnpm/npm 的 Next.js 项目;本地开发使用 Workflow SDK 本地 World,无需额外配置
- 准备 Next.js 项目:安装并承载 durable-harness 与 chat 路由
- 准备 npm 环境:安装 durable-harness、pi-durable 等包
- 准备 模型 gateway 访问与密钥:示例使用 anthropic/claude-sonnet-4.5,需可用的模型凭据(README 未说明具体配置)
- 准备 chatRoute 的 authorize 实现:为聊天接口做鉴权
- 准备 Vercel 账号(选用):仅在需要托管存储、排队与扩缩或使用 Vercel Sandbox 跑 Claude Code / Codex 时需要
按下面的步骤就能做出第一个结果。复制命令不会自动执行。
安装依赖
在 Next.js 项目根目录安装 durable-harness 与 Pi 相关包:
bash原始来源命令npm install durable-harness @earendil-works/pi-durable @earendil-works/chord @earendil-works/pi-ai just-bash预期结果:package.json 中出现上述依赖,node_modules 里能解析到 durable-harness
编写 agent 模块
新建 lib/agent.ts,用 createRegistry 安装 CodingTools,并用 resumeWith 与 Harness.open 打开 World 存储上的会话:
typescript原始来源命令import { BACKGROUND_CONTEXT as ctx } from '@earendil-works/chord/context'; import { createRegistry, Harness, type Storage } from '@earendil-works/pi-durable'; import { CodingTools, GATEWAY_PROVIDER, gatewayModels, resumeWith, virtualEnv } from 'durable-harness/pi-durable'; const models = gatewayModels(); const registry = createRegistry(); registry.install(CodingTools); export const agent = { model: { provider: GATEWAY_PROVIDER, modelId: 'anthropic/claude-sonnet-4.5' } }; export const open = resumeWith((storage: Storage) => Harness.open(storage, { models, registry, env: virtualEnv() }, ctx));预期结果:agent 与 open 导出可被路由引用,类型检查通过
添加 chat 路由
新建 app/api/chat/route.ts,用 chatRoute 暴露 GET/POST,并在 authorize 中填入自己的鉴权逻辑:
typescript原始来源命令import { chatRoute } from 'durable-harness/pi-durable'; import { agent, open } from '@/lib/agent'; export const { GET, POST } = chatRoute({ open, agent, authorize: async (request) => { /* your auth */ } });预期结果:向 /api/chat 发请求能收到 agent 回复
接入 Next.js 配置
用 withDurableHarness 包住 next.config.ts:
typescript原始来源命令import type { NextConfig } from 'next'; import { withDurableHarness } from 'durable-harness/next'; const nextConfig: NextConfig = { // your existing config }; export default withDurableHarness(nextConfig);预期结果:next dev 能正常启动,无配置相关报错
本地运行验证恢复
本地开发默认使用 Workflow SDK 的本地 World,无需额外配置;启动应用并发起一段对话。
bash本站编写npm run dev预期结果:会话作为 workflow run 运行,中断后再次发起可从上一次的 turn 继续