<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>LLM on AI博士 万戈</title>
        <link>https://www.yesmiracle.net/tags/llm/</link>
        <description>AI博士万戈的技术博客，聚焦 Agentic AI、AI Infra 与 Agent Security，分享 AI 基础设施与工程落地实践。</description>
        <generator>Hugo -- gohugo.io</generator>
        <language>zh-cn</language>
        <managingEditor>admin@yesmiracle.net (万戈)</managingEditor>
        <webMaster>admin@yesmiracle.net (万戈)</webMaster>
        <lastBuildDate>Sun, 19 Jul 2026 00:00:00 +0000</lastBuildDate><atom:link href="https://www.yesmiracle.net/tags/llm/index.xml" rel="self" type="application/rss+xml" /><item>
        <title>Pi Agent 深度拆解：TypeScript 多包架构下的 Steering &#43; Follow-up 双队列设计</title>
        <link>https://www.yesmiracle.net/post/20260719-pi-agent-architecture/</link>
        <pubDate>Sun, 19 Jul 2026 00:00:00 +0000</pubDate>
        <author>admin@yesmiracle.net (万戈)</author>
        <guid>https://www.yesmiracle.net/post/20260719-pi-agent-architecture/</guid>
        <description>&lt;img src="https://www.yesmiracle.net/post/20260719-pi-agent-architecture/cover.svg" alt="Featured image of post Pi Agent 深度拆解：TypeScript 多包架构下的 Steering &#43; Follow-up 双队列设计" /&gt;&lt;p&gt;如果你一直在关注我前两天的博客——Grok Build 的 Rust 巨构和 OpenCode 的 Effect TS 体系——今天的主角是 &lt;strong&gt;Pi Agent&lt;/strong&gt;（&lt;code&gt;@earendil-works/pi&lt;/code&gt;）。&lt;/p&gt;
&lt;p&gt;Pi 是一个 TypeScript 多包单体仓库项目，由 5 个核心包组成，共计 859 个 TypeScript 源文件。它的定位和 OpenCode 类似（都是 TypeScript 编码 Agent），但在架构设计上走了完全不同的路。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;TL;DR：Pi 在「用户交互能力」上远超同类。它的 Steering + Follow-up 双队列设计，是 Grok Build 和 OpenCode 都没有的工程创新。&lt;/strong&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&#34;一五层包的依赖关系&#34;&gt;一、五层包的依赖关系&lt;/h2&gt;
&lt;p&gt;Pi 的包结构比 OpenCode 的 20+ 包更精简，但每层的抽象更严格：&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;@earendil-works/pi-orchestrator → RPC 子代理编排
    ↑
@earendil-works/pi-coding-agent → 编码 Agent CLI
    ↑
@earendil-works/pi-agent-core → 无状态 Agent Loop 引擎
    ↑
@earendil-works/pi-ai → 30+ LLM Provider 统一接口
    ↑
@earendil-works/pi-tui → 终端 UI 库
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;对比一下前两篇的架构：&lt;/p&gt;
&lt;table&gt;
  &lt;thead&gt;
      &lt;tr&gt;
          &lt;th&gt;项目&lt;/th&gt;
          &lt;th&gt;包数量&lt;/th&gt;
          &lt;th&gt;语言&lt;/th&gt;
          &lt;th&gt;Agent 数量&lt;/th&gt;
          &lt;th&gt;会话存储&lt;/th&gt;
      &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;strong&gt;Grok Build&lt;/strong&gt;&lt;/td&gt;
          &lt;td&gt;50+ crate&lt;/td&gt;
          &lt;td&gt;Rust&lt;/td&gt;
          &lt;td&gt;1 (MvpAgent)&lt;/td&gt;
          &lt;td&gt;ACP 协议 + 磁盘序列化&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;strong&gt;OpenCode&lt;/strong&gt;&lt;/td&gt;
          &lt;td&gt;20+ 包&lt;/td&gt;
          &lt;td&gt;TypeScript/Effect&lt;/td&gt;
          &lt;td&gt;2 (build/plan)&lt;/td&gt;
          &lt;td&gt;Drizzle SQLite&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;strong&gt;Pi Agent&lt;/strong&gt;&lt;/td&gt;
          &lt;td&gt;5 个包&lt;/td&gt;
          &lt;td&gt;TypeScript&lt;/td&gt;
          &lt;td&gt;N/A (用户配置)&lt;/td&gt;
          &lt;td&gt;JSONL 树形文件&lt;/td&gt;
      &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;Pi 的包最少，但它的 &lt;strong&gt;Agent Loop 设计&lt;/strong&gt; 反而是三者中最复杂的。&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&#34;二agent-loopsteering-vs-follow-up-双队列&#34;&gt;二、Agent Loop：Steering vs Follow-up 双队列&lt;/h2&gt;
&lt;p&gt;这是 Pi 最值得关注的架构创新。读 &lt;code&gt;packages/agent/src/agent-loop.ts&lt;/code&gt;，它的核心循环是一个双层结构：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-typescript&#34; data-lang=&#34;typescript&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;// 外层循环：处理 follow-up 消息
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;while&lt;/span&gt; (&lt;span style=&#34;color:#66d9ef&#34;&gt;true&lt;/span&gt;) {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;let&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;hasMoreToolCalls&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;true&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#75715e&#34;&gt;// 内层循环：处理工具调用和 steering
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;while&lt;/span&gt; (&lt;span style=&#34;color:#a6e22e&#34;&gt;hasMoreToolCalls&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;||&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;pendingMessages&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;length&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;&amp;gt;&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt;) {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#75715e&#34;&gt;// step 1: 处理 pending steering 消息
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;        &lt;span style=&#34;color:#75715e&#34;&gt;// step 2: 调用 LLM
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;        &lt;span style=&#34;color:#75715e&#34;&gt;// step 3: 执行工具（并行或串行）
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;        &lt;span style=&#34;color:#75715e&#34;&gt;// step 4: shouldStopAfterTurn 检查
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;        &lt;span style=&#34;color:#75715e&#34;&gt;// step 5: 获取新的 steering
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;    }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#75715e&#34;&gt;// 检查 follow-up 队列
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;    &lt;span style=&#34;color:#75715e&#34;&gt;// 若有 → 继续外层循环
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;    &lt;span style=&#34;color:#75715e&#34;&gt;// 若无 → break
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;Steering 和 Follow-up 有什么区别？&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Steering&lt;/strong&gt;：在当前 turn 内注入的消息。用户可以在 Agent 思考时发一条&amp;quot;等一下，换个思路&amp;quot;，它被排到 pending 队列，在当前 LLM 调用结束后立即处理。&lt;strong&gt;这是「打断并纠正」机制。&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Follow-up&lt;/strong&gt;：在当前 turn 结束后注入的消息。Agent 即将停止时，如果外部有新的请求（比如子 Agent 返回结果），它被注入到下一轮。&lt;strong&gt;这是「追加任务」机制。&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;对比 Grok Build：&lt;strong&gt;Grok Build 没有 Steering 机制&lt;/strong&gt;。用户一旦提交 prompt，Agent 会一直跑到工具调用结束或达到最大迭代次数。用户在中途发送的消息会被排到新 turn 中，而不是注入到当前 turn。&lt;/p&gt;
&lt;p&gt;这种差异的本质原因是：&lt;strong&gt;Architecture influences interaction design.&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Grok Build 用 ACP 协议 + 网关模式：用户通过 &lt;code&gt;session/prompt&lt;/code&gt; 提交请求，Agent 执行完毕后通过 &lt;code&gt;PromptResponse&lt;/code&gt; 返回。协议层面就是「一问一答」。&lt;/li&gt;
&lt;li&gt;Pi Agent 在进程内运行：Agent Loop 和 Steering 队列在同一个进程空间，天然支持 mid-turn injection。&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2 id=&#34;三30-llm-provider-的抽象层&#34;&gt;三、30+ LLM Provider 的抽象层&lt;/h2&gt;
&lt;p&gt;Pi 的 &lt;code&gt;@earendil-works/pi-ai&lt;/code&gt;（&lt;code&gt;packages/ai/src/&lt;/code&gt;）拥有我在开源编码 Agent 中见过的最完整的 Provider 抽象层。&lt;/p&gt;
&lt;p&gt;在 &lt;code&gt;types.ts&lt;/code&gt; 中定义了核心类型：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-typescript&#34; data-lang=&#34;typescript&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;interface&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;Model&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#a6e22e&#34;&gt;id&lt;/span&gt;: &lt;span style=&#34;color:#66d9ef&#34;&gt;string&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#a6e22e&#34;&gt;provider&lt;/span&gt;: &lt;span style=&#34;color:#66d9ef&#34;&gt;string&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#a6e22e&#34;&gt;description?&lt;/span&gt;: &lt;span style=&#34;color:#66d9ef&#34;&gt;string&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#75715e&#34;&gt;// 认证方式
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;    &lt;span style=&#34;color:#a6e22e&#34;&gt;authType&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;?:&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;api-key&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;|&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;oauth&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;|&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;cert&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;|&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;none&amp;#34;&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#75715e&#34;&gt;// 是否支持流式、工具调用、并行工具等
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;    &lt;span style=&#34;color:#a6e22e&#34;&gt;capabilities?&lt;/span&gt;: &lt;span style=&#34;color:#66d9ef&#34;&gt;ModelCapabilities&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;注册机制在 &lt;code&gt;providers/all.ts&lt;/code&gt; 中，每个 Provider 一个文件：&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;providers/
├── anthropic.ts       # Claude 系列
├── openai-codex.ts    # Codex 系列
├── openai.ts          # OpenAI 系列
├── deepseek.ts        # DeepSeek
├── google-vertex.ts   # Google Vertex AI
├── fireworks.ts       # Fireworks
├── openrouter.ts      # OpenRouter
├── cerebras.ts        # Cerebras
├── mistral.models.ts  # Mistral
├── minimax.ts         # MiniMax
├── moonshotai-cn.models.ts  # 月之暗面
└── ... (30+ providers)
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;对比 Grok Build：Grok Build 的 Provider 层在 &lt;code&gt;xai-grok-sampler&lt;/code&gt; crate 中，核心是 &lt;strong&gt;Retry + Backoff + AuthScheme&lt;/strong&gt; 三层。它不需要 30+ Provider 是因为 Grok Build 通过 ACP 协议的 &lt;code&gt;backend_search&lt;/code&gt; 机制复用 xAI 服务器端的 model catalog。&lt;/p&gt;
&lt;p&gt;对比 OpenCode：OpenCode 的四轴 LLM 路由体系（Protocol/Endpoint/Auth/Framing）比 Pi 更抽象，但 Pi 在 Provider 覆盖面上更广——尤其是对中文厂商的支持（MiniMax、月之暗面、小米、零一万物等），这是 Pi 的一个明显差异化。&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&#34;四工具系统定义优先--双层注册&#34;&gt;四、工具系统：定义优先 + 双层注册&lt;/h2&gt;
&lt;p&gt;Pi 的工具系统在 &lt;code&gt;packages/agent/src/types.ts&lt;/code&gt; 中定义了核心类型体系：&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;ToolDefinition → AgentTool → Agent
     ↓              ↓
  schema (JSON)   runtime implementation
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;strong&gt;ToolDefinition&lt;/strong&gt;：工具的定义（名称、描述、参数 Schema），由 LLM 调用方消费。
&lt;strong&gt;AgentTool&lt;/strong&gt;：工具的实现（validate → execute），由 Agent 执行方消费。&lt;/p&gt;
&lt;p&gt;两层注册流程：&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;1. 注册 ToolDefinition（定义）→ 注册到 Agent
2. 注册 AgentTool（实现）→ 注册到 Agent
3. Agent Loop 中：LLM 选择工具 → Agent 匹配 ToolDefinition → Agent 调用对应的 AgentTool
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Pi 支持两种工具执行模式：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;串行执行&lt;/strong&gt;：一个工具调用返回后再下一个&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;并行执行&lt;/strong&gt;：多个工具调用同时执行（在 LLM 支持并行工具调用的情况下）&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;对比 Grok Build：Grok Build 的工具系统使用 &lt;code&gt;ToolBridge&lt;/code&gt; + &lt;code&gt;FinalizedToolset&lt;/code&gt;，通过 &lt;code&gt;xai-tool-runtime&lt;/code&gt; crate 实现 &lt;strong&gt;类型安全的 Resource 注入&lt;/strong&gt;。每个工具声明它需要的资源（Terminal、Cwd、SessionEnv 等），由系统注入。Pi 没有这一层——工具直接通过 &lt;code&gt;input&lt;/code&gt; 参数获取依赖。&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&#34;五会话管理jsonl-树形文件&#34;&gt;五、会话管理：JSONL 树形文件&lt;/h2&gt;
&lt;p&gt;Pi 的会话存储在 &lt;code&gt;packages/coding-agent/src/agent-session.ts&lt;/code&gt;（3283 行！）中。它的存储格式是 &lt;strong&gt;JSONL 树形文件&lt;/strong&gt;：&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;~/.pi/sessions/
├── {session_id}/
│   ├── config.json           # 会话配置
│   ├── turns.jsonl           # 核心数据：每个 turn 一行 JSON
│   └── branches/
│       └── {branch_id}/
│           ├── config.json
│           └── turns.jsonl
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;strong&gt;树形分支&lt;/strong&gt;：Pi 支持从历史中的任何 turn 创建分支，这个分支可以独立发展。这是一个被严重低估的功能——在复杂的调试场景中，你想回到 10 分钟前的某个决策点重新探索，而不丢失那之后的分析结果。&lt;/p&gt;
&lt;p&gt;对比 Grok Build：Grok Build 的会话通过 ACP 协议管理，5 个生命周期状态（Working → IdleResident → Dormant → Completed → DeadFailed），&lt;strong&gt;不支持分支&lt;/strong&gt;。&lt;/p&gt;
&lt;p&gt;对比 OpenCode：OpenCode 用 Drizzle SQLite 做持久化，支持 V2 Session 的 &lt;code&gt;durable prompt admission&lt;/code&gt;——先持久化再执行。&lt;strong&gt;也不支持分支&lt;/strong&gt;。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;JSONL 树形 + 分支回滚，Pi 在会话管理的灵活度上独树一帜。&lt;/strong&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&#34;六子代理rpc-进程级编排&#34;&gt;六、子代理：RPC 进程级编排&lt;/h2&gt;
&lt;p&gt;Pi 的子代理通过 &lt;code&gt;packages/orchestrator/&lt;/code&gt; 实现，和其他编码 Agent 最大的不同在于：&lt;strong&gt;它启动的是独立的 Pi 进程&lt;/strong&gt;，通过 RPC 协议通信。&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;主 Pi 进程 → 启动子 Pi 进程（独立 Node/Bun 进程）
  │  RPC 协议（JSON-RPC over stdio/Unix socket）
  ▼
子 Pi 进程 → 拥有自己的 Agent Loop、工具、会话
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;这种方式和 Grok Build 的 &lt;code&gt;SubagentCoordinator&lt;/code&gt;（进程内 &lt;code&gt;spawn_local&lt;/code&gt;）完全不同：&lt;/p&gt;
&lt;p&gt;| 维度 | Pi (RPC 进程) | Grok Build (进程内) | OpenCode (???)
|&amp;mdash;&amp;mdash;|&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;-|&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;-|
| 隔离性 | ✅ 完全隔离，崩溃不影响主进程 | ❌ 同一进程，panic 可能级联 |
| 资源开销 | ❌ 每个子 Agent 一个完整进程 | ✅ 共享进程资源 |
| 通信方式 | JSON-RPC over stdio/socket | ACP 消息通道 |
| 嵌套深度 | 无限制 | 1 层 |
| 工具继承 | 从零启动，需重新注册 | 继承父进程的 ToolBridge |&lt;/p&gt;
&lt;p&gt;Pi 的 RPC 模式更安全但更重。Grok Build 的进程内模式更高效但隔离性差——这和两者语言的选择一脉相承：Rust 的类型系统让进程内并发安全得多，而 TypeScript 需要用进程隔离来弥补。&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&#34;七扩展系统-vs-插件系统&#34;&gt;七、扩展系统 vs 插件系统&lt;/h2&gt;
&lt;p&gt;Pi 的扩展系统比 Grok Build 和 OpenCode 的插件系统更轻量，但覆盖了完整的 Agent 生命周期事件。&lt;/p&gt;
&lt;p&gt;在 &lt;code&gt;packages/coding-agent/src/extensions/types.ts&lt;/code&gt;（1682 行）定义了所有扩展点：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;onBeforeTurn&lt;/code&gt; / &lt;code&gt;onAfterTurn&lt;/code&gt;：Turn 前后钩子&lt;/li&gt;
&lt;li&gt;&lt;code&gt;onToolCall&lt;/code&gt; / &lt;code&gt;onToolResult&lt;/code&gt;：工具调用钩子&lt;/li&gt;
&lt;li&gt;&lt;code&gt;onUserMessage&lt;/code&gt; / &lt;code&gt;onAssistantMessage&lt;/code&gt;：消息钩子&lt;/li&gt;
&lt;li&gt;&lt;code&gt;onConfigLoad&lt;/code&gt; / &lt;code&gt;onConfigSave&lt;/code&gt;：配置钩子&lt;/li&gt;
&lt;li&gt;&lt;code&gt;onSessionCreate&lt;/code&gt; / &lt;code&gt;onSessionDestroy&lt;/code&gt;：会话生命周期钩子&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;扩展可以：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;注册新工具&lt;/strong&gt;（通过 &lt;code&gt;extensions.registerTool()&lt;/code&gt;）&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;注册新命令&lt;/strong&gt;（如 &lt;code&gt;/help&lt;/code&gt;、&lt;code&gt;/search&lt;/code&gt;）&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;修改系统提示词&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;拦截和修改 LLM 响应&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;添加自定义 UI 组件&lt;/strong&gt;（TUI 模式下）&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;对比 Grok Build：Grok Build 的 Hooks 系统在 &lt;code&gt;xai-grok-agent&lt;/code&gt; 中，支持 &lt;code&gt;before_turn&lt;/code&gt; 和 &lt;code&gt;after_turn&lt;/code&gt;，通过 TurnHook trait 实现。Pi 的扩展系统更丰富，而 Grok Build 的 Hooks 更专注于安全和合规。&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&#34;八安全问题没有内置权限系统&#34;&gt;八、安全问题：没有内置权限系统&lt;/h2&gt;
&lt;p&gt;Pi 的 README 明确说明：&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Pi does not include a built-in permission system for restricting filesystem, process, network, or credential access.&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;它给出的替代方案是外部容器化：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Gondolin 扩展&lt;/strong&gt;：在 Linux micro-VM 中运行工具&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Plain Docker&lt;/strong&gt;：整个 Pi 进程跑在 Docker 容器中&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;OpenShell&lt;/strong&gt;：基于策略的沙箱&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;对比 Grok Build：Grok Build 有完整的 &lt;code&gt;xai-grok-workspace&lt;/code&gt; 权限系统 + &lt;code&gt;xai-grok-sandbox&lt;/code&gt; 沙箱 + &lt;code&gt;permission::manager&lt;/code&gt;（6295 行的大模块）。它是三者中唯一有原生权限模型的。&lt;/p&gt;
&lt;p&gt;对比 OpenCode：OpenCode 的 &lt;code&gt;PermissionV1.Ruleset&lt;/code&gt; 在 Agent 定义中指定，支持细粒度的 allow/deny。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Pi 在安全性上最弱&lt;/strong&gt;，但这也反映了它的目标用户群不同——Pi 更面向「个人开发者个人使用」，而 Grok Build 设计之初就考虑了企业级安全。&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&#34;九和-grok-build-的深层对比&#34;&gt;九、和 Grok Build 的深层对比&lt;/h2&gt;
&lt;p&gt;从代码层面，两者在四个关键维度上有本质差异：&lt;/p&gt;
&lt;h3 id=&#34;91-并发模型&#34;&gt;9.1 并发模型&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Grok Build&lt;/strong&gt;：Tokio Actor 模型 + LocalSet，&lt;code&gt;!Send&lt;/code&gt; 类型安全&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Pi Agent&lt;/strong&gt;：EventEmitter + async/await，无共享状态&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;92-工具系统&#34;&gt;9.2 工具系统&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Grok Build&lt;/strong&gt;：&lt;code&gt;ToolBridge&lt;/code&gt; + &lt;code&gt;FinalizedToolset&lt;/code&gt;，类型安全的 Resource 注入，支持 MCP 工具和本地工具统一注册&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Pi Agent&lt;/strong&gt;：&lt;code&gt;ToolDefinition&lt;/code&gt; + &lt;code&gt;AgentTool&lt;/code&gt; 双层注册，定义优先，不支持 MCP&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;93-协议&#34;&gt;9.3 协议&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Grok Build&lt;/strong&gt;：ACP 协议，支持 5 种部署模式（TUI/Headless/Stdio/Server/Leader）&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Pi Agent&lt;/strong&gt;：纯 CLI 工具，无标准化协议层&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;94-验证系统&#34;&gt;9.4 验证系统&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Grok Build&lt;/strong&gt;：Skeptic 验证 + Goal 系统 + Doom Loop 检测（最完善）&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Pi Agent&lt;/strong&gt;：无验证系统&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2 id=&#34;写在最后&#34;&gt;写在最后&lt;/h2&gt;
&lt;p&gt;Pi Agent 是一个定位清晰的个人开发工具。它在架构设计上有两个真正的创新：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Steering + Follow-up 双队列&lt;/strong&gt;：让用户可以在 Agent 思考过程中介入，这是其他编码 Agent 没有做到的。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;JSONL 树形会话存储 + 分支&lt;/strong&gt;：为探索式编程提供了天然的「反悔」机制。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;但它也有明显的短板：没有权限模型、没有标准化协议、没有验证系统。如果你把它和 Grok Build 对比，它们解决的问题不同——Grok Build 是「企业级 AI 编码基础设施」，Pi 是「个人开发者的编码助手」。&lt;/p&gt;
&lt;p&gt;如果你想深入了解，Pi 的 &lt;code&gt;@earendil-works/pi-ai&lt;/code&gt; Provider 抽象层是三者中最值得学习的——&lt;strong&gt;30+ Provider 的统一接口设计&lt;/strong&gt;，对于任何需要支持多模型的项目都有参考价值。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;相关阅读：&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;https://www.yesmiracle.net/20260719-grok-build-open-source/&#34; &gt;Grok Build 开源！万字拆解 40 万行 Rust 构建的 AI Coding Agent 内部架构&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;https://www.yesmiracle.net/20260719-opencode-architecture/&#34; &gt;OpenCode 源码深度拆解：Effect TS 代数效应系统构建的智能编码 Agent&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;GitHub: &lt;a class=&#34;link&#34; href=&#34;https://github.com/earendil-works/pi&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;https://github.com/earendil-works/pi&lt;/a&gt;&lt;/p&gt;
</description>
        </item>
        
    </channel>
</rss>
