oh-my-pi v15.10.8 发布 —— 以前偷改全局 fetch,现在每层都能注入
v15.10.8 不是加新功能——它干了一件事:把 fetch 这个被隐藏的输入口,从每一层的代码里翻了出来,变成可注入的参数。

以前:全局 hook 的暴力美学
omp 早期设计里,网络请求的入口就一个 globalThis.fetch。你要拦截、修改、mock 请求?就得自己 hook 全局 fetch。omp 自己甚至提供了一个 hookFetch API,在 @oh-my-pi/pi-utils 里导出——用中介者模式拦截全局 fetch。
这套方案的局限很明显:
- 只能拦截全局,不能精准控制某一层的 HTTP 行为
- 多个 hook 同时工作时,谁先谁后不可控
- 测试时想 mock 一个特定模块的请求,hook 全局会影响所有单元
现在:每层都可注入
这个版本在所有关键路径上加了一个 fetch?: FetchImpl 可选参数。不是单个包的单个入口——是跨 5 个包、几十个模块的统一改动:
pi-agent-core:SummaryOptions、compact/generateSummary、ProxyStreamOptions、requestRemoteCompaction——agent loop 里每个会产生 HTTP 请求的节点,全加了 fetch 注入点。
pi-ai:Google、Ollama、OpenAI-compatible 的 model manager 各自接收可选 fetch。OAuth 控制器、API key 校验、设备/PKCE 登录——整个认证链路也覆盖了。
pi-coding-agent:CustomToolContext、ModelRegistry 构造器、MCP 调用、web search、tool 网络调用——agent 暴露给模型的所有工具链。
pi-mnemopi:ExtractionClient、extractFacts——记忆系统的 LLM 请求入口。
组合起来的画面是:以后你想 mock 测试、加自定义代理、调整超时、或者给特定请求加签名,不再需要碰全局状态。传一个 fetch 进去就行,不影响其他路径。
与这次对应的还有 hookFetch 的移除——它从 @oh-my-pi/pi-utils 的导出中被删除,不再是公共 API。这不是功能退化,而是架构信号:以前需要 hook 全局完成的,现在每层都给了明确的注入点。
几个不容易注意但很重要的修复
Codex 的空白符号死循环(#2155):OpenAI Codex 流式输出会在 todo tool call 之后,不断发射纯空白字符的 function_call_arguments.delta 帧——没有新内容,但也不会断。之前的处理方式是 abort 共享的 AbortController,结果导致整个 requestSetup 无法 reopen。修复加了重试机制:放弃 abort,清理半成品 tool call,从 zero 重发请求,上限 2 次。这背后有一个更底层的教训——跨请求共享一个 AbortController 的短路效应,出 bug 后关联到另一个完全不相关的功能。
Output token 超上限 400 错误:GLM-4.7 之类的模型,catalog 里存的 maxTokens 其实是 context window(131072),不是 output 上限。请求 max_tokens=131072 会空手而归 400。修复加了硬上线 64k(OPENAI_MAX_OUTPUT_TOKENS),min(requested, model.maxTokens, 64000)——mirror 了 Anthropic 端 CLAUDE_CODE_MAX_OUTPUT_TOKENS 的设计。
OpenRouter max_tokens 过滤上游(#2155):更隐蔽的一个——OpenRouter 会过滤掉 advertised output cap < max_tokens 的上游。所以当你想要 Cerebras 的快速推理,但传了从 catalog 拿到的 131072 上限,Cerebras 被过滤了,fallback 到 DeepInfra。修复很简单:OpenRouter 请求去掉 max_tokens,让每个上游自己 cap。Kimi 继续保留——它的 TPM 限流依赖这个参数。
@upstream 模型选择器:给 aggregator 模型的 provider 路由加了一个 @ 后缀语法。--model openrouter/z-ai/glm-4.7@cerebras 的意思是「这个模型固定用 Cerebras 跑」,不再走自动路由。和后面的 thinking level 可以组合:@cerebras:high。设计上考虑了 id 中本身就含 @ 的模型(如 workers-ai/@cf/...),不会误解析。
TUI scrollback 修复(#2154):终端内容填满 viewport 后,TUI 每帧都走 historyRebuild 销毁 scrollback。修复让新增的行只追加在尾部,历史行等到安全 checkpoint 才清理——看起来像小问题,实际是 TUI 最影响日常使用体验的 bug 之一。
升级方式
# 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
完整更新日志:GitHub Release
📢 关注我,获取最新开源更新日志和开发者工具动态。如果觉得这篇文章有用,欢迎转发给身边的开发者朋友。
#oh-my-pi #AI编程 #开源 #fetch注入 #agent框架