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在文件里找到匹配的哈希段,然后替换。哈希冲突概率极低,定位绝对稳定。

hash-anchored code editing diagram

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示例,你会看到如何定义触发词、工具依赖和执行步骤。

markdown
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32
# 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

操作步骤

  1. 在终端运行oh-my-pi:
    bash
    1
    oh-my-pi "把src/app.py里 'print(f\"Processing {file}\")' 改成 'logging.warning(f\"Processing {file}\")'"
  2. oh-my-pi内部计算 print(f"Processing {file}") 的SHA256哈希,在文件中找到精确匹配,替换为 logging.warning(...)
  3. 输出:[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,你可以定义:

bash
1 2 3 4 5 6 7 8
# 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诊断:

bash
1
oh-my-pi --lsp-check "修改src/main.ts的add函数"

如果LSP报语法错,edit会被拒绝并回滚。这个机制可以避免AI生成语法错误的代码。

技巧3:创建项目级模板库

把你的常用编辑指令写成模板文件,方便快速复用。例如:

text
1 2 3 4
# add-logging.template
old: "console.log($ARG)"
new: "logger.info($ARG)"
file: "*.ts"

然后执行:

bash
1
oh-my-pi --template add-logging "stats.ts"

等价于批量把所有console.log替换为logger.info,且基于哈希精准匹配。

变体扩展

  1. 远程仓库编辑:结合git,先clone再edit最后push。
  2. 代码审查辅助:让oh-my-pi根据review comment自动修改代码,例如“把循环复杂度降到5以下”。
  3. 多语言微调:Python项目优先用ast工具生成代码块,确保哈希匹配的是AST树节点而非原始文本。

为什么这样写有效

  • 哈希锚定:行号是位置相关,插入/删除会漂移;哈希是内容相关,内容不改哈希不变。这对增量开发尤其重要。
  • tool harness:把子进程管理、环境变量、超时、重试封装起来,避免每个工具都写一遍脚本。
  • LSP检查:闭环验证,阻止AI生成编译不过的代码,减少人工纠错成本。

你可以把oh-my-pi看作一个专为代码修改优化的AI代理。如果不想安装整个项目,也可以只借鉴它的hash-anchored edit算法,封装成你自己的AI Skill —— 我上面给的SKILL.md模板就是为了这个目的。

最后提醒:今天星星数涨幅惊人,但项目还在早期,依赖Node 18+。如果你要生产环境使用,建议加上--dry-run预览变更。