写于 2026 年 1 月 31 日
如果你这周没有住在石头底下,大概已经注意到我朋友 Peter 的一个项目在互联网上爆红。它有过很多名字。最近的名字是 OpenClaw,但在新闻里你可能会在不同时间点看到它被叫做 ClawdBot 或 MoltBot。它本质上就是一个接到你选择的通信渠道上的 agent,只做一件事:跑代码。
你可能不太熟悉的是:OpenClaw 的底层其实是一个叫 Pi 的小型编码代理。到目前为止,Pi 也是我几乎唯一在用的 coding agent。过去几周里,我越来越像个 Pi 的“推销员”。前阵子我就这个主题做了个分享,才意识到:我居然还没在博客里认真写过 Pi。所以我想补上这篇,聊聊我为什么对它如此着迷,以及它和 OpenClaw 的关系。
Pi 由 Mario Zechner 编写;与 Peter 那种追求“带点疯狂的科幻感”不同,1 Mario 非常务实。尽管两人的风格差异明显,OpenClaw 和 Pi 的核心理念却一致:LLM 很擅长写代码、跑代码,那就拥抱这件事。我觉得这并非偶然——去年就是 Peter 把我和 Mario 都拉进了“agent 这坑”。
什么是 Pi?
Pi 是一个 coding agent。现在的 coding agent 多到数不过来。说实话,你随便从货架上挑一个,都能体验到所谓“agentic programming”是什么感觉。我在这个博客里也写过对 AMP 的正面评价;其中一个让我很有共鸣的点是:它像是由真正沉迷过 agentic programming、并且试过各种方案之后总结出“哪些好用哪些不好用”的人做出来的产品,而不只是给一个模型套个漂亮 UI。
Pi 之所以让我觉得有意思,主要有两个原因:
- 首先,它的核心非常小。它可能是我见过的系统提示词最短的 agent,而且只提供四个工具:Read、Write、Edit、Bash。
- 其次,它用扩展系统弥补了这个极小的核心,并且允许扩展把状态持久化到 session 里——这非常强大。
另外还有个小加分:Pi 本身写得像是“优秀软件”的样子。它不闪烁、不吃太多内存、不乱崩、很可靠,而且你能看出作者对软件里每一部分都非常在意。
Pi 还是一组你可以用来搭建自己 agent 的组件集合。OpenClaw 就是这么搭出来的;我也用它做过一个 Telegram bot;Mario 则用它做了他的 mom。如果你想做一个“连接到某个东西”的 agent,只要把 Pi 指向它自己和 mom,它就能给你“变”出一个来。
Pi 里没有什么
要理解 Pi 里有什么,更重要的是理解它没有什么、为什么没有,以及更关键的:为什么未来也不会有。最明显的缺失是 MCP 支持。Pi 没有内置 MCP。你当然可以写个扩展来做这件事;或者像 OpenClaw 那样,用 mcporter 来支持 MCP。mcporter 会把 MCP 调用暴露成 CLI 接口或 TypeScript bindings,然后你的 agent 也许能拿来用——也可能不能,我也说不准 :)
这并不是“偷懒省事”。这来自 Pi 的工作哲学:如果你希望 agent 做一件它目前不会做的事,你不应该去下载一个扩展/skill 之类的东西;你应该让 agent 自己扩展自己。Pi 崇尚的就是“写代码并运行代码”这件事。
当然,并不是说你不能下载扩展——Pi 非常支持这件事。只是它不会强烈鼓励你直接拿别人的扩展来用;你也可以指着一个现成扩展说:“照着它做,但按我的喜好改这些地方。”
为构建 agent 的 agent 而生
当你看 Pi(以及基于它的 OpenClaw)在做什么时,你会看到一种“像黏土一样可塑”的软件。这会对底层架构提出一些要求,而这些要求其实会反过来约束系统设计,必须进入核心。
比如,Pi 的底层 AI SDK 设计成:一个 session 可以容纳来自多个模型提供方的多种消息。它承认 session 在不同 provider 之间的可移植性是有限的,因此它不会过度依赖那些无法迁移的 provider 特性。
第二点是:除了模型消息之外,它还会在 session 文件里维护自定义消息,扩展可以用它来存状态,系统也可以用它存一些要么根本不发给 AI、要么只发其中一部分的信息。
正因为有这套机制,并且扩展状态还能落盘,Pi 内置了热重载:agent 可以写代码、reload、测试、循环迭代,直到扩展真的能用。它还自带文档和示例,agent 自己也能拿来“自举式”地扩展自己。更棒的是:Pi 的 session 是树结构,你可以在一个 session 里分支并在分支间导航——这会带来很多有趣的工作流,比如你可以开个支线去修一个坏掉的工具,而不浪费主 session 的上下文;修好之后再把 session rewind 回更早的位置,然后让 Pi 总结那条分支上发生了什么。
这些很重要。因为如果你考虑 MCP 的工作方式:对大多数模型提供方来说,MCP 工具和任何 LLM 工具一样,需要在 session 开始时被加载进 system context(或 tool section)。这会让你很难(甚至不可能)在不清空缓存、或不让 AI 对“过去的调用语义突然变了”感到困惑的情况下,完整热重载工具能力。
上下文之外的工具
Pi 的扩展可以注册一个工具,供 LLM 调用。我偶尔会觉得这很有用。比如,尽管我对 Beads 的实现有不少吐槽,我确实认为“给 agent 一个待办列表”是很有价值的。我自己就用一个本地的、agent 专用的 issue tracker(也是让 agent 自己写出来的)。因为我希望 agent 也能管理 to-do,所以在这个场景下我选择给它一个 tool,而不是仅仅给 CLI——对这个问题的范围来说,这样更合适;目前这也是我唯一额外加载进上下文的工具。
但总体而言,我给 agent 增加的东西大多是 skills 或 TUI 扩展,让使用体验更好。除了 slash commands,Pi 扩展还能直接在终端里渲染自定义 TUI 组件:spinner、进度条、交互式文件选择器、数据表、预览面板等等。这个 TUI 足够灵活,以至于 Mario 证明过你甚至可以在里面跑 Doom。不实用,但如果能跑 Doom,你当然也能做出一个有用的 dashboard 或调试界面。
我想挑几个我写/用过的扩展,给你一个“能做到什么程度”的直觉。虽然你可以原样使用它们,但核心思路是:你指给 agent 看一个扩展,然后按你喜欢的方式 remix。
/answer
我不用 plan mode。我更希望 agent 直接提问,双方来回沟通。但如果你给 agent 一个 question tool,它往往会用一种结构化的提问对话框来问你问题;我不喜欢这种形式。我更喜欢它用自然的文字叙述,夹杂解释和示意图。
问题在于:把问题直接夹在回复里很容易变得乱。于是 /answer 会读取 agent 的上一条回复,提取所有问题,然后把它们重新排版成一个更好用的输入框。

/todos
尽管我批评过 Beads 的实现,但给 agent 一个待办列表确实很有用。/todos 会列出 .pi/todos 目录下的所有 markdown 文件;我和 agent 都可以操作它们,session 还可以 claim 任务来标记“正在进行”。
/review
随着越来越多代码由 agent 编写,把“未完成的工作”直接丢给人类去 review 其实很不合理——在那之前让 agent 先 review 一遍更有意义。因为 Pi 的 session 是树结构,我可以分支到一个全新的 review 上下文里得到结论,再把修复带回主线。

这个 UI 参考了 Codex:能很方便地查看 commit、diff、未提交变更或远端 PR。Prompt 也会刻意关注我在意的事情,所以我能得到我希望它特别指出的点(比如:我会让它提醒我新引入的依赖)。
/control
这是个我在实验但不常用的扩展:它允许一个 Pi agent 把 prompt 发给另一个 Pi agent。它是一个没有复杂编排的简单 multi-agent 系统,适合拿来做实验。
/files
列出 session 中所有被改动或被引用过的文件。你可以在 Finder 里 reveal,或者在 VS Code 里 diff,quick-look,或把它们作为 prompt 参考。shift+ctrl+r 会 quick-look 最近提到的文件,这在 agent 生成 PDF 时很顺手。
也有人做了其他扩展:比如 Nico 的 subagent 扩展 和 interactive-shell,它让 Pi 可以在可观察的 TUI overlay 里自动操控交互式 CLI。
用软件构建软件
以上都只是你可以拿 agent 做什么的例子。重点是:这些几乎都不是我手写的,而是由 agent 按我的规格写出来的。我告诉 Pi “做一个扩展”,它就做了。这里没有 MCP、没有社区技能、什么都没有。别误会,我也会用很多 skills;但它们都是我的 clanker 手工打磨出来的,不是从哪里下载的。比如我把所有用于浏览器自动化的 CLI/MCP 都替换成了一个只用 CDP 的 skill。不是因为替代品不好用或很差,而是因为这样做又自然又简单:agent 维护它自己的能力。
我的 agent 有不少 skills,而且关键是:不用就丢。我曾经给它一个 skill,用来读取其他工程师分享的 Pi sessions,帮助做 code review;也有 skill 用来帮它写我喜欢的提交信息、控制提交行为、更新 changelog。这些最初是 slash commands,但我正在把它们迁移成 skills,看看效果是否一样。还有一个 skill 试图让 Pi 用 uv 而不是 pip;同时我也加了一个自定义扩展,拦截对 pip 和 python 的调用并把它们重定向到 uv。
用 Pi 这种极简 agent 工作的迷人之处之一在于:你会真实地生活在“软件构建软件”这个想法里。当你把它推到极致,拿掉 UI 和输出,把它直接接到聊天里——那就是 OpenClaw 在做的事。而考虑到 OpenClaw 的爆炸式增长,我越来越觉得:或早或晚,这会成为我们的未来。
这篇文章的标签是 ai