Open Interpreter 会话管理实战:Resume、Fork、Compact 与本地历史全面指南
Open Interpreter 会将每一次对话作为**会话(session)**在本地持久化,让你可以随时恢复、分叉(fork)、压缩与管理自己的历史记录。本文将围绕官方文档 docs/sessions.md 展开,结合本仓库中 CLI 参数定义、会话存储实现与配置解析源码,系统讲解如何利用 interpreter resume / fork / exec 等命令拾回工作现场、如何用 /compact 与自动压缩对抗长上下文、如何通过 [history] 配置控制本地记录,以及如何借助守护进程在多个客户端间共享同一套运行时。读完你即可在真实环境中安全地管理自己的全部本地会话。
会话存储在哪里:~/.openinterpreter/ 之下的数据组织
Open Interpreter 把所有会话数据默认保存在本地用户目录 ~/.openinterpreter/ 下,从而支持"关掉终端之后还能接着干"。
从源码结构看,这套本地存储由 codex-rs/thread-store 与 codex-rs/rollout 两个 crate 配合实现:
- 会话内容以 rollout 记录的形式落盘,主目录常量定义于 codex-rs/rollout/src/lib.rs:活动会话位于
sessions/子目录,归档会话位于archived_sessions/子目录; - 会话文件按日期分层组织,例如
sessions/2025/01/03/这样的日级目录中存放带时间戳与 UUID 的记录文件; - 记录本身既可能是纯文本的
.jsonl,也可能是经过压缩的.jsonl.zst(压缩与归档逻辑见 codex-rs/rollout/src/compression.rs); - 会话之外,还有一份独立的"命令/消息历史"文件
history.jsonl,每行一个 JSON 对象,用于记录你与 agent 的交互轨迹(见 codex-rs/message-history/src/lib.rs)。
需要说明的是,~/.openinterpreter 只是默认值。官方文档 docs/daemon.md 明确指出该目录可用环境变量 INTERPRETER_HOME 覆盖;而配置加载逻辑也会根据当前产品品牌选择不同的配置目录——Open Interpreter 使用 .openinterpreter,Codex 使用 .codex,见 codex-rs/config/src/loader/mod.rs。也就是说,Open Interpreter 的项目级配置同样约定存放在 ./.openinterpreter/config.toml(见同一文件 L106-L107)。
恢复会话(Resume):四种姿势找回工作现场
无论是不小心退出了 TUI,还是想接续前一天的实现,恢复命令都能把你拉回原会话。
命令形态一览
| 命令 | 行为 |
|---|---|
interpreter resume |
打开会话选择器(picker),交互式挑选历史会话 |
interpreter resume --last |
直接恢复当前工作目录下最近一次的会话,跳过选择器 |
interpreter resume --all |
选择器包含来自其他目录的会话,并展示 CWD(当前工作目录)列 |
interpreter resume <SESSION_ID> |
按会话 ID 精确恢复 |
interpreter resume --last "继续实现" |
恢复最近会话的同时携带一条起始提示语 |
对应 CLI 参数定义位于 codex-rs/cli/src/main.rs,其中几个细节值得注意:
SESSION_ID位置参数既接受 UUID 也接受会话名称——源码注释明确说明"UUIDs take precedence if it parses",即如果该字符串能被解析为 UUID 则优先按 UUID 匹配;--last是布尔开关,用于"不看选择器、直接进最近会话";--all会关闭 cwd 过滤并显示 CWD 列,方便从其他目录找回会话;--include-non-interactive用于把非交互(exec)会话也纳入选择器与--last的选择范围。
Resume 的默认目录语义
官方文档强调 interpreter resume 默认只列出当前目录相关的会话,而 --all 才放开目录限制。这背后是"按 cwd 过滤 + 展示 CWD 列"的选择器实现,源码注释(codex-rs/cli/src/main.rs)对 --all 的描述即"Show all sessions (disables cwd filtering and shows CWD column)"。
在 TUI 中恢复
交互式终端界面里,恢复入口是斜杠命令 /resume。官方文档 docs/interactive.md 的会话控制表中列出了 TUI 内的全套会话相关命令:/new 开启新对话、/resume 挑选旧会话、/fork 分叉当前会话、/compact 压缩旧上下文。
分叉会话(Fork):从旧会话另起一条分支
分叉(Fork)是在不破坏原会话的前提下,从某一段旧历史派生出新线程。官方文档对它的定位是:"Forking creates a new thread from an older session. The original stays intact."
interpreter fork --last # 分叉最近一次会话
interpreter fork <SESSION_ID> # 分叉指定会话
interpreter fork --all # 从选择器中选择(含其他目录)会话进行分叉
底层语义:thread/fork
在 app-server 协议层面,分叉对应 thread/fork 方法,其行为在 codex-rs/app-server/README.md 有详细定义:
- 通过复制已存储历史创建一个新的 thread id,返回结果中的
forkedFromId指向源会话(若已知); - 可选
lastTurnId参数,可只复制到指定轮次为止并丢弃其后轮次;beforeTurnId则只复制该轮次之前的历史,两者不能同时使用; - 若源线程正在运行中,fork 会先对当前轮次做打断快照,再派生新线程,保证派生内容一致;
- 传入
ephemeral: true时 fork 仅驻留内存,不落盘,适合临时分支场景。
TUI 里的 /fork 与 /side
在 TUI 内,除了 /fork 直接分叉当前会话外,还有 /side 命令。从 TUI 源码与测试来看,二者在交互场景中都被用于会话分支/派生侧栏线程的操作路径(相关测试覆盖见 codex-rs/tui/src/app/tests.rs 附近对 resume/fork 会话生命周期动作的断言)。它们返回的新会话同样会被持久化,之后可再次 resume 回来。
恢复非交互(Exec)会话
Open Interpreter 支持在非交互模式下执行一次性任务,这类会话同样会被记录并且可以恢复:
interpreter exec resume --last "continue with the implementation"
上面的命令会把最近一次非交互会话恢复到 exec 上下文中,并直接注入一条提示语继续推进。这一语法被 CLI 测试显式覆盖,例如 codex exec --json resume --last "2+2" 的解析断言见 codex-rs/cli/src/main.rs。
如果你希望在交互式 interpreter resume 的选择器中也能看到这些非交互会话,就加上 --include-non-interactive 开关——这正是 codex-rs/cli/src/main.rs 中该参数的用途说明:"Include non-interactive sessions in the resume picker and --last selection"。
压缩长对话(Compact):给上下文瘦身
随着对话变长,模型可用的上下文窗口会被历史消息逐渐占满。压缩(Compaction)会把这串长对话提炼成一段较短的摘要,从而腾出上下文空间继续工作,同时保留关键信息。
手动压缩:/compact
在 TUI 中直接输入:
/compact
即可触发一次手动压缩。该命令会启动后台压缩任务,将旧上下文归纳为摘要注入后续对话。TUI 对 /compact 有完善的排队机制——如果当前已有轮次在运行,压缩命令会等到活跃轮次结束后再派发(见 codex-rs/tui/src/chatwidget/tests/slash_commands.rs 中 slash_compact_eagerly_queues_follow_up_before_turn_start 与 queued_slash_compact_dispatches_after_active_turn 两个用例)。
自动压缩阈值:model_auto_compact_token_limit
当活跃模型接近其上下文窗口上限时,系统可以自动执行压缩。如果你需要显式控制触发时机,可以在配置文件中设置:
model_auto_compact_token_limit = 120000
model_auto_compact_token_limit_scope = "total"
这两个配置项在配置解析源码 codex-rs/config/src/config_toml.rs 中的定义是:
model_auto_compact_token_limit:触发会话历史自动压缩的 token 用量阈值(Option<i64>),不设置则按内置默认策略触发;model_auto_compact_token_limit_scope:阈值的作用范围,枚举定义于 codex-rs/protocol/src/config_types.rs:total(默认):对整个活跃上下文计数;body_after_prefix:只对"继承前缀之后的采样输出与后续增长"部分计数。
压缩核心执行逻辑集中在 codex-rs/core/src/compact.rs,包括 run_compact_task(常规压缩)与 run_inline_auto_compact_task(内联自动压缩);在 app-server 协议层,手动压缩对应 thread/compact/start JSON-RPC 方法,调用即返回并随后通过标准 turn/item 通知流式输出进度(见 codex-rs/app-server/README.md)。
历史控制(History Controls):决定记录什么、记录多久
Open Interpreter 默认会把交互记录写入本地历史文件(history.jsonl,见 codex-rs/message-history/src/lib.rs)。[history] 配置段用于控制这条记录通道的行为,对应配置结构体 History 定义于 codex-rs/config/src/types.rs。
完全禁用已保存的历史
[history]
persistence = "none"
persistence 字段的取值定义在 HistoryPersistence 枚举中(codex-rs/config/src/types.rs):
| 取值 | 行为 |
|---|---|
save_all(默认) |
将所有历史条目写入磁盘 |
none |
不向磁盘写入任何历史条目 |
注意:该开关只影响
history.jsonl记录通道;会话本身(可用于resume/fork的 rollout 记录)仍受其他机制管理。若希望对会话/线程存储做更细粒度控制,可进一步参考 docs/config.md 中的 History and Memory 一节以及配置全量参考 docs/config-reference.md。
限制历史文件大小
[history]
max_bytes = 104857600
max_bytes 为可选字段(Option<usize>),含义是历史文件的最大字节数;一旦文件超过该上限,最旧的条目会被丢弃以控制体积。上述示例即把上限设为约 100 MiB。若不设置该字段,则历史文件不受字节数硬性限制,只会随使用不断增长,因此建议在长期使用场景中主动配置。
完整示例也可对照 docs/config.md,其中给出了 [history] persistence = "none" 的标准写法。
守护进程模式:多客户端共享同一运行时
默认情况下 interpreter 以前台进程方式运行:终端 UI 与运行时在同一进程内,退出 UI 即干净地结束会话,普通使用并不需要守护进程。守护进程只在你希望"一个运行时服务多个客户端"时才派上用场——例如编辑器集成与终端同时挂到同一台机器。
守护进程的基本管理
官方文档 docs/daemon.md 提供了完整的守护进程管理命令族:
interpreter app-server daemon start # 启动后台守护进程(监听本地 unix socket)
interpreter app-server daemon restart # 重启
interpreter app-server daemon stop # 停止
interpreter app-server daemon version # 查看版本
其中 start 会在守护进程健康后就绪并返回;重复调用 start 会复用已健康的运行实例,而不会派生第二个进程。官方会话文档(本文主体 docs/sessions.md)特别提醒可以用 interpreter app-server daemon stop 停掉共享运行的服务。
让客户端连接到守护进程
终端 UI 等任何 app-server 客户端都可以通过 --remote 指向守护进程的端点:
interpreter --remote <ws-url-or-unix-socket>
守护进程的运行时文件(含日志)位于 Open Interpreter 主目录(默认 ~/.openinterpreter,可用 INTERPRETER_HOME 覆盖),启动排障时应首先查看守护进程日志。更多细节请阅读 docs/daemon.md;远程端点部署与编程式客户端分别参见 docs/remote.md 与 docs/sdk.md。
会话状态为何能跨命令、跨 TUI 保持一致
无论是 resume、fork 还是 exec resume,最终都汇入同一套"线程状态机 + 本地持久化"模型:app-server 侧的 thread/resume、thread/fork、thread/compact/start 方法定义于 codex-rs/app-server/README.md;会话的增删查、归档、分页读取则统一由 thread-store 的本地存储实现承接(codex-rs/thread-store/src/local/mod.rs)。理解这一点,你就明白为什么 CLI 会话、TUI 会话与守护进程共享的会话之间可以无缝衔接——它们读写的是同一套本地记录与同一份配置。
小结:一套完整的本地会话工作流
| 场景 | 推荐操作 |
|---|---|
| 继续手头工作 | interpreter resume --last |
| 从旧会话开出新方向 | interpreter fork --last,或 TUI 内 /fork、/side |
| 恢复一次性任务现场 | interpreter exec resume --last "..." |
| 让选择器涵盖所有来源 | resume/fork 加 --all、加 --include-non-interactive |
| 长对话续写前先瘦身 | TUI 输入 /compact,或配置 model_auto_compact_token_limit |
| 不想留记录 | [history] persistence = "none" |
| 限制记录体积 | [history] max_bytes = <字节数> |
| 多客户端共享运行时 | interpreter app-server daemon start,客户端加 --remote |
掌握以上命令与配置后,你便能在 Open Interpreter 中像管理版本分支一样管理自己的每一次编码会话:随时回到上次中断的现场、大胆从旧历史中试出新路线,并让上下文始终保持在模型可控的范围内。相关命令的完整 CLI 说明可继续查阅 docs/cli-reference.md,会话相关斜杠命令的交互式体验说明见 docs/interactive.md。
atomcodeClaude Code 的开源替代方案。连接任意大模型,编辑代码,运行命令,自动验证 — 全自动执行。用 Rust 构建,极致性能。 | An open-source alternative to Claude Code. Connect any LLM, edit code, run commands, and verify changes — autonomously. Built in Rust for speed. Get StartedRust0631
MiniCPM5-2BMiniCPM5-2B 是一款面向端侧、本地部署和资源受限场景的 2B 稠密 Transformer,能够达到同尺寸开源模型 SOTA 水平。Markdown00
video-shotcraftAI宣传片skill,使用 Remotion 制作电影级产品视频:提供106 张镜头配方卡和可复用的视频魔板。适用于 Claude Code 与 Codex以及所有其他智能体Markdown00
HivisionIDPhotos⚡️HivisionIDPhotos: a lightweight and efficient AI ID photos tools. 一个轻量级的AI证件照制作算法。Python09
DragonOSDragonOS is an operating system developed from scratch using Rust, with Linux compatibility. It is designed for **Serverless** scenarios. 使用Rust从0自研内核,具有Linux兼容性的操作系统,面向云计算Serverless场景而设计。Rust00
Spark-X2.5-1.7BSpark-X2.5-1.7B 旨在让强大的 AI 更加实用、高效且易于获取。这些模型在广泛的日常任务中表现出色,涵盖对话、写作、翻译、推理、编程、工具调用和智能体工作流,并在同等规模的开源模型中取得领先结果。Spark-X2.5 将面向效率的架构与最高 1M tokens 的原生上下文窗口相结合,并支持 200 多种语言。Python00