
1. 为什么我要从 Claude Code 换到 piClaude Code 刚出来那阵子我几乎是第一时间就装上了。终端里敲一行命令它就能读项目、改文件、跑测试、提交 commit确实有种“未来已来”的感觉。但用久了之后我慢慢发现一个问题它太全能了全能到有点“重”。这种“重”体现在几个方面。第一是启动和响应链路长每次交互都要经过完整的上下文组装、工具调度、权限确认简单任务也要走一遍完整流程。第二是工具集庞大内置了文件读写、搜索、终端执行、网页抓取、子代理调度等一大堆能力配置项和权限模型也跟着复杂起来。第三是它对运行环境有比较明确的要求账号体系、网络条件、版本更新策略都会影响日常使用体验。我不是说这些设计不好对于复杂工程任务这种全能型选手确实有优势。但问题是我日常八成的操作其实很固定读文件、改文件、跑命令、搜代码。为了这四件事去背一整套重型框架性价比不高。后来我在社区里看到有人提到pi这个 Coding Agent定位非常克制只保留四个核心工具把“读、写、执行、搜索”做到极致其余全部交给外部组合。再配上oh-my-pi简称omp这个“全家桶”式的配置层整个体验一下子轻了起来。我抱着试试看的心态迁移了一周结果就再也没切回去。这篇就聊聊我是怎么理解 pi 的设计哲学、怎么用 omp 把它武装起来以及中间踩过的那些坑。先给不太熟悉的朋友交代一下背景。pi是一个命令行 Coding Agent核心特点是工具数量极少通常只暴露四个基础能力读取文件、写入文件、执行 shell 命令、搜索内容。它不内置花哨的子代理、不搞复杂的权限矩阵配置也尽量扁平。oh-my-pi则是围绕 pi 构建的一套配置与扩展集合类似“开箱即用的增强包”把常用模型接入、提示词模板、快捷键、项目级配置、常用工作流都打包好了。omp就是它的缩写。Claude Code则是另一条路线上的代表功能全面、生态成熟但相对更重。两者不是谁替代谁而是适用场景不同。如果你也觉得自己被“全能”拖累了那 pi omp 这套组合值得认真看看。2. pi 的核心设计四个工具如何撑起一个 Agent2.1 为什么是四个工具而不是四十个刚接触 pi 的时候我第一反应是“这也太简陋了吧”。四个工具能干嘛但用下来才明白这不是简陋是刻意为之。一个 Coding Agent 的本质工作流拆到最底层其实就四步获取信息、修改内容、验证结果、定位目标。读取文件对应获取信息写入文件对应修改内容执行命令对应验证结果搜索对应定位目标。其余所有高级能力比如重构、生成测试、批量替换都是这四步的组合。工具少带来的直接好处是上下文占用低。每个工具的定义、参数说明、返回格式都要塞进模型的上下文窗口。工具越多光工具描述就吃掉大量 token留给真正任务的空间就少了。pi 把工具压到四个等于把上下文预算几乎全留给代码和指令模型“注意力”更集中。我实测下来同样一个中等规模的重构任务pi 的响应明显更干脆废话更少。第二个好处是行为可预测。工具多了之后模型经常在“该用哪个工具”上犹豫甚至选错。四个工具职责边界清晰模型决策路径短出错概率自然下降。这就像给一个新人交代任务你给他四个明确指令他执行得又快又准你给他四十个指令还互相重叠他反而懵了。第三个好处是权限和审计简单。每个工具就那几种操作读、写、执行、搜权限模型可以做得非常直白。哪些目录可读、哪些可写、命令白名单是什么一目了然。对于团队协作或者对安全有要求的场景这种简单性本身就是价值。2.2 四个工具各自的职责边界我把 pi 的四个工具按我的理解拆一下方便你建立心智模型。读取工具负责把文件内容、目录结构、甚至指定行范围的内容拉进上下文。关键是它支持按需读取不是一股脑全塞进来。你可以只读某个函数的实现而不是整个文件。写入工具负责创建、修改、覆盖文件。通常支持精确替换和整文件写入两种模式。精确替换更安全整文件写入适合新建或大改。执行工具负责跑 shell 命令比如构建、测试、格式化、git 操作。它是 Agent 的“手”用来验证想法是否成立。搜索工具负责在代码库里定位符号、字符串、文件。它是 Agent 的“眼睛”决定它能不能快速找到该改的地方。这四个工具的组合能力其实非常强。举个例子一个“给所有 API 加错误处理”的任务pi 的典型流程是搜索定位所有 API 定义读取相关文件写入修改执行测试验证。全程四个工具轮转没有多余动作。我一开始还担心它做不了复杂任务后来发现只要任务能被拆成这四步的循环它就能做而且做得干净。2.3 与 Claude Code 的定位差异这里必须说清楚我不是在贬低 Claude Code。Claude Code 的定位是“全能型工程助手”它要覆盖从需求理解到部署的全链路内置大量工具和子代理是合理的。它适合那种“我描述一个复杂目标你帮我端到端搞定”的场景。而 pi 的定位是“精准型编码执行器”它假设你已经想清楚了要做什么它负责高效、准确地执行。两者面向的用户心智不同。我自己的使用习惯是探索性、模糊性强的任务用 Claude Code目标明确、执行密集的任务用 pi。比如“帮我看看这个项目哪里可能有性能问题”这种开放问题Claude Code 的全面性更有优势。但“把 src/utils 下所有 console.log 换成统一 logger”这种明确任务pi 快得多也省心得多。理解这个差异你就不会纠结“到底选哪个”而是知道“什么时候用哪个”。3. oh-my-pi 全家桶把 pi 从能用变成好用3.1 omp 到底打包了什么pi 本身很克制克制到有些配置要你自己从头写。oh-my-pi的价值就在于它把社区里反复验证过的最佳实践打包好了。我装完 omp 之后最直观的感受是“终于不用自己拼配置了”。它主要包含这几块内容。第一是模型接入配置。omp 预置了多家模型提供方的接入模板包括 base url、模型名、参数默认值。你只需要填自己的 key不用去翻各家文档。对于想接不同模型对比效果的人这个省了大量时间。第二是提示词模板。omp 内置了一套针对编码场景优化的系统提示词涵盖代码风格、修改原则、测试要求、安全边界等。这些提示词是社区打磨过的比我自己随手写的靠谱得多。第三是项目级配置管理。omp 支持在项目根目录放配置文件定义该项目的工具权限、忽略目录、命令白名单、模型偏好。这样不同项目可以有不同策略切换项目时不用手动改全局配置。第四是常用工作流脚本。比如一键初始化项目上下文、一键跑完整检查、一键生成变更摘要。这些脚本把高频操作固化下来减少重复劳动。第五是快捷键与交互增强。omp 对 pi 的终端交互做了增强比如历史搜索、多行编辑、快速切换模型、会话保存与恢复。这些细节用起来很顺手。3.2 安装与初始配置的实操路径我按自己的安装过程梳理一遍你照着走基本不会卡。前提是你本地有 Node.js 环境版本建议 18 以上。先装 pi 本体再装 omp。# 安装 pi 本体 npm install -g pi/pi # 安装 oh-my-pi 全家桶 npm install -g oh-my-pi # 验证安装 pi --version omp --version装完之后omp 通常会引导你做一次初始化配置。如果没有自动引导可以手动跑omp init。这一步会生成全局配置文件一般在用户目录下的.pi或.config/pi里。配置文件里最关键的是模型接入部分你需要填 base url 和 api key。# 查看当前配置 omp config list # 设置默认模型 omp config set model.default your-model-name # 设置 base url omp config set model.baseUrl https://your-endpoint/v1 # 设置 api key建议用环境变量不要写死在配置里 export PI_API_KEYyour-key-here提示api key 尽量走环境变量不要直接写进配置文件。配置文件如果被同步到云端或者误提交到仓库key 就泄露了。omp 支持从环境变量读取优先用这个方式。初始化完成后进到你的项目目录跑一次omp project init它会生成项目级配置。这个配置里我建议重点设置三样东西忽略目录、命令白名单、模型偏好。忽略目录把 node_modules、dist、.git 这些排除掉避免搜索和读取时浪费时间。命令白名单限制执行工具能跑哪些命令安全第一。模型偏好可以针对项目类型选不同模型比如前端项目用响应快的后端重构用推理强的。3.3 项目级配置的推荐模板我把自己常用的项目级配置整理成一个模板你可以直接抄。这个配置放在项目根目录的.pi/config.json里。{ ignore: [ node_modules, dist, build, .git, coverage, *.log ], tools: { read: { enabled: true }, write: { enabled: true, requireConfirm: false }, exec: { enabled: true, allow: [npm, pnpm, yarn, git, node, python, pytest, cargo, go], deny: [rm -rf /, curl, wget] }, search: { enabled: true } }, model: { default: your-fast-model, heavy: your-strong-model }, prompt: { style: concise, testRequired: true } }这个模板里几个点解释一下。requireConfirm设为 false 是因为我信任 pi 的写入精度不想每次改文件都确认效率优先。如果你在敏感项目里建议设为 true。allow列表只放构建、测试、版本控制相关命令deny列表挡住网络下载和危险删除。model里分了 default 和 heavy 两档日常用快的复杂任务手动切强的。testRequired设为 true强制 pi 改完代码后跑测试这个习惯能挡掉很多低级错误。4. 日常高频场景的实操拆解4.1 场景一批量重构与符号重命名批量重构是 pi 最擅长的场景之一。我拿一个真实例子说把项目里所有getUserInfo函数重命名为fetchUserProfile同时更新所有调用点。这个任务如果用编辑器全局替换很容易误伤字符串和注释。用 pi 的流程是这样的。第一步搜索定位。让 pi 搜索getUserInfo它会列出所有出现位置区分定义、调用、注释、字符串。第二步读取相关文件确认每个位置的上下文。第三步写入修改只改定义和调用跳过注释和字符串。第四步执行测试确认没破坏功能。# 在 pi 交互里输入 搜索 getUserInfo 的所有出现位置区分定义、调用、注释和字符串 # pi 返回列表后 读取 src/services/user.ts 和 src/api/client.ts # 确认上下文后 把 getUserInfo 重命名为 fetchUserProfile只改定义和调用保留注释和字符串不变 # 最后 跑 npm test 验证这个流程的关键在于先搜索后修改。很多人一上来就让 Agent 直接改结果它没看清上下文就动手改错了还得回滚。pi 的搜索工具让它先建立全局视图再精准下手。我实测下来这种“搜索-读取-修改-验证”的循环比直接下指令的准确率高出一大截。注意重命名这类操作改完一定要跑测试。我踩过一次坑pi 把某个字符串里的函数名也改了那个字符串是动态拼接的 API 路径测试没覆盖到上线才发现。后来我在项目配置里加了testRequired: true并且要求 pi 改完后额外搜索一次旧名字确认没有遗漏。4.2 场景二新增功能与测试同步生成第二个高频场景是加新功能。比如给现有模块加一个“导出 CSV”的方法。我的习惯是让 pi 同时生成实现和测试这样它自己就会考虑边界情况。# 指令示例 在 src/export 下新增一个 exportToCsv 方法接收数据数组和列配置返回 CSV 字符串。 要求 1. 处理空数组、null 值、包含逗号和换行的字段 2. 同步生成对应的单元测试覆盖上述边界 3. 跑测试确认通过pi 的执行路径是先读取 src/export 目录现有结构了解代码风格然后写入新方法和测试文件最后执行测试。如果测试失败它会读报错、改代码、再跑直到通过。这个“写-测-修”循环是 pi 的强项因为执行工具让它能自己验证。我特别欣赏它生成测试这一点。很多 Agent 只写实现不写测试结果代码质量全靠运气。pi 在 omp 的提示词模板加持下默认会考虑测试这省了我大量补测试的时间。当然它生成的测试不一定完美但至少覆盖了主要路径我在此基础上补充边界就行。4.3 场景三跨文件问题排查第三个场景是排查。比如线上报了一个“某个接口偶发 500”我需要定位原因。这种任务以前我会手动 grep 加断点现在直接交给 pi。# 指令示例 接口 /api/orders 偶发 500帮我排查可能原因。 步骤 1. 搜索该接口的路由定义和 handler 2. 读取 handler 及其调用的 service 层 3. 找出可能抛异常的位置 4. 列出最可能的三个原因和验证方法pi 会先搜索路由读取 handler顺着调用链往下读最后给出分析。它的优势是读取范围可控不会把整个项目塞进上下文而是按调用链精准读取。这样分析既快又准。我实测下来它给出的原因列表通常能命中七八成剩下的靠我自己的领域知识补。这个场景里搜索工具的质量很关键。如果搜索不准它就会读错文件分析全跑偏。omp 的配置里把忽略目录设好能大幅提升搜索信噪比。我建议你把测试快照、生成代码、第三方库都排除掉只搜业务代码。5. 常见问题与排查技巧实录5.1 模型接入报错怎么排查接模型是新手最容易卡的地方。常见报错有几类我整理成表格方便对照。报错现象可能原因排查方法401 Unauthorizedapi key 错误或过期检查环境变量是否正确导出key 是否有空格404 Not Foundbase url 路径不对确认是否漏了/v1或多了斜杠超时无响应网络或端点不可达先用 curl 测端点连通性返回乱码模型名不匹配确认模型名与端点支持的列表一致上下文超限模型窗口太小换大窗口模型或减少读取范围我踩过最坑的一次是 base url 末尾多了个斜杠导致拼接出双斜杠端点直接 404。排查了半天才发现。所以配置完第一件事就是用最小请求测通。# 测试端点连通性 curl -s -X POST $PI_BASE_URL/chat/completions \ -H Authorization: Bearer $PI_API_KEY \ -H Content-Type: application/json \ -d {model:your-model,messages:[{role:user,content:hi}]}这个命令能通说明接入没问题。不通就按报错逐项排查。记住先测通再进 pi不要在 pi 里反复试那样排查效率低。5.2 工具权限与安全边界设置pi 的执行工具能跑 shell 命令这是能力也是风险。我的原则是白名单优先黑名单兜底。白名单只放你确定安全的命令比如构建、测试、git 只读操作。黑名单挡住网络请求和危险删除。有个细节很多人忽略git命令要细分。git status、git diff、git log是安全的但git push、git reset --hard就有风险。omp 支持更细的命令匹配我建议把 git 拆开配置。{ exec: { allow: [ git status, git diff, git log, git add, npm test, npm run build ], deny: [ git push, git reset --hard, rm -rf ] } }这样配置后pi 能自己跑测试和构建但不会误推代码或硬重置。我吃过一次亏pi 在排查问题时跑了git reset --hard把我未提交的改动全清了。从那以后我就把危险命令全挡了。提示写入工具的requireConfirm在敏感项目里建议设为 true。虽然会多几次确认但能防止 Agent 误改关键文件。我现在的做法是个人项目关确认求效率公司项目开确认求安全。5.3 上下文管理与性能优化pi 虽然工具少但读取范围如果失控上下文还是会爆。我的经验是按需读取及时清理。omp 支持会话级别的上下文管理可以手动清理不再需要的文件内容。几个实用技巧。第一读取时指定行范围不要整文件读。比如读取 src/app.ts 第 50 到 120 行比读取 src/app.ts省得多。第二搜索时用精确关键词不要用宽泛词。搜fetchUserProfile比搜user精准得多。第三长会话定期清理把已完成的子任务上下文清掉给新任务腾空间。# 清理当前会话上下文 omp session clear # 查看当前上下文占用 omp session stats # 保存当前会话 omp session save refactor-user-module我一般一个任务一个会话做完就存或清。这样每个任务的上下文都干净模型注意力集中响应质量也稳定。混在一起的长会话模型容易被旧信息干扰改错文件的情况明显增多。5.4 与 Claude Code 混用的经验最后聊聊混用。我现在的工作流是pi 做主力执行Claude Code 做探索和兜底。具体怎么分目标明确、步骤清晰的执行任务用 pi快且省。目标模糊、需要多轮探索的任务用 Claude Code它的全面性有优势。遇到 pi 搞不定的复杂任务切到 Claude Code 试试往往能找到新思路。两者配置可以共享一部分比如项目忽略目录、代码风格约定。omp 的配置格式和 Claude Code 不完全一样但思路相通。我建议你把项目级的通用约定忽略目录、测试命令、代码风格抽成一份文档两边都参考减少重复维护。混用还有个好处是交叉验证。同一个任务pi 和 Claude Code 各做一遍对比结果能发现各自的盲区。我有次让两者同时改一个模块pi 改得干净但漏了一个边界Claude Code 考虑周全但改得啰嗦。综合两者我得到了最优解。这种用法虽然费点时间但对关键任务值得。6. 我个人的使用体会用 pi omp 这套组合快两个月了最大的感受是“轻”。启动快、响应快、配置简单、心智负担小。它不试图替我做所有决定而是把我明确交代的事做得又快又准。这种“克制”在工具泛滥的今天反而稀缺。当然它也有局限。复杂探索任务它不如 Claude Code多轮模糊需求它容易跑偏生态和插件也不如成熟框架丰富。但对我这种日常以明确执行任务为主的人来说这些局限可以接受。工具没有绝对好坏只有匹配与否。如果你也觉得自己被“全能”拖累不妨试试 pi配上 omp说不定会有惊喜。最后分享一个小技巧omp 的会话保存功能配合 git 分支可以做到“一个任务一个分支一个会话”。做完存会话、提分支出问题随时回滚追溯也方便。这个习惯让我在快速迭代时心里踏实很多。