「Pi ships with powerful defaults but skips features like sub agents and plan mode.」 — Mario Zechner
引言
在 AI Agent 领域,Claude Code、Cursor、Windsurf 等工具往往内置了大量功能——MCP、Sub-agent、Plan Mode、权限弹窗等。然而,有一个项目反其道而行之:只带 4 个默认工具,却获得了 23,000+ Stars。这就是 Pi。
本文基于 Pi 官方源码(badlogic/pi-mono),深入解析其架构设计与技术实现。
一、Pi 是什么?
Pi 是一个终端编码 Agent 工具包,由独立开发者 Mario Zechner(@badlogic)开发和维护。
npm install -g @mariozechner/pi-coding-agent
pi
| 项目信息 | |
|---|---|
| GitHub | badlogic/pi-mono |
| Stars | 23,391 |
| 语言 | TypeScript |
| 定位 | Minimal terminal coding harness |
核心理念
"Pi is aggressively extensible so it doesn't have to dictate your workflow."
二、为什么默认只有 4 个工具?
Pi 默认只提供 4 个工具:
| 工具 | 功能 |
|---|---|
read | 读取文件 |
write | 创建/覆盖文件 |
edit | 精确编辑 |
bash | 执行 Shell |
设计哲学
最小化复杂度
- 4 个工具图灵完备,理论上可以做任何事
- 避免「功能膨胀」——100+ 工具反而让模型困惑
让模型自己思考
- 工具少 → 模型必须理解代码/命令
- 工具多 → 模型可能瞎猜
按需扩展
--tools read,bash,edit,write,grep,find,ls需要就加,不需要就不加。
三、完整架构解析
3.1 整体架构
┌─────────────────────────────────────────────────────────────────┐
│ Pi Monorepo │
├─────────────────────────────────────────────────────────────────┤
│ ┌──────────────┐ ┌──────────────┐ ┌──────────────────────┐ │
│ │Coding Agent │ │ AI Core │ │ UI Layer │ │
│ │ (CLI/RPC) │ │(Multi-Provider│ │ (TUI / WebUI) │ │
│ └──────┬───────┘ └──────┬───────┘ └──────────┬───────────┘ │
│ │ │ │ │
│ └──────────────────┼──────────────────────┘ │
│ ▼ │
│ ┌─────────────────────┐ │
│ │ Agent Core │ │
│ │ Tool Calling + State│ │
│ └─────────────────────┘ │
│ ▼ │
│ ┌─────────────────────┐ │
│ │ Event-Driven Loop │ │
│ └─────────────────────┘ │
└─────────────────────────────────────────────────────────────────┘
3.2 包结构
packages/
├── ai/ # 统一 LLM API
│ └── providers/
│ ├── anthropic.js # Claude
│ ├── openai-responses.js # GPT-4
│ ├── google.js # Gemini
│ ├── bedrock.js # AWS
│ └── ... (15+ providers)
│
├── agent/ # Agent 核心引擎
│ ├── agent.ts # Agent 主类
│ └── agent-loop.ts # ReAct 循环
│
├── coding-agent/ # 终端入口
│ ├── cli.ts
│ └── modes/
│ ├── interactive/
│ ├── print-mode.ts
│ └── rpc/
│
├── tui/ # 终端 UI
├── web-ui/ # Web UI
├── mom/ # Slack Bot
└── pods/ # vLLM 管理
四、核心实现
4.1 Agent Loop (ReAct 模式)
// 主循环逻辑
while (true) {
// 1. 流式调用 LLM
const message = await streamAssistantResponse(...);
// 2. 提取工具调用
const toolCalls = message.content.filter(c => c.type === "toolCall");
if (toolCalls.length > 0) {
// 3. 执行工具
const toolResults = await executeToolCalls(...);
// 4. 结果加入上下文,继续循环
} else {
break; // 无工具调用,退出
}
}
4.2 工具执行模式
| 模式 | 说明 | 适用场景 |
|---|---|---|
| parallel | 并行执行所有工具 | 独立任务,追求速度 |
| sequential | 串行执行,可中断 | 工具相互依赖,需要人工干预 |
// 配置工具执行模式
toolExecution?: "parallel" | "sequential"
// Hooks
beforeToolCall?: (context) => Promise<BeforeToolResult>
afterToolCall?: (context) => Promise<AfterToolResult>
4.3 事件驱动架构
type AgentEvent =
| { type: "agent_start" }
| { type: "turn_start" }
| { type: "message_start", message }
| { type: "message_update", assistantMessageEvent } // 增量更新
| { type: "tool_execution_start", toolCallId, toolName, args }
| { type: "tool_execution_end" }
| { type: "turn_end" }
| { type: "agent_end", messages }
4.4 消息转换层
// Agent 内部使用 AgentMessage[]
// 只有调用 LLM 时才转换
const llmMessages = await config.convertToLlm(messages);
4.5 多提供商支持
支持 15+ LLM 提供商:
- 订阅:Anthropic Pro, OpenAI ChatGPT Pro, GitHub Copilot, Google Gemini CLI
- API Keys:OpenAI, Anthropic, Azure, Google Vertex, Amazon Bedrock, Groq, Cerebras, xAI, MiniMax, Kimi...
五、扩展机制
5.1 Skills
预设技能包,CLI 工具 + README:
pi skill install npm:@foo/pi-tools
5.2 Extensions
TypeScript 扩展:
export default function (pi: ExtensionAPI) {
pi.registerTool({ name: "deploy", ... });
pi.on("tool_call", async (event, ctx) => { ... });
}
5.3 Prompt Templates
自定义提示词模板。
5.4 Themes
UI 主题定制。
六、运行模式
| 模式 | 用途 |
|---|---|
| interactive | 终端交互,TUI 界面 |
| 脚本输出,纯文本 | |
| json | 程序集成 |
| rpc | 远程进程调用 |
| sdk | 代码嵌入 |
七、Pi 的「不做」哲学
| 功能 | 其他 Agent | Pi |
|---|---|---|
| Sub-agents | 内置 | 不做,用 tmux 或扩展 |
| MCP | 强制 | 不做,用 Skills + CLI |
| Plan mode | 强制弹窗 | 不做,自己写文件 |
| Todo | 内置 | 不做,用 TODO.md |
| 权限弹窗 | 频繁打断 | 不做,自己控制 |
核心思想:最小化核心,让用户自己选择工作流。
八、Q&A:通过问答深入理解 Pi
为了帮助读者更好地理解 Pi 的架构和流程,以下是本文形成过程中的核心问答:
Q1: OpenClaw 使用的 Pi 是什么技术?
A: OpenClaw 文档里提到的 Pi 是由独立开发者 Mario Zechner(@badlogic)开发的终端编码 Agent,不是 Inflection AI 的 Pi。两者是同名但不同的项目。
OpenClaw 底层使用 Pi 作为 Agent 引擎,官方文档明确提到:
"See openclaw/openclaw for a real-world SDK integration."
Q2: Agent 的底层技术除了 LLM 以外,还有什么?
A: AI Agent 的底层技术栈除了 LLM 本身,还包括:
| 技术 | 作用 |
|---|---|
| Function Calling / Tool Use | 让 LLM 调用外部 API、函数 |
| MCP (Model Context Protocol) | 标准化工具调用协议 |
| Vector Database | 语义检索、记忆存储 |
| RAG | 检索增强生成 |
简单说:LLM 是大脑,MCP 是神经,Memory 是记忆,Tools 是手和脚。
Q3: Pi Monorepo 是什么?
A: Pi Monorepo (badlogic/pi-mono) 是一个 TypeScript 编写的 AI Agent 工具包,包含:
| 包 | 功能 |
|---|---|
| coding-agent | 交互式终端编码 Agent |
| ai | 统一多提供商 LLM API |
| agent-core | Agent 运行时 + 工具调用 |
| tui | 终端 UI 库 |
| web-ui | Web 聊天组件 |
Q4: Pi 的工具包有哪些?
A: 默认只有 4 个核心工具:
| 工具 | 功能 |
|---|---|
| read | 读取文件 |
| write | 创建/覆盖文件 |
| edit | 精确编辑 |
| bash | 执行 Shell |
可通过参数扩展:--tools read,bash,edit,write,grep,find,ls
Q5: 为什么人们喜欢 Pi?
A: Pi 的核心理念是 "Minimal but Extensible"(最小化但激进可扩展):
| 特性 | Pi 的做法 | 其他 Agent 做法 |
|---|---|---|
| Sub-agents | 不内置,用 tmux/扩展 | 内置,复杂 |
| MCP | 不内置,用 Skills | 强制绑定 |
| Plan mode | 不内置,写文件就行 | 强制弹窗确认 |
| Todo | 不内置,用 TODO.md | 内置但模型困惑 |
| 权限弹窗 | 不内置,自己控制 | 频繁弹窗打断 |
"Pi 给你自由,其他 Agent 给你枷锁"。
Q6: 为什么默认工具只有 4 个?
A: 这是 "少即是多" 的设计哲学:
- 最小化复杂度 - 4 个工具图灵完备,可以做任何事
- 避免功能膨胀 - 100+ 工具反而让模型困惑
- 迫使模型自己思考 - 工具少,模型必须理解代码逻辑而不是乱猜
Q7: Sequential(串行执行)是什么意思?
A: 工具执行有两种模式:
| 模式 | 执行方式 | 中断能力 |
|---|---|---|
| parallel | 所有工具同时执行 | ❌ 不可中断 |
| sequential | 一个一个执行 | ✅ 可中断 |
Sequential 优势:
- 工具相互依赖时按顺序执行
- 发现错误可及时停止
- 避免后续无效工具浪费资源
Q8: 怎么实现多个 Agent 和 Sub-Agent?
A: Pi 本身不内置 Sub-agent,但可以通过以下方式实现:
| 方式 | 说明 |
|---|---|
| Tool Calls | 主 Agent 调用子 Agent 作为工具 |
| Sessions | 每个 Agent 独立 Session |
| Extensions | 自定义 Sub-Agent 扩展 |
| OpenClaw | 内置 subagents API |
Q9: Pi 的完整工作流程是怎样的?
A: 用户输入 → Agent 处理流程:
用户消息
│
▼
┌─────────────────┐
│ CLI / RPC │ ← 接收输入
└────────┬────────┘
│
▼
┌─────────────────┐
│ Agent Loop │ ← 核心循环 (ReAct)
│ │
│ while (true) {│
│ 1. LLM 调用 │
│ 2. 提取工具 │
│ 3. 执行工具 │
│ 4. 加入上下文│
│ } │
└────────┬────────┘
│
▼
┌─────────────────┐
│ Tools 执行 │ ← read/write/edit/bash
└────────┬────────┘
│
▼
┌─────────────────┐
│ 返回结果给用户 │
└─────────────────┘
九、与 OpenClaw 的关系
OpenClaw 底层使用 Pi 作为 Agent 引擎:
"See openclaw/openclaw for a real-world SDK integration."
OpenClaw = Pi + Multi-channel Gateway (WhatsApp/Telegram/Discord...)
十、总结
Pi 是一个极简但激进可扩展的 AI 编码 Agent:
- 4 个默认工具:迫使模型真正理解问题
- Event-driven ReAct:清晰的状态机
- Multi-provider:15+ LLM 提供商
- 激进扩展:不内置,按需加载
- 终端优先:TUI 设计,操作流畅
「少即是多」 — 这是 Pi 带给 AI Agent 领域的最大启发。
十一、参考资料
本文由 AI 助手根据 Pi 源码和官方文档整理