Pi 的“极简”很容易被理解成工具少、功能少。源码给出的答案更准确:Pi 把稳定、通用、可观察的 Agent 机制放在核心,把 subagent、plan mode、MCP、权限弹窗和团队流程留给扩展或上层产品。

本文以 earendil-works/pi v0.87.1 和当前主线为参照。近期版本已经将 AgentHarness v2、v4 session、durable operation、context extension 和默认工具配置推进到更公开的接口,因此 Pi 不应只被看作一个终端 UI。

01 四种形态,一套核心

Pi Agent 从产品到基础设施的四种形态

Pi 同时提供交互式 CLI、非交互命令、RPC 子进程和 TypeScript SDK。它的核心结构是:

pi-ai -> provider/model stream
pi-agent-core -> Agent state + tool loop
pi-coding-agent -> CLI/TUI/session/extension
pi packages -> durable、telemetry、composition、protocol

默认 coding agent 只暴露 read、write、edit 和 bash。这个选择不是能力不足,而是避免把每个 CLI 都包装成一套工具 schema。bash 承担搜索、Git、测试和其他本地能力,扩展再按场景增加更专门的工具。

02 Monorepo 的分层:核心越小,边界越清楚

Pi Monorepo 的分层架构

层职责
pi-ai多 provider 消息、工具和流事件归一化
agent core状态、消息、tool call、steering、follow-up
coding agent文件工具、TUI、session、prompt、extensions
harness/durable持久操作、恢复、执行环境和高层 orchestration
protocol/clientRPC、远程客户端和嵌入式产品

这种分层让用户可以只依赖 agent core,也可以直接使用完整 CLI。它还让实验性 API 有机会先在上层验证,再逐步进入稳定入口。

03 Agent Loop:流事件是内部总线

Pi Agent Loop 的完整状态流

Pi 的 loop 可以抽象为:

prompt
  -> assistant stream
  -> tool calls
  -> parallel execution
  -> ordered tool results
  -> next model request

流事件同时服务模型、TUI、日志和 RPC。这样 UI 不必猜测 Agent 状态,远程客户端也可以逐事件渲染。

Steering 和 follow-up 解决运行中输入的问题:用户可以在当前工具执行或模型响应期间补充信息,系统再按语义决定插入当前 turn、排队到下一 turn,还是终止当前工作。

04 工具并发:完成顺序和消息顺序要分离

Pi 支持并行工具执行,但要区分两种顺序:

  • 生命周期事件可以按真实完成顺序发出,便于 UI 展示。
  • 写回 transcript 的工具结果要按模型给出的 call 顺序排列,保证下一次请求的消息序列稳定。

参数被截断或解析失败时不能执行工具;工具 hook 抛错也应该转译成可观察的 error result,而不是破坏整个 batch。工具结果还分模型内容和 UI detail,避免把大量诊断文本挤进上下文。

05 pi-ai:统一模型 API 的难点是有损互译

不同 provider 对 system message、tool call、reasoning、图片、缓存和 usage 的表达不同。pi-ai 负责把内部消息翻译成 provider 请求,再把流事件翻译回统一事件。

这不是无损转换。某些 provider 没有同样的 reasoning 字段,某些 endpoint 对严格 schema 的支持不同,某些工具结果只能降级成文本。因此统一接口必须记录能力差异,而不是假装所有模型完全等价。

06 Session 是树,不是单线日志

Pi Session 树与 Compaction 的关系

Pi 的 session 支持分支、回退、摘要和 compaction。树结构让用户可以从某个历史点产生另一条路径,而不破坏原分支。

v0.84 之后的 session/repository 方向进一步强调 durable operation、共享序列号、lane view、JSONL 原子发布和恢复查询。compaction 变成上下文投影,而不是删除历史;branch summary 也必须使用独立的摘要事件保存。

这让 Pi 从“保存聊天”走向“保存可恢复的 Agent 状态”。

07 Extension:核心不做的事由扩展决定

Pi 的四级扩展模型

Pi 的扩展面可以改变工具、命令、系统 prompt、事件处理、UI、provider 和 context。扩展的价值在于把工作流偏好从核心剥离:

稳定 loop + 可编程 hooks + 用户自定义 context

没有内置 MCP、subagent 或复杂 plan mode,并不意味着不能实现,而是避免核心替用户选择唯一正确方案。代价是扩展生态承担更多兼容性、安全和测试责任。

08 AgentHarness v2:从 Agent 到 Orchestration Layer

AgentHarness 位于低层 Agent Loop 之上,负责任务、文档、会话和 durable operation。当前公开方向包括 typed AI request、telemetry schema、执行环境、工具上下文、恢复查询和未完成操作列表。

关键判断是:Agent 本身回答“下一步做什么”,Harness 回答“这项工作如何被启动、暂停、恢复、验证和收口”。这与 Codex app-server、Temporal workflow 和 OpenHands runtime 处在同一个更高层问题空间。

09 TUI、RPC 与产品嵌入

Pi 官方交互界面

TUI 不是装饰,它是可观察性层:显示流、工具调用、权限、成本、错误和 session 分支。RPC 则把这些事件暴露给非 Node 客户端,宿主可以自行决定 UI 和产品状态。

嵌入 Pi 时要先选层:命令适合一次任务,AgentSession 适合可控对话,AgentHarness 适合可恢复产品,RPC 适合跨语言或远程客户端。

10 安全和边界

Pi 默认更自由,尤其是 bash 工具和本地文件访问。它提供执行环境与扩展接口,但不会替宿主决定完整的权限模型。生产应用需要自行加入工作区限制、命令审批、网络隔离、插件签名、凭证过滤和资源预算。

极简架构的优点是边界透明,缺点是安全责任不会自动消失。

11 与 Claude Code 和 Codex 的差异

Claude Code 更强调内置工作流、权限、skills、hooks 和 subagents;Codex 更强调 app-server、Thread/Turn/Item 协议和宿主嵌入;Pi 更强调最小核心、可编程扩展和用户可见的 session。

选择 Pi 的理由不是它功能最多,而是你希望自己拥有工作流决定权。如果需要开箱即用的企业策略,Claude Code/Codex 可能更合适;如果要构建自己的 Agent 产品,Pi 的分层更适合作为底座。

12 最后的判断

Pi 证明了极简可以是一种架构纪律:核心只承诺稳定的循环、消息、工具和事件,其他能力通过扩展和上层 harness 组合。真正的工程难点因此被暴露出来,而不是被一个“全能默认工作流”遮住。

参考资料