- 本文基于 pi monorepo 1.1.0,所有
@earendil-works/pi-*包在 2026-10-07 统一发布了这个版本。源码对应仓库earendil-works/pi的 commit6fb2e78(2026-10-08)。 - pi 迭代很快,API 也经历过重构,例如 pi-ai 从全局 API 改成了
Models集合(见 4.2 pi-ai 统一多模型 API)。资料截至 2026-10-09,本文不随官方同步更新,请对照 pi.dev 文档 和 GitHub 仓库 使用。 - 文中凡是“笔者理解”“笔者统计”,都是笔者自己的分析,不代表官方观点。
- pi 是 “一个极简、可扩展、可以让你据为己有的 agent harness”1。作者是 libGDX 的作者 Mario Zechner;2026-04 起,项目由 Earendil 公司维护,Earendil 由 Armin Ronacher 等人创办2。
- 设计哲学:最小的系统提示词、默认只有 4 个工具、拒绝在核心里加入 sub-agents 和 plan mode 等功能,一切交给扩展实现31。
- 架构是一组可以独立使用的分层包:
pi-ai(多厂商 LLM 统一层)→pi-agent-core(agent 循环)→pi-coding-agent(CLI 加 SDK)。另有pi-tui、chord、pi-durable等配套包1。 - 它是 OpenClaw 等项目的底座1。在本专题里,它代表“轻量、透明、可完全掌控”这一类路线。
1. 背景#
| 时间 | 事件 | 出处 |
|---|---|---|
| 2025-08-09 | GitHub 仓库创建,最初是 badlogic/pi-mono | GitHub API4 |
| 2025-08 至 2025-11 | Mario 陆续发表 MCP vs CLI、What if you don't need MCP at all? 等文章,对比 MCP 和 CLI 工具在 token 开销上的差异 | 作者博客5 |
| 2025-11-30 | 发表 What I learned building an opinionated and minimal coding agent,系统阐述 pi 的设计哲学 | 3 |
| 2026-04-08 | 发表 I've sold out:Mario 加入 Earendil,仓库迁移到 earendil-works/pi,核心代码保持 MIT 许可 | 2 |
| 2026-10-07 | 全部包发布 1.1.0,npm 作用域为 @earendil-works/*(作用域具体是哪天更换的,未查到官方日期) | npm6 |
截至 2026-10-09,仓库约有 11.3 万个 star,许可证为 MIT。数据来自 GitHub API4。
根据 2026-04-08 的那篇文章,pi 的核心会一直保持 MIT 许可。今后可能出现采用 Fair Source(延迟开源)许可的部分,以及面向企业的专有功能,比如云基础设施和计费2。
2. 设计哲学:做减法#
2.1 为什么要做 pi#
Mario 的出发点3:
- 现有的 harness(比如当时的 Claude Code)功能越来越臃肿,他用不上;
- 对模型交互缺乏可观测性;
- 框架会在用户看不到的地方往上下文里塞东西,让上下文工程(context engineering)变得非常困难,甚至无法实现。
他的核心主张是:精确控制进入模型上下文的内容,才能得到更好的输出,写代码时尤其如此3。
2.2 极简的系统提示词和 4 个工具#
- 系统提示词不到 1000 token,其中已经包含 4 个核心工具(read、write、edit、bash)的定义。Mario 的理由是,前沿模型经过大量强化学习,本身就理解编码 agent 是什么,不需要冗长的提示词3。
- 源码中的默认工具常量是
DEFAULT_TOOL_NAMES = ["read", "bash", "edit", "write"]7。另外还有grep、find、ls、powershell等内置工具,可以按需开启8。
2.3 “不做”清单#
| 不做的功能 | 当初的理由(2025-11 博文) |
|---|---|
| MCP | 一个 Playwright MCP server 就带来 21 个工具定义、约 1.37 万 token,会在每次会话开始时直接塞进上下文。带 README 的简单 CLI 工具更省 token |
| Sub-agents | 相当于“黑盒里的黑盒”。需要的话,可以通过 bash 再启动一个 pi,这样完全可观测 |
| Plan mode | 把计划写进 PLAN.md 文件,可以跨会话共享,还能和代码一起做版本管理 |
| 权限弹窗 | 一旦 agent 能写代码、能运行代码,弹窗式的权限控制基本就失效了,只是安全表演 |
| 后台 bash | 用 tmux 可观测性更好,甚至可以进入同一个调试会话和 agent 一起排查 |
| 内置 todo | 通常会让模型更困惑,不如写进外部文件 |
整张表概括自 Mario 的博文3。
3. 架构:一组可以独立使用的分层包#
图中箭头表示依赖关系,A → B 即 A 依赖 B。这些依赖是笔者从各包 package.json 中提取的11。
| 包 | 一句话说明 | 本专题笔记 |
|---|---|---|
@earendil-works/pi-ai | 统一的多厂商 LLM API,支持 OpenAI、Anthropic、Google、DeepSeek 等 | 4.2 pi-ai 统一多模型 API |
@earendil-works/pi-agent-core | 带工具调用和状态管理的 agent 运行时 | 4.3 pi-agent-core 最小 Agent 运行时 |
@earendil-works/pi-coding-agent | 交互式编码 agent 的 CLI,以及 TypeScript SDK | 4.4 pi-coding-agent SDK 与扩展系统 |
@earendil-works/pi-tui | 采用差分渲染的终端 UI 库 | — |
@earendil-works/chord | 独立的应用组合运行时,管理服务、可复制状态、RPC、插件 | — |
@earendil-works/pi-durable | 持久化的会话、任务和文档运行时 | — |
@earendil-works/pi-telemetry | 与厂商无关的遥测契约和类型化 schema | — |
各包说明取自 README 的 Packages 表1,其余包的说明取自各自 package.json 的 description 字段11。
3.1 “轻量”到底指什么#
笔者用 find 加 wc -l 粗略统计了各包 src/ 目录下的 TypeScript 行数,排除了测试文件和自动生成的文件:
| 包 | 代码行数 |
|---|---|
pi-agent-core | 约 2,500 行(其中 agent-loop.ts 949 行) |
pi-ai | 约 26,900 行,主要是数十家提供方的适配代码 |
pi-coding-agent | 约 86,100 行,包括 CLI、TUI 交互、扩展系统、会话管理 |
笔者理解:
- 轻量指的是核心抽象和设计哲学,而不是整个仓库的代码量。 agent 循环本身只有 2,500 行左右,读一个下午就能读懂;外围的功能都可以按需使用。
- 这和 DSH 的“核心轻、发行版重”是同一个思路。
4. 使用方式#
| 方式 | 命令或入口 | 适合什么 |
|---|---|---|
| 交互式 TUI | pi | 日常编码 |
| Print 模式 | pi -p "..." | 脚本里一次性执行 |
| JSON 模式 | 以 JSONL 格式输出 agent 事件 | 管道处理、日志收集 |
| RPC 模式 | pi --mode rpc,通过 stdin 和 stdout 收发 JSONL | 其他语言集成、进程隔离、IDE |
| TypeScript SDK | createAgentSession() | Node.js 或 Bun 应用内嵌 |
# 安装:官方安装器会锁定依赖版本;也可以用 npm 安装curl -fsSL https://pi.dev/install.sh | sh# 或者:npm install -g --ignore-scripts @earendil-works/pi-coding-agent
cd /path/to/projectpi # 进入后用 /login 连接订阅账号或 API Key,然后直接给它布置任务运行要求:Node.js 22.19 或更高版本1。
5. 安全模型:默认不设防,由你负责隔离#
- pi 没有内置的权限系统来限制文件系统、进程、网络或凭据的访问。默认情况下,它以启动它的用户和进程的权限运行1。
- 扩展在 pi 进程内运行,拥有相同的权限,所以只应该加载可信来源的扩展14。
- 官方给出了三种隔离方案1:
- Gondolin 扩展:内置工具在本地的 Linux micro-VM 里执行;
- 普通 Docker:把整个 pi 进程放进容器;
- OpenShell:在一个受策略控制的沙箱里运行 pi。
这与 3.3 Claude Agent SDK 的多层权限判定、DSH 的 fail-closed 沙箱形成鲜明对比。pi 的立场是:权限弹窗只是安全表演,真正的隔离应该靠容器或虚拟机3。
5.1 供应链加固:一个值得后端借鉴的实践#
pi 把 npm 依赖的变更视同代码变更,需要经过审查1:
- 直接依赖锁定到精确版本;
.npmrc设置了min-release-age=2,不使用当天才发布的依赖;- 安装时一律使用
--ignore-scripts; - CI 定期运行
npm audit signatures。
6. 与 OpenClaw 的关系#
pi 的 README 把 OpenClaw 列为“真实世界的集成案例”1。Mario 在 2026-04-08 的文章里也提到:OpenClaw 基于 pi 构建,它的走红为 pi 带来了商业关注2。
笔者理解:这正是 pi 分层设计的价值所在。上层产品可以只用 pi-ai 和 pi-agent-core 搭出完全不同的应用,不必接受 pi CLI 的交互形态。
小结#
- pi 的关键词:极简核心、完全可观测、上下文由你掌控、功能靠扩展实现、多厂商。
- 学习路线建议:
- 先读 pi-ai,理解统一的消息和事件模型;
- 再读 pi-agent-core,大约 2,500 行,是最适合学习 agent 循环工程实现的源码之一;
- 最后读 pi-coding-agent,看完整的 harness 和扩展系统。
相关笔记#
- 1.1 从 LLM API 到 Agent Harness 的分层
- 4.2 pi-ai 统一多模型 API · 4.3 pi-agent-core 最小 Agent 运行时 · 4.4 pi-coding-agent SDK 与扩展系统
- 对照:5.1 DeepSeek Harness 全景 · 3.3 Claude Agent SDK
参考资料#
注释与出处#
-
earendil-works/pi,根目录
README.md(commit6fb2e78),https://github.com/earendil-works/pi/blob/6fb2e7815167e6b19006fc526d1a5d0f5f998787/README.md ↩ ↩2 ↩3 ↩4 ↩5 ↩6 ↩7 ↩8 ↩9 ↩10 ↩11 ↩12 -
Mario Zechner,I've sold out(2026-04-08),https://mariozechner.at/posts/2026-04-08-ive-sold-out/ ↩ ↩2 ↩3 ↩4
-
Mario Zechner,What I learned building an opinionated and minimal coding agent(2025-11-30),https://mariozechner.at/posts/2025-11-30-pi-coding-agent/ ↩ ↩2 ↩3 ↩4 ↩5 ↩6 ↩7
-
GitHub REST API,
GET /repos/earendil-works/pi(2026-10-09 查询:created_at 为 2025-08-09,stargazers_count 为 113482,license 为 MIT) ↩ ↩2 -
Mario Zechner 博客 RSS,https://mariozechner.at/rss.xml ;其中包括 MCP vs CLI: Benchmarking Tools for Coding Agents(2025-08-15)和 What if you don't need MCP at all?(2025-11-02) ↩
-
npm registry,
@earendil-works/pi-coding-agent(1.1.0,2026-10-07),https://www.npmjs.com/package/@earendil-works/pi-coding-agent ↩ -
earendil-works/pi,
packages/coding-agent/src/core/settings-manager.ts第 83 行,https://github.com/earendil-works/pi/blob/6fb2e7815167e6b19006fc526d1a5d0f5f998787/packages/coding-agent/src/core/settings-manager.ts#L83 ↩ -
earendil-works/pi,
packages/coding-agent/docs/settings.md(defaultTools 一项),https://github.com/earendil-works/pi/blob/6fb2e7815167e6b19006fc526d1a5d0f5f998787/packages/coding-agent/docs/settings.md ↩ -
earendil-works/pi,
packages/coding-agent/examples/extensions/,https://github.com/earendil-works/pi/tree/6fb2e7815167e6b19006fc526d1a5d0f5f998787/packages/coding-agent/examples/extensions ↩ -
earendil-works/pi,
packages/coding-agent/docs/sdk.md(codemode、tool_search 和 MCP 一节),https://github.com/earendil-works/pi/blob/6fb2e7815167e6b19006fc526d1a5d0f5f998787/packages/coding-agent/docs/sdk.md ↩ -
earendil-works/pi,
packages/*/package.json(dependencies 与 description 字段),https://github.com/earendil-works/pi/tree/6fb2e7815167e6b19006fc526d1a5d0f5f998787/packages ↩ ↩2 -
earendil-works/pi,
packages/coding-agent/docs/how-pi-works.md,https://github.com/earendil-works/pi/blob/6fb2e7815167e6b19006fc526d1a5d0f5f998787/packages/coding-agent/docs/how-pi-works.md ↩ -
earendil-works/pi,
packages/coding-agent/docs/rpc.md,https://github.com/earendil-works/pi/blob/6fb2e7815167e6b19006fc526d1a5d0f5f998787/packages/coding-agent/docs/rpc.md ↩ -
earendil-works/pi,
packages/coding-agent/docs/extensions.md,https://github.com/earendil-works/pi/blob/6fb2e7815167e6b19006fc526d1a5d0f5f998787/packages/coding-agent/docs/extensions.md ↩