推荐语:如果你受够了「AI 改错行」和「上下文里没有 IDE 能力」,omp 是当前终端编码 Agent 里最值得一试的那个------Hashline 哈希锚点编辑把改错文件变成小概率事件,LSP/调试器/Python+JS 双内核/并行子 Agent 全套内置且互相咬合,8 万行 Rust 让它在 macOS/Linux/Windows 上行为一致。它不是 Claude Code 的平替,而是技术设计更激进的「下一代」:代价是学习曲线和折腾成本。愿意投入的开发者,它不会让你失望;犹豫的人,先读完这篇再决定。
更多AI工具分享,参见猫哥的博客 :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 的解法 |
|---|---|---|
| 编辑频繁失败、重试烧 Token | str_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 让模型用内容哈希标识要改的行,而不是重新打出那些行:
scss
@@{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 展开具体行段。而且所有东西都是路径:
bash
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
# Python 内核里调用 Agent 的 read 工具
df = pd.read_csv(tool.read("data/sales.csv"))
print(df.describe())
javascript
// 同一个 eval 会话切到 Bun 内核
const top = 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 用路径语法直接取字段:
arduino
read agent://<subagent-id>/findings.0.path
子 Agent 之间还能通过 IRC 短消息协调分工。Alt+A 打开 Agent Hub 看每个子 Agent 的实时状态、活体转录、成本,还能中途发消息或杀掉卡住的 worker。
流规则:模型不听话的实时纠正
传统做法把所有规范塞进 System Prompt,每次对话付全量 Token,模型还可能无视。omp 的规则是睡着的,直到触发:
- 正则监听模型的流式输出
- 命中即中断当前流(mid-token 级别)
- 把规则作为系统提醒注入上下文
- 从同一位置重新生成
- 注入的规则在上下文压缩后依然存活
例如「禁止在 Rust 生产代码用 Box::leak」,模型一旦写到就触发纠正为 Arc<str>。用 /omfg 用自然语言生成规则:
sql
/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 覆盖,会话中 /model 或 Ctrl+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/*.mdc、CLAUDE.md、.clinerules、AGENTS.md、Copilot applyTo 等 8 种现有格式,零迁移 - ACP/SDK/RPC :
omp 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(推荐)
sh
curl -fsSL https://omp.sh/install | sh
脚本自动检测 Bun(≥1.3.14),有则用 Bun 安装,否则下载预构建二进制。
其他方式
sh
# Homebrew
brew install can1357/tap/omp
# Bun(推荐,最新版)
bun install -g @oh-my-pi/pi-coding-agent
# Windows(PowerShell,原生运行,无需 WSL)
irm https://omp.sh/install.ps1 | iex
# Nix
nix profile install github:can1357/oh-my-pi
# 版本锁定
mise use -g github:can1357/oh-my-pi
验证 + 补全
sh
omp --version
# shell 补全(bash → ~/.bashrc)
eval "$(omp completions bash)"
# zsh → ~/.zshrc
eval "$(omp completions zsh)"
# fish
omp completions fish > ~/.config/fish/completions/omp.fish
模型配置:四种方式
sh
/login # 方式一:OAuth 一键登录(Anthropic / Codex / Gemini / Cursor / Copilot...)
/model # 方式二:打开模型选择器,直接填 API Key
sh
# 方式三:Coding Plan 订阅路由(/login 选对应提供商)
# 方式四:本地模型(Ollama / LM Studio)
ollama serve
/model # 选择 Ollama,指向 http://localhost:11434
自定义 OpenAI 兼容提供商(~/.omp/agent/models.yml):
yaml
providers:
spark:
baseUrl: http://192.168.10.223:8000/v1
api: openai-completions
apiKey: dummy
models:
- id: minimax-m3
name: MiniMax M3
contextWindow: 100000
maxTokens: 32000
故障转移与路径绑定:
yaml
retry:
fallbackChains:
default:
- anthropic/claude-sonnet-4.6
- openai/gpt-4o
- google/gemini-2.0-flash
models:
enabledModels:
- path: ~/projects/side-project
models: ["deepseek/deepseek-coder"]
TUI 上手
sh
cd ~/your-project
omp
全屏 TUI 启动,工具调用渲染成卡片,编辑落盘前有预览。推荐在支持 Kitty 键盘协议的终端运行(Kitty、Ghostty、WezTerm、iTerm2)。
常用键位
| 按键 | 功能 |
|---|---|
| Enter | 发送消息 |
| Ctrl+J / Shift+Enter | 消息内换行 |
| Ctrl+P | 循环切换当前角色的模型 |
| Ctrl+T | 展开/折叠 Todo 面板 |
| Ctrl+C | 中断任务 |
| Esc | 取消待确认操作 |
| ↑ / ↓ | 历史消息 / 选项 |
| ? | 输入框内查看快捷键 |
单次执行与恢复
sh
omp -p "列出所有 .ts 文件里未使用的 export"
git diff HEAD~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 |
全部快捷键 |
核心工具实操
sh
# read:读文件/目录/URL/数据库/PR,全部结构化
read src/auth/login.ts
read pr://can1357/oh-my-pi/1428
# search:进程内 ripgrep
search "useState\(" src/
search "TODO:" --type ts
# bash:持久会话,环境变量跨调用保留
bash: npm test
bash: git log --oneline -10
# eval:Python + JS 双内核,可回调 Agent 工具
eval: import pandas as pd; df = pd.read_csv(tool.read("data/sales.csv")); print(df.describe())
# lsp:IDE 级代码智能
lsp: rename formatBytes → humanizeFileSize
# debug:真实调试器
debug: attach lldb-dap,看崩溃栈、读变量、评估表达式
# task:并行子 Agent
task(workers=[{name: "auth", workdir: "services/auth"}, ...])
# ask:结构化提问(带推荐选项的选择器)
我的评价
优点
- 工具质量是真实的,不是营销:Hashline 的基准数据可复现,编辑成功率提升是数量级的;read 的结构化摘要省 Token 立竿见影;进程内搜索在无 rg 的 Windows 上也能用------这些都在日常使用里感受得到。
- 一站配齐:调试器、LSP、双内核、子 Agent、记忆、浏览器、桌面控制......别的 Agent 要装一堆插件,omp 开箱即有,而且互相咬合(eval 回调 read、子 Agent 类型化返回、配置零迁移继承)。
- Rust 底子带来的一致性:macOS/Linux/Windows 同一二进制,不依赖外部工具链,行为一致。
- 可塑性 :插件与内置工具同一 API,
/omfg建规则、/reload-plugins热重载,从配置到源码全开放。
局限
- 学习曲线:TUI + 斜杠命令 + 角色模型路由,比「打开即聊」的工具要花一两天适应;文档分散在 omp.sh/docs 和仓库 docs/。
- 生态相对年轻:插件数量远不如 Claude Code,社区仍在成长(PR 刚放开 trial)。
- 终端依赖 :全屏 TUI 在 SSH/无头环境体验打折(有
-p单次模式兜底);依赖 Kitty 键盘协议,老终端要降级。 - 模型强绑定:编辑格式、工具调用是针对强模型调的,弱模型 + 复杂任务仍需人工盯。
适合谁 :终端党、追求工具效率的资深开发者、想省 Token 的重度用户。不适合:只想点两下就完事的 GUI 用户(用 IDE 插件版或 Claude Code 更顺手)。
与 DeepSeek Harness(dsh)的关系 :两者定位不同------omp 是「终端里打磨到极致的单体 Agent」;dsh 是「一切皆插件」的可重组框架(模型/工具/UI/循环都可替换)。omp 开箱即用、工具质量天花板高;dsh 可定制性更强、适合自组 harness。都用过之后我的建议:日常写代码用 omp,做自定义 Agent 平台用 dsh。
参考
- 官网:omp.sh
- GitHub:github.com/can1357/oh-...(MIT,24.8k+ stars)
- 菜鸟教程入门:www.runoob.com/vibe-coding...
- 工具文档:omp.sh/docs/tools
- 提供商文档:omp.sh/docs/provid...
- npm:www.npmjs.com/package/@oh...