这个在讲啥
回 群友 716: 一句话:这是 Pi 团队(Earendil)当天发 Pi 1.0 的同时,扔出来的一个实验性新包 Pi Durable 的发布说明,讲的是他们想造一个「在哪都能跑、能跑很久、崩了也不丢」的 agent harness。 先把这词说清楚,因为全文都建立在它上面。作者自己给的定义是:harness = 存储 + 让你能并行跑一个或多个 LLM 对话的那套机器。它管三件事——模型能调用的工具、工具执行的环境(你的笔记本、远端 VM、内存沙箱),以及对话本身(你和 agent 的交互被记成一份 transcript)。他们顺手定义了:agent = 模型 + 它的设置(思考等级、可用工具);task = harness 跑的每一个动作,从调模型到执行工具都算。 那为什么不用现成的 Pi?因为那两个定位不一样。Pi 那个 coding agent 是给一个人在终端里用的,跑在你自己(远端)机器上,进程死了你看一眼叫它继续,这很好用,而且不会变。但要「bring this to everyone」,就需要另一种东西:能从不同界面接入、支持无限长对话、能扛住内外部的灾难性故障、还允许多人同时操控同一个 agent。Pi Durable 就是这个,它不替代 Pi,而是构建任何 agentic 应用(包括 coding agent)的框架,跟 Pi 共享代码(比如 pi-ai)和原则:极简、可塑。 正文基本是四个诉求 + 一堆代码例子: 一是跑得久、哪都能跑。现在的「任何地方」指的是任何有 JS 运行时的环境。它内置 memory、SQLite、JSONL 三种存储,官方还给了 conformance 套件让你自己实现后端。SQLite 那套不依赖 Node API,加个小适配器就能跑在 Bun 或者 Cloudflare Durable Object 里。 二是扛崩溃。每个 run 的每一步都是一个 task,往前走之前先存 checkpoint;进程没了,新进程打开同一个 storage、找到没做完的 task、从上一个 checkpoint 接着跑。被打断的模型请求会重发,半截回答留在 transcript 里标记成 aborted;被打断的工具调用,说自己安全就重跑,不安全就告诉模型「你被打断了」。submission 带 requestId,做到 exactly-once,客户端崩了重试拿回的是原来那次提交。 三是同时跑很多对话。一个 harness 并发跑任意多个 conversation,互不阻塞;conversation 可以在 transcript 的任意位置 fork 出新的,父级历史不复制就能看到。举的例子很好懂:Slack 频道算一个 conversation,有人在某条消息下开 thread,thread 就是这个 conversation 在那个点的 fork,两边同时跑。 四是全都可插拔。extension 是一组有名字的 system prompt 段落、工具、hook 和 task;system prompt 每次请求前重建,变更记录进 transcript,重启或 fork 后模型看到的跟当时一模一样。最值得注意的是 hook——它能改写去模型的请求、拦或改工具调用、替换结果、甚至自己写总结;因为崩了可能重跑,要做决定就得写进 memo,第一次写入为准。 还有两块我觉得是全文最有意思的: subagent。Pi Durable 明确说没有内置 subagent,但几行代码就能做——subagent 就是一个普通 conversation,由发起它的那次 tool call 拥有,所以它照样扛崩溃、单独算成本。task 和 conversation 构成一棵 ownership tree,abort 是自底向上传播的,每个 task 先清理好自己的副作用。foreground task 属于当前这轮工作,用户按 Esc 就一起带走;background task 属于 conversation 但不属于当前这轮,conversation 空闲着它还在跑,普通 abort 不动它——适合那种要活过本轮 turn 的 subagent。 compaction。长对话靠它压,活跃 transcript 天然被模型上下文窗口兜住,所以几万条消息的对话也塞得进内存。 最后一个细节我挺喜欢:他们说整个源码去掉测试大概一万五千行,GPT 读约十五万 token、Claude 读约二十五万——是刻意保持在「你的 agent 能读懂」的规模上的,这是 Pi 一贯的设计取向。 跟你之前问的 Codex 主 agent / subagent 那套通信对照着看会更清楚:Codex 那边 subagent 是框架内置的概念、有专门的 sendInput / followup_task 这类动作;Pi Durable 这边干脆不给 subagent 这个原语,只给你 conversation + task + ownership,让 subagent 从这几块积木里长出来,durability 是白送的。两种思路,一个是把多 agent 做进产品,一个是把地基留给你自己搭。 顺便,Joye 博客里《同一个模型,只改外面那圈》那篇正好是讲 harness 的,里面那句「Agent = 模型 + Harness,你要么是模型,要么就是 harness」,跟这篇是一套语言,对着读挺顺。