持久化与回放

Codex 的持久化不是单一数据库。它把“模型对话历史”和“结构化运行状态”分开管理。

Rollout:事件化历史

codex-rs/rollout 负责 rollout 文件。它保存线程中的 RolloutItem,常见形态包括:

  • response item
  • event msg
  • compacted item
  • inter-agent communication
  • rollback marker

rollout 的价值是可回放:恢复线程、fork 线程、重建 UI 历史、计算摘要时,都可以从事件序列推导。

LocalThreadStore

codex-rs/thread-store 提供 thread store 抽象。thread_manager.rs 根据配置选择:

  • LocalThreadStore
  • InMemoryThreadStore

当启用 LocalThreadStoreCompression feature 时,会启动 rollout compression worker。

冷历史压缩

codex-rs/rollout/src/compression.rs 实现后台压缩:

  • 使用 .jsonl.zst 表示压缩后的 rollout。
  • 对 append 路径可以 materialize 回普通 .jsonl
  • 读取方通过 open_rollout_line_reader 透明处理 plain 和 compressed。
  • worker 是 best-effort,使用 run marker 避免重入,限制并发压缩任务。

这和“上下文压缩”完全不同:这里压缩的是磁盘上的历史文件,不影响模型上下文语义。

State DB:结构化状态

codex-rs/state 保存更结构化的状态,例如:

  • thread metadata
  • thread goal
  • memories
  • agent jobs
  • graph
  • logs

/goal 就依赖 state DB 保存 ThreadGoal,而不是只依赖聊天历史里的 prompt。

回放时的边界

thread_rollout_truncation.rs 说明 Codex 回放历史时很重视 turn boundary:

  • user message boundary
  • inter-agent trigger turn
  • legacy assistant inter-agent envelope
  • rollback marker

这能保证 fork、回滚、保留最近 N 轮等操作不破坏对话结构。

可学习的设计

Codex 把“可审计历史”和“可查询状态”分开:

  • rollout 适合顺序回放、审计和恢复。
  • state DB 适合目标、记忆、索引这类需要查询和更新的对象。
  • thread store 负责把两者包装成上层线程生命周期。