深入 Oh My Pi(omp):终端里最能打的 AI 编程 Agent

深入 Oh My Pi(omp):终端里最能打的 AI 编程 Agent

推荐语:如果你受够了「AI 改错行」和「上下文里没有 IDE 能力」,omp 是当前终端编码 Agent 里最值得一试的那个——Hashline 哈希锚点编辑把改错文件变成小概率事件,LSP/调试器/Python+JS 双内核/并行子 Agent 全套内置且互相咬合,8 万行 Rust 让它在 macOS/Linux/Windows 上行为一致。它不是 Claude Code 的平替,而是技术设计更激进的「下一代」:代价是学习曲线和折腾成本。愿意投入的开发者,它不会让你失望;犹豫的人,先读完这篇再决定。

更多AI工具分享,参见猫哥的博客:https://blog.csdn.net/qq8864

一个有趣的彩蛋:DeepSeek Harness(DSH) 的 LLM 层依赖 @earendil-works/pi-ai,而 omp 是 Pi 生态的旗舰应用——也就是说 omp 和 DSH 共享底层 LLM 运行时(都是 can1357 的 pi-ai 架构),但 DSH 走了"事件溯源 + 服务化插件 + Web GUI"的产品路线,omp 走了"终端单机全能 IDE"路线。二者更像是"兄弟项目"而非竞品。

一句话定位

Oh My Pi(命令行简称omp)是一个终端优先的开源 AI 编程 Agent:不依赖 IDE、全屏 TUI 运行,内置 31 个工具、完整 LSP/DAP 集成、Python+JS 双执行内核、并行子 Agent、跨会话记忆,底层是约 8 万行 Rust 原生实现——搜索、shell、AST、高亮全部进程内完成,零 fork/exec。

它由 Can Bölük fork 自 Mario Zechner 的 Pi,在 GitHub 上已有24.8k+ stars,MIT 开源。核心理念一句话:工具不应该只是「连上去」,而要被打磨到极致——每个工具都经过基准测试调优,编辑命中率、搜索速度、LSP 集成力求同类最优。

为什么值得关注:它解决的是真问题

传统 Coding Agent 的痛点,omp 几乎逐个给了解法:

痛点传统方案omp 的解法
编辑频繁失败、重试烧 Tokenstr_replace 重打旧内容Hashline:内容哈希锚点,一次命中
读文件浪费上下文全文 dump结构化摘要:Tree-sitter 提取符号,按需展开
Agent 对代码库的理解靠猜LSP 14 种操作:重命名、跳转、诊断走协议
排查 bug 全靠 print 调试DAP 调试器:lldb / dlv / debugpy
数据分析弱单一 Python 沙箱Python + Bun 双持久内核,可回调 Agent 工具
大任务串行慢并行子 Agent:隔离工作区、类型化返回
模型不守规矩全靠 prompt 唠叨流规则:正则命中 → 中断流 → 注入规则 → 重试
每次会话失忆Hindsight 记忆银行(项目级)
搜索慢、依赖外部二进制shell 调 rg进程内 ripgrep / glob / bash

Hashline:技术含量最高的编辑机制

多数 Agent 用str_replace(模型输出「旧内容 + 新内容」),问题在于:空白/引号错一个就拒,文件被改过锚点就失效,于是进入「拒绝 → 重试 → 拒绝」的 Token 燃烧循环。

omp 让模型用内容哈希标识要改的行,而不是重新打出那些行:

@@{a3f2} - const result = compute(x) + const result = compute(x, options)

{a3f2}是目标行内容的哈希前缀。文件变了导致哈希对不上,patch 会被拒绝而不是打错地方。基准数据(官方实测,同权重同 Prompt):

  • Grok Code Fast 1:编辑成功率 6.7% → 68.3%(10 倍提升)
  • Gemini 3 Flash:比 str_replace 高 5 个百分点,超过 Google 自己对该格式的最佳实现
  • Grok 4 Fast:输出 Token 减少 61%(重试循环消失)
  • MiniMax:通过率提升 2.1 倍

更高层还有ast_edit(ast-grep 结构化重写,先出 proposed 预览卡片、Agent 写一行理由后xd://resolve才落盘,原子操作)和ast_grep(50+ 语言 Tree-sitter 结构化查询)。

read:统一读取接口,省一半 Token

read不只是读文件——返回的是 Tree-sitter 结构化摘要(函数名、类名、重要注释),需要细节时 Agent 再调用read展开具体行段。而且所有东西都是路径

read src/auth/login.ts # 文件 → 结构化摘要 read src/ # 目录 → 树形概览 read data/app.db # SQLite → 表/行 read https://arxiv.org/pdf/… # 论文 PDF → 结构化 Markdown read pr://can1357/oh-my-pi/1428 # GitHub PR 就是路径 read issue://can1357/oh-my-pi/142 # Issue 也是路径

「GitHub 只是另一个文件系统」——不用学一堆gh_issue_view之类的专用工具参数,一个接口走天下。

原生 Rust:搜索、shell、高亮全部进程内

其他 Agent shell 出去调 rg/grep/find/bash,每次都是 fork-exec 往返;omp 把真实实现链接进进程:ripgrep、glob、find 进程内;bash是内嵌的 brush shell(持久会话,跨调用保留环境变量和工作目录),58+ 个命令行工具(ls、sed、sort、xargs、jq…)移植进 builtins crate。同一个二进制原生跑 macOS/Linux/Windows,不需要 WSL 桥。

LSP 与 DAP:IDE 知道的,Agent 都知道

14 个 LSP 操作:diagnostics、hover、definition、references、rename、code_action、completion、signature_help、document_symbols、workspace_symbols、format、range_format、implementation、type_definition。重命名走workspace/willRenameFiles,re-export、barrel 文件、别名导入全部同步更新——不是文本替换。

28 个 DAP 操作:C/C++/Rust 用 lldb-dap,Go 用 dlv,Python 用 debugpy,Node 用内置 inspector。C 程序段错误?attach 调试器、看调用栈、读帧、debug.evaluate("*ptr")——不用再满代码撒 print。

eval:Python + JavaScript 双持久内核

大多数 Agent 只给一个 Python 沙箱。omp 跑两个持久内核,且任一内核都能回调 Agent 自己的工具:

# Python 内核里调用 Agent 的 read 工具df=pd.read_csv(tool.read("data/sales.csv"))print(df.describe())
// 同一个 eval 会话切到 Bun 内核consttop=tool.read("data/sales.csv").split("\n").slice(1).map(l=>l.split(",")).sort((a,b)=>+b[2]-+a[2]).slice(0,5);console.table(top);

两个内核共享 prelude,Python 处理数据、JS 画图,全程一个连续会话。

子 Agent:并行、隔离、类型化返回

task把任务拆给并行子 Agent:平台原生文件系统快照隔离工作区(macOS APFS clone、Linux reflink/overlayfs、Windows projfs),互不干扰、无合并冲突;每个子 Agent 返回schema 校验过的结构化对象,父 Agent 用路径语法直接取字段:

read agent://<subagent-id>/findings.0.path

子 Agent 之间还能通过 IRC 短消息协调分工。Alt+A打开 Agent Hub 看每个子 Agent 的实时状态、活体转录、成本,还能中途发消息或杀掉卡住的 worker。

流规则:模型不听话的实时纠正

传统做法把所有规范塞进 System Prompt,每次对话付全量 Token,模型还可能无视。omp 的规则是睡着的,直到触发:

  1. 正则监听模型的流式输出
  2. 命中即中断当前流(mid-token 级别)
  3. 把规则作为系统提醒注入上下文
  4. 从同一位置重新生成
  5. 注入的规则在上下文压缩后依然存活

例如「禁止在 Rust 生产代码用Box::leak」,模型一旦写到就触发纠正为Arc<str>。用/omfg用自然语言生成规则:

/omfg 不要在任何地方用 any 类型,要求用具体的类型定义或 unknown

Hindsight:项目级跨会话记忆

Agent 运行中主动用retain写入记忆、recall检索、reflect综合;每次会话结束自动压缩成「心智模型」,下次会话第一轮就加载。项目级作用域——A 项目学到的东西不泄漏到 B 项目。用一段时间后,omp 自己就知道:项目用什么技术栈、模块怎么分工、哪些文件是「地雷区」。

模型路由:60+ 提供商、10 个角色

角色而非模型名调度:「对的任务用对的模型」。default日常、smol廉价探索、slow深度推理、plan计划模式,另有 vision/designer/task/advisor/commit/tiny。启动时--smol/--slow/--plan覆盖,会话中/modelCtrl+P切换。

支持 OAuth 一键登录(Anthropic、Codex、Gemini、Perplexity、Cursor、Copilot…)、Coding Plan 订阅路由、API Key、本地模型(Ollama/LM Studio/vLLM),还能自定义任意 OpenAI 兼容提供商、配 fallback 链(429 自动切换)、路径级模型绑定、多 Key 轮转。

其他值得说的

  • /collab:把会话放上中继,甩个链接+二维码,队友浏览器就能围观/协作,密钥不出本机
  • /commit:读整个工作树,把不相关改动拆成按依赖排序的原子 commit,循环依赖直接拒绝
  • /review:专用 reviewer 子 Agent 并行扫描,问题按 P0-P3 分级+置信度评分
  • 配置继承:自动读取.cursor/rules/*.mdcCLAUDE.md.clinerulesAGENTS.md、Copilot applyTo 等 8 种现有格式,零迁移
  • ACP/SDK/RPComp acp接入 Zed;Node SDK 内嵌会话;--mode rpcstdio 驱动
  • 插件:TypeScript 模块、与内置工具同一套 API、热重载

与主流工具对比

维度Claude Code / 同类omp
编辑格式str_replace(易错)Hashline(内容哈希锚点)
文件读取全文 dump结构化摘要 + 按需展开
LSP无或有限完整 14 操作
调试器完整 DAP(lldb/dlv/debugpy)
代码执行Python 沙箱持久 Python + Bun 双内核
子 Agent无或有限并行 + 隔离 + 类型化返回
搜索shell 调 ripgrep进程内 ripgrep,零 fork/exec
行为纠正靠 prompt流规则:中断注入重试
跨会话记忆Hindsight(项目级)
技术栈纯 JS/Python~8 万行 Rust 核心 + TypeScript

安装

macOS / Linux(推荐)

curl-fsSLhttps://omp.sh/install|sh

脚本自动检测 Bun(≥1.3.14),有则用 Bun 安装,否则下载预构建二进制。

其他方式

# Homebrewbrewinstallcan1357/tap/omp# Bun(推荐,最新版)buninstall-g@oh-my-pi/pi-coding-agent# Windows(PowerShell,原生运行,无需 WSL)irm https://omp.sh/install.ps1|iex# Nixnix profileinstallgithub:can1357/oh-my-pi# 版本锁定mise use-ggithub:can1357/oh-my-pi

验证 + 补全

omp--version# shell 补全(bash → ~/.bashrc)eval"$(omp completionsbash)"# zsh → ~/.zshrceval"$(omp completionszsh)"# fishomp completions fish>~/.config/fish/completions/omp.fish

模型配置:四种方式

/login# 方式一:OAuth 一键登录(Anthropic / Codex / Gemini / Cursor / Copilot…)/model# 方式二:打开模型选择器,直接填 API Key
# 方式三:Coding Plan 订阅路由(/login 选对应提供商)# 方式四:本地模型(Ollama / LM Studio)ollama serve /model# 选择 Ollama,指向 http://localhost:11434

自定义 OpenAI 兼容提供商(~/.omp/agent/models.yml):

providers:spark:baseUrl:http://192.168.10.223:8000/v1api:openai-completionsapiKey:dummymodels:-id:minimax-m3name:MiniMax M3contextWindow:100000maxTokens:32000

故障转移与路径绑定:

retry:fallbackChains:default:-anthropic/claude-sonnet-4.6-openai/gpt-4o-google/gemini-2.0-flashmodels:enabledModels:-path:~/projects/side-projectmodels:["deepseek/deepseek-coder"]

TUI 上手

cd~/your-project omp

全屏 TUI 启动,工具调用渲染成卡片,编辑落盘前有预览。推荐在支持 Kitty 键盘协议的终端运行(Kitty、Ghostty、WezTerm、iTerm2)。

常用键位

按键功能
Enter发送消息
Ctrl+J / Shift+Enter消息内换行
Ctrl+P循环切换当前角色的模型
Ctrl+T展开/折叠 Todo 面板
Ctrl+C中断任务
Esc取消待确认操作
↑ / ↓历史消息 / 选项
?输入框内查看快捷键

单次执行与恢复

omp-p"列出所有 .ts 文件里未使用的 export"gitdiffHEAD~1|omp-p"给这个 diff 写一个精简的 commit message"omp--resume# 会话选择器(Tab 补全)omp--resume<id># 直接恢复

常用斜杠命令

命令功能
/model切换模型
/login提供商登录
/review代码审查(分支/commit/未提交,P0-P3 分级)
/commit智能拆分原子提交
/omfg自然语言创建流规则
/collab分享实时会话
/compact手动压缩上下文
/reload-plugins热重载插件
/hotkeys全部快捷键

核心工具实操

# read:读文件/目录/URL/数据库/PR,全部结构化readsrc/auth/login.tsreadpr://can1357/oh-my-pi/1428# search:进程内 ripgrepsearch"useState\("src/ search"TODO:"--typets# bash:持久会话,环境变量跨调用保留bash:npmtestbash:gitlog--oneline-10# eval:Python + JS 双内核,可回调 Agent 工具eval:importpandas as pd;df=pd.read_csv(tool.read("data/sales.csv"));print(df.describe())# lsp:IDE 级代码智能lsp:renameformatBytes → humanizeFileSize# debug:真实调试器debug: attach lldb-dap,看崩溃栈、读变量、评估表达式# task:并行子 Agenttask(workers=[{name:"auth", workdir:"services/auth"},...])# ask:结构化提问(带推荐选项的选择器)

我的评价

优点

  1. 工具质量是真实的,不是营销:Hashline 的基准数据可复现,编辑成功率提升是数量级的;read 的结构化摘要省 Token 立竿见影;进程内搜索在无 rg 的 Windows 上也能用——这些都在日常使用里感受得到。
  2. 一站配齐:调试器、LSP、双内核、子 Agent、记忆、浏览器、桌面控制……别的 Agent 要装一堆插件,omp 开箱即有,而且互相咬合(eval 回调 read、子 Agent 类型化返回、配置零迁移继承)。
  3. Rust 底子带来的一致性:macOS/Linux/Windows 同一二进制,不依赖外部工具链,行为一致。
  4. 可塑性:插件与内置工具同一 API,/omfg建规则、/reload-plugins热重载,从配置到源码全开放。

局限

  1. 学习曲线:TUI + 斜杠命令 + 角色模型路由,比「打开即聊」的工具要花一两天适应;文档分散在 omp.sh/docs 和仓库 docs/。
  2. 生态相对年轻:插件数量远不如 Claude Code,社区仍在成长(PR 刚放开 trial)。
  3. 终端依赖:全屏 TUI 在 SSH/无头环境体验打折(有-p单次模式兜底);依赖 Kitty 键盘协议,老终端要降级。
  4. 模型强绑定:编辑格式、工具调用是针对强模型调的,弱模型 + 复杂任务仍需人工盯。

适合谁:终端党、追求工具效率的资深开发者、想省 Token 的重度用户。不适合:只想点两下就完事的 GUI 用户(用 IDE 插件版或 Claude Code 更顺手)。

与 DeepSeek Harness(dsh)的关系:两者定位不同——omp 是「终端里打磨到极致的单体 Agent」;dsh 是「一切皆插件」的可重组框架(模型/工具/UI/循环都可替换)。omp 开箱即用、工具质量天花板高;dsh 可定制性更强、适合自组 harness。都用过之后我的建议:日常写代码用 omp,做自定义 Agent 平台用 dsh

参考

  • 官网:https://omp.sh
  • GitHub:https://github.com/can1357/oh-my-pi(MIT,24.8k+ stars)
  • 菜鸟教程入门:https://www.runoob.com/vibe-coding/omp-usage.html
  • 工具文档:https://omp.sh/docs/tools
  • 提供商文档:https://omp.sh/docs/providers
  • npm:https://www.npmjs.com/package/@oh-my-pi/pi-coding-agent