会话管理:保存、恢复与切换
本教程共 30 篇 · 第 8 篇 · 更新于 2026-08-10 · 约 8 分钟阅读
本节目标:搞懂 pi 的会话系统——会话存在哪、怎么自动保存、怎样恢复历史会话、如何给会话起名字、以及会话相关命令的完整用法。
会话是什么
你在 pi 里的每一次对话,pi 都会自动存成一个”会话”(session)。一个会话就是一个完整的对话记录,包含你发的消息、pi 的回复、工具调用的结果、模型切换记录等等。
会话是自动保存的,你不需要手动点”保存”。退出 pi 之后下次再进来,接着上次聊——前提是你知道怎么恢复。
会话文件存在哪
所有会话都存储在:
~/.pi/agent/sessions/
按工作目录分类组织,每个会话是一个 .jsonl 文件:
~/.pi/agent/sessions/
└── my-project/
├── 2026-08-10T10_30_abc123.jsonl # 会话 1
├── 2026-08-10T14_22_def456.jsonl # 会话 2
└── 2026-08-11T09_15_ghi789.jsonl # 会话 3
NoteJSONL 是”每行一个 JSON 对象”的格式。你可以用任何文本编辑器打开看,但一般不需要手动编辑——pi 的会话命令已经够用了。
每个会话文件内部以树状结构组织(tree structure),这意味着你可以在任意的历史节点”分叉”出新分支,旧分支的对话不会丢失。不过树结构的细节留到第 25 章再深入,这里只关心怎么用。
启动时的会话选项
每次启动 pi 都可以用命令行参数控制会话行为。以下是全部选项:
继续最近的会话
pi -c
这是最常用的场景:昨天写到一半,今天接着写。-c 会自动找到当前工作目录下最近一次会话,直接恢复。
浏览并选择历史会话
pi -r
不想直接恢复最后一次?-r 会打开一个会话选择器:
- 搜索:直接打字就能过滤会话列表
Ctrl+P:切换是否显示文件路径Ctrl+S:切换排序方式Ctrl+N:只看有名字的会话Ctrl+R:重命名选中的会话Ctrl+D:删除选中的会话
选好后按回车进入。
指定具体会话
pi --session ~/.pi/agent/sessions/my-project/abc123.jsonl
完整路径、部分 ID 都可以。pi 支持 ID 的部分匹配,所以你不用记住那个长 UUID:
pi --session abc123
从某个会话分叉
pi --fork abc123
这个命令会以指定会话为基础,创建一个新会话文件。原来的会话不受影响。想从历史某个时间点”重新来过”的时候用。
给会话起名
pi --name "重构认证模块"
缩写成 -n 也行:
pi -n "重构认证模块"
起了名字的会话在 /resume 里特别显眼,比靠时间戳翻找方便太多。
临时会话(不保存)
pi --no-session
快速试个东西、问一嘴就跑——不想留痕迹,就用这个。
会话管理命令大全
进了交互模式之后,下面这些斜杠命令帮你管理会话:
| 命令 | 作用 | 什么时候用 |
|---|---|---|
/resume | 浏览并恢复历史会话 | 想把当前对话切到另一个项目/会话 |
/new | 开始一个全新会话 | 当前任务完了,开启一个完全无关的新任务 |
/name 名称 | 给当前会话取名 | 会话有了明确主题,给它个名字方便日后查找 |
/session | 查看当前会话信息 | 看看存哪了、多少条消息、烧了多少 token |
/fork | 从历史消息分叉出新会话 | 想从某个时间点重新开始,又不想破坏当前会话 |
/clone | 克隆当前分支到新会话 | 在继续之前做个副本,给自己留条退路 |
/tree | 打开会话树浏览器 | 在当前会话的历史节点之间跳转 |
/export 文件 | 导出会话为 HTML | 想分享对话记录、或者归档保存 |
/share | 上传为 GitHub Gist | 生成一个可分享的链接 |
/session——看一眼当前状态
/session
输出大概这样:
Session file: ~/.pi/agent/sessions/my-project/abc123.jsonl
Session ID: abc123-def456
Messages: 42
Tokens: 85,432
Cost: $0.52
Current model: claude-sonnet-4-20250514
看一眼就知道花了多少钱、聊了多少轮。出问题排查时也很实用——至少能确认用的是哪个会话文件。
/resume——切到别的会话
/resume
和启动时的 -r 一样,打开交互式的会话选择器。选好之后会替换当前会话。
/new——开个新的
/new
当前会话自动保存,然后开启一个全新的、干净的对话。适合”上一个任务做完了,开始下一个”的时候用。
/name——给会话起个好名字
/name 写登录模块的单元测试
会话名字会显示在 /resume 的列表里,取代默认的时间戳。名字越具体越好——“周三晚上改的 bug”比”修 bug”强十倍。
/tree、/fork 和 /clone 的区别
这三个命令看起来有点像,但用途完全不同。一句话概括:
| 命令 | 效果 | 比喻 |
|---|---|---|
/tree | 在当前会话文件内跳到历史节点 | 一本书里翻回某一页,接着写 |
/fork | 从历史节点创建新会话文件 | 复印一页到新本子上,从那里开始写 |
/clone | 复制当前分支到新会话文件 | 整本笔记本复制一份,防止写坏 |
什么时候用哪个:
- 要比较两种方案 → 用
/tree,在当前会话里分叉两条支线,方便对比 - 想从三天前某个时间点重新来 → 用
/fork,独立文件互不干扰 - 要做大改动、想备份当前状态 → 用
/clone,留条退路
/tree 快速上手
进入 /tree 之后,用键盘操作:
├─ user: "帮我实现登录..."
│ └─ assistant: "好的..."
│ ├─ user: "用 JWT 方案..." ← 分支 A
│ │ └─ assistant: "JWT 实现..."
│ │ └─ user: "测试通过了" ← 当前活跃
│ └─ user: "还是用 Session 方案..." ← 分支 B
│ └─ assistant: "Session 实现..."
| 操作 | 按键 |
|---|---|
| 上下移动 | ↑/↓ |
| 翻页 | ←/→ |
| 折叠/展开 | Ctrl+←/Ctrl+→ |
| 打标签 | Shift+L |
| 确认选择 | Enter |
| 取消 | Escape |
Tip选了用户消息会把它填回编辑区——你可以修改后重新发,这会创建一个新分支。选了AI 回复或工具调用,则会直接跳到那个位置继续对话。
过滤模式按 Ctrl+O 循环切换:default → no-tools(隐藏工具调用)→ user-only(只看用户消息)→ labeled-only(只看有标签的)→ all。
导出与分享
导出 HTML
# 导出到默认位置
/export
# 导出到指定文件
/export ~/Desktop/my-session.html
适合归档或者发给同事看对话记录。
分享为 Gist
/share
这会创建一个私有 GitHub Gist 并生成分享链接。对方打开看到的是渲染好的 HTML,不需要安装 pi。
Note要使用
/share,需要先在 pi 里配好 GitHub token。如果没用过 Git 集成,第 20 章会讲到。
命令行导出
不进交互模式也能导出:
pi --export session.jsonl output.html
适合脚本批量处理。
会话命名技巧
命名是小事,但在翻几十个会话的时候——名字好坏天差地别。几个建议:
- 用动词开头:“重构用户模块”而不是”用户模块”
- 加上范围:“修复登录超时 bug”而不是”修 bug”
- 加日期前缀可以,但别只靠日期——一周后你就忘了那天干了啥
临时试东西的会话也可以不起名。它们排在有名字的会话后面,不会碍眼。
小结
- 会话存在
~/.pi/agent/sessions/,按工作目录分文件夹,每个会话一个.jsonl文件 pi -c恢复最近会话,pi -r浏览历史,--no-session临时模式/resume、/new、/name、/session四个命令覆盖了日常会话操作/tree(在文件内跳)、/fork(复制到新文件)、/clone(备份当前)用途不同,别搞混
会话树数据结构和 JSONL 格式的内部细节,放在第 25 章。现在你知道怎么存、怎么找、怎么切,日常使用已经够用了。