命令行工具
earendil-works/pi avatar
earendil-works/pi

Pi:一个把权限边界留给你的 TypeScript 编码代理工具箱

Pi 在 TypeScript 工具包中结合了提供商中立的 LLM API、代理循环、终端接口和编码 CLI。

105,572 个 Star13,273 个 ForkTypeScriptMIT
GitHub

秒懂

它是什么?
Pi 是一个由多个 npm 包组成的 TypeScript 工具集,统一了多厂商 LLM API、代理运行时、终端界面和编码 CLI。它的核心取舍是默认不做权限限制,把隔离责任完全交给使用者。
适合谁用?
Pi 适合愿意自己处理隔离问题的 TypeScript 开发者,尤其是那些需要同时对接多家 LLM 提供商、并且希望代理运行时和终端 UI 能作为独立库复用的团队。它不适合想要开箱即用、内置权限弹窗或沙箱的普通用户,因为默认情况下代理拥有与启动用户相同的权限,任何误操作都可能直接作用于真实文件系统。
能商用吗?
可以。MIT 是宽松许可证:你可以使用、修改并销售基于它的软件,只需保留版权和许可证声明。
还在维护吗?
在维护。仓库在最近一天内有新的提交。
用什么语言写的?
主要是 TypeScript(依据 GitHub 的语言统计)。

以上回答依据项目的 GitHub 数据(最近同步于 2026年9月15日)和我们的分析,不构成法律意见。

开源项目深度解析

它解决什么问题,给谁用

Pi 解决的问题很具体:一个编码代理往往被绑死在单一 LLM 提供商上,换一家厂商就要重写调用逻辑。Pi 用 @earendil-works/pi-ai 包提供了一个统一的多提供商 LLM API,支持 OpenAI、Anthropic、Google 等,把差异藏在接口后面。同时它把代理运行时、终端 UI 和编码 CLI 拆成独立包,让开发者可以只取自己需要的部分。这个工具集面向的是想自己组装编码代理流程的 TypeScript 工程师,而不是想要一个傻瓜式聊天窗口的普通用户。

包结构:四个库,一个 CLI

仓库采用 monorepo 布局,核心包有四个。@earendil-works/pi-ai 是统一 LLM API,负责处理不同厂商的请求差异。@earendil-works/pi-agent-core 是代理运行时,提供工具调用和状态管理。@earendil-works/pi-coding-agent 是交互式编码代理 CLI,也就是用户最终运行的命令。@earendil-works/pi-tui 是终端 UI 库,带有差分渲染功能。另外还有一个 @earendil-works/pi-telemetry 包,定义厂商中立的遥测契约、参考适配器和一致性测试。这种拆分意味着你可以把 pi-ai 单独用于自己的应用,也可以把整个 CLI 当作独立工具。

代理如何工作:工具调用加状态管理

根据 README 的描述,@earendil-works/pi-agent-core 是一个代理运行时,核心机制是工具调用加状态管理。代理在循环中接收 LLM 输出,解析出工具调用请求,执行对应工具,再把结果反馈给模型。状态管理负责在多次调用之间保持上下文。这个设计并不特殊,但关键在于它被做成了独立包,而不是和 CLI 绑死。CLI 只是这个运行时的一个前端,你完全可以基于 agent-core 构建自己的工具。README 没有给出具体的调用示例,所以工具调用的细节需要查看包内文档。

运行方式:从源码构建到独立二进制

开发环境下的构建命令很直接。npm install --ignore-scripts 安装依赖但不运行生命周期脚本,npm run build 会刷新模型数据并构建所有包,npm run build:offline 则用现有模型数据离线重建。测试通过 ./test.sh 运行,它会跳过需要 API 密钥的 LLM 相关测试。如果你想构建独立二进制,需要从 GitHub release 下载带 SHA256SUMS 校验的源码归档,解压后运行 ./scripts/build-binaries.sh --offline-model-data --platform linux-x64 --out "$PWD/out"。这个脚本会安装依赖、构建 monorepo、编译 Bun 可执行文件并准备运行时资源。注意它默认会联网刷新模型数据,除非你像示例那样传入 --offline-model-data。

权限边界:一个需要你自己补上的缺口

README 明确说 Pi 没有内置权限系统,不限制文件系统、进程、网络或凭证访问。默认情况下,它拥有启动它的用户和进程的全部权限。这意味着如果你在本地直接运行 pi,它能读写你的文件、执行命令、访问网络,没有任何弹窗确认。这不是疏忽,而是一个设计决定。文档提供了三种隔离模式:Gondolin 扩展把 pi 和提供商认证留在宿主机,只把内置工具和 ! 命令路由进 Linux 微虚拟机;Plain Docker 把整个 pi 进程放进本地容器;OpenShell 则把整个进程放进策略控制的沙箱。如果你不想自己搭这些,Pi 可能不是合适的选择。

供应链加固:把依赖当代码审查

Pi 对 npm 依赖的处理相当严格。直接外部依赖被锁定到精确版本,内部工作区包保持版本范围。.npmrc 设置了 save-exact=true 和 min-release-age=2,避免在 npm 解析时使用当天发布的依赖。package-lock.json 是依赖的最终依据,pre-commit 钩子会阻止意外的 lockfile 提交,除非设置 PI_ALLOW_LOCKFILE_CHANGE=1。npm run check 会验证锁定的直接依赖、原生 TypeScript 导入兼容性,以及生成的 coding-agent shrinkwrap。发布的 CLI 包包含 npm-shrinkwrap.json,用于固定 npm 用户的传递依赖。生命周期脚本的 shrinkwrap 生成有明确的允许列表,新的生命周期脚本依赖会在检查中失败。这种程度的加固在开源项目中很少见,但它也意味着你作为使用者需要信任维护者的审查流程。

维护与版本节奏

项目最近一次推送是 2026-08-28,发布了 v0.84.4,前两个版本分别是 v0.84.3 和 v0.84.2,间隔只有几天到两周。这种高频发布说明项目处于活跃开发状态,新功能可能随时出现,但也意味着 API 可能不够稳定。README 提到你可以让代理自己解释自身,文档在 pi.dev/docs/latest。另外,项目有一个独特的规则:新贡献者的 issue 和 PR 默认自动关闭,维护者每天审查一次。这对想提交代码的团队是个障碍,但对只想使用的用户没有影响。许可证是 MIT,没有附加限制。

替代方案与适用判断

如果你需要内置权限控制,可以考虑其他编码代理工具,比如 OpenAI Codex CLI 或 Anthropic 的 Claude Code,它们通常自带确认机制。但那些工具往往绑定单一提供商,而 Pi 的多提供商支持是它的主要优势。另一个思路是使用 LangChain 之类的框架自己搭建代理,但那样你需要自己处理终端 UI 和工具调用循环。Pi 的价值在于它把这些组件打包成了可组合的库,同时保留了选择的自由。它不适合想要零配置的用户,但适合愿意花时间配置隔离环境的开发者。

编辑结论

Pi 适合愿意自己处理隔离问题的 TypeScript 开发者,尤其是那些需要同时对接多家 LLM 提供商、并且希望代理运行时和终端 UI 能作为独立库复用的团队。它不适合想要开箱即用、内置权限弹窗或沙箱的普通用户,因为默认情况下代理拥有与启动用户相同的权限,任何误操作都可能直接作用于真实文件系统。在采用之前,请先确认你的运行环境能否满足容器化或沙箱要求,并检查 README 中提到的 containerization.md 文档,评估 Gondolin、Docker 或 OpenShell 三种模式中哪一种适合你的工作流。另外,由于项目维护者会默认关闭新贡献者的 PR 和 issue,如果你的团队计划提交代码,需要先阅读 CONTRIBUTING.md 了解流程。Pi 的版本迭代相当快,v0.84.4 发布在即,但这不是坏事,只是意味着你需要跟着更新。

官方来源

  1. Official README
  2. Project repository
  3. Release notes
社区笔记

社区笔记