Opencode Event 表写入优化方案

目标 :减少 event 表写入量,不改 Schema,不改 UI,不破坏重放机制

版本 :基于 D:\agent\opencode(dev 分支,v1.17.18)

2026/7/12


一、设计原则

  • 不改 Schema --- 不新增事件类型,不修改表结构

  • 不改 UI --- Web/CLI 消费端保持完全不动

  • 最小改动 --- 聚焦合并写入操作,不做架构层面的重写


二、优化一:合并 step-finish + cleanup

现状

processor.ts 中,每个 LLM turn 至少产生 2 次 updateMessage 调用:

  1. step-finish (L456):写入 finishcosttokens

  2. cleanup (L596):写入 time.completed

加上 prompt.ts 中创建 assistant message 的那次写入,同一条消息在 event 表中留下 3 条 message.updated.1 记录。

修改方案

step-finish 承担 time.completed 的写入,cleanup 仅在异常场景下兜底:

typescript

复制代码
// step-finish 分支 (L456):
ctx.assistantMessage.time.completed = Date.now()  // 新增
yield* session.updateMessage(ctx.assistantMessage)

// cleanup 分支 (L596):
// 如果已完成则跳过,仅作兜底
if (!ctx.assistantMessage.time.completed) {
  ctx.assistantMessage.time.completed = Date.now()
  yield* session.updateMessage(ctx.assistantMessage)
}

效果

指标 改前 改后
正常流程写入次数 2 次 1 次
异常流程覆盖 ✅(cleanup 兜底)

风险等级:低 --- cleanup 保留完整兜底逻辑,异常场景不受影响


三、优化二:合并创建 + 首次更新(暂缓)

现状

prompt.ts:1201 创建 assistant message 时触发一次 updateMessage,此时消息内容为空(content 为空,cost=0,tokens=0),仅为占位记录。随后 processor.ts:456 的 step-finish 再次更新,写入实际数据。

改造思路

创建时不立即发布 durable event ,仅在内存中维护消息记录,延迟到 step-finish 阶段再统一写入。

决策

暂不实施 。该改动涉及 prompt.tsprocessor.ts 之间的交互逻辑调整,改动面较大,收益与优化一重叠,优先级靠后。


四、优化三:PartUpdated 去 durable(需验证后实施)

现状

PartUpdatedmessage.part.updated.1)在 event 表中占据 260,911 行 / 1,047 MB ,约占总数据量的 68%

每条 updatePart 调用都会将完整的 part JSON 写入 event 表。streaming 过程中,text-starttext-endreasoning-startreasoning-endstep-startstep-finish 等事件都会触发写入。

PartDeltamessage.part.delta)已经采用了非 durable 的设计,可作为参照。

修改方案

schema/src/v1/session.ts:612 中移除 PartUpdated 的 durable 标记:

typescript

复制代码
PartUpdated: define({
  type: "message.part.updated",
  // 去掉 ...options 中的 durable 配置
  schema: {
    sessionID: SessionID,
    part: Part,
    time: Schema.Finite,
  },
}),

安全性验证

需要确认两点:

  1. Web UI 会话重放是否依赖 event 表中的 PartUpdated

    检查 packages/app/src/context/global-sync/event-reducer.ts:该文件处理 message.updatedsession.updated不处理 message.part.updated

  2. V2 sync 是否以 event 表为源?

    检查 packages/app/src/context/server-session.ts:786apply 方法:同样只处理 message.updated,不处理 part.updated

结论PartUpdated 的 event 表行对 Web UI 没有实际消费价值,UI 依赖的是 MessageTable 和 live stream。

效果

指标 数值
消除现有行数 260,911 行(存量不删,但不再增长)
消除数据量 1,047 MB(不再增量)

风险等级:中高 --- 需充分验证 GlobalBus 推送路径是否依赖 event 表写入(初步判断不依赖)


五、优先级

顺序 优化项 效果 风险 改动量 状态
1 优化一:合并 finish+cleanup 省 50% 的 message.updated.1 2 行 立即执行
2 优化三:PartUpdated 去 durable 省 68% 的 event 行 中高 1 行 先验证后执行
3 优化二:合并创建+首次更新 省 33% 的 message.updated.1 较大 暂缓

六、验证步骤

优化三验证流程

  1. grep 全仓搜索 PartUpdated 的消费者,确认无 projector 或 reducer 依赖

  2. 在测试环境将 PartUpdated 改为非 durable,运行一个完整 LLM turn

  3. 检查 Web UI 的会话重放是否正常(消息内容、part 顺序、streaming 效果)

  4. 对比 event 表增量,确认减少量符合预期

验收标准

  • □ 优化一部署后,正常流程每条 assistant 消息从 2 次更新减少为 1 次

  • □ 优化三部署后,event 表日增量减少 60% 以上

  • □ Web UI 所有功能(消息展示、会话重放、streaming 效果)无异常

  • □ CLI 交互无异常


七、执行清单

  1. 优化一 --- 修改 processor.ts,2 行改动,低风险,立即上线

  2. 验证优化三 --- grep PartUpdated 消费者,确认无依赖

  3. 优化三 --- 修改 session.ts,1 行改动,验证后上线

完成后,跑一个完整的 LLM turn,对比 event 表增量即可验证效果。预计三项全部落地后,event 表整体写入量可减少 60%-70%

相关推荐
Gauss松鼠会几秒前
【GaussDB】GaussDB 组件、节点和AZ故障仲裁与切换流程
运维·服务器·数据库·gaussdb
eBest数字化转型方案2 分钟前
Route Optimization for FMCG:多目标排线算法的工程实现
大数据·人工智能·算法
武子康5 分钟前
Seedream 5.0 Pro 进入 Vercel AI Gateway:图像生成开始网关化
人工智能·ai·chatgpt·gateway·agent·claude·harness
能源科技集8 分钟前
GWh时代储能逻辑生变,远景动力(AESC)790Ah电芯反向定义系统最优解
人工智能
Forerror20269 分钟前
API网关怎么部署?MAI Gateway配置教程与最佳实践
人工智能·gateway·maigateway·finapi·企业级ai网关·大模型财务管控
2601_9621007312 分钟前
AI批量生成视频的工程化复盘(2026):一条能断点续跑、不重复扣量的出片脚本
人工智能·音视频
l1m0_14 分钟前
智能电动自行车管理后台实战:AI生成页面与React组件化技巧
前端·react.js·ui·ai·设计
qq_4255161817 分钟前
双语字幕会议记录APP:多语言会议整理工具推荐
人工智能·智能手机·语音识别
xian_wwq21 分钟前
【学习笔记】-深度认知系列-第8讲主流AI模型横向评测——GPT、Claude、Gemini、盘古、文心、通义
人工智能·笔记·学习
面包狗AI4S21 分钟前
Codex/ChatGPT 反复 Reconnecting(正在重新连接) 5/5 的最简修复方法
人工智能·vscode·chatgpt