<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>Nanobot on AI博士 万戈</title>
        <link>https://www.yesmiracle.net/tags/nanobot/</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/nanobot/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>
        
    </channel>
</rss>
