pi 全景与设计哲学

pi 是 “一个极简、可扩展、可以让你据为己有的 agent harness”。

预计阅读
12分钟
全文字数
2,631字
资料截至
2026-10-09
Agent SDK · pi4.1
版本与时效声明
  • 本文基于 pi monorepo 1.1.0,所有 @earendil-works/pi-* 包在 2026-10-07 统一发布了这个版本。源码对应仓库 earendil-works/pi 的 commit 6fb2e78(2026-10-08)。
  • pi 迭代很快,API 也经历过重构,例如 pi-ai 从全局 API 改成了 Models 集合(见 4.2 pi-ai 统一多模型 API)。资料截至 2026-10-09,本文不随官方同步更新,请对照 pi.dev 文档 和 GitHub 仓库 使用。
  • 文中凡是“笔者理解”“笔者统计”,都是笔者自己的分析,不代表官方观点。
本文要点
  1. pi 是 “一个极简、可扩展、可以让你据为己有的 agent harness”1。作者是 libGDX 的作者 Mario Zechner;2026-04 起,项目由 Earendil 公司维护,Earendil 由 Armin Ronacher 等人创办2。
  2. 设计哲学:最小的系统提示词、默认只有 4 个工具、拒绝在核心里加入 sub-agents 和 plan mode 等功能,一切交给扩展实现31。
  3. 架构是一组可以独立使用的分层包:pi-ai(多厂商 LLM 统一层)→ pi-agent-core(agent 循环)→ pi-coding-agent(CLI 加 SDK)。另有 pi-tui、chord、pi-durable 等配套包1。
  4. 它是 OpenClaw 等项目的底座1。在本专题里,它代表“轻量、透明、可完全掌控”这一类路线。

1. 背景#

时间事件出处
2025-08-09GitHub 仓库创建,最初是 badlogic/pi-monoGitHub API4
2025-08 至 2025-11Mario 陆续发表 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。

2026 年的演变:从“不做”到“交给扩展做”

1.1.0 的 README 仍然强调:pi 有强大的默认配置,但不提供 sub-agents 和 plan mode;你可以让 pi 自己把它写出来,或者安装别人做好的包1。实际情况是:

  • 官方 examples 目录里已经有 plan-mode、subagent、permission-gate、sandbox 等扩展示例9;
  • CLI 默认会加载 MCP、codemode、tool_search 这三个内置扩展,而通过 SDK 创建的会话不会自动加载它们10。

笔者理解:pi 的哲学并不是“永远不做”,而是“核心不做,交给扩展去做”。核心只保留最小机制,功能放在可以替换、可以删掉的扩展里。


3. 架构:一组可以独立使用的分层包#

pi-packages.svg

pi-telemetry

遥测契约

pi-ai

统一多厂商 LLM API

pi-agent-core

Agent 运行时

pi-tui

终端 UI(差分渲染)

pi-mcp

独立的 MCP 客户端

pi-codemode

沙箱化的 JS 工具编排

chord

应用组合运行时

pi-coding-agent

CLI + SDK

pi-durable

持久化会话、任务、文档

pi-env

远程执行环境

pi-protocol

远程会话协议(CBOR)

pi-client

pi-server(实验性)

pi-telemetry

遥测契约

pi-ai

统一多厂商 LLM API

pi-agent-core

Agent 运行时

pi-tui

终端 UI(差分渲染)

pi-mcp

独立的 MCP 客户端

pi-codemode

沙箱化的 JS 工具编排

chord

应用组合运行时

pi-coding-agent

CLI + SDK

pi-durable

持久化会话、任务、文档

pi-env

远程执行环境

pi-protocol

远程会话协议(CBOR)

pi-client

pi-server(实验性)

图中箭头表示依赖关系,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 SDK4.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. 使用方式#

方式命令或入口适合什么
交互式 TUIpi日常编码
Print 模式pi -p "..."脚本里一次性执行
JSON 模式以 JSONL 格式输出 agent 事件管道处理、日志收集
RPC 模式pi --mode rpc,通过 stdin 和 stdout 收发 JSONL其他语言集成、进程隔离、IDE
TypeScript SDKcreateAgentSession()Node.js 或 Bun 应用内嵌

以上取自官方文档11213。

Terminal window
# 安装:官方安装器会锁定依赖版本;也可以用 npm 安装
curl -fsSL https://pi.dev/install.sh | sh
# 或者:npm install -g --ignore-scripts @earendil-works/pi-coding-agent
cd /path/to/project
pi # 进入后用 /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 的关键词:极简核心、完全可观测、上下文由你掌控、功能靠扩展实现、多厂商。
  • 学习路线建议:
    1. 先读 pi-ai,理解统一的消息和事件模型;
    2. 再读 pi-agent-core,大约 2,500 行,是最适合学习 agent 循环工程实现的源码之一;
    3. 最后读 pi-coding-agent,看完整的 harness 和扩展系统。

相关笔记#

参考资料#

注释与出处#

  1. earendil-works/pi,根目录 README.md(commit 6fb2e78),https://github.com/earendil-works/pi/blob/6fb2e7815167e6b19006fc526d1a5d0f5f998787/README.md ↩ ↩2 ↩3 ↩4 ↩5 ↩6 ↩7 ↩8 ↩9 ↩10 ↩11 ↩12

  2. Mario Zechner,I've sold out(2026-04-08),https://mariozechner.at/posts/2026-04-08-ive-sold-out/ ↩ ↩2 ↩3 ↩4

  3. 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

  4. GitHub REST API,GET /repos/earendil-works/pi(2026-10-09 查询:created_at 为 2025-08-09,stargazers_count 为 113482,license 为 MIT) ↩ ↩2

  5. 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) ↩

  6. npm registry,@earendil-works/pi-coding-agent(1.1.0,2026-10-07),https://www.npmjs.com/package/@earendil-works/pi-coding-agent ↩

  7. 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 ↩

  8. earendil-works/pi,packages/coding-agent/docs/settings.md(defaultTools 一项),https://github.com/earendil-works/pi/blob/6fb2e7815167e6b19006fc526d1a5d0f5f998787/packages/coding-agent/docs/settings.md ↩

  9. earendil-works/pi,packages/coding-agent/examples/extensions/,https://github.com/earendil-works/pi/tree/6fb2e7815167e6b19006fc526d1a5d0f5f998787/packages/coding-agent/examples/extensions ↩

  10. 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 ↩

  11. earendil-works/pi,packages/*/package.json(dependencies 与 description 字段),https://github.com/earendil-works/pi/tree/6fb2e7815167e6b19006fc526d1a5d0f5f998787/packages ↩ ↩2

  12. 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 ↩

  13. earendil-works/pi,packages/coding-agent/docs/rpc.md,https://github.com/earendil-works/pi/blob/6fb2e7815167e6b19006fc526d1a5d0f5f998787/packages/coding-agent/docs/rpc.md ↩

  14. earendil-works/pi,packages/coding-agent/docs/extensions.md,https://github.com/earendil-works/pi/blob/6fb2e7815167e6b19006fc526d1a5d0f5f998787/packages/coding-agent/docs/extensions.md ↩

输入关键词开始搜索。多个关键词用空格分隔。