oh-my-pi实战:手写AI编码代理Skill
如果你还在让AI直接丢给你整段代码然后手动粘贴,那就错过了自动化编码的下一阶段。oh-my-pi(今天GitHub 9518 stars)把AI编码代理做成了终端原生工具,核心亮点是hash-anchored edits(哈希锚定编辑)和tool harness(工具集线器)。这篇文章不是翻译README,而是把它拆解成一个可复用的AI Skill,让你在自己的项目里也能搭出同样的能力。
1. 这个Skill解决什么具体问题
传统AI代码编辑器(比如Cline、Aider)依赖行号或正则定位修改位置,一旦代码有微小偏移(比如上面插了一行注释),AI就会改错地方。oh-my-pi的hash-anchored edits做法是:在修改指令里嵌入代码块的SHA256哈希,代理先定位哈希再执行替换,从根本上避免了上下文漂移。
你遇到的问题:AI给你改了第42行,实际代码第42行已经不是原来的内容了,结果改完编译都不通过。
oh-my-pi的解法:AI生成的edit指令包含原始代码段的哈希值,agent在文件里找到匹配的哈希段,然后替换。哈希冲突概率极低,定位绝对稳定。

2. 触发条件和适用场景
oh-my-pi作为终端代理,可以通过自然语言触发:
- 直接输入任务:
oh-my-pi "把src/main.py里calculate函数改成返回浮点数" - 管道模式:
cat bug_report.txt | oh-my-pi "根据报告修改对应代码" - 交互模式:
oh-my-pi进入对话,连续提问
适用场景:
- 需要对代码做精准手术式修改,不能容忍AI“猜位置”
- 多文件重构,需要原子化提交(hash保证了编辑的幂等性)
- 与CI/CD集成,自动修复lint错误
不适用场景:
- 完全从零生成项目(它更适合修改,而非创造)
- 对非文本文件(二进制)无效
3. 完整Skill结构(基于oh-my-pi设计模式)
oh-my-pi本身不是Skill,但我们可以把它的核心流程封装成一个可复用的AI Skill模板。以下是SKILL.md示例,你会看到如何定义触发词、工具依赖和执行步骤。
# SKILL.md
## Name: hash-edit
## Trigger
当用户说“修改代码”或“改某函数”时,自动调用此Skill。
## Requires
- oh-my-pi 已安装
- 当前目录是git仓库
## Steps
1. 用户输入修改需求(如“把logger级别从INFO改为DEBUG”)
2. AI推理需要修改的文件和代码块
3. AI生成hash-anchored edit指令(格式见下)
4. 执行 `oh-my-pi -e "<edit指令>"`
5. 验证:运行测试,如果失败则回滚git reset
## Edit指令格式
{
"target": "<文件路径>",
"old_hash": "sha256(<原始代码块>)",
"new_code": "<替换后的代码块>"
}
## Example
用户:“把src/utils.py的get_version函数改成返回git标签”
AI输出:
```json
{
"target": "src/utils.py",
"old_hash": "a3f2b1c...",
"new_code": "def get_version():\n import subprocess\n return subprocess.check_output(['git', 'describe', '--tags']).strip()\n"
}
Safety
- 每次编辑前备份文件
- 使用
git diff预览变更
```
这个SKILL.md可以放进你的AI工作流(比如OpenAI functions或LangChain工具),让任何AI助手学会精准修改代码。
4. 实际案例演示
差的做法:直接用AI修改行号
Prompt: “把第23行的print改成logging.warning”
结果:AI返回 src/app.py 第23行改为 logging.warning(old_content)。但实际第23行是空行,AI把注释部分改了。因为你昨天加了条import,行号全变了。
好的做法:使用hash-anchored edit
操作步骤:
- 在终端运行oh-my-pi:
bash1
oh-my-pi "把src/app.py里 'print(f\"Processing {file}\")' 改成 'logging.warning(f\"Processing {file}\")'" - oh-my-pi内部计算
print(f"Processing {file}")的SHA256哈希,在文件中找到精确匹配,替换为logging.warning(...)。 - 输出:
[hash-edit] 1 file changed, 2 lines patched (hash: a3f2b1c...)
效果对比:
| 方法 | 准确率(100次测试) | 平均耗时 |
|------|-------------------|----------|
| 行号定位 | 68% | 2.3s |
| 哈希锚定 | 99% | 1.1s |
数据来源:oh-my-pi README引用内部测试。实际准确率取决于代码块唯一性,但哈希锚定天然抗漂移。
5. 复用和组合技巧
技巧1:将oh-my-pi封装为子Agent
oh-my-pi支持subagents(子代理),你可以让一个主agent调度多个oh-my-pi实例并行修改不同文件。配合tool harness,你可以定义:
# tool harness 配置片段
- name: "parallel-edit"
type: "subagent"
agents:
- command: "oh-my-pi \"更新接口文档\""
file: "docs/api.md"
- command: "oh-my-pi \"修复类型错误\""
file: "src/types.ts"
技巧2:与LSP集成做语法安全检测
oh-my-pi内置了LSP(Language Server Protocol)集成。你可以在edit后自动触发LSP诊断:
oh-my-pi --lsp-check "修改src/main.ts的add函数"
如果LSP报语法错,edit会被拒绝并回滚。这个机制可以避免AI生成语法错误的代码。
技巧3:创建项目级模板库
把你的常用编辑指令写成模板文件,方便快速复用。例如:
# add-logging.template
old: "console.log($ARG)"
new: "logger.info($ARG)"
file: "*.ts"
然后执行:
oh-my-pi --template add-logging "stats.ts"
等价于批量把所有console.log替换为logger.info,且基于哈希精准匹配。
变体扩展
- 远程仓库编辑:结合git,先clone再edit最后push。
- 代码审查辅助:让oh-my-pi根据review comment自动修改代码,例如“把循环复杂度降到5以下”。
- 多语言微调:Python项目优先用ast工具生成代码块,确保哈希匹配的是AST树节点而非原始文本。
为什么这样写有效
- 哈希锚定:行号是位置相关,插入/删除会漂移;哈希是内容相关,内容不改哈希不变。这对增量开发尤其重要。
- tool harness:把子进程管理、环境变量、超时、重试封装起来,避免每个工具都写一遍脚本。
- LSP检查:闭环验证,阻止AI生成编译不过的代码,减少人工纠错成本。
你可以把oh-my-pi看作一个专为代码修改优化的AI代理。如果不想安装整个项目,也可以只借鉴它的hash-anchored edit算法,封装成你自己的AI Skill —— 我上面给的SKILL.md模板就是为了这个目的。
最后提醒:今天星星数涨幅惊人,但项目还在早期,依赖Node 18+。如果你要生产环境使用,建议加上--dry-run预览变更。