feat(context): 增加旧工具结果的读时 Micro Compact#161
Conversation
Codecov Report❌ Patch coverage is 📢 Thoughts on this report? Let us know! |
Cai-Tang-www
left a comment
There was a problem hiding this comment.
架构与行为上我有一个建议需要在本 PR 里修正:
microCompactRetainedToolSpans的计数时机可能导致“保留预算被空块占用”
- 位置:
internal/context/microcompact.go - 当前逻辑:只要 span 里存在可压缩 tool call ID,就会先
retainedCompactableSpans++,即使该 span 内所有 tool message 都是IsError=true/ 空内容 / 已清空,最终并没有真正“保留有效内容”。 - 风险:最近窗口会被这些“不可清理/无有效内容”的 span 吃掉,导致更早但仍有价值的工具结果被过早清理,和“保留最近工作面上下文”的目标不一致。
建议修复:
- 先判断该 span 是否存在至少一条“可清理候选”或“有效保留候选”(例如 role=tool、匹配 compactable ID、非错误、非空、未清空)再消耗 retained 预算。
- 补一条回归测试:最近两个 compactable span 均为 error/empty 时,不应挤占保留预算并误清理更近的有效工具结果。
其余模块边界(读时投影、不改 runtime 持久化)是合理的,测试覆盖也比较完整。
1)可压缩工具列表硬编码在 context 层microCompactableTools 是静态 map,后续新增/改名工具时容易漂移。 2)现在 Builder.Build() 每次都执行 micro compact,无法按会话/环境灰度。如果线上出现误清理,很难快速回退。建议至少留一个配置开关(默认开也行)。 |
已修正 retained 预算被 error/empty span 占用的问题 |
|
当前 micro compact 对“可压缩工具”的判断依赖静态白名单(按工具名匹配)。 该行为对“高输出工具”风险较高,因为其旧 tool result 会长期保留在 provider 请求上下文中。 |
|
在工具中加入显式声明compact:true即可,直接改动就行 |
变更摘要
在
context模块中增加读时Micro Compact能力,用于缩小发送给模型的上下文体积,同时不修改 runtime 持久化的原始会话消息。本次改动将 micro compact 挂到
context.Builder的消息输出链路中,执行顺序变为trim -> micro compact -> BuildResult.Messages。对于较早的高体积工具结果,会将role=tool消息的内容替换为[Old tool result content cleared],同时保留工具调用结构和最近工作面上下文。主要改动
context.Builder中接入读时 micro compacttrim逻辑不变,在其后增加微压缩投影tool消息内容,不改写 assistant 的ToolCallsToolCallID、Role、IsError等结构字段,避免破坏后续上下文语义IsError=true的工具结果默认纳入 Micro Compact 的工具
bashwebfetchfilesystem_read_filefilesystem_grepfilesystem_globfilesystem_editfilesystem_write_file行为说明
测试覆盖
新增并补充了以下测试场景:
Builder.Build()默认链路会执行 micro compact验证结果
已执行:
go test ./internal/context/...go test ./...