Pi 的设计哲学:核心极简、行为外置的 4 包架构(含延伸:为何这是理解 Agent Harness 的最佳学习样本)
Pi 用一句话定义自己:核心要小,行为由扩展装配。本篇先看它最上层的哲学,再落到 4 个 npm 包的源码目录 里。
- 核心极简:默认不内置 MCP、sub-agent、plan mode、to-do、权限弹窗
- Harness ≠ 模型:LLM 是发动机、Harness 是车辆系统——这一层直接决定成本与效果
- 两条路径:产品派(Claude Code / Codex)成品房 vs 框架派(Pi)毛坯房
- 双层扩展:Skill 改方法,Extension 改 Agent 自身运行方式
- 4 个 npm 包:pi-ai / pi-agent-core / pi-coding-agent / pi-tui,单向依赖
- 透明可读 → 自改造:Pi 自己读自己的扩展文档、自己写代码修改 Extension
- 同模型实测:同模型同任务,Pi / CC token 比 51%、耗时 ~80%
- 核心只做四件事:加载扩展、跑 agent 循环、读写 session 文件、提供 TUI
记忆点:Pi 卖的不是「帮你做好了一切」,而是「给你一块可改装的底盘」——也是一个「让你能看到 Agent 怎么跑的透明壳」。
设计哲学与包架构:Minimal Core
Pi 给出的答案是「核心极简、行为由扩展装配」,跟 Claude Code 那种「核心大而全、扩展只是补丁」的设计路线完全相反。本篇先看最上层的哲学、再落到 4 个 npm 包,最后补一段延伸——为什么这套极简是研究 Agent Harness 的最佳学习样本。
一句话定位
官方 README 给出的定义是:
Pi is a minimal terminal coding harness. It is designed to stay small at the core while being extended through TypeScript extensions, skills, prompt templates, themes, and pi packages.
关键词是 stay small at the core——核心要小、不能膨胀,所有「工作流级别的能力」都外移到扩展层。这是一个有意识的产品决策:默认不内置 MCP、不内置 sub-agent、不内置 plan mode、不内置 to-dos、不内置后台 bash、不内置权限弹窗——这些都可以作为扩展、或者借助容器/tmux 等外部工具实现。
Pi 核心只做四件事:
- 加载扩展(extensions、skills、prompts、themes)
- 跑 agent 循环
- 读写 session 文件
- 提供 TUI
其他——包括权限弹窗、plan mode、sub-agent、消息队列——全部由扩展层按需装配。
Harness ≠ 模型——为什么这层包装值得研究
很多人评估 Agent 时只看「用的哪个模型」,结论就是「Claude Code 用的是 Opus 4.5,所以它强」。这判断只对了一半。
更精确的拆解是这样的:
LLM(模型)是发动机;Harness 是发动机外面那一整套车辆系统——它负责组织上下文、提供工具、执行模型发起的操作、再把结果返回给模型。
每次 Agent 调用模型时送进去的内容里,包含:
- 系统提 示词
- 工具定义
- 项目规则
- 历史消息
- 过往工具返回结果
这些内容越多,多轮执行里反复进入上下文的 token 就越多,无关上下文拉长还会拖累模型的注意力。这意味着 Harness 的设计会 直接影响成本和效果,不是「穿在外面的透明壳」。
Pi 走的是把这个壳 做小、做透 的路线:默认 4 个工具(read / write / edit / bash)、系统提示词不到 1000 token、核心代码完全开源。这种「什么都不敢内置」的姿态让它成为一个 活的教学样本——打开它,就能看到 Agent 内部的循环。
跟其他 Coding Agent 的差异
| 维度 | Pi | Claude Code | OpenCode |
|---|---|---|---|
| 核心大小 | 极简,行为由扩展装配 | 大而全,功能内置 | 中等,模块化 |
| MCP | 不内置(可作扩展) | 内置 | 内置 |
| Sub-Agent | 不内置(可作扩展) | 内置 Coordinator | 内置 |
| 权限系统 | 不内置(靠容器化) | 内置多层权限 | 内置 |
| Plan Mode | 不内置 | 内置 | 内置 |
| 扩展机制 | TypeScript 模块 + 生命周期事件 + UI | Hooks + Skills + Plugins | Hooks |
| 会话存储 | JSONL 树形结构,可分支 | JSONL 线性 + 内部状态 | JSONL |
| 多 Provider | 内置统一抽象层 | 主推 Anthropic | 内置 |