<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>Coding Agent on AI博士 万戈</title>
        <link>https://www.yesmiracle.net/tags/coding-agent/</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/coding-agent/index.xml" rel="self" type="application/rss+xml" /><item>
        <title>Nanobot 源码深度拆解：Python 异步消息总线构建的轻量级 AI Agent 框架</title>
        <link>https://www.yesmiracle.net/post/20260719-nanobot-architecture/</link>
        <pubDate>Sun, 19 Jul 2026 00:00:00 +0000</pubDate>
        <author>admin@yesmiracle.net (万戈)</author>
        <guid>https://www.yesmiracle.net/post/20260719-nanobot-architecture/</guid>
        <description>&lt;img src="https://www.yesmiracle.net/post/20260719-nanobot-architecture/cover.svg" alt="Featured image of post Nanobot 源码深度拆解：Python 异步消息总线构建的轻量级 AI Agent 框架" /&gt;&lt;p&gt;这是我的编码 Agent 开源系列第四篇。前三天我分别拆解了 &lt;strong&gt;Grok Build&lt;/strong&gt;（Rust 50+ crate）、&lt;strong&gt;Pi Agent&lt;/strong&gt;（TypeScript 双队列）和 &lt;strong&gt;OpenCode&lt;/strong&gt;（Effect TS 四轴路由）。今天的主角是 &lt;strong&gt;Nanobot&lt;/strong&gt;。&lt;/p&gt;
&lt;p&gt;Nanobot 由香港大学数据科学实验室（HKUDS）开发，是一个 &lt;strong&gt;Python 3.11+ asyncio&lt;/strong&gt; 构建的轻量级 AI Agent 框架。它和前三者的最大区别在于：&lt;strong&gt;Nanobot 不是编码 Agent，而是通用 Agent 框架。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;TL;DR：Nanobot 的 Dream 两阶段记忆合并系统是三者中最完善的记忆方案。它的 MessageBus 架构让 15+ 聊天平台可以即插即用。但 Python 的性能限制让它不适合做代码编辑等延迟敏感的任务。&lt;/strong&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&#34;一架构全景messagebus-异步事件驱动&#34;&gt;一、架构全景：MessageBus 异步事件驱动&lt;/h2&gt;
&lt;p&gt;Nanobot 的核心架构是一句话：&lt;strong&gt;一个 async MessageBus 解耦了 Chat Channels 和 Agent Core&lt;/strong&gt;。&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;Channels Layer (Telegram, Discord, Slack, Feishu, 微信...)
    ↓ InboundMessage (publish_inbound)
┌──────────────────────────────────────────────────┐
│  MessageBus (asyncio.Queue)                      │
│     ↓ consume_inbound                            │
├──────────────────────────────────────────────────┤
│  AgentLoop (调度层)                               │
│     ↓ AgentRunner (执行层 - LLM + Tool 循环)       │
│     ↓ ToolRegistry (工具执行)                      │
│     ↓ SessionManager (JSONL 持久化)               │
│     ↓ Consolidator (Dream 记忆合并)               │
│     ↑ OutboundMessage (publish_outbound)          │
├──────────────────────────────────────────────────┤
│  MessageBus (outbound)                            │
│     ↓ consume_outbound                           │
└──────────────────────────────────────────────────┘
Channels → send() to platform
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;看 &lt;code&gt;nanobot/bus/queue.py&lt;/code&gt;，只有 44 行：&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-python&#34; data-lang=&#34;python&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;class&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;MessageBus&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;def&lt;/span&gt; __init__(self):
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        self&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;inbound: asyncio&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;Queue[InboundMessage] &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; asyncio&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;Queue()
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        self&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;outbound: asyncio&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;Queue[OutboundMessage] &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; asyncio&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;Queue()
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;极简主义。没有优先级队列，没有持久化，没有死信队列。&lt;/p&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;解耦方式&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;ACP 协议 (Gateway)&lt;/td&gt;
          &lt;td&gt;5 种部署模式&lt;/td&gt;
          &lt;td&gt;协议层解耦&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;Effect HttpApi&lt;/td&gt;
          &lt;td&gt;TUI + Desktop + Web&lt;/td&gt;
          &lt;td&gt;Service 层解耦&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;EventEmitter&lt;/td&gt;
          &lt;td&gt;CLI TUI&lt;/td&gt;
          &lt;td&gt;事件订阅解耦&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;strong&gt;Nanobot&lt;/strong&gt;&lt;/td&gt;
          &lt;td&gt;async Queue&lt;/td&gt;
          &lt;td&gt;15+ Chat 平台&lt;/td&gt;
          &lt;td&gt;消息总线解耦&lt;/td&gt;
      &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;Nanobot 是唯一一个&lt;strong&gt;原生支持多聊天平台&lt;/strong&gt;的。Telegram、Discord、Slack、飞书、微信、企业微信、钉钉、Email、Mattermost、Matrix、WhatsApp、QQ、MoChat、Teams、WebSocket——15+ 平台，全部通过同一个 MessageBus 接入。&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&#34;二两阶段-agent-loop调度层和执行层分离&#34;&gt;二、两阶段 Agent Loop：调度层和执行层分离&lt;/h2&gt;
&lt;p&gt;这是 Nanobot 最核心的架构设计。Agent 的处理被分成了两个清晰的层次。&lt;/p&gt;
&lt;h3 id=&#34;21-agentloop--调度层&#34;&gt;2.1 AgentLoop — 调度层&lt;/h3&gt;
&lt;p&gt;&lt;code&gt;nanobot/agent/loop.py&lt;/code&gt;，约 2000 行。&lt;/p&gt;
&lt;p&gt;&lt;code&gt;AgentLoop&lt;/code&gt; 负责：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;消息消费&lt;/strong&gt;：从 MessageBus 的 inbound 队列消费消息&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;会话路由&lt;/strong&gt;：按 &lt;code&gt;session_key&lt;/code&gt; 做任务路由，同一 session 串行，跨 session 并发&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;上下文构建&lt;/strong&gt;：组装 system prompt、历史记录、memory、skills&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;状态管理&lt;/strong&gt;：TurnState 状态机&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;MCP 连接管理&lt;/strong&gt;：连接/断开 MCP 服务器&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Cron 和自动化任务&lt;/strong&gt;：协调定时任务和本地触发器&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;关键设计是&lt;strong&gt;会话锁和 pending 队列&lt;/strong&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-python&#34; data-lang=&#34;python&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;# 每个 session 一个锁&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;lock &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; self&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;_session_locks&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;setdefault(session_key, asyncio&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;Lock())
&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;# 消息路由到 pending 队列&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;if&lt;/span&gt; effective_key &lt;span style=&#34;color:#f92672&#34;&gt;in&lt;/span&gt; self&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;_pending_queues:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    self&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;_pending_queues[effective_key]&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;put_nowait(pending_msg)
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;这实现了 &lt;strong&gt;mid-turn injection&lt;/strong&gt; 模式——用户可以在 Agent 思考过程中发送新消息，它们会被注入到正在运行的 LLM 循环中。&lt;/p&gt;
&lt;p&gt;对比 Pi Agent 的 Steering 队列：两者都实现了 mid-turn injection，但实现方式不同。Pi Agent 在 Agent Loop 内部维护 Steering 队列，Nanobot 在外部通过 MessageBus 和 session 锁实现。&lt;strong&gt;Pi Agent 的方式更精细（可以区分 Steering 和 Follow-up），Nanobot 的方式更通用（不依赖 Agent Loop 实现）。&lt;/strong&gt;&lt;/p&gt;
&lt;h3 id=&#34;22-agentrunner--执行层&#34;&gt;2.2 AgentRunner — 执行层&lt;/h3&gt;
&lt;p&gt;&lt;code&gt;nanobot/agent/runner.py&lt;/code&gt;，约 1400 行。&lt;/p&gt;
&lt;p&gt;&lt;code&gt;AgentRunner&lt;/code&gt; 是一个&lt;strong&gt;纯函数式&lt;/strong&gt;的执行引擎，不知道任何产品层概念（channel、session、用户）。它接收一个 &lt;code&gt;AgentRunSpec&lt;/code&gt; 返回 &lt;code&gt;AgentRunResult&lt;/code&gt;。&lt;/p&gt;
&lt;p&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-python&#34; data-lang=&#34;python&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;for&lt;/span&gt; iteration &lt;span style=&#34;color:#f92672&#34;&gt;in&lt;/span&gt; range(spec&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;max_iterations):
&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;# 1. Context Governance — 修复消息格式、压缩历史&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    messages_for_model &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; self&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;context_governor&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;prepare_for_model(&lt;span style=&#34;color:#f92672&#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;# 2. 调用 LLM&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    response &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;await&lt;/span&gt; self&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;_request_model(spec, messages_for_model, hook, context)
&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;# 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:#66d9ef&#34;&gt;for&lt;/span&gt; tool_call &lt;span style=&#34;color:#f92672&#34;&gt;in&lt;/span&gt; response&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;tool_calls:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        result &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;await&lt;/span&gt; tool_registry&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;execute(tool_call, context)
&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;# 4. 检查继续条件&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;对比 Grok Build 的 &lt;code&gt;MvpAgent&lt;/code&gt;：Grok Build 的 Agent 是&lt;strong&gt;有状态的&lt;/strong&gt;（通过 &lt;code&gt;SessionHandle&lt;/code&gt; 管理），而 Nanobot 的 AgentRunner 是&lt;strong&gt;无状态的&lt;/strong&gt;——状态全部在 &lt;code&gt;AgentRunSpec&lt;/code&gt; 中传递。这使得 AgentRunner 可以被单元测试，不需要 mock 任何全局状态。&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&#34;三turnstate-状态机8-个状态的精细控制&#34;&gt;三、TurnState 状态机：8 个状态的精细控制&lt;/h2&gt;
&lt;p&gt;Nanobot 的 TurnState 状态机是代码中最值得学习的模式之一：&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;RESTORE → COMPACT → COMMAND → BUILD → RUN → SAVE → RESPOND → DONE
&lt;/code&gt;&lt;/pre&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;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;strong&gt;RESTORE&lt;/strong&gt;&lt;/td&gt;
          &lt;td&gt;从磁盘加载会话历史&lt;/td&gt;
          &lt;td&gt;跳过&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;strong&gt;COMPACT&lt;/strong&gt;&lt;/td&gt;
          &lt;td&gt;检查是否需要压缩长历史&lt;/td&gt;
          &lt;td&gt;跳过&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;strong&gt;COMMAND&lt;/strong&gt;&lt;/td&gt;
          &lt;td&gt;检查是否是 &lt;code&gt;/&lt;/code&gt; 命令&lt;/td&gt;
          &lt;td&gt;进入 BUILD&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;strong&gt;BUILD&lt;/strong&gt;&lt;/td&gt;
          &lt;td&gt;构建 LLM 请求&lt;/td&gt;
          &lt;td&gt;错误返回&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;strong&gt;RUN&lt;/strong&gt;&lt;/td&gt;
          &lt;td&gt;调用 LLM + 执行工具&lt;/td&gt;
          &lt;td&gt;重试或失败&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;strong&gt;SAVE&lt;/strong&gt;&lt;/td&gt;
          &lt;td&gt;持久化结果&lt;/td&gt;
          &lt;td&gt;继续&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;strong&gt;RESPOND&lt;/strong&gt;&lt;/td&gt;
          &lt;td&gt;通过 MessageBus 发送回复&lt;/td&gt;
          &lt;td&gt;继续&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;strong&gt;DONE&lt;/strong&gt;&lt;/td&gt;
          &lt;td&gt;清理和完成&lt;/td&gt;
          &lt;td&gt;—&lt;/td&gt;
      &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;对比 Grok Build 的会话 5 状态（Working → IdleResident → Dormant → Completed → DeadFailed）：&lt;strong&gt;Grok Build 的状态是会话生命周期，Nanobot 的状态是单个 turn 的执行过程。&lt;/strong&gt; 两者关注不同层面。&lt;/p&gt;
&lt;p&gt;对比 OpenCode 的 Processor 事件驱动：OpenCode 用事件流（&lt;code&gt;LLMEvent&lt;/code&gt; → &lt;code&gt;handleEvent&lt;/code&gt;），Nanobot 用显式状态机。&lt;strong&gt;状态机更容易理解和调试，事件流更灵活。&lt;/strong&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&#34;四dream-两阶段记忆合并&#34;&gt;四、Dream 两阶段记忆合并&lt;/h2&gt;
&lt;p&gt;Nanobot 的记忆系统是三者中最完善的。&lt;code&gt;nanobot/agent/memory.py&lt;/code&gt;（1167 行）实现了 &lt;strong&gt;Dream&lt;/strong&gt; 两阶段记忆合并：&lt;/p&gt;
&lt;h3 id=&#34;第一阶段consolidation&#34;&gt;第一阶段：Consolidation&lt;/h3&gt;
&lt;p&gt;按 token 数量自动触发的 Incremental 合并：&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-python&#34; data-lang=&#34;python&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;if&lt;/span&gt; session_total_tokens &lt;span style=&#34;color:#f92672&#34;&gt;&amp;gt;&lt;/span&gt; memory_config&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;consolidate_threshold:
&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;# 用 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&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#75715e&#34;&gt;# 记录 token 节省量&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id=&#34;第二阶段dream&#34;&gt;第二阶段：Dream&lt;/h3&gt;
&lt;p&gt;定时触发的 &lt;strong&gt;LLM 驱动的跨会话总结&lt;/strong&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-python&#34; data-lang=&#34;python&#34;&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;# 1. 读取所有 session 的 consolidated history&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;# 2. 用 LLM 生成跨 session 的洞察&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;# 3. 写入全局 MEMORY.md&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;为什么这是三者中最完善的？&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;对比 Grok Build 的 &lt;code&gt;xai-grok-memory&lt;/code&gt; crate：Grok Build 的记忆系统是用户手动管理的（&lt;code&gt;memory&lt;/code&gt; 工具 + &lt;code&gt;skill&lt;/code&gt; 工具），没有自动合并。它靠的是&lt;strong&gt;用户主动决定&lt;/strong&gt;什么时候保存、保存什么。&lt;/p&gt;
&lt;p&gt;对比 Pi Agent：Pi Agent 没有长期记忆系统，session 之间的数据不共享。&lt;/p&gt;
&lt;p&gt;对比 OpenCode：OpenCode 有 Session Summary 生成（&lt;code&gt;summary.ts&lt;/code&gt;），但仅限于单 session 的摘要，没有跨 session 的合并。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Nanobot 的 Dream 是唯一一个「自动的、跨 session 的、LLM 驱动的」记忆系统。&lt;/strong&gt; 而且它的设计很克制——Consolidation 只做 token 层面的压缩，Dream 才做语义层面的总结，两阶段分开避免 LLM 调用过多。&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&#34;五mcp-集成最复杂的子系统&#34;&gt;五、MCP 集成：最复杂的子系统&lt;/h2&gt;
&lt;p&gt;Nanobot 的 MCP 集成在 &lt;code&gt;nanobot/agent/tools/mcp.py&lt;/code&gt;（1435 行），是代码库中最复杂的子系统。&lt;/p&gt;
&lt;p&gt;它实现了：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;名称 sanitization&lt;/strong&gt;：Python 方法名不能有 &lt;code&gt;-&lt;/code&gt;，MCP 工具名可能有 &lt;code&gt;-&lt;/code&gt;，需要做名字映射&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Schema 标准化&lt;/strong&gt;：MCP 的 JSON Schema 格式和 Nanobot 的 ToolSchema 格式不同，需要转换&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;会话重连&lt;/strong&gt;：MCP Server 断开后自动重连，带退避策略&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;多 MCP Server 管理&lt;/strong&gt;：每个 Server 独立连接池&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;对比 Grok Build 的 &lt;code&gt;xai-grok-mcp&lt;/code&gt;：Grok Build 的 MCP 集成更底层——它直接操作 &lt;code&gt;rmcp&lt;/code&gt; crate 的 transport 层，支持 Streamable HTTP 和子进程。Nanobot 的 MCP 是更高层的封装——通过 Python 的 &lt;code&gt;mcp&lt;/code&gt; 库连 MCP Server，然后适配到自己的工具系统。&lt;/p&gt;
&lt;p&gt;两者的差异是语言生态的体现：&lt;strong&gt;Rust 生态没有成熟的 MCP 客户端库，所以 Grok Build 必须自己实现 transport 层；Python 生态有 &lt;code&gt;mcp&lt;/code&gt; 客户端库，Nanobot 可以站在上面做封装。&lt;/strong&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&#34;六工具系统自动发现--参数校验&#34;&gt;六、工具系统：自动发现 + 参数校验&lt;/h2&gt;
&lt;p&gt;Nanobot 的工具系统在 &lt;code&gt;nanobot/agent/tools/&lt;/code&gt; 下，每个工具一个文件。&lt;/p&gt;
&lt;h3 id=&#34;61-自动发现&#34;&gt;6.1 自动发现&lt;/h3&gt;
&lt;p&gt;&lt;code&gt;tools/loader.py&lt;/code&gt; 通过两种方式自动发现工具：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;pkgutil 扫描&lt;/strong&gt;：扫描 &lt;code&gt;nanobot.agent.tools&lt;/code&gt; 包下的所有模块&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;entry_points 插件&lt;/strong&gt;：通过 Python 的 &lt;code&gt;entry_points&lt;/code&gt; 机制发现第三方工具&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id=&#34;62-参数校验&#34;&gt;6.2 参数校验&lt;/h3&gt;
&lt;p&gt;&lt;code&gt;tools/schema.py&lt;/code&gt; 实现了完整的 JSON Schema 类型系统：&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-python&#34; data-lang=&#34;python&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;class&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;ToolSchema&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    type: str           &lt;span style=&#34;color:#75715e&#34;&gt;# &amp;#34;string&amp;#34; | &amp;#34;integer&amp;#34; | &amp;#34;object&amp;#34; | ...&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    description: str    &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;    properties: dict    &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;    required: list      &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;code&gt;ToolSchema&lt;/code&gt; 定义参数，&lt;code&gt;registry.py&lt;/code&gt; 在调用时做 &lt;code&gt;validate_params → cast_params&lt;/code&gt; 两阶段验证。&lt;/p&gt;
&lt;p&gt;对比 Grok Build 的 &lt;code&gt;ToolDefinition&lt;/code&gt;：Grok Build 的 MCP 工具通过 &lt;code&gt;ToolBridge.register_mcp_tools()&lt;/code&gt; 注册，MCP 工具和本地工具共享同一个 &lt;code&gt;FinalizedToolset&lt;/code&gt;。Nanobot 的 MCP 工具需要单独适配，不能和本地工具统一注册。&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&#34;七provider-抽象层fallback-链式封装&#34;&gt;七、Provider 抽象层：Fallback 链式封装&lt;/h2&gt;
&lt;p&gt;Nanobot 的 Provider 系统在 &lt;code&gt;nanobot/providers/&lt;/code&gt; 中，支持 5 种后端：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Anthropic&lt;/strong&gt;：Claude 系列&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;OpenAI Compat&lt;/strong&gt;：兼容 OpenAI API 的模型&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;OpenAI Responses&lt;/strong&gt;：OpenAI 的 Responses API&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Azure OpenAI&lt;/strong&gt;：Azure 部署&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Bedrock&lt;/strong&gt;：AWS Bedrock&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;GitHub Copilot&lt;/strong&gt;：Copilot 代理&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;核心设计是 &lt;code&gt;FallbackProvider&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-python&#34; data-lang=&#34;python&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;class&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;FallbackProvider&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;def&lt;/span&gt; __init__(self, providers: list[Provider]):
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        self&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;providers &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; providers
&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:#66d9ef&#34;&gt;async&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;def&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;complete&lt;/span&gt;(self, messages):
&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;for&lt;/span&gt; provider &lt;span style=&#34;color:#f92672&#34;&gt;in&lt;/span&gt; self&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;providers:
&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;try&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;return&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;await&lt;/span&gt; provider&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;complete(messages)
&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;except&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;Exception&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;continue&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;raise&lt;/span&gt; AllProvidersFailed()
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;对比 Pi Agent 的 30+ Provider：Pi Agent 的 Provider 覆盖更广，但都是单 Provider 直连。Nanobot 的 Provider 数量少，但支持 Fallback 链式切换。&lt;strong&gt;这是两种不同的哲学：广度 vs 韧性。&lt;/strong&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&#34;八和三个编码-agent-的横向对比&#34;&gt;八、和三个编码 Agent 的横向对比&lt;/h2&gt;
&lt;table&gt;
  &lt;thead&gt;
      &lt;tr&gt;
          &lt;th&gt;维度&lt;/th&gt;
          &lt;th&gt;Grok Build&lt;/th&gt;
          &lt;th&gt;OpenCode&lt;/th&gt;
          &lt;th&gt;Pi Agent&lt;/th&gt;
          &lt;th&gt;Nanobot&lt;/th&gt;
      &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
      &lt;tr&gt;
          &lt;td&gt;语言&lt;/td&gt;
          &lt;td&gt;Rust&lt;/td&gt;
          &lt;td&gt;TypeScript/Effect&lt;/td&gt;
          &lt;td&gt;TypeScript&lt;/td&gt;
          &lt;td&gt;Python&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;定位&lt;/td&gt;
          &lt;td&gt;编码 Agent&lt;/td&gt;
          &lt;td&gt;编码 Agent&lt;/td&gt;
          &lt;td&gt;编码 Agent&lt;/td&gt;
          &lt;td&gt;通用 Agent 框架&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;源文件&lt;/td&gt;
          &lt;td&gt;2804&lt;/td&gt;
          &lt;td&gt;2499&lt;/td&gt;
          &lt;td&gt;859&lt;/td&gt;
          &lt;td&gt;500+&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;沟通平台&lt;/td&gt;
          &lt;td&gt;CLI 5 模式&lt;/td&gt;
          &lt;td&gt;TUI + Desktop&lt;/td&gt;
          &lt;td&gt;CLI TUI&lt;/td&gt;
          &lt;td&gt;15+ Chat 平台&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;会话存储&lt;/td&gt;
          &lt;td&gt;ACP 5 状态&lt;/td&gt;
          &lt;td&gt;Durable SQLite&lt;/td&gt;
          &lt;td&gt;JSONL 树形&lt;/td&gt;
          &lt;td&gt;JSONL 文件&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;记忆系统&lt;/td&gt;
          &lt;td&gt;手动管理&lt;/td&gt;
          &lt;td&gt;Session Summary&lt;/td&gt;
          &lt;td&gt;无&lt;/td&gt;
          &lt;td&gt;&lt;strong&gt;Dream 自动合并&lt;/strong&gt;&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;MCP&lt;/td&gt;
          &lt;td&gt;✅ 完整传输层&lt;/td&gt;
          &lt;td&gt;✅ 插件化&lt;/td&gt;
          &lt;td&gt;❌&lt;/td&gt;
          &lt;td&gt;✅ 适配层&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;子 Agent&lt;/td&gt;
          &lt;td&gt;进程内 1 层&lt;/td&gt;
          &lt;td&gt;插件&lt;/td&gt;
          &lt;td&gt;RPC 进程&lt;/td&gt;
          &lt;td&gt;消息总线&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;工具数&lt;/td&gt;
          &lt;td&gt;60+&lt;/td&gt;
          &lt;td&gt;较多&lt;/td&gt;
          &lt;td&gt;中等&lt;/td&gt;
          &lt;td&gt;20+&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;验证系统&lt;/td&gt;
          &lt;td&gt;Skeptic + Goal&lt;/td&gt;
          &lt;td&gt;❌&lt;/td&gt;
          &lt;td&gt;❌&lt;/td&gt;
          &lt;td&gt;❌&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;权限系统&lt;/td&gt;
          &lt;td&gt;✅ 完整&lt;/td&gt;
          &lt;td&gt;✅ Ruleset&lt;/td&gt;
          &lt;td&gt;❌ 容器化&lt;/td&gt;
          &lt;td&gt;❌&lt;/td&gt;
      &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;
&lt;hr&gt;
&lt;h2 id=&#34;写在最后&#34;&gt;写在最后&lt;/h2&gt;
&lt;p&gt;Nanobot 作为一个 Python Agent 框架，它的定位和前三者完全不同。它不是编码 Agent，而是&lt;strong&gt;通用 Agent 运行时&lt;/strong&gt;。它的 15+ 聊天平台集成、Dream 两阶段记忆合并、TurnState 状态机，都是为「长时间、多平台、多会话」的通用 Agent 场景设计的。&lt;/p&gt;
&lt;p&gt;如果你需要的是一个&lt;strong&gt;可以接入 Telegram、飞书、微信，能跑自动任务，有记忆系统的 Agent 框架&lt;/strong&gt;，Nanobot 是这四个项目中唯一的选择。&lt;/p&gt;
&lt;p&gt;但如果你需要的是&lt;strong&gt;高效的代码编辑能力&lt;/strong&gt;，Python 的异步性能瓶颈和 GIL 会让它力不从心。这时候 Rust 的 Grok Build 或 TypeScript 的 OpenCode/Pi Agent 更适合。&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;li&gt;&lt;a class=&#34;link&#34; href=&#34;https://www.yesmiracle.net/20260719-pi-agent-architecture/&#34; &gt;Pi Agent 深度拆解：TypeScript 多包架构下的 Steering + Follow-up 双队列设计&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;GitHub: &lt;a class=&#34;link&#34; href=&#34;https://github.com/HKUDS/nanobot&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;https://github.com/HKUDS/nanobot&lt;/a&gt;&lt;/p&gt;
</description>
        </item>
        <item>
        <title>OpenCode 源码深度拆解：Effect TS 代数效应系统构建的智能编码 Agent</title>
        <link>https://www.yesmiracle.net/post/20260719-opencode-architecture/</link>
        <pubDate>Sun, 19 Jul 2026 00:00:00 +0000</pubDate>
        <author>admin@yesmiracle.net (万戈)</author>
        <guid>https://www.yesmiracle.net/post/20260719-opencode-architecture/</guid>
        <description>&lt;img src="https://www.yesmiracle.net/post/20260719-opencode-architecture/cover.svg" alt="Featured image of post OpenCode 源码深度拆解：Effect TS 代数效应系统构建的智能编码 Agent" /&gt;&lt;p&gt;在读完 Grok Build 的 Rust 巨构和 Pi Agent 的 Steering 双队列之后，今天来看第三个编码 Agent——&lt;strong&gt;OpenCode&lt;/strong&gt;。&lt;/p&gt;
&lt;p&gt;OpenCode 由 SST/Anomaly 团队开发，是一个 TypeScript monorepo，2499 个 TS 源文件，20+ 个独立包。它的技术栈选择非常激进：&lt;strong&gt;Effect TS&lt;/strong&gt; 不是「用了一下」，而是深嵌在每一层代码的核心。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;TL;DR：OpenCode 的「四轴 LLM 路由」和「Schema First 协议层」设计，是三者中最工程化的。如果你追求代码的可测试性和架构的可维护性，OpenCode 的代码最值得读。&lt;/strong&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&#34;一monorepo-全景&#34;&gt;一、Monorepo 全景&lt;/h2&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;packages/
├── opencode/    # 主 CLI Agent —— 双 Agent 系统 (build + plan)
├── core/        # 核心运行时 —— Session, Tool, Config, Permission
├── protocol/    # HTTP API 协议层 —— Effect HttpApi
├── server/      # 服务器实现
├── tui/         # 终端 UI
├── schema/      # 浏览器安全的序列化合约
├── plugin/      # 插件系统（V2 Effect 版 + V1 Promise 版）
├── llm/         # LLM 集成 —— 四轴路由体系
├── console/     # 桌面应用
└── web/         # Web 前端
&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;包数&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;2804 .rs&lt;/td&gt;
          &lt;td&gt;Rust&lt;/td&gt;
          &lt;td&gt;50+ crate&lt;/td&gt;
          &lt;td&gt;编译期类型安全 + Actor 模型&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;2499 .ts&lt;/td&gt;
          &lt;td&gt;TypeScript&lt;/td&gt;
          &lt;td&gt;20+ 包&lt;/td&gt;
          &lt;td&gt;Effect TS 代数效应 + Schema First&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;859 .ts&lt;/td&gt;
          &lt;td&gt;TypeScript&lt;/td&gt;
          &lt;td&gt;5 包&lt;/td&gt;
          &lt;td&gt;事件驱动 + 分层抽象&lt;/td&gt;
      &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;
&lt;hr&gt;
&lt;h2 id=&#34;二effect-ts不是用了是深嵌&#34;&gt;二、Effect TS：不是「用了」，是「深嵌」&lt;/h2&gt;
&lt;p&gt;OpenCode 对 Effect TS 的使用深度，是我见过的 TypeScript 项目中最彻底的。&lt;/p&gt;
&lt;h3 id=&#34;21-contextservice-依赖注入&#34;&gt;2.1 Context.Service 依赖注入&lt;/h3&gt;
&lt;p&gt;每一层都通过 &lt;code&gt;Context.Tag&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;// packages/opencode/src/session/llm.ts
&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;class&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;LLM&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;extends&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;Context&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;Tag&lt;/span&gt;(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;session/LLM&amp;#34;&lt;/span&gt;)&lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;&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;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:#a6e22e&#34;&gt;stream&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; (&lt;span style=&#34;color:#a6e22e&#34;&gt;input&lt;/span&gt;: &lt;span style=&#34;color:#66d9ef&#34;&gt;StreamInput&lt;/span&gt;) &lt;span style=&#34;color:#f92672&#34;&gt;=&amp;gt;&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;Effect&lt;/span&gt;&amp;lt;&lt;span style=&#34;color:#f92672&#34;&gt;StreamResult&lt;/span&gt;&amp;gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;&amp;gt;&lt;/span&gt;() {}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id=&#34;22-effectgen-代数效应&#34;&gt;2.2 Effect.gen 代数效应&lt;/h3&gt;
&lt;p&gt;核心逻辑用 &lt;code&gt;Effect.gen&lt;/code&gt; 编写，而不是 &lt;code&gt;async/await&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;const&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;program&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;Effect&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;gen&lt;/span&gt;(&lt;span style=&#34;color:#66d9ef&#34;&gt;function&lt;/span&gt;&lt;span style=&#34;color:#f92672&#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:#66d9ef&#34;&gt;const&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;llm&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;yield&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;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:#66d9ef&#34;&gt;const&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;session&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;yield&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;Session&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;const&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;result&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;yield&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;llm&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;stream&lt;/span&gt;(&lt;span style=&#34;color:#a6e22e&#34;&gt;input&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;return&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;yield&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;session&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;save&lt;/span&gt;(&lt;span style=&#34;color:#a6e22e&#34;&gt;result&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;h3 id=&#34;23-schema-优先验证&#34;&gt;2.3 Schema 优先验证&lt;/h3&gt;
&lt;p&gt;&lt;code&gt;packages/schema/&lt;/code&gt; 定义了所有数据结构的 Schema，运行时验证 + 编译时类型推导：&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;export&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;const&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;AgentInfo&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;Schema&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;Struct&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;name&lt;/span&gt;: &lt;span style=&#34;color:#66d9ef&#34;&gt;Schema.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;mode&lt;/span&gt;: &lt;span style=&#34;color:#66d9ef&#34;&gt;Schema.Literals&lt;/span&gt;([&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;subagent&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;primary&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;all&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:#a6e22e&#34;&gt;permission&lt;/span&gt;: &lt;span style=&#34;color:#66d9ef&#34;&gt;PermissionV1.Ruleset&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;h3 id=&#34;24-为什么这很重要&#34;&gt;2.4 为什么这很重要？&lt;/h3&gt;
&lt;p&gt;对比 Grok Build 的 Rust 方案：Rust 的类型系统在&lt;strong&gt;编译期&lt;/strong&gt;保证正确性，Effect TS 的 Schema 在&lt;strong&gt;运行时&lt;/strong&gt;保证正确性。两者达到的最终效果类似——数据结构不会在管道中变形——但路径完全不同。&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&#34;三四轴-llm-路由体系&#34;&gt;三、四轴 LLM 路由体系&lt;/h2&gt;
&lt;p&gt;这是 OpenCode 最独特的架构设计。&lt;code&gt;packages/llm/&lt;/code&gt; 将 LLM 调用拆成四个正交维度：&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;Protocol  → 协议层（OpenAI Chat、Anthropic Messages、Google Gemini...）
Endpoint → 端点层（api.openai.com、api.anthropic.com、自定义代理...）
Auth     → 认证层（API Key、OAuth、Bearer Token...）
Framing  → 框架层（AI SDK、原生 HTTP、流式/非流式...）
&lt;/code&gt;&lt;/pre&gt;&lt;h3 id=&#34;31-protocol-复用&#34;&gt;3.1 Protocol 复用&lt;/h3&gt;
&lt;p&gt;多个 Provider 共享同一个 Protocol 实现：&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;// 同一个 OpenAIChat.protocol 被多个 provider 复用
&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;const&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;deepseek&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;OpenAIChat&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;protocol&lt;/span&gt;({ &lt;span style=&#34;color:#a6e22e&#34;&gt;baseURL&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;https://api.deepseek.com&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:#66d9ef&#34;&gt;const&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;together&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;OpenAIChat&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;protocol&lt;/span&gt;({ &lt;span style=&#34;color:#a6e22e&#34;&gt;baseURL&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;https://api.together.xyz&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:#66d9ef&#34;&gt;const&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;fireworks&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;OpenAIChat&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;protocol&lt;/span&gt;({ &lt;span style=&#34;color:#a6e22e&#34;&gt;baseURL&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;https://api.fireworks.ai&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:#66d9ef&#34;&gt;const&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;openai&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;OpenAIChat&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;protocol&lt;/span&gt;({ &lt;span style=&#34;color:#a6e22e&#34;&gt;baseURL&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;https://api.openai.com/v1&amp;#34;&lt;/span&gt; });
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;对比 Pi Agent 的 30+ Provider：Pi 为每个 provider 写一个适配文件，而 OpenCode 只需要写一个 &lt;code&gt;OpenAIChat.protocol&lt;/code&gt;，然后通过配置不同的 baseURL 复用。&lt;strong&gt;这是架构抽象层次的差异。&lt;/strong&gt;&lt;/p&gt;
&lt;h3 id=&#34;32-requestexecutor-重试逻辑&#34;&gt;3.2 RequestExecutor 重试逻辑&lt;/h3&gt;
&lt;p&gt;在 &lt;code&gt;packages/llm/src/&lt;/code&gt; 中，&lt;code&gt;RequestExecutor&lt;/code&gt; 封装了完整的重试策略：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;指数退避 + 抖动&lt;/li&gt;
&lt;li&gt;按错误类型分类（4xx 不重试，5xx 重试，429 限速重试）&lt;/li&gt;
&lt;li&gt;请求超时控制&lt;/li&gt;
&lt;li&gt;流式响应中断恢复&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;对比 Grok Build 的 &lt;code&gt;xai-grok-sampler&lt;/code&gt;：Grok Build 的 samper 有三层架构（SamplingClient → stream → SamplerHandle），重试逻辑在 &lt;code&gt;retry.rs&lt;/code&gt; 中，支持 &lt;code&gt;doom_loop&lt;/code&gt; 检测。OpenCode 的 RequestExecutor 功能类似但更轻量。&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&#34;四双-agent-架构build-vs-plan&#34;&gt;四、双 Agent 架构：build vs plan&lt;/h2&gt;
&lt;p&gt;OpenCode 内置了两个 Agent，定义在 &lt;code&gt;packages/opencode/src/agent/agent.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;const&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;AgentInfo&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;Schema&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;Struct&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;name&lt;/span&gt;: &lt;span style=&#34;color:#66d9ef&#34;&gt;Schema.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;Schema.optional&lt;/span&gt;(&lt;span style=&#34;color:#a6e22e&#34;&gt;Schema&lt;/span&gt;.String),
&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;mode&lt;/span&gt;: &lt;span style=&#34;color:#66d9ef&#34;&gt;Schema.Literals&lt;/span&gt;([&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;subagent&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;primary&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;all&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:#a6e22e&#34;&gt;permission&lt;/span&gt;: &lt;span style=&#34;color:#66d9ef&#34;&gt;PermissionV1.Ruleset&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&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;table&gt;
  &lt;thead&gt;
      &lt;tr&gt;
          &lt;th&gt;Agent&lt;/th&gt;
          &lt;th&gt;模式&lt;/th&gt;
          &lt;th&gt;权限&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;build&lt;/strong&gt;&lt;/td&gt;
          &lt;td&gt;primary&lt;/td&gt;
          &lt;td&gt;完整文件读写&lt;/td&gt;
          &lt;td&gt;开发工作&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;strong&gt;plan&lt;/strong&gt;&lt;/td&gt;
          &lt;td&gt;primary&lt;/td&gt;
          &lt;td&gt;只读&lt;/td&gt;
          &lt;td&gt;代码分析、探索&lt;/td&gt;
      &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;两者通过 &lt;code&gt;Tab&lt;/code&gt; 键在 TUI 中切换。核心差异只是 &lt;code&gt;permission&lt;/code&gt; 级别不同——&lt;strong&gt;同一个 Agent Loop，不同的权限配置&lt;/strong&gt;。&lt;/p&gt;
&lt;p&gt;对比 Grok Build：Grok Build 的 &lt;code&gt;AgentDefinition&lt;/code&gt; 系统更复杂，除了 permission 还支持 &lt;code&gt;prompt_mode&lt;/code&gt;、&lt;code&gt;completion_requirement&lt;/code&gt;、&lt;code&gt;toolset&lt;/code&gt; 等配置，通过 &lt;code&gt;AgentBuilder&lt;/code&gt; 构建。&lt;/p&gt;
&lt;p&gt;对比 Pi Agent：Pi 没有内置的多 Agent 概念，但通过扩展系统可以实现。&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&#34;五session-架构v2-的持久化改革&#34;&gt;五、Session 架构：V2 的持久化改革&lt;/h2&gt;
&lt;p&gt;OpenCode 的 Session 系统在 &lt;code&gt;packages/opencode/src/session/&lt;/code&gt; 下，约 24 个文件。V2 版本引入了 &lt;strong&gt;Durable Prompt Admission&lt;/strong&gt; 模式：&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;SessionV2.prompt(input)
  ├── durable admission: 将 prompt 持久化到 SQLite
  ├── schedule wake: 通知 SessionRunner 有新工作
  └── return sessionID
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;strong&gt;关键设计&lt;/strong&gt;：prompt 在发送给 LLM 之前先持久化。即使进程崩溃，prompt 不会丢失。&lt;/p&gt;
&lt;h3 id=&#34;51-session-处理循环processor&#34;&gt;5.1 Session 处理循环（Processor）&lt;/h3&gt;
&lt;p&gt;&lt;code&gt;processor.ts&lt;/code&gt; 是实现 Agent 循环的核心——一个&lt;strong&gt;事件驱动的状态机&lt;/strong&gt;：&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;create(input) → LLM.Service.stream(input) → handleEvent(event)
  ├── reasoning-start → 管理推理过程
  ├── tool-call-start → 执行工具调用
  ├── tool-result → 处理工具结果
  ├── text-delta → 文本增量更新
  └── error → 错误处理
&lt;/code&gt;&lt;/pre&gt;&lt;h3 id=&#34;52-双运行时策略&#34;&gt;5.2 双运行时策略&lt;/h3&gt;
&lt;p&gt;OpenCode 同时支持两种 LLM 运行时：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;AI SDK 路径&lt;/strong&gt;（默认）：通过 Vercel AI SDK 调用&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Native LLM 路径&lt;/strong&gt;（新）：通过 &lt;code&gt;native-runtime.ts&lt;/code&gt; 直接调用&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;双运行时通过 &lt;code&gt;session/llm.ts&lt;/code&gt; 中的 &lt;code&gt;LLM.Service&lt;/code&gt; 统一管理，根据配置自动选择。这种渐进式迁移策略——先通过成熟 SDK 上线，再逐步替换为原生实现——是工程化团队的典型做法。&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&#34;六插件系统v1--v2-双轨制&#34;&gt;六、插件系统：V1 + V2 双轨制&lt;/h2&gt;
&lt;p&gt;OpenCode 的插件系统在 &lt;code&gt;packages/plugin/&lt;/code&gt; 中，同时维护两套 API：&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;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;strong&gt;V1 (Promise)&lt;/strong&gt;&lt;/td&gt;
          &lt;td&gt;简单的 &lt;code&gt;() =&amp;gt; Promise&amp;lt;void&amp;gt;&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;快速原型、简单插件&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;strong&gt;V2 (Effect)&lt;/strong&gt;&lt;/td&gt;
          &lt;td&gt;Effect 的 Context/Layer/Scope&lt;/td&gt;
          &lt;td&gt;复杂插件、生产环境&lt;/td&gt;
      &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;V2 插件支持 20+ 生命周期钩子：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;onSessionStart&lt;/code&gt; / &lt;code&gt;onSessionEnd&lt;/code&gt;&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;onPromptBuild&lt;/code&gt; / &lt;code&gt;onPromptComplete&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;onError&lt;/code&gt; / &lt;code&gt;onConfigLoad&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;对比 Pi Agent 的扩展系统：Pi 的扩展机制更丰富（注册工具、命令、UI 组件），但 OpenCode 的插件系统在&lt;strong&gt;类型安全&lt;/strong&gt;上更好——Effect 的 Context 保证了插件依赖在编译期可验证。&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&#34;七和-grok-build-的深层对比&#34;&gt;七、和 Grok Build 的深层对比&lt;/h2&gt;
&lt;h3 id=&#34;71-哲学差异&#34;&gt;7.1 哲学差异&lt;/h3&gt;
&lt;table&gt;
  &lt;thead&gt;
      &lt;tr&gt;
          &lt;th&gt;维度&lt;/th&gt;
          &lt;th&gt;Grok Build (Rust)&lt;/th&gt;
          &lt;th&gt;OpenCode (Effect TS)&lt;/th&gt;
      &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
      &lt;tr&gt;
          &lt;td&gt;正确性保证&lt;/td&gt;
          &lt;td&gt;编译期类型系统&lt;/td&gt;
          &lt;td&gt;运行时 Schema 验证&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;并发模型&lt;/td&gt;
          &lt;td&gt;Tokio Actor + mpsc&lt;/td&gt;
          &lt;td&gt;Effect Fiber + Scope&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;错误处理&lt;/td&gt;
          &lt;td&gt;Result + thiserror&lt;/td&gt;
          &lt;td&gt;Effect.Either + Cause&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;依赖注入&lt;/td&gt;
          &lt;td&gt;手动 Resource 注入&lt;/td&gt;
          &lt;td&gt;Context.Service 自动&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;协议层&lt;/td&gt;
          &lt;td&gt;ACP (Gateway + Session)&lt;/td&gt;
          &lt;td&gt;Effect HttpApi&lt;/td&gt;
      &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 id=&#34;72-工具系统&#34;&gt;7.2 工具系统&lt;/h3&gt;
&lt;p&gt;Grok Build 的 &lt;code&gt;ToolBridge&lt;/code&gt; + &lt;code&gt;FinalizedToolset&lt;/code&gt; 通过类型安全的 Resource 注入管理工具依赖。OpenCode 的工具注册通过 &lt;code&gt;Tool.Registry&lt;/code&gt; 的 Effect Service 实现。两者都在做同一件事——&lt;strong&gt;让工具不依赖全局状态&lt;/strong&gt;——但 Grok Build 的 Rust 版本在编译期保证，而 OpenCode 在运行时保证。&lt;/p&gt;
&lt;h3 id=&#34;73-mcp-集成&#34;&gt;7.3 MCP 集成&lt;/h3&gt;
&lt;p&gt;Grok Build 有完整的 &lt;code&gt;xai-grok-mcp&lt;/code&gt; crate，支持 Streamable HTTP 和子进程两种传输，OAuth 认证，Managed MCP 自动刷新。OpenCode 的 MCP 支持在 &lt;code&gt;packages/plugin/src/v2/&lt;/code&gt; 中，通过插件系统实现。&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&#34;八三篇编码-agent-的横向对比&#34;&gt;八、三篇编码 Agent 的横向对比&lt;/h2&gt;
&lt;table&gt;
  &lt;thead&gt;
      &lt;tr&gt;
          &lt;th&gt;维度&lt;/th&gt;
          &lt;th&gt;Grok Build&lt;/th&gt;
          &lt;th&gt;OpenCode&lt;/th&gt;
          &lt;th&gt;Pi Agent&lt;/th&gt;
      &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
      &lt;tr&gt;
          &lt;td&gt;语言&lt;/td&gt;
          &lt;td&gt;Rust&lt;/td&gt;
          &lt;td&gt;TypeScript/Effect&lt;/td&gt;
          &lt;td&gt;TypeScript&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;包数&lt;/td&gt;
          &lt;td&gt;50+ crate&lt;/td&gt;
          &lt;td&gt;20+ 包&lt;/td&gt;
          &lt;td&gt;5 包&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;文件数&lt;/td&gt;
          &lt;td&gt;2804&lt;/td&gt;
          &lt;td&gt;2499&lt;/td&gt;
          &lt;td&gt;859&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;会话模式&lt;/td&gt;
          &lt;td&gt;5 状态 + ACP 协议&lt;/td&gt;
          &lt;td&gt;Durable SQLite&lt;/td&gt;
          &lt;td&gt;JSONL 树形 + 分支&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;工具系统&lt;/td&gt;
          &lt;td&gt;ToolBridge 资源注入&lt;/td&gt;
          &lt;td&gt;Effect Service 注册&lt;/td&gt;
          &lt;td&gt;定义优先双层注册&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;Provider&lt;/td&gt;
          &lt;td&gt;少（委托 xAI）&lt;/td&gt;
          &lt;td&gt;四轴路由&lt;/td&gt;
          &lt;td&gt;30+ Provider&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;验证系统&lt;/td&gt;
          &lt;td&gt;✅ Skeptic + Goal&lt;/td&gt;
          &lt;td&gt;❌&lt;/td&gt;
          &lt;td&gt;❌&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;权限系统&lt;/td&gt;
          &lt;td&gt;✅ 完整&lt;/td&gt;
          &lt;td&gt;✅ Ruleset&lt;/td&gt;
          &lt;td&gt;❌ 容器化&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;子 Agent&lt;/td&gt;
          &lt;td&gt;进程内 1 层&lt;/td&gt;
          &lt;td&gt;❌ 未知&lt;/td&gt;
          &lt;td&gt;RPC 进程级&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;协议&lt;/td&gt;
          &lt;td&gt;ACP&lt;/td&gt;
          &lt;td&gt;Effect HttpApi&lt;/td&gt;
          &lt;td&gt;❌ CLI 原生&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;MCP&lt;/td&gt;
          &lt;td&gt;✅ 完整&lt;/td&gt;
          &lt;td&gt;✅ 插件化&lt;/td&gt;
          &lt;td&gt;❌&lt;/td&gt;
      &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;
&lt;hr&gt;
&lt;h2 id=&#34;写在最后&#34;&gt;写在最后&lt;/h2&gt;
&lt;p&gt;OpenCode 的代码质量是三者中最高的。Effect TS 的选择让它的架构非常干净——&lt;strong&gt;每一层都有明确的边界，每个依赖都有显式的声明&lt;/strong&gt;。&lt;/p&gt;
&lt;p&gt;但代价也很明显：学习曲线陡峭。如果你不熟悉 Effect TS，读 OpenCode 的代码会非常吃力。而 Grok Build 的 Rust 代码虽然复杂，但 Rust 类型系统的表现力让代码「自文档化」程度更高。&lt;/p&gt;
&lt;p&gt;如果你对 Effect TS 的代数效应系统在工程中的落地感兴趣，OpenCode 是最值得读的参考实现。它的「四轴 LLM 路由」和「Schema First 协议层」设计，是面向未来的 Agent 架构方向。&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-pi-agent-architecture/&#34; &gt;Pi Agent 深度拆解：TypeScript 多包架构下的 Steering + Follow-up 双队列设计&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;GitHub: &lt;a class=&#34;link&#34; href=&#34;https://github.com/sst/opencode&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;https://github.com/sst/opencode&lt;/a&gt;&lt;/p&gt;
</description>
        </item>
        <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>
        <item>
        <title>xAI 开源了 Grok Build！万字拆解 40 万行 Rust 构建的 AI Coding Agent 内部架构</title>
        <link>https://www.yesmiracle.net/post/20260719-grok-build-open-source/</link>
        <pubDate>Sun, 19 Jul 2026 00:00:00 +0000</pubDate>
        <author>admin@yesmiracle.net (万戈)</author>
        <guid>https://www.yesmiracle.net/post/20260719-grok-build-open-source/</guid>
        <description>&lt;img src="https://www.yesmiracle.net/post/20260719-grok-build-open-source/cover.svg" alt="Featured image of post xAI 开源了 Grok Build！万字拆解 40 万行 Rust 构建的 AI Coding Agent 内部架构" /&gt;&lt;p&gt;如果你是 AI 编程工具的深度用户，可能已经用过 Cursor、Claude Code、Codex 或者 Hermes Agent。但 2026 年 7 月 19 日，xAI 在 GitHub 上开源了 &lt;strong&gt;Grok Build&lt;/strong&gt;——一个你可能不知道名字、但架构深度令人叹为观止的终端 AI Coding Agent。&lt;/p&gt;
&lt;p&gt;这不是一个简单的&amp;quot;AI 调 API 封装&amp;quot;。我花了整整一天通读源码，只能说：&lt;strong&gt;这可能是目前开源社区能见到的最完整的 AI Agent 工程实现。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;本文从源码出发，分 10 个维度拆解 Grok Build 的架构设计。&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&#34;一项目概览40-万行-rust50-个-crate-的模块化巨构&#34;&gt;一、项目概览：40 万行 Rust，50+ 个 Crate 的模块化巨构&lt;/h2&gt;
&lt;p&gt;Grok Build 的代码量惊人——&lt;strong&gt;2804 个文件，约 132 万行代码&lt;/strong&gt;（含第三方依赖），核心 Rust 源码约 60 万行。它被组织为 &lt;strong&gt;50+ 个独立的 Cargo crate&lt;/strong&gt;，每个 crate 有清晰的职责边界。&lt;/p&gt;
&lt;p&gt;从仓库布局看，xAI 将其抽象为 6 个层次：&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;xai-grok-pager-bin          → 二进制入口
xai-grok-pager / render     → TUI 界面层
xai-grok-shell              → Agent 运行时 + 会话管理
xai-grok-agent              → Agent 定义 + 系统提示词组装
xai-grok-tools              → 工具实现层（60+ 工具）
xai-grok-workspace          → 工作区（文件系统 + VCS + 权限）
xai-grok-sampler            → LLM 采样层（HTTP 流式 + 重试）
xai-acp-lib                 → ACP 协议通信层
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;这种分层设计使得 Grok Build 可以运行在 &lt;strong&gt;5 种模式&lt;/strong&gt;下：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;TUI 模式&lt;/strong&gt;：全屏终端界面，交互式编程&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Headless 模式&lt;/strong&gt;：通过 Relay WebSocket 连接，无界面运行&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Stdio 模式&lt;/strong&gt;：JSON-RPC over stdin/stdout，适合 CI/CD&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Server 模式&lt;/strong&gt;：WebSocket 服务器，供外部客户端连接&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Leader 模式&lt;/strong&gt;：IPC 服务器，协调多个 follower 客户端&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;而这种多模式能力，正是其底层架构设计成功的证明。&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&#34;二acp-协议让-agent-和客户端解耦的七层协议&#34;&gt;二、ACP 协议：让 Agent 和客户端解耦的「七层协议」&lt;/h2&gt;
&lt;p&gt;Grok Build 最核心的设计决策是拥抱 &lt;strong&gt;ACP（Agent Client Protocol）&lt;/strong&gt;。这不是 xAI 自创的协议——它来自 &lt;code&gt;agent-client-protocol&lt;/code&gt; 这个开源 Rust crate（v0.10.4），是一个通用的 Agent ↔ 客户端通信规范。&lt;/p&gt;
&lt;p&gt;ACP 定义了完整的请求-响应模型：&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;客户端                          Agent
  │                              │
  │── initialize ──────────────→│  (握手，交换能力)
  │←── InitializeResponse ──────│
  │                              │
  │── session/new ─────────────→│  (创建新会话)
  │←── SessionCreated ──────────│
  │                              │
  │── prompt ──────────────────→│  (发送提示词)
  │←── PromptResponse ──────────│
  │←── x.ai/tool/use ──────────│  (服务器调用工具)
  │── x.ai/tool/result ───────→│  (客户端返回结果)
  │                              │
  │── session/close ───────────→│  (关闭会话)
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;code&gt;xai-acp-lib&lt;/code&gt; crate 封装了 ACP 的低层通信细节，提供了基于 &lt;code&gt;mpsc&lt;/code&gt; channel 的 Gateway 模式：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;AcpGatewaySender / AcpGatewayReceiver&lt;/strong&gt;：双向消息通道&lt;/li&gt;
&lt;li&gt;支持 &lt;strong&gt;AgentMessage&lt;/strong&gt; 和 &lt;strong&gt;ClientMessage&lt;/strong&gt; 两种消息类型&lt;/li&gt;
&lt;li&gt;通过 &lt;code&gt;serde_json::Value&lt;/code&gt; 的 &lt;code&gt;_meta&lt;/code&gt; 字段支持扩展协议&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;这意味着，&lt;strong&gt;任何实现了 ACP 的客户端都可以连接 Grok Build&lt;/strong&gt;——不仅是 xAI 自家的 TUI，还包括 VS Code 扩展、Web UI、CI 脚本等。&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&#34;三agent-运行时从-mvpagent-到子-agent-协调器&#34;&gt;三、Agent 运行时：从 MvpAgent 到子 Agent 协调器&lt;/h2&gt;
&lt;p&gt;Grok Build 的 Agent 运行时位于 &lt;code&gt;xai-grok-shell&lt;/code&gt; crate，核心是 &lt;code&gt;MvpAgent&lt;/code&gt; 结构体。它实现了 ACP 的 &lt;code&gt;acp::Agent&lt;/code&gt; trait，是真正的&amp;quot;大脑&amp;quot;。&lt;/p&gt;
&lt;h3 id=&#34;31-mvpagent-的职责&#34;&gt;3.1 MvpAgent 的职责&lt;/h3&gt;
&lt;p&gt;MvpAgent 是一个巨大的结构体，管理着：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;会话注册表&lt;/strong&gt;：所有活跃会话的 &lt;code&gt;SessionHandle&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;认证管理器&lt;/strong&gt;：OAuth、API Key 等多种认证方式&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;模型管理器&lt;/strong&gt;：模型目录、模型切换&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;子 Agent 协调器&lt;/strong&gt;：子任务管理&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;网关&lt;/strong&gt;：与 leader/relay 的通信通道&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;工作区操作&lt;/strong&gt;：文件系统、VCS、权限&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;32-会话生命周期&#34;&gt;3.2 会话生命周期&lt;/h3&gt;
&lt;p&gt;Grok Build 的会话有 5 个状态：&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;Working → 正在执行一个 turn（有 LLM 请求在跑）
IdleResident → Actor 存活，但无正在执行的 turn
Dormant → 序列化在磁盘上，但未加载
Completed → 已结束，可恢复
DeadFailed → Actor 崩溃（无害，可恢复）
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;这种设计让 Grok Build 可以同时管理数十个会话，并按需加载/卸载，避免内存爆炸。&lt;/p&gt;
&lt;h3 id=&#34;33-子-agent-系统&#34;&gt;3.3 子 Agent 系统&lt;/h3&gt;
&lt;p&gt;Grok Build 支持通过 &lt;code&gt;task&lt;/code&gt; 工具创建子 Agent。子 Agent 的深度限制为 &lt;strong&gt;1 层&lt;/strong&gt;（子 Agent 不能再创建子 Agent），但每个父会话可以同时运行多个子 Agent。&lt;/p&gt;
&lt;p&gt;子 Agent 的协调通过 &lt;code&gt;SubagentCoordinator&lt;/code&gt; 完成，支持：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Spawn&lt;/strong&gt;：创建新子 Agent&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Query&lt;/strong&gt;：查询子 Agent 状态（支持阻塞等待）&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Cancel&lt;/strong&gt;：取消子 Agent&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;ListActive&lt;/strong&gt;：列出活跃子 Agent&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Completions&lt;/strong&gt;：获取已完成子 Agent 结果&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2 id=&#34;四工具系统60-工具的分层架构&#34;&gt;四、工具系统：60+ 工具的分层架构&lt;/h2&gt;
&lt;p&gt;Grok Build 的工具系统是最值得深入研究的部分。它位于 &lt;code&gt;xai-grok-tools&lt;/code&gt; crate，包含 &lt;strong&gt;60+ 个工具实现&lt;/strong&gt;，分为两层架构。&lt;/p&gt;
&lt;h3 id=&#34;41-旧架构-vs-新架构&#34;&gt;4.1 旧架构 vs 新架构&lt;/h3&gt;
&lt;p&gt;代码中同时存在两种工具 trait：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;旧 &lt;code&gt;Tool&lt;/code&gt; trait&lt;/strong&gt;：早期的工具接口&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;新 &lt;code&gt;NewTool&lt;/code&gt; trait&lt;/strong&gt;：基于 &lt;code&gt;xai-tool-runtime&lt;/code&gt; 的新架构&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;新架构的核心是 &lt;code&gt;ToolBridge&lt;/code&gt;，它封装了 &lt;code&gt;FinalizedToolset&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-rust&#34; data-lang=&#34;rust&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;pub&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;struct&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;ToolBridge&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    registry: &lt;span style=&#34;color:#a6e22e&#34;&gt;Arc&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;&lt;/span&gt;FinalizedToolset&lt;span style=&#34;color:#f92672&#34;&gt;&amp;gt;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    terminal: Option&lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;&lt;/span&gt;Arc&lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;dyn&lt;/span&gt; TerminalBackend&lt;span style=&#34;color:#f92672&#34;&gt;&amp;gt;&amp;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;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id=&#34;42-工具注册与资源注入&#34;&gt;4.2 工具注册与资源注入&lt;/h3&gt;
&lt;p&gt;工具通过 &lt;code&gt;ToolRegistryBuilder&lt;/code&gt; 注册，每个工具声明它需要的 &lt;strong&gt;资源&lt;/strong&gt;（Resource）：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;Terminal&lt;/code&gt;：终端后端&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Cwd&lt;/code&gt;：工作目录&lt;/li&gt;
&lt;li&gt;&lt;code&gt;ToolCallId&lt;/code&gt;：工具调用 ID&lt;/li&gt;
&lt;li&gt;&lt;code&gt;SessionFolder&lt;/code&gt;：输出文件路径前缀&lt;/li&gt;
&lt;li&gt;&lt;code&gt;SessionEnv&lt;/code&gt;：环境变量&lt;/li&gt;
&lt;li&gt;&lt;code&gt;NotificationHandle&lt;/code&gt;：通知通道&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;这种&lt;strong&gt;依赖注入&lt;/strong&gt;模式让工具可以自由组合，且每个工具不需要关心全局状态。&lt;/p&gt;
&lt;h3 id=&#34;43-核心工具一览&#34;&gt;4.3 核心工具一览&lt;/h3&gt;
&lt;p&gt;Grok Build 的工具集覆盖了 Coding Agent 所需的全部能力：&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;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;BashTool&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;执行 shell 命令（支持前台/后台）&lt;/td&gt;
          &lt;td&gt;自研&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;ReadFileTool&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;读取文件&lt;/td&gt;
          &lt;td&gt;自研&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;SearchReplaceTool&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;搜索替换编辑&lt;/td&gt;
          &lt;td&gt;自研&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;GrepTool&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;代码搜索&lt;/td&gt;
          &lt;td&gt;自研&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;ListDirTool&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;列出目录&lt;/td&gt;
          &lt;td&gt;自研&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;WebFetchTool&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;获取网页内容&lt;/td&gt;
          &lt;td&gt;自研&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;WebSearchTool&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;网页搜索&lt;/td&gt;
          &lt;td&gt;自研&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;TaskTool&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;创建子 Agent&lt;/td&gt;
          &lt;td&gt;自研&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;TodoWriteTool&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;任务清单管理&lt;/td&gt;
          &lt;td&gt;自研&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;UpdateGoalTool&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;目标完成声明&lt;/td&gt;
          &lt;td&gt;自研&lt;/td&gt;
      &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;此外，还有来自 &lt;strong&gt;Codex&lt;/strong&gt;（OpenAI）和 &lt;strong&gt;OpenCode&lt;/strong&gt;（SST）的移植工具，以及完整的 &lt;strong&gt;MCP 工具集成&lt;/strong&gt;。&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&#34;五终端系统actor-模式--智能超时管理&#34;&gt;五、终端系统：Actor 模式 + 智能超时管理&lt;/h2&gt;
&lt;p&gt;终端（Terminal）是 Coding Agent 最重要的工具。Grok Build 的终端实现是一个教科书级别的 Actor 模式实例。&lt;/p&gt;
&lt;h3 id=&#34;51-actor-架构&#34;&gt;5.1 Actor 架构&lt;/h3&gt;
&lt;p&gt;&lt;code&gt;LocalTerminalBackend&lt;/code&gt; 是一个轻量级 handle，所有实际工作通过 &lt;code&gt;mpsc&lt;/code&gt; channel 发送给 &lt;code&gt;LocalTerminalActor&lt;/code&gt; 处理：&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;LocalTerminalBackend (Handle)
  │ 发送 TerminalCommand
  ▼
LocalTerminalActor (Actor)
  ├── Run (前台运行)
  ├── RunBackground (后台运行)
  ├── GetTask (查询任务)
  ├── Kill (终止任务)
  ├── KillForegroundCommands (终止前台命令)
  ├── BackgroundForeground (前台→后台迁移)
  └── WaitForCompletion (等待完成)
&lt;/code&gt;&lt;/pre&gt;&lt;h3 id=&#34;52-智能的超时策略&#34;&gt;5.2 智能的超时策略&lt;/h3&gt;
&lt;p&gt;Grok Build 的终端超时策略非常 smart：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;前台命令&lt;/strong&gt;：默认 120s 超时，但可通过 &lt;code&gt;max_timeout_secs&lt;/code&gt; 配置扩展到 10 小时&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;后台任务&lt;/strong&gt;：最长 10 小时（&lt;code&gt;BACKGROUND_MAX_RUNTIME&lt;/code&gt;）&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;自动后台迁移&lt;/strong&gt;：前台命令运行超过 15s 后自动转为后台——模型不阻塞，用户可以继续交互&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;输出文件上限&lt;/strong&gt;：5 GiB 后自动终止，防止 &lt;code&gt;yes&lt;/code&gt; 等命令撑爆磁盘&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;SIGTERM → SIGKILL&lt;/strong&gt;：1 秒宽限期&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;53-搜索工具-shadow&#34;&gt;5.3 搜索工具 Shadow&lt;/h3&gt;
&lt;p&gt;Grok Build 还悄悄做了一个很聪明的事：它把 &lt;code&gt;find&lt;/code&gt; 替换为 &lt;code&gt;bfs&lt;/code&gt;，把 &lt;code&gt;grep&lt;/code&gt; 替换为 &lt;code&gt;ugrep&lt;/code&gt;，通过 &lt;code&gt;SearchShadowConfig&lt;/code&gt; 控制。这样在底层就用更快的工具替代标准命令，&lt;strong&gt;对模型完全透明&lt;/strong&gt;。&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&#34;六sampler-层三层架构的-llm-请求处理&#34;&gt;六、Sampler 层：三层架构的 LLM 请求处理&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;xai-grok-sampler&lt;/code&gt; crate 是 LLM 请求的 HTTP 流式+重试层，被设计为可独立复用的组件。&lt;/p&gt;
&lt;h3 id=&#34;61-三层-api&#34;&gt;6.1 三层 API&lt;/h3&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;Layer 1: SamplingClient  → 返回原始 chunk 流
Layer 2: stream          → 将原始流转换为 SamplingEvent
Layer 3: SamplerHandle   → 管理并发请求、重试、取消
&lt;/code&gt;&lt;/pre&gt;&lt;h3 id=&#34;62-重试策略&#34;&gt;6.2 重试策略&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;支持多种 API 后端（Chat Completions、Responses API、Messages API）&lt;/li&gt;
&lt;li&gt;智能错误分类：&lt;code&gt;classify_error()&lt;/code&gt; 区分速率限制、认证错误、服务器错误&lt;/li&gt;
&lt;li&gt;指数退避 + 抖动（jitter）&lt;/li&gt;
&lt;li&gt;重试次数可通过 &lt;code&gt;max_retries&lt;/code&gt; 配置&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;63-doom-loop-检测&#34;&gt;6.3 Doom Loop 检测&lt;/h3&gt;
&lt;p&gt;Grok Build 有一个专门的 &lt;code&gt;doom_loop&lt;/code&gt; 模块，检测 LLM 是否陷入无限循环（如持续调用工具但从不完成）。当检测到死循环时，自动取消当前 turn 并报告原因。&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&#34;七目标系统阴谋论者式的验证机制&#34;&gt;七、目标系统：阴谋论者式的验证机制&lt;/h2&gt;
&lt;p&gt;Grok Build 的 Goal 系统可能是最令人印象深刻的特性。它不是一个简单的&amp;quot;声明完成&amp;quot;——而是一个&lt;strong&gt;对抗性 skeptic 验证&lt;/strong&gt;系统。&lt;/p&gt;
&lt;h3 id=&#34;71-工作流程&#34;&gt;7.1 工作流程&lt;/h3&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;模型: update_goal(completed: true)
  │
  ▼
Goal Tracker 创建验证任务
  │
  ▼
Goal Classifier 启动 N 个 skeptic 子 Agent
  ├── Skeptic 1: 检查代码，找漏洞
  ├── Skeptic 2: 检查代码，找漏洞
  └── Skeptic 3: 检查代码，找漏洞
  │
  ▼
Majority Refute 投票
  ├── ≥ 2 个 skeptic 说&amp;#34;没完成&amp;#34; → 拒绝，生成 gap 摘要
  └── ≥ 2 个 skeptic 说&amp;#34;完成了&amp;#34; → 接受，标记完成
&lt;/code&gt;&lt;/pre&gt;&lt;h3 id=&#34;72-关键参数&#34;&gt;7.2 关键参数&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;默认 &lt;strong&gt;3 个 skeptic&lt;/strong&gt;（可配置 1-5 个）&lt;/li&gt;
&lt;li&gt;最大验证次数：&lt;strong&gt;10 次&lt;/strong&gt;（可配置）&lt;/li&gt;
&lt;li&gt;每次验证的 diff 上限：&lt;strong&gt;256 KB&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;skeptic 使用独立的子 Agent，不污染父会话的上下文&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;这种设计确保了一个 bug 不会被模型自己&amp;quot;蒙混过关&amp;quot;。当一个 skeptic 指出&amp;quot;代码没处理边界情况&amp;quot;，模型必须真正修复代码才能再次声明完成。&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&#34;八mcp-与插件系统生态扩展能力&#34;&gt;八、MCP 与插件系统：生态扩展能力&lt;/h2&gt;
&lt;h3 id=&#34;81-mcp-集成&#34;&gt;8.1 MCP 集成&lt;/h3&gt;
&lt;p&gt;&lt;code&gt;xai-grok-mcp&lt;/code&gt; crate 负责 MCP 集成，支持：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Streamable HTTP Transport&lt;/strong&gt;：基于 &lt;code&gt;rmcp&lt;/code&gt; 2.1 的 HTTP 流式传输&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;OAuth 支持&lt;/strong&gt;：浏览器 OAuth 流程 + 进程间去重&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;凭证管理&lt;/strong&gt;：&lt;code&gt;$GROK_HOME/mcp_credentials.json&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Managed MCP&lt;/strong&gt;：自动刷新 MCP 服务器配置&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;82-插件系统&#34;&gt;8.2 插件系统&lt;/h3&gt;
&lt;p&gt;&lt;code&gt;xai-grok-agent&lt;/code&gt; 的插件系统支持：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;插件发现&lt;/strong&gt;：从本地目录、Git 仓库、市场发现插件&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Git 安装&lt;/strong&gt;：从 GitHub 仓库直接安装&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;信任管理&lt;/strong&gt;：插件信任级别配置&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Hooks 适配器&lt;/strong&gt;：支持 before_turn 和 after_turn 钩子&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;83-hooks-系统&#34;&gt;8.3 Hooks 系统&lt;/h3&gt;
&lt;p&gt;Grok Build 的 hooks 系统支持在 turn 的前后插入自定义逻辑：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;before_turn&lt;/code&gt;：在模型生成前执行&lt;/li&gt;
&lt;li&gt;&lt;code&gt;after_turn&lt;/code&gt;：在模型生成后执行&lt;/li&gt;
&lt;li&gt;可用于：代码审查、日志记录、策略执行等&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2 id=&#34;九代码库图tree-sitter-驱动的代码理解&#34;&gt;九、代码库图：Tree-sitter 驱动的代码理解&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;xai-codebase-graph&lt;/code&gt; crate 是 Grok Build 的代码理解引擎，基于 &lt;strong&gt;Tree-sitter&lt;/strong&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;Go-to-definition&lt;/strong&gt;：跳转到符号定义&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Go-to-references&lt;/strong&gt;：查找符号引用&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;增量索引&lt;/strong&gt;：基于文件系统事件更新&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;并行解析&lt;/strong&gt;：使用 Rayon 并行处理&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;内存映射 I/O&lt;/strong&gt;：零拷贝文件读取&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;92-架构&#34;&gt;9.2 架构&lt;/h3&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;IndexManager (Actor)
  ├── IndexCommand::Build → 构建完整索引
  ├── IndexCommand::Reindex → 增量重索引
  └── QueryCommand:
      ├── GotoDefinition → 跳转到定义
      ├── GotoReferences → 查找引用
      └── GetFileCount → 轻量统计
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;索引缓存到磁盘，支持跨会话复用。语言注册表支持多种语言，每种语言有自己的 Tree-sitter 查询配置。&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&#34;十编译与许可apache-20-开源的细节&#34;&gt;十、编译与许可：Apache 2.0 开源的细节&lt;/h2&gt;
&lt;h3 id=&#34;101-构建系统&#34;&gt;10.1 构建系统&lt;/h3&gt;
&lt;p&gt;Grok Build 使用 Rust 2024 edition，依赖：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;DotSlash&lt;/strong&gt;：用于管理 protoc 等工具&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;jemalloc&lt;/strong&gt;：生产环境使用 jemalloc 内存分配器&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;多构建 profile&lt;/strong&gt;：&lt;code&gt;release&lt;/code&gt;、&lt;code&gt;release-dist&lt;/code&gt;（LTO+CGU1）、&lt;code&gt;x-prod&lt;/code&gt;（unwind on panic）&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;102-许可&#34;&gt;10.2 许可&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;第一方代码&lt;/strong&gt;：Apache 2.0&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;第三方代码&lt;/strong&gt;：保留原许可证&lt;/li&gt;
&lt;li&gt;包含了来自 OpenAI Codex 和 SST OpenCode 的移植代码，都注明了 Apache §4(b) 变更通知&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;103-已知限制&#34;&gt;10.3 已知限制&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;不接受外部贡献&lt;/strong&gt;（CONTRIBUTING.md 明确说明）&lt;/li&gt;
&lt;li&gt;Windows 构建是 best-effort，未在 CI 中测试&lt;/li&gt;
&lt;li&gt;源码从 xAI 内部 monorepo 定期同步（&lt;code&gt;SOURCE_REV&lt;/code&gt; 文件记录了 monorepo commit SHA）&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2 id=&#34;写在最后&#34;&gt;写在最后&lt;/h2&gt;
&lt;p&gt;Grok Build 的开源，对 AI 编程工具领域有三个深远影响：&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;第一，ACP 协议的推广。&lt;/strong&gt; &lt;code&gt;agent-client-protocol&lt;/code&gt; 作为一个通用规范，在 Grok Build 之后可能成为类似 LSP 在编辑器领域的标准——所有 AI Agent 都通过同一个协议与客户端通信。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;第二，Rust 在 AI Agent 领域的示范。&lt;/strong&gt; 50+ crate、Actor 模式、严格的类型系统、零成本抽象——这是 Rust 在复杂 AI 系统上的最佳实践展示。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;第三，验证机制的工程化。&lt;/strong&gt; 对抗性 skeptic 验证、目标系统、Doom Loop 检测——这些不是学术论文中的概念，而是实打实的生产级代码。&lt;/p&gt;
&lt;p&gt;如果你对 AI Agent 工程感兴趣，&lt;strong&gt;我强烈建议你 clone 下来读一读&lt;/strong&gt;。这不是一个&amp;quot;调 API&amp;quot;的项目，而是 xAI 工程团队在 AI Agent 基础设施上深思熟虑的答卷。&lt;/p&gt;
&lt;p&gt;GitHub 地址：https://github.com/xai-org/grok-build&lt;/p&gt;
</description>
        </item>
        
    </channel>
</rss>
