跳转到内容

第 10 课:会话管理与任务连续性

学习 Pi Agent SDK 中 in-memory session、persistent session、resume、fork 和 session 文件的任务连续性模型。

会话管理解决的不是“聊天记录保存”,而是 coding agent 能否跨多轮任务保持上下文、恢复中断、复盘证据、分支探索的工程问题。

resume 为什么不是重新运行上一次任务,而是恢复一条可继续推理的上下文链?

  • 内存会话适合一次性实验。
  • 持久化会话适合长任务和复盘。
  • resume 选择某个历史 leaf 作为当前上下文。
  • fork 从已有历史开出新分支,适合尝试不同修复方向。

下面不是完整源码,而是把本课主线压缩成可以在文档里直接阅读的关键形状。读者即使不打开本地源码,也应该能看出运行时如何组织职责。

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 对审计和恢复的价值。
  • 能说明分支上下文如何构造。
  1. 实践题:基于本课的省略版源码,补出一个最小实现草图,要求写清输入、输出、副作用和错误处理。
  2. 思考题:本课机制如果只靠 prompt 约束,而不放进 harness 或 runtime,会出现什么工程风险?