跳到主要内容

oh-my-pi v15.11.0 发布 —— 当 Agent 的"遗忘"变成像素级记忆:Snapcompact 来了

· 阅读需 6 分钟

这个版本最核心的改动只有三个,但每一个都在改变 Agent 框架的设计范式。

oh-my-pi v15.11.0 封面

亮点一:Snapcompact——把压缩历史变成像素帧

这是本版本最反直觉、也最值得关注的功能。

传统上,当 Agent 的对话历史撑满上下文窗口时,有两种处理方式:截断(丢掉最旧的内容)或压缩(用 LLM 把历史重写一份摘要)。后者效果好一些,但代价是每次压缩都要烧一趟 LLM 调用,而且 LLM 做摘要会丢失代码行号、错误栈、文件路径这些细节——它认为"重点"的和你关心的,天然有偏差。

Snapcompact 走了一条完全不同的路:不要 LLM 插手。它把即将被丢弃的历史文本直接渲染到密集的像素字体位图中,作为图片贴回对话上下文。Vision Model 读这些位图的速度和读纯文本相当,但渲染位图比跑 LLM 压缩便宜得多。

底层实现做了很细致的差异化适配。不同的 API provider 有不同的图片计费方式,Snapcompact 会根据当前模型自动选择最优的帧形状:

  • Anthropic 和未知 API8x8r-bw(unscii-8 方框字体,黑墨,每行双轨打印)——阅读速度接近纯文本,成本约低 2 倍,拒绝率最低。
  • Google8x8r-sent(句子色调渲染)——成本约低 2.9 倍。
  • OpenAI6x6u-sent(unscii Lanczos 拉伸到 6×6 格,detail: "original")——OpenAI 固定按 ~2.9k tokens/张计费,帧数才是成本杠杆。

Snapcompact 的帧数据存储在 preserveData.snapcompact 下,采用 8 帧中段弹出(middle-out)的 eviction 预算。帧会跨 compaction 操作持久存在——这意味着你的历史不会因为多次压缩而逐层退化。

snapcompact 已被提取为独立的 @oh-my-pi/snapcompact 包,包含完整的 SQuAD 实验套件、provider 探测工具和激活分析。如果你在构建自己的 Agent 框架,可以直接复用。

亮点二:Task 工具的并行化重写

Task 工具是本版本中破坏性最大的改动,也是最能改变你使用习惯的改动。

以前,task 工具在子目录里启动一个子 agent,等它跑完才返回结果。task.simple 选项允许简化 schema,但本质上还是串行执行。子 agent 的 session 在任务完成后就被回收。

现在,task 工具被彻底重写:

  • Batch 模式(默认开启):wire schema 变成 { agent, context, tasks[] }——每个 tasks 项启动一个独立的持久化子 agent,全部在后台并行运行。
  • 异步投递:结果以 job 交付形式返回,只在真正需要时才 job poll 阻塞等待。
  • 持久化生命周期:子 agent 完成后进入 idle 状态,7 分钟无活动后自动序列化到磁盘。被取消或 abort 的 child 可以 salvage 回收资源。
  • Soft request budget:子 agent 达到配额阈值后注入 wrap-up 指令,超额 1.5 倍时优雅中断。

同时,resume 选项被移除(通过新的 irc 发消息即可继续和子 agent 对话),task.simple 和 per-call schema 参数被移除(task.batch 覆盖了所有用例)。

如果你之前只在偶尔需要隔离测试时才用 task,建议在新版本里重新试试它——当你建了 5 个并行子 agent、各自处理不同上下文的时候,你会意识到以前串行 task 的方式已经回不去了。

亮点三:Agent Hub + IRC 总线

伴随 task 重写,session 观察器被替换为 Agent Hub。按下 ctrl+salt+a、或在空编辑器中双击左箭头,弹出一张实时表格:所有已注册的子 agent,存活状态、当前任务、消耗资源一目了然。每个子 agent 都可以进入聊天视图——Enter 打开 transcript + 输入行,可以给正在运行的 agent 发指令、唤醒空闲 agent、或唤醒已序列化的 agent。

IRC(agent 间通信)被从配置项升级为协议。irc.enabled 设置被移除,现在 IRC 的可用性自动推导。API 重写为 send/wait/inbox/list 四个操作,基于 per-agent 邮箱总线(mailbox bus),每个 agent 有绑定的收件箱容量。history:// 协议的加入让 agent 历史记录的引用方式标准化了——history:// 列出所有 agent,history://<agentId> 渲染一段折叠工具调用后的精简 transcript。

更多值得关注的细节

这个版本还有不少不容易归类的改动,但都很实用:

  • <files> 标签统一:compaction 和 branch-summary 中的文件列表从 <read-files><modified-files> 合并为单一的 <files>,按 prefix-folded 目录树渲染,每个文件标注 (Read)/(Write)/(RW)。旧标签会在下次 compaction 时自动愈合。
  • Supersede 裁剪:当同一个文件被重新读取后,之前的 tool 结果被标记为过时并在溢出裁剪时优先剔除。这是为 long-running agent 设计的——同一个文件的旧结果会累积占用大量上下文窗口。
  • 内联字节上限:bash 和 browser 工具结果现在有约 50KB 硬上限,尾部截断并附 artifact:// 链接。这关闭了此前工具结果可以塞进 100KB+ 内容的路径。
  • 思考量计费修复([#2275]):estimateTokens() 之前低估了 thinking-heavy 消息——thinkingSignature payloads 和 redactedThinking.data 没有被计入,导致本地估算远低于 provider 实际用量。现在二者一并计入。
  • OpenRouter DeepSeek V4 工具 schema 修复([#2270]):strict tool schemas 在嵌套 anyOf 时产生不含 type 的分支,OpenRouter 返回 400。修复使 enforceStrictSchema 自动展平纯 union 到父级 anyOf
  • 跨模型 reasoning chain 保留([#2257], [#2265]):anthropic-messages → anthropic-messages 续接时,之前的 thinking/redactedThinking block 会完整保留,不会断裂。

Breaking Changes 的决策逻辑

v15.11.0 的 breaking changes 集中在几个明确的删改上,每个删除都对应"有一个更好的路径存在":

  1. resume 从 task 移除 → irc.send 可以实现同样效果
  2. irc.enabled 移除 → 自动推导
  3. task.simple 和 per-call schema 移除 → task.batch 覆盖所有用例
  4. convertToLlm 别名删除 → 与 defaultConvertToLlm 重复
  5. compaction barrel 中 snapcompact helpers re-export 删除 → 强制从 @oh-my-pi/snapcompact 导入

对于没有自定义过这些 API 的用户,升级理论上不会有感知。


升级命令:

# 一键安装(macOS / Linux)
curl -fsSL https://omp.sh/install | sh

# 或者通过 Bun
bun install -g @oh-my-pi/pi-coding-agent

完整更新日志:GitHub Release

📢 关注我,获取最新开源更新日志和开发者工具动态。

#oh-my-pi #AI编程 #版本更新