Oh My Pi v16.0.2 发布 —— 一个工具 schema 写错了,整个对话就炸了?现在不会了
在 coding agent 越做越重的年代,这类「一个错误拖垮全局」的体验不是个例。v16.0.2 的主题很简单——不要因为一个工具的 schema 有瑕疵,就让整个回合替它陪葬。

一个工具的 schema 错误,不该炸掉十几个工具的回合
这次最核心的修复在 @oh-my-pi/pi-ai 的 convertTools 方法里。之前 OpenAI Responses API 的 strict tool schema 验证逻辑是全有或全无——如果某个工具的 enum/const 和 type 不匹配(比如一个 type: "null" 的节点上挂了非空的 enum,或者 array 节点上挂了 enum),provider 直接返回 HTTP 400,整轮对话报废。现在 convertTools 对每个工具的 schema 做了逐项校验,发现违规的 只隔离那一个工具,记一条 logger.warn 标明哪个工具、哪个 schema 路径出了问题,其余所有工具照常可用(#2652)。
这个设计的聪明之处在于:之前你装了 MCP 工具栈之后出了 400 错误,排查路径是先怀疑 provider、再怀疑 prompt、最后翻几十个工具的 schema。现在 logger 直接告诉你「xxx 工具的第 3 个参数的 enum 和 type 打架了」,你可以选择修它或者暂时禁用它,不耽误继续用其他工具。
Provider 兼容性:不是 provider 不行,是适配方式太脆弱
这版本有好几个修复其实是一个主题——OpenAI Responses stream 下并行 tool call 的 delta 路由。如果你用 Ollama 或本地模型跑 Responses 兼容流,fc_<call_id> 前缀的 delta 会被上游模型丢弃或颠倒次序。之前 ast_grep 调用拿到的是 {},校验直接炸。现在 delta 路由做了前缀匹配修正,Ollama 本地模型下并行调用不会丢参数了(#2715)。
同样跟 Google Gemini 有关的一个隐藏很深的问题:Gemini 3 系列模型对 toolChoice: "auto" 的序列化方式很敏感。以前 toolConfig AUTO mode 被显式发送出去后,Gemini 3 不走工具交付流程,直接丢出了原始的规划 JSON——也就是你以为它在执行 ast_grep 找代码,实际它在输出「嗯让我想想先找什么」。现在 toolConfig 的序列化做了调整,Gemini 3 能正确执行工具调用了(#2776)。
OpenRouter 的路由选择器也有一个边缘 case:如果你的上游 slug 恰好和模型 id 里的一段字符串重复(比如 @deepseek:high 匹配到了 deepseek-ai 的模型 id 里面),openRouterRouting.only 配置会被无视,路由退化到 provider 级别的模糊匹配。现在路由选择器做了 slug 区分匹配,确保 @upstream 指示符不被模型 id 字段吃掉(#2708)。
TUI 和终端:Warp 用户终于不用忍受布局风暴了
如果你用 Warp 终端跑 Oh My Pi,可能遇到过这个现象:拖动窗口调整大小时,TUI 疯狂重绘,CPU 飙升,闪烁到根本没法操作。原因很搞:Warp 在 alt-screen 切换时会重新上报一个小一行或大一行的尺寸,每拖一次鼠标就触发一次 resize,然后 TUI 收到 ED3 全量刷新指令——全量刷新又触发 alt-screen 切换,又触发新的 resize。死循环。
修复方案很干脆:对在 alt-screen 切换后重新上报尺寸的终端,resize 不再借 alt-screen 刷 ED3 wrap,而是原地重绘。Warp 用户下次拖动窗口时不会再触发风暴了。可以通过 PI_TUI_RESIZE_IN_PLACE=1|0 自定义这个行为。
另外 CMUX 会话也被单独识别了——之前 CMUX 不设 TMUX/STY/ZELLIJ 环境变量,TERM 可能还是 dumb,导致 TUI 认为它是直接终端而非复用器,每次 reset 都会清空面板滚动缓冲区。现在 CMUX 的工作区/表面环境标记被纳入复用器检测条件,滚动缓冲区保住了。
编码体验加强:Emacs Lisp 用户终于有了 AST 工具
@oh-my-pi/pi-natives 新增了对 Emacs Lisp(.el、.emacs)的 tree-sitter 语言推断支持。这意味着 astGrep、astEdit、summarizeCode、blockRangeAt 等操作在 .el 文件上都能用了。如果你用 .emacs 配置或拆成 .el 模块管理 emacs 配置,现在 agent 可以结构性地理解你的 init 逻辑、找到嵌套的 defun 或 let 块,而不是把它当纯文本逐行猜。
GitHub Copilot 的 .github/instructions/*.instructions.md 规则文件也被正确加载了——之前的发现逻辑没处理好 applyTo 作用域限定,现在 ** 全局规则和 rule://<name> 访问模式都能用了,Copilot 用户的项目级指令不会在 agent 侧被忽略(#2731)。
插件系统修复:测试不再 rm -rf 你的 node_modules
有一个 bug 我觉得值得单独拿出来写:plugin-extensions-discovery 测试套件会在某些环境下 rm -rf 开发者真实的 ~/.omp/plugins 目录。原因很经典——XDG 路径隔离只在 Linux/macOS 上生效,Windows 无视它;而在 XDG-migrated 的 Linux/macOS 环境里,隔离机制本身也失效了。测试直接对真实的 node_modules 下了 rm -rf 命令。现在整个测试用了 os.homedir() mock + 清空 XDG_* 变量,加上写入前检查——如果目标路径逃逸了临时 home 目录,测试直接 fail,不会动手删文件(#2721)。
其他值得注意的修复
- 插件扩展目录解析:
pi.extensions: ["./extensions"]目录方式现在被正确支持了,安装时不会再报declared extension entry not found on disk(#2713) - sub-agent 的 fallback 链:子 agent 的候选模型列表现在能按顺序 fallback 了,某个 provider 挂了可以自动切下一个模型(#2750)
omp plugin list --json不再遗漏本地链接的插件(#2742)/exit和/quit不再等待每一个扩展的 shutdown timeout——所有 session_shutdown handler 在同一窗口期内运行,退出更利索(#2736)- Windows bash-tool 子进程默认使用 UTF-8 编码,而不是 ANSI codepage,中文路径不再乱码(#2701)
- Hashline 自动修复了 JSX/XML 闭合边界行的重复问题(#2705)
- Kimi 输出上限的合规处理:Umans 网关下的 Kimi 请求现在正确使用 output cap,而不把上下文大小的 token 天花板当作请求上限
升级
Oh My Pi 支持多种安装方式:
# macOS / Linux 一键安装
curl -fsSL https://omp.sh/install | sh
# Homebrew
brew install can1357/tap/omp
# Bun(推荐)
bun install -g @oh-my-pi/pi-coding-agent
# Windows(PowerShell)
irm https://omp.sh/install.ps1 | iex
# Pinned versions (mise)
mise use -g github:can1357/oh-my-pi
完整更新日志:GitHub Release
📢 关注我,获取最新开源更新日志和开发者工具动态。
#OhMyPi #CodingAgent #AI编程 #Terminal #开源工具







