跳转至

09. 状态、事件与可观测性

Codex 在运行过程中持续产生结构化状态。模型文本、推理内容、命令开始、命令输出、补丁结果、差异更新、审批请求、token 用量和轮次完成都会形成事件。事件用于实时展示,持久化记录用于会话恢复,状态数据库用于跨会话索引和后台任务。

flowchart TD Runtime[会话/运行时] --> Event[核心事件] Event --> Notify[app-server notifications] Notify --> TUI[终端界面] Notify --> Exec[一次性执行 / JSONL] Notify --> Client[外部客户端] Event --> Rollout[持久化条目] Rollout --> Store[线程存储] Store --> Replay[历史回放 / 线程读取] Store --> Resume[恢复 / 分叉] Event --> Status[智能体状态 / token 用量 / 差异] Store --> StateDB[状态数据库索引] StateDB --> Memory[后台记忆任务]

实时事件

会话在轮次运行过程中发出事件。事件描述运行时当前发生的事实,例如轮次开始、条目开始、助手文本增量、工具输出、差异更新、错误、轮次完成。

实时事件使客户端能够展示智能体正在执行的步骤。终端界面用事件更新界面,一次性执行用事件输出终端文本,外部客户端用事件同步任务状态。

实时事件还承担交互协调。审批请求、用户中断、工具输出和轮次完成通过事件向客户端暴露,客户端再将用户响应转回 Session 队列。事件流因此是用户介入智能体循环的通道。

通知协议

app-server 将核心事件转换成稳定通知。客户端消费 turn/starteditem/starteditem/agentMessage/deltaitem/completedturn/diff/updatedthread/tokenUsage/updatedturn/completederror 等通知。

通知隔离了客户端和核心内部实现。客户端无需理解任务调度、工具任务或历史管理,只需要按协议更新展示状态。

通知还稳定了不同客户端之间的语义。终端界面、一次性执行和外部集成都可以从同一条目生命周期推导状态,即使各自展示方式不同。协议事件比解析助手文本可靠,因为命令、差异、审批和错误都有独立结构。

持久化记录

持久化记录(rollout)保存会话恢复所需的关键记录。记录包括会话元信息、模型响应条目、压缩替换历史、轮次上下文和重要事件。

恢复时,运行时需要恢复历史、上下文基线、动态工具、记忆模式和会话元数据。分叉从旧会话某个历史点创建新会话,也需要依赖持久化记录中的恢复材料。

持久化记录因此不是普通日志,而是模型现场的恢复记录。

持久化记录中的压缩记录尤其重要。压缩会替换旧历史,恢复时必须按替换历史重建模型窗口,而不是简单追加摘要。轮次上下文记录则用于恢复上下文基线和设置差异。

线程存储

线程存储(thread-store)负责线程的持久化读写。它保存线程和对应持久化记录,支持创建、追加、刷新、恢复和读取历史。

持久化记录说明会话中发生了什么,线程存储负责这些记录保存在哪里以及如何读取。客户端读取线程历史时,服务端会从线程存储和回放逻辑中重建线程、轮次和条目视图。

线程存储抽象使本地和远程持久化可以共享上层语义。会话只需追加持久化条目,读取侧再将持久化记录重建为协议对象。

状态数据库

状态数据库保存跨会话索引和后台任务状态。长期记忆处理状态、目标状态、子智能体派生关系和线程元数据都属于这类信息。

状态数据库不替代持久化记录。持久化记录保存顺序历史,状态数据库保存便于查询和后台任务协调的状态。

长期记忆后台任务体现了二者的配合。状态数据库记录哪些线程或持久化记录可处理、处理到哪个阶段;实际可提炼内容仍来自持久化记录中保存的会话历史。

事件与持久化的交叉

部分事件只用于实时展示,部分事件也会进入持久化记录。轮次上下文、响应条目、压缩、重要错误和完成状态都可能影响恢复、分叉或历史回放。

事件变更可能同时影响终端界面展示、一次性执行输出、外部客户端协议、历史回放、token 用量和长期记忆后台处理。因此事件系统是运行时的结构化记录层,而不是普通日志。

事件顺序同样重要。条目开始必须早于条目完成,工具输出增量必须关联到正确条目,轮次完成必须在工具和待处理输入收束后发出。顺序错误会导致客户端界面、历史回放和恢复状态不一致。

命令执行示例

模型请求运行测试时,状态层会产生一组事件:命令条目开始、标准输出/标准错误增量、条目完成、可能的差异更新、token 用量更新和后续轮次完成。

这些事件让客户端展示命令正在运行、输出正在返回、任务仍在推进。命令结果同时写入历史,使模型后续能够基于真实输出继续采样。

命令输出事件和历史中的工具输出相关但不等价。事件面向实时展示,可以是流式增量;历史需要的是可恢复的最终工具结果。两者由同一次工具执行产生,但服务不同消费方。

sequenceDiagram participant Tool as shell 处理器 participant Event as 事件流 participant UI as 客户端界面 participant Hist as 历史 participant Rollout as 持久化记录 Tool->>Event: 条目开始 Event->>UI: 命令开始 Tool->>Event: stdout/stderr 增量 Event->>UI: 流式输出 Tool->>Hist: 完整工具输出 Tool->>Event: 条目完成 Event->>UI: 命令完成 Hist->>Rollout: 响应/工具条目持久化

可观测性的作用

实时事件支持用户审批、中断和进度观察。结构化条目支持客户端可靠展示命令和差异。持久化记录支持恢复和分叉。状态数据库支持长期记忆、目标和子智能体等跨会话功能。

状态系统将智能体运行过程变成可观察、可回放、可恢复的结构化任务记录。