Session:JSONL 文件与树形结构
Pi 把「一次会话」抽象成一颗 JSONL 树。每条 entry 是一个节点,节点之间靠
id和parentId串成父子关系;当前活跃的位置是「叶子」。这个数据结构撑起了分支、回滚、/tree导航、压缩摘要等所有能力。
存储位置与会话命令
会话自动存到 ~/.pi/agent/sessions/,按工作目录分组:
~/.pi/agent/sessions/
--Users-kimi-Projects-mysite--/
2026-06-30T10-23-45_a1b2c3d4.jsonl
2026-06-30T14-08-12_e5f6g7h8.jsonl
每个 .jsonl 文件就是一次完整的 session(包含它的分支树)。最常用的 CLI flags:
| Flag | 行为 |
|---|---|
pi -c | 续接最近一次 session |
pi -r | 打开 picker 选择历史 session |
pi --no-session | 临时模式,不写盘 |
pi --name "..." | 启动时设置 display name |
pi --session <path|id> | 用指定文件或 partial id |
pi --fork <path|id> | 从指定 session fork |
交互模式里也有 /resume、/new、/name、/session、/tree、/fork、/clone、/compact、/export、/share 等命令。/share 会把 session 上传到私有 GitHub gist 并生成可分享的 HTML 链接——这是 Pi 鼓励公开 session 的一个具体机制(社区有 badlogic/pi-share-hf 工具一键发到 Hugging Face)。
版本演进
Session 文件格式经历过三代:
| 版本 | 形态 | 说明 |
|---|---|---|
| v1 | 线性 entry 序列 | legacy,老 session 自动迁移 |
| v2 | 树形结构(id / parentId) | 引入真正的分支 |
| v3 | hookMessage role 改名为 custom | 当前版本 |
加载时自动迁移——你手上 v1 的老 session 不需要手动转。
文件结构
每行是一个 JSON 对象,靠 type 字段区分;节点间靠 id / parentId 串成 树。第一行是 header:
{"type":"session","version":3,"id":"uuid","timestamp":"...","cwd":"/path"}
后续行是各种 entry。