项目详情

Pi-Mono

极简终端编码 harness 的 monorepo——自扩展、不 fork,缺功能让 agent 自己造

GitHub 地址 MIT TypeScriptNode.js / Bun

更新于 2026-08-14 · 作者 badlogic(Mario Zechner)

← 返回汇总
项目速览

一句话定位

让 agent 适配你的工作流,而不是反过来

Pi 是一个极简终端编码 harness,整个项目以 monorepo 形式提供五件套:统一多 provider LLM API、有状态 agent runtime、差分渲染终端 UI、交互式编码 CLI、遥测契约。核心理念是自扩展——缺 sub-agents / plan mode 这类功能?不 fork 改内核,用 TypeScript Extensions / Skills / Prompt Templates / Themes 扩展,或装第三方 Pi 包。适合不想被某个 agent 工具锁死、追求定制自由的开发者。

🔥 核心页

Monorepo 五件套架构

分层清晰:底层 LLM API → agent runtime → UI/CLI。每层独立成包,可单独引用。

L1 · LLM 基础 @earendil-works/pi-ai 统一多 provider LLM API(OpenAI/Anthropic/Google/DeepSeek/Bedrock…30+)· 自动 auth 解析 · token/成本追踪 · 跨 provider handoff L2 · Agent Runtime @earendil-works/pi-agent-core 有状态 agent · 工具执行 + 事件流 · AgentMessage↔LLM Message 桥接 · 并行/顺序工具模式 L2' · 遥测 @earendil-works/pi-telemetry 厂商中立契约 · 参考适配器 · 一致性测试 L3 · 终端 UI 库 @earendil-works/pi-tui 差分渲染终端 UI · 替换编辑器/控件/状态栏/覆盖层 L4 · 交互式编码 CLI @earendil-works/pi-coding-agent 默认 4 工具:read/write/edit/bash · 四种运行模式 扩展层(不 fork 内核) Extensions · Skills · Prompt Templates · Themes · Pi Packages(npm/git 分发) 缺功能?让 agent 帮你造,或装第三方包——这是 Pi 的核心哲学
核心产品包
runtime 基础
UI 抽象
可扩展层
🔥 核心页

AgentMessage ↔ LLM Message 双层桥接

Pi 的关键设计:agent 工作在灵活的 AgentMessage 上(支持自定义类型),但 LLM 只懂 user/assistant/toolResult。两个函数桥接这个鸿沟。

AgentMessage[] user / assistant / toolResult + 自定义类型 (声明合并扩展) transformContext() 裁剪旧消息 注入外部上下文 (可选步骤) convertToLlm() 滤掉 UI-only 消息 自定义类型 → LLM 格式 (必经步骤) Message[] 标准 LLM 消息 → 送给模型 (仅 3 种角色) 灵活层(agent 内部) ↓ 上下文管理 ↓ ↓ 格式转换 ↓ 严格层(模型接口)

这个分层让你能在 agent 内部塞任意结构化消息(Q&A 交互、计划节点、审批记录…),而模型只看到它能理解的标准格式——UI 状态与 LLM 输入解耦。

🔥 核心页

事件流:prompt 的一生

理解事件序列是构建响应式 UI 的关键。prompt() 触发一个 turn;若调工具,循环继续到下一 turn。

prompt("读 config.json")  # 带工具调用
├─ agent_start
├─ turn_start
│   ├─ message_start/end { userMessage }          # 你的输入
│   ├─ message_start { assistantMessage + toolCall }
│   ├─ message_update { 部分结果… }                # 流式 chunk
│   ├─ message_end { assistantMessage }
│   ├─ tool_execution_start { toolCallId, toolName, args }
│   ├─ tool_execution_update { partialResult }    # 工具流式(若有)
│   ├─ tool_execution_end { toolCallId, result }
│   ├─ message_start/end { toolResultMessage }
│   └─ turn_end { message, toolResults: [toolResult] }
│
├─ turn_start                                     # 下一回合
│   └─ message_start…end { assistantMessage }     # 模型回应工具结果
├─ turn_end
└─ agent_end { messages: [...] }

工具执行模式可配:parallel(默认,预检→并发执行→按源序持久化)或 sequential(逐个执行)。beforeToolCall 可拦截,shouldStopAfterTurn 可在 turn 后决定是否续。

四种模式

一个 CLI,四种运行形态

  • interactive——终端交互式,默认形态,read/write/edit/bash 四工具起步
  • print / JSON——非交互,输出到 stdout,适合脚本/管道集成
  • RPC——进程集成,供其他程序驱动 Pi 作为子进程
  • SDK——嵌入你自己的 app,直接 import { Agent } 编程式调用

交互模式界面:启动头 → 消息区 → 编辑器(边框色表示思考层级)→ 页脚(工作目录/会话/ token 用量/成本/上下文/当前模型)。编辑器可被扩展 UI 临时替换(如结构化 Q&A 工具)。

自扩展哲学

不 fork,缺什么造什么

Pi 故意不内置 sub-agents 和 plan mode。理由:与其塞一堆「正确答案」功能,不如给你造功能的机制。

扩展点做什么
ExtensionsTypeScript 扩展,替换编辑器/加控件/状态栏/覆盖层,最强定制力
Skills打包的指令+资源,按任务匹配加载(类似 Anthropic skills)
Prompt Templates可复用提示词模板,/skill:xxx 调用
Themes终端配色主题
Pi Packages把上述任意组合打包,npm 或 git 分发,pi install 装

缺 sub-agents?装个第三方 Pi 包,或让 agent 自己写一个。内核保持极简,能力由生态组装。

Provider 全家桶

30+ provider,统一接口

pi-ai 抽象层统一了几乎所有主流 LLM provider,且只收录支持 tool calling 的模型(agentic 必需)。

订阅制(OAuth)
  • Anthropic Claude Pro/Max
  • OpenAI ChatGPT Plus/Pro
  • GitHub Copilot
  • 本地 llama.cpp 路由
API key 直连
  • Anthropic / OpenAI / DeepSeek
  • Google Gemini / Vertex
  • Amazon Bedrock / Mistral
  • Groq / Cerebras / xAI / Fireworks
国产 / 区域
  • ZAI Coding Plan(含中国)
  • MiniMax / Moonshot(含中国)
  • Xiaomi MiMo(Token Plan 多区域)
  • Qwen Token Plan

跨 provider handoff:会话中途切模型。自动 auth 解析、token/成本追踪、上下文序列化跨模型传递。任何 OpenAI 兼容 API(Ollama/vLLM/LM Studio)也开箱即用。

容器化与安全

无内置权限系统,靠容器隔离

Pi 不内置限制文件系统/进程/网络/凭证的权限系统,默认以启动它的用户/进程权限运行。要强边界?容器化或沙箱化。

Gondolin 扩展

Pi 和 provider auth 留在宿主,内置工具和 ! 命令路由进本地 Linux micro-VM。

纯 Docker

整个 pi 进程跑在本地容器里,简单隔离。

OpenShell

整个 pi 进程跑在策略控制的沙箱里。

详见 packages/coding-agent/docs/containerization.md。

供应链硬化

把 npm 依赖当代码审查

适用场景

适合谁用

  • 追求定制的开发者——不想被某 agent 工具锁死,要 TypeScript 级扩展能力
  • 多 provider 重度用户——同时用 Claude/ChatGPT/Copilot 订阅 + 多家 API key,要在会话间切换
  • agent 应用构建者——用 pi-agent-core + pi-ai SDK 嵌入自己的产品
  • 开源贡献者——作者呼吁分享 OSS 编码 session 数据,反哺模型训练
⚠️ 注意
  • 无内置权限——默认全权限,需自行容器化隔离
  • 功能靠生态——sub-agents/plan mode 要自己装或造
  • 单维护者——作者 badlogic 个人项目,长期维护节奏取决于个人
风险提示

需要权衡

快速上手

三步开跑

# 1. 全局安装(--ignore-scripts 禁用生命周期脚本)
npm install -g --ignore-scripts @earendil-works/pi-coding-agent
# 或:curl -fsSL https://pi.dev/install.sh | sh

# 2. 认证(API key 或订阅)
export ANTHROPIC_API_KEY=sk-ant-...   # API key 方式
pi /login                            # 订阅方式(Claude/ChatGPT/Copilot)

# 3. 直接对话,默认 4 工具:read/write/edit/bash
pi

# SDK 嵌入(编程式)
import { Agent } from "@earendil-works/pi-agent-core";
import { createModels } from "@earendil-works/pi-ai";

文档:pi.dev/docs/latest · 源码结构:packages/ 五件套各自独立 README。

潜力评估

未来空间

Pi-Mono 代表了 agent 工具的极简 + 可组合流派——与 DeepSeek Harness 的「重型插件框架」、Claude Code 的「成品优先」形成三足鼎立。它的 AgentMessage/LLM Message 双层桥接、30+ provider 统一抽象、供应链硬化(防同日发布攻击)都是工程上的亮点。风险在单维护者 + 无内置安全的激进选择。若生态(Pi Packages)能起来,会成为「不想被锁定、要自己造轮子」的开发者的首选底盘。


上一个
DeepSeek Harness
下一个
Apache Tika
1 / 14