跳到主要内容

53 篇博文 含有标签「Oh My Pi」

查看所有标签

oh-my-pi v15.10.1 发布 —— Auth 重构铺到底层,/tan 让 AI 分身干活,计划模式全屏重写

· 阅读需 7 分钟

oh-my-pi v15.10.1 封面

Auth 重试架构:从单点 key 到 a/b/c 三层轮换

v15.10.1 最深的改动藏在 API 调用链的最底层——认证层。

过去 oh-my-pi 的 API key 管理是平面的:一个 apiKey 走到底,401 报错就报错。这个版本引入了 ApiKeyResolverApiKey 的完整认证系统,配合 authStorage.resolver() 建出的 a/b/c 三层重试策略:

  • 第一次 401:尝试 forceRefresh 刷新当前凭据(针对短期 token)
  • 第二次 401:切换到 sibling credential(针对多账号轮转)
  • 超出限制/无 sibling:按最初配置的 apiKey 兜底

这不是某个 provider 的专属改动——它写进了全部调用路径的底层。非 agent 的 API 操作(标题生成、commit-message 生成、图片生成、web search、eval、记忆合并)全部换上了 session-aware 的 key 解析。图片生成(OpenAI-hosted、antigravity、xai-oauth)和 web search(anthropic、exa、tavily、parallel 等 7 个 provider)各自套上了 withAuth 包装。

说实话,做多 provider 的 agent 工具里,我很少看到对 auth 重试写得这么细致的。大部分项目只在用户首次配置 key 时管一次,后面出错就弹 401 了事。oh-my-pi 把这个塞进了重试循环里——登录失效后自动刷新,刷新失败自动切换账号,切换失败才报错。对于长期跑在后台的 agent 任务,这个差距是「自己知道要修 key」和「任务默默失败」之间的差别。

/tan 命令:在想主线任务的同时开一条副线

/tan <work> 是一个新命令——把当前会话分支成一个后台 agent,跑边角任务不阻塞主会话。

它的实现比想象中重:后台会话继承了父会话的 prompt 缓存 key 和 MCP 代理工具,有独立的 artifact 副本。dispatch 消息记录了非阻塞移交,主会话继续正常编辑,后台 agent 完成后再把结果送回来。现有的 /bg(挂起整个进程组)被移除了——/tan 才是更合理的后台模式。

这个功能的使用场景很明显:你在改代码的时候想到「顺便查一下这个 API 的文档」或「跑一下测试看看会不会炸」——过去要么等当前工具返回,要么开一个新终端。/tan 让这个并行发生在同一个 agent 的上下文里。

计划模式:从内嵌面板到独立全屏

计划模式(plan-mode)被整个翻了一遍。之前的版本是一个内联 transcript 块加一个底部选择器——交互空间小,导航僵硬。v15.10.1 把它换成了类似 /copy 的全屏 overlay,借用了终端的 alternate screen buffer:

  • ScrollView 导航:↑/↓ 逐行、Shift+↑/↓ 加速、PgUp/PgDn、g/G 跳转首尾
  • VS Code 风格侧边栏:终端宽度够 + 计划有 ≥2 个标题时自动显示,高亮跟踪滚动位置
  • 区域操作:Tab/Shift+Tab 在侧边栏和正文间切换焦点,d 删除区域(u 撤销),a 添加反馈标注
  • 鼠标支持:点击批准选项生效、点击侧边栏跳转、滚轮滚动计划页面
  • 走到底部自动进入批准选项:从最后一个 section 的底部往下走就落到 approve/refine/back

这个改动不只是界面美化——之前的内联版在 scrollback 中会散落 transcript 段落,全屏 overlay 让整个审批流程保持在一个独立的视图里,审批完了回到 transcript 时不会被中间步骤污染。我自己试了一下,在 long plan(>5个section)上导航速度快了不止一倍。

平滑流式输出和其他渲染改进

30FPS 逐字输出

assistant 的流式输出从「chunk-by-chunk 整个替换消息」改成「每秒 30 帧逐字增量揭示」,带 grapheme-safe 自适应追赶。更接近人类打字的效果——不是一下子弹出整段话,而是一个字一个字地出现,但追赶上之前的内容时加速不卡。

对应的,TUI 动画帧率从 60fps 降到 30fps(工作状态、待处理边框、主题 loading 动画)。显示上其实看不出差别,但 CPU 负载减半——在复杂的 TUI 会话中,每个 tick 都少算一倍的渲染周期。

ChatBlock 原语

新引入的 ChatBlock transcript 原语和统一的 ctx.present() sink,把之前零散分布在各个 controller 里的 chatContainer.addChild() + ui.requestRender() 模式收归一处。ChatBlock 带 React/Svelte 风格的生命周期——onMount 启动效果、onCleanup 注销清理、finish() 冻结内容、dispose() 完全销毁。MCP 的「Connecting…」spinner 现在就是一个 ChatBlock。

这意味着 transcript 重建时(session replay)不会再有泄漏的 setInterval/requestRender——所有动画块自己管理自己的资源。

Tool 输出框架统一化

多个 tool 的渲染被梳理了一遍:

  • edit/apply_patch:流式进行中也有框架
  • bash/eval:框架 title bar 不再重复「Bash」行,优化最小化 artifact 链接的位置
  • search 家族(find/search/ast_grep):多级目录树折叠,从单层 # dir/ 变成 # pkg/src/ → ## nested/ → ### child.ts
  • read 连续调用:跨 completion 聚合(不再每个 tool call 单独一行)
  • todo 阶段性渲染:多阶段列表默认只渲染有更新的阶段,其他折叠为一行摘要
  • completion.notify 前台也触发:桌面 toast 不再只在后台模式亮起
  • tool 间垂直间距统一:所有 block 的空白由 TranscriptContainer 统一管理,不再依赖各组件自己的 Spacer

这些改动单独看都很小——但每次修一条,agent 的输出就少一分「AI 感」多一分「控制台感」。

值得关注的修复

llama.cpp 并行 tool call 修复。llama.cpp 的 OpenAI Responses endpoint(/v1/responses)在发出多个 function_call 时,只有最后一个的 arguments 是正确的,前面的全是 {}。根因是 llama.cpp 的 stream 事件中 output_item.added 只带 item.call_id 没有 item.id,而 function_call_arguments.deltaitem_id: "fc_<call_id>" 匹配。oh-my-pi 加了 item.call_id 作为次级查找 key,让 identifier 不标准的 host 也能正确路由。(#2015)

dlv 调试 Go 包debug 工具之前拒绝任何 dlv 对目录的启动——validateLaunchProgram 在 adapter 选择之前就 reject 了。现在 adapter 解析在验证之前执行,dlv 标记了 acceptsDirectoryProgram,目录和 .go 文件启动为 mode=debug,其他文件为 mode=exec。(#2020)

多字节 UTF-8 bash 命令损坏修复。当命令中包含 /× 等多字节字符且在尾部有 | head/| tail 时,brush-parser 报告的是 Unicode scalar 偏移量,但 pi_shell::fixup 按字节偏移量切割——多字节每个 char 的偏移量多了一个字节,导致切除的位置正好落在多字节序列中间,丢掉末尾的闭合引号。

OMP dry-balance --bench 修复。解决了两类问题:401 token 失败后自动重续 OAuth 凭据;raw 模式(ONLCR 关闭)下的进度行不再阶梯式重复渲染。

URL 二进制读取智能降级。read/web-fetch 读取远程 URL 时,根据 payload 类型差异化处理:压缩存档列出根目录条目、SQLite 数据库显示表概览、notebook 渲染为可编辑单元格、二进制文件返回元数据提示而不是解码乱码。

升级

curl -fsSL https://omp.sh/install | sh
# 或用 Bun
bun install -g @oh-my-pi/pi-coding-agent

完整更新日志:GitHub Release

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

#oh-my-pi #AI编程 #Auth重构 #开源 #计划模式 #开发者工具

oh-my-pi 深度解读 —— 一个把 IDE 能力塞进终端的 AI 编程 agent

· 阅读需 7 分钟

oh-my-pi 的 slogan 是「A coding agent with the IDE wired in」。这句话不夸张。

oh-my-pi 深度解读封面

它是什么

oh-my-pi 是 Pi 的一个 fork,由 Can Bölük 维护。Pi 本身是一个多 provider LLM 终端客户端,而 oh-my-pi 把它改造成了一个「以编程为第一优先级」的 agent 工具。TypeScript 写的上层逻辑 + Rust 写的核心引擎,约 27,000 行 Rust 代码直接编译进二进制——不像大部分 agent 那样 shell out 到第三方工具,而是把 grep、shell、AST 解析、语法高亮、PTY 分配、图片编解码、BPE token 计数全部内联进进程。

40+ Provider、32 内置工具、18 个你没想到的功能

工具链:32 个工具,一个命名空间

oh-my-pi 的工具分几类,所有工具都在同一命名空间下,不像某些项目分「内置工具」和「MCP 工具」两种语言:

  • 文件与搜索read(文件/目录/压缩包/SQLite/PDF/notebook/URL → 统一路径接口)、writeedit(hashline 内容锚定补丁)、ast_edit(ast-grep 结构重写,预览后执行)、searchfind
  • 运行时bash(带 PTY 和后台任务调度)、eval(持久的 Python 和 JavaScript cell,两个内核都可以回调 agent 的工具)、ssh
  • 代码智能lsp(诊断、导航、符号、重命名、代码操作、原生请求)、debug(驱动 DAP session——断点、单步、线程、堆栈、变量)
  • 编排task(并行派发 subagent,可选 workspace 隔离)、irc(子 agent 之间短文本通信)、todojobask
  • 外网browser(Puppeteer + 隐身模式默认开)、web_search(14 个 provider 链式调用)、githubgenerate_imageinspect_image
  • 记忆retain/recall/reflect(Hindsight 记忆系统)

18 个值得单独说的功能

1. 代码执行带工具回调 — eval cell(Python + JavaScript)可以从 cell 内部调用 agent 的 read/search/task 工具。agent 挂载了 CSV 文件,Python cell 里用 tool.read 读它,JavaScript cell 里做图表,不离开同一个 session。

2. LSP 写进每次编辑 — 请求 rename 就是真的 rename。调用走 workspace/willRenameFiles 协议,re-export、barrel 文件、别名导入在文件移动前就更新了。不是「自己找引用自己改」那种。

3. 驱动真调试器 — C 程序段错误:agent attach lldb,步进到坏指针,读帧。Go 服务卡住:attach dlv 遍历 goroutine。Python 进程卡死:debugpy,暂停,检查,求值。不是加 print 了事。

4. 时间旅行流规则 — 你的 rule 不占用每次的 context。模型跑偏时正则匹配中断流,注入 rule 作为 system reminder,从同一位置重试。注射在 compaction 后仍然生效。

5. 一级 subagent 支持task 派发到隔离 worktree,每个 worker 独立工具空间,返回 schema 验证的对象。父 agent 直接读字段,不需要解析自然语言、不需要处理 sibling 之间的合并冲突。

6. Hashline 编辑 — 模型指向内容哈希锚点而不是重打要改的行,空格战和「字符串找不到」循环不再发生。文件过期了锚点不匹配?patch 在污染代码前就被拒绝了。

7. GitHub 就是另一种文件系统read pr://1428 返回 PR 内容,search 可以走 diff 目录,agent://<id>/findings.0.path 按路径直接取 subagent 输出的字段。所有 :// 方案用同一个 read 接口。

8. 冲突解决 — 每个 merge conflict 变成一个 URL。agent 写 @theirs/@ours/@baseconflict://N,文件干净解决。

9. 原生 Windows 支持 — 不用 WSL。不 shell out 到 rg/grep/find。在进程内直接调 ripgrep、glob、find、brush-shell。同一二进制在 macOS/Linux/Windows 上跑。

10. Hindsight 记忆系统 — agent 在运行中写事实(retain),下次回拉(recall),每轮 session 压缩成心理模型,下一轮第一句就加载。按项目隔离。

11. ACP 协议支持 — 在 Zed 里跑 omp,读你正在看的 buffer,经过编辑器的保存路径写文件,在编辑器的终端里起 shell。

12. 兼容 8 种现有配置格式 — Cursor MDC、Cline .clinerules、Codex AGENTS.md、Copilot 配置……o 直接读。不迁移,不转换,不写「支持的子集」脚注。

13. omp commit — 读工作树,把无关的改动拆成原子 commit,按依赖排序。循环依赖拒绝后不出手。源码比测试和文档优先,lock 文件不分析。

14. 冲突 URL 方案 — 前面提过。一个细节:conflict://* 批量解决所有冲突。

15. 预览 + 确认ast_edit 返回 (proposed) 卡片,agent 调 resolve,TUI 显示 Accept 卡片,磁盘写入是原子的——要么全写要么不写。

16. 真浏览器 + Slack — Stealth 默认开,网站看到的是普通用户。同样 API 驱动任何 Electron 应用——指向 Slack,agent 像读网页一样读你的 DM。

17. web_search 内置 — 14 个 provider 链,按站点智能提取。GitHub、arXiv、Stack Overflow、npm 等 20+ 站点有专有提取器,返回结构化 markdown,链接不丢。

18. 安全数据库查询 — NVD、OSV、CISA KEV 直接查,返回的是供应商数据而不是博客摘要。

40+ Provider,角色路由

oh-my-pi 支持 40 多个 provider,按角色(default/smol/slow/plan/commit)分发请求。本地模型也用 local 标签直接接入 Ollama、LM Studio、llama.cpp、vLLM。每个角色可以配 fallback 链——主 provider 429 了自动切到下一个。

还有路径级覆盖:modelRoles 下 nest paths:,不同项目目录用不同模型。

架构:~27,000 行 Rust

Rust 核心分成 22 个模块,3 个 crate(pi-nativespi-shellpi-ast),5 个平台二进制。所有热路径不走 fork/exec:

模块作用~代码行
shell嵌入式 bash,持久 session,超时/中断3,700
grep正则搜索,并行/顺序,glob 过滤1,900
keysKitty 键盘协议 + xterm 回退1,490
text终端文字宽度计算、截断、换行1,450
summarizeTree-sitter 源码摘要1,040
astast-grep 模式匹配与结构重写1,000
fs_cache文件缓存(mtume 键)840

四个入口

oh-my-pi 同一引擎四种启动方式:

  • omp — 默认 TUI 交互界面,工具调用渲染成卡片,编辑预览后落地,歧义走 ask 工具弹选项
  • omp -p — 单次问答后退出
  • Node SDKcreateAgentSession + session.prompt("list .ts files"),嵌入到你自己的进程里
  • RPC (--mode rpc) — NDJSON 通信,适合非 Node 宿主。--mode rpc-ui 加入工具卡片和选择对话框
  • ACP (omp acp) — 通过 Agent Client Protocol 与编辑器通信(Zed 等),工具 I/O 走编辑器,写操作需 session/request_permission

安装

# macOS / Linux
curl -fsSL https://omp.sh/install | sh

# Bun(推荐)
bun install -g @oh-my-pi/pi-coding-agent

# Windows
irm https://omp.sh/install.ps1 | iex

第一次启动自动继承磁盘上已有的配置:.claude.cursor.windsurf.gemini.codex.cline.github/copilot.vscode 下的 rules、skills、MCP servers——不迁移,直接读。

项目主页:omp.sh · GitHub:can1357/oh-my-pi

如果你觉得现有的 coding agent 在「能改配置」和「能改代码」之间差了点什么——oh-my-pi 给你的是从 LSP 到调试器到汇编级调试的一条线。而且不用换工具。

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

#oh-my-pi #AI编程 #开源 #终端工具 #开发者工具

oh-my-pi v15.10.0 发布 —— 以前用一个开关决定 fetch 方式,现在给了五种选择

· 阅读需 4 分钟

oh-my-pi v15.10.0 封面

以前:一个 parallelFetch 开关决定一切

之前 oh-my-pi 的 fetch 策略只有一个 providers.parallelFetch 布尔值:打开是并行,关上走默认。听起来简单,但实际用起来很尴尬——有时候你想用 trafilatura 抓正文,有时候想用 jina 做结构化提取,有时候就想老老实实用 native。一个开关解决不了这种选择。

v15.10.0 把它改成了 providers.fetch 枚举:auto / native / trafilatura / lynx / parallel / jina。旧配置自动迁移,默认 auto。五个选项对应五种不同的 URL 读取器后端优先级——不再是非此即彼,而是按场景挑。

这是一个 Breaking Change,但看社区的迁移方式就知道了:旧 key 被自动丢弃,新默认自动启用。除了改了配置文件需要看一眼,用户端基本无感。

核心修复:三个你迟早会碰到的问题

Cloud Code Assist(Antigravity / Gemini CLI)的 github 工具挂了

pr 参数 schema 含 anyOf: [string, array] 的时候,CCA 的混合类型组合器选了第一个非空类型(string),却把 items 从 array variant 里一起复制过来了——结果产出一个 {type: "string", items: {...}} 的 schema,Google API 直接 400 拒绝。修法是:collapse 现在会按获胜类型的允许 key 集过滤合并后的 variant 字段。

简单说:如果你用 CCA 和 GitHub tool 的组合,之前大概率遇到过请求发不出去的情况。

OpenAI Responses 家族面请求 400 的「孤儿 tool call」问题

OpenAI Responses、Codex、Azure Responses 等 provider 在处理 session 树分支或中断的会话时,如果上下文中停在了一个 tool call 上,后续请求会报 400 No tool output found for function call。原因是对应的 tool-result 在重建历史时丢失了。

修法是:在未配对的 function_call / custom_tool_call 之后立即合成一个占位 function_call_output / custom_tool_call_output。模型能看见这个调用,可以 recover 而不是整个请求 400。

Anthropic 推理 endpoint 在续写请求中丢推理

非官方 Anthropic 兼容 endpoint 发出的 unsigned thinking block 会被降级为 type: "text",导致下一轮的 tool-call argument 序列化出错——表现为 todo 工具报 args?.ops?.map is not a function。修了之后非官方 endpoint 的 unsigned reasoning 会保留为原生 type: "thinking",不会降级。

GitHub Actions 读取工具上线

read/web-fetch 工具现在能抓 GitHub Actions 的 runs 和 jobs 页面了。fetch github.com/{owner}/{repo}/actions/runs/{id} 会渲染 run 元数据加 per-job 的 step 列表。…/jobs/{id} 还能看单个 job 的完整纯文本 logs(有 GITHUB_TOKEN/GH_TOKEN 时)。没有 token 也会有明确的降级提示。

其他值得注意的

  • @oh-my-pi/pi-ai/effort 模块拆分:从 model-thinking 中拆出独立的 Effort 枚举和 THINKING_EFFORTS 导出,热路径消费者可以只 import effort 级别而不拉 model-thinking 的整个依赖图
  • Antigravity 用量去重:之前同一个 tier 的 15+ model 在 usage 面板里各占一条。现在按 tier 折叠成一条,匹配上游 API 的共享配额逻辑
  • Subagent task.maxRuntimeMs 限制移除:eval agent 的子 agent 不再受 wall-clock cap 限制(父 cell 的 idle watchdog 已在 bridge 调用期间暂停)

安装:

curl -fsSL https://omp.sh/install | sh
# 或用 Bun
bun install -g @oh-my-pi/pi-coding-agent

完整更新日志:GitHub Release

第一次写 oh-my-pi 的更新。从这个版本看,它更关注「不同 provider 之间的兼容性」——CCA、OpenAI Responses、Anthropic 三家的坑都踩了一遍,而且每个修得都挺深。

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

#oh-my-pi #AI编程 #开源 #版本更新 #开发者工具