学习 Pi Agent SDK 中 in-memory session、persistent session、resume、fork 和 session 文件的任务连续性模型。
会话管理解决的不是“聊天记录保存”,而是 coding agent 能否跨多轮任务保持上下文、恢复中断、复盘证据、分支探索的工程问题。
resume 为什么不是重新运行上一次任务,而是恢复一条可继续推理的上下文链?
- 内存会话适合一次性实验。
- 持久化会话适合长任务和复盘。
- resume 选择某个历史 leaf 作为当前上下文。
- fork 从已有历史开出新分支,适合尝试不同修复方向。
源码推演(省略版)
Section titled “源码推演(省略版)”下面不是完整源码,而是把本课主线压缩成可以在文档里直接阅读的关键形状。读者即使不打开本地源码,也应该能看出运行时如何组织职责。
type SessionEntry = { id: string; parentId?: string; kind: "user" | "assistant" | "tool" | "summary"; payload: unknown;};
function buildContext(leaf: SessionEntry) { return walkToRoot(leaf).reverse().map(toModelMessage);}- 关键细节是
parentId:session 不是扁平数组,而是一棵可分支的任务树。 buildContext()从 leaf 回溯到 root,只恢复当前分支上的消息。- 这解释了为什么 fork 比在同一长会话里反复纠错更干净。
画出一个包含 fork 的 session 树,并说明从不同 leaf resume 时模型看到的上下文有什么不同。
- 能区分 in-memory、persistent、resume 和 fork。
- 能解释 JSONL append-only 对审计和恢复的价值。
- 能说明分支上下文如何构造。
- 实践题:基于本课的省略版源码,补出一个最小实现草图,要求写清输入、输出、副作用和错误处理。
- 思考题:本课机制如果只靠 prompt 约束,而不放进 harness 或 runtime,会出现什么工程风险?