引言
"Adapt pi to your workflows, not the other way around."
这是「每日一个开源项目」系列的第 187 篇。今天的项目是 Pi —— 一个极简哲学驱动的 AI coding agent harness,86,334 颗 Star,由游戏开发者 Mario Zechner(libGDX 作者)创建。
Pi 有一个不寻常的 README 章节叫「Philosophy」,里面逐条列出了它刻意不做的事:没有 MCP、没有子 agent、没有权限弹窗、没有计划模式、没有内置待办列表、没有后台 bash。每条后面跟着理由,以及「如果你真的需要,用扩展自己做」。
这不是功能缺失,而是一种设计立场:核心保持极简,所有定制通过扩展层完成,不强迫用户接受工具作者的工作流偏好。
86k Stars,2025 年 8 月创建,MIT 许可。
你会学到什么
- Pi 的 5 个 npm 包和各自的职责
- 四种运行模式:交互/打印/JSON/RPC/SDK
- 会话分支树(Session Tree)的设计
- 扩展生态:Extensions、Skills、Prompt Templates、Pi Packages
- Pi 的哲学:刻意不内置什么,以及为什么
- 30+ LLM 提供商列表和切换方式
前提知识
- 基本的终端/命令行使用经验
- 了解 AI coding agent 的基本概念(工具调用、系统提示)
- TypeScript 基础知识对理解扩展开发有帮助
项目背景
概述
Pi 是一个 AI coding agent 的「harness」—— 这个词很准确:它是一个驾驭 LLM 的框架,而不是一个固定的产品。它把 LLM 接入、agent 循环、TUI 渲染、会话管理做成了独立的 npm 包,让用户可以根据需要选择和扩展。
项目信息
- 作者: Mario Zechner(badlogic,libGDX 游戏框架作者)
- 主语言: TypeScript
- 许可证: MIT
- 官网: pi.dev
项目数据
- ⭐ GitHub Stars: 86,334+
- 🍴 Forks: 10,721+
- 📄 许可证: MIT
- 📅 创建时间: 2025-08-09
五个 npm 包
Pi 是一个 monorepo,核心功能拆分成五个独立的 npm 包:
| 包名 | 功能 |
|---|---|
@earendil-works/pi-ai | 统一多提供商 LLM API(OpenAI、Anthropic、Google 等) |
@earendil-works/pi-agent-core | Agent 运行时:工具调用循环 + 状态管理 |
@earendil-works/pi-coding-agent | 交互式 coding agent CLI(面向用户的主入口) |
@earendil-works/pi-tui | 差分渲染 TUI 库 |
@earendil-works/pi-telemetry | 厂商中立遥测合约、参考适配器、合规测试 |
这种拆分让用户可以只用 pi-ai 做 LLM API 统一层,或者只用 pi-agent-core 嵌入到自己的应用里,不必接受整个 coding agent CLI。
快速上手
npm install -g --ignore-scripts @earendil-works/pi-coding-agent
# 或者
curl -fsSL https://pi.dev/install.sh | sh设置 API Key 或直接登录订阅账号:
export ANTHROPIC_API_KEY=sk-ant-...
pipi
/login # 选择提供商(支持订阅账号:Claude Pro/Max、ChatGPT Plus/Pro、GitHub Copilot)默认开箱即用的工具:read、bash、edit、write、grep、find、ls。不需要任何配置,直接对话。
30+ LLM 提供商
Pi 内置的提供商列表是目前 coding agent 工具里最全的之一:
订阅账号(无需 API Key):
- Anthropic Claude Pro/Max
- OpenAI ChatGPT Plus/Pro(Codex)
- GitHub Copilot
API Key 接入:
- Anthropic、OpenAI、Azure OpenAI、DeepSeek
- Google Gemini、Google Vertex、Amazon Bedrock
- Mistral、Groq、Cerebras、xAI
- Cloudflare AI Gateway、Cloudflare Workers AI
- OpenRouter、Vercel AI Gateway
- Hugging Face、Fireworks、Together AI、Baseten
- NVIDIA NIM、Kimi For Coding、MiniMax
- 小米 MiMo(含中国区、阿姆斯特丹、新加坡节点)
- ZAI Coding Plan(全球/中国)、OpenCode Zen/Go
- Ant Ling
本地推理:
- llama.cpp router server(
/login llama.cpp+/llama管理模型下载)
切换模型用 Ctrl+L 打开选择器,或命令行:
pi --model openai/gpt-4o "帮我重构这段代码"
pi --model sonnet:high "解决这个复杂问题" # 带思考级别四种运行模式
交互模式(默认)
带 TUI 的交互终端,从上到下:
- 启动头部:快捷键提示、已加载的 AGENTS.md、模板、技能、扩展
- 消息区:对话、工具调用结果、错误、扩展 UI
- 编辑器:边框颜色标示思考级别
- 底部状态栏:工作目录、会话名、token 用量(↑ 输入/↓ 输出/R 缓存读/W 缓存写/CH 缓存命中率)、成本、当前模型
打印模式(非交互)
pi -p "总结这个代码库"
cat README.md | pi -p "总结这段文字" # 支持管道 stdinJSON 模式
pi --mode json "帮我分析这个问题"
# 输出所有事件为 JSONL,适合脚本处理RPC 模式
pi --mode rpc
# stdin/stdout JSONL 协议,适合非 Node.js 进程集成SDK 模式(嵌入使用)
import { createAgentSession, ModelRuntime, SessionManager } from "@earendil-works/pi-coding-agent";
const modelRuntime = await ModelRuntime.create();
const { session } = await createAgentSession({
sessionManager: SessionManager.inMemory(),
modelRuntime,
});
await session.prompt("当前目录有哪些文件?");会话系统
会话存储
会话以 JSONL 文件形式保存在 ~/.pi/agent/sessions/,按工作目录分组。每条记录有 id 和 parentId,天然支持分支结构,不需要创建多个文件。
pi -c # 继续最近的会话
pi -r # 浏览并选择历史会话
pi --no-session # 临时模式,不保存
pi --name "任务名" # 命名会话会话分支树(Session Tree)
这是 Pi 的一个独特设计:按 Escape 两次打开 /tree 视图,可以在整个会话历史树中导航,跳到任意历史节点继续工作。
/tree 快捷键:
搜索:输入关键词
折叠/展开分支:Ctrl+← / Ctrl+→
翻页:← / →
过滤模式:Ctrl+O(默认→无工具→仅用户→仅标签→全部)
复制消息:Ctrl+X
添加书签:Shift+L/fork:从历史节点创建新会话文件(修改后重新发送)。
/clone:复制当前分支到新会话文件,从当前位置继续。
Context Compaction(上下文压缩)
长会话超出上下文窗口时,Pi 支持自动或手动压缩:
/compact # 手动压缩
/compact 专注 API # 带自定义指令的压缩自动压缩默认开启,在接近上下文限制时触发,或上下文溢出时恢复重试。完整历史仍在 JSONL 文件中,通过 /tree 可回溯。
扩展生态
Extensions(TypeScript 扩展)
扩展是 Pi 最强大的机制:TypeScript 模块,可以添加自定义工具、命令、快捷键、事件处理、UI 组件。
export default function (pi: ExtensionAPI) {
pi.registerTool({ name: "deploy", ... });
pi.registerCommand("stats", { ... });
pi.on("tool_call", async (event, ctx) => { ... });
}扩展能做的事(README 列举的部分):
- 自定义工具(或完全替换内置工具)
- 子 agent 和计划模式
- 自定义上下文压缩和摘要
- 权限门控和路径保护
- 自定义编辑器和 UI 组件
- 状态栏、头部、底部、覆盖层
- Git 检查点和自动提交
- SSH 和沙箱执行
- MCP server 集成
- 让 Pi 看起来像 Claude Code
- 游戏(在等待期间玩 Doom —— 有人真的实现了)
扩展放在 ~/.pi/agent/extensions/(全局)或 .pi/extensions/(项目级)。
Skills(技能包)
遵循 Agent Skills 标准,按需加载的能力包,Markdown 格式:
<!-- ~/.pi/agent/skills/my-skill/SKILL.md -->
# My Skill
当用户询问 X 时使用此技能。
## Steps
1. 做这个
2. 然后那个通过 /skill:名称 手动调用,或由 agent 根据 SKILL.md 描述自动选择。
Prompt Templates(提示词模板)
<!-- ~/.pi/agent/prompts/review.md -->
检查这段代码中的 Bug、安全问题和性能问题。
重点关注:{{focus}}编辑器里输入 /review 自动展开。
Pi Packages
将扩展、技能、模板、主题打包通过 npm 或 git 分享:
pi install npm:@foo/pi-tools
pi install git:github.com/user/repo
pi install git:github.com/user/repo@v1 # 固定版本
pi list
pi update --all
pi config # 启用/禁用扩展、技能、模板⚠️ 安全警告:Pi Packages 以完整系统权限运行。安装第三方包前请审查源代码。
Pi 的哲学:刻意不做什么
Pi 的 Philosophy 章节逐条列出了它不内置的功能,以及背后的原因:
| 刻意不做 | 为什么 | 如何满足需求 |
|---|---|---|
| MCP | 见这篇博文,CLI 工具 + README 更直接 | 用扩展自己实现 MCP 支持 |
| 子 agent | 实现方式各异,不应由工具强制 | 用 tmux 启动多个 pi 实例,或扩展实现 |
| 权限弹窗 | 应与执行环境和安全需求契合,不该是通用弹窗 | 在容器里运行,或扩展实现符合场景的确认流 |
| 计划模式 | 各有偏好 | 把计划写进文件,或扩展实现 |
| 内置待办 | 会让模型困惑 | 用 TODO.md,或扩展实现 |
| 后台 bash | tmux 有完整可见性和直接交互 | 用 tmux |
这种「刻意极简」的设计哲学意味着 Pi 的核心不会随着功能膨胀而变得难以理解,也不会强迫用户接受一套固定的工作流。代价是:新用户的开箱体验不如功能全面的工具,需要花时间配置才能达到理想状态。
供应链安全
Pi 对依赖安全的处理值得单独提:
- 精确版本锁定:所有直接外部依赖固定到精确版本(
save-exact=true),内部 workspace 包使用范围版本 - 最小发布年龄:
.npmrc设置min-release-age=2,避免安装当天刚发布的依赖 - package-lock.json 作为唯一真相:pre-commit hook 阻止意外的 lockfile 修改(需要
PI_ALLOW_LOCKFILE_CHANGE=1显式解除) - shrinkwrap:发布的 CLI 包含
npm-shrinkwrap.json,对 npm 用户锁定传递依赖 - CI 审计:定期运行
npm audit --omit=dev+npm audit signatures --omit=dev - Lifecycle script 许可名单:有明确允许列表,新的 lifecycle script 依赖会导致检查失败直到被审查
消息队列(在 Agent 工作时发送)
一个细节设计:在 agent 正在执行工具调用时,可以提前排队消息:
Enter— 排队一条「引导」消息,在当前工具调用完成后立即发送Alt+Enter— 排队一条「后续」消息,在 agent 完成所有工作后发送Escape— 中止并把排队消息恢复到编辑器
这解决了「agent 跑偏了但我又不想粗暴中断」的常见场景。
参考资源
官方链接
- 🌟 GitHub: earendil-works/pi
- 🌐 官网: pi.dev
- 📖 文档: pi.dev/docs/latest
- 📦 npm: @earendil-works/pi-coding-agent
- 💬 Discord: discord.com/invite/3cU7Bz4UPx
- ✍️ 作者博文: mariozechner.at/posts/2025-11-30-pi-coding-agent
总结
Pi 是一个有清晰设计立场的工具:宁可核心极简、需要用户自己配置,也不要一个充满内置功能但难以修改的黑盒。86k Star 说明这个立场找到了对应的用户群。
几个工程决策值得记录:
Philosophy 章节:主动声明不做什么并给出理由,这在开源工具里比较少见。它让用户在安装前就能判断这个工具是否适合自己,而不是安装后发现缺少某个「标准功能」。
5 个独立 npm 包:TUI、LLM API、agent 运行时各自独立,意味着你可以只用 pi-ai 做多提供商统一层,或者用 pi-agent-core 把 agent 循环嵌入自己的应用。不需要接受整个 CLI。
会话分支树:JSONL + parentId 的树形结构让分支不需要多文件,所有历史都在一个文件里,通过 /tree 视图随时导航。在其他 coding agent 工具里这种设计不常见。
供应链安全的投入:依赖精确锁定、lockfile pre-commit 保护、CI 定期审计、shrinkwrap 锁定传递依赖 —— 这个重视程度超过了大多数开发工具。
如果你对 Claude Code、Codex 这类工具的工作流有自己的想法,并且愿意花一点时间配置而不是开箱即用,Pi 的扩展系统给了你足够的空间把它改造成你想要的样子。
探索 PrimeSkills —— 精选 AI agent 和技能工具,每一个都经过真实工作流验证。没有炒作,只有真正好用的工具。
访问我的个人主页,获取更多见解和有趣的产品。