claw0: 从零到一构建 AI Agent 网关
shareAI-lab 出品的 10 章渐进式 Agent 网关教程,约 7000 行 Python,支持中/英/日三种语言。与 learn-claude-code 组成姊妹教程——一个关注 Agent Harness 内核(循环、规划、团队、隔离),一个关注网关路由与主动行为(心跳、Cron、IM 通道、记忆、Soul)。
一句话摘要
从 while True 循环出发,逐层叠加工具调用 → 会话持久化 → 多通道接入 → 网关路由 → 智能层(8 层提示词 + 记忆)→ 心跳 + Cron → 可靠投递 → 弹性重试 → 并发序列化。学完全部 10 节,可以直接阅读 OpenClaw 的生产代码。
五阶段学习路径
每节只引入一个核心概念,前一节的代码原样保留。这种”不改旧代码、只叠新逻辑”的方式让每一步的增量都清晰可见。
| 阶段 | 章节 | 核心概念 | 代码量 |
|---|---|---|---|
| 基础 | s01 Agent Loop | while True + stop_reason——这就是一个 Agent,不需要框架 | ~175 行 |
| s02 Tool Use | 工具 = schema dict + handler map。模型选名字,你查表执行 | ~445 行 | |
| 连接 | s03 Sessions | JSONL 持久化:写入追加,读取重放。太大了就总结旧消息 | ~890 行 |
| s04 Channels | Telegram / 飞书等平台实现不同,但最终都产出同一个 InboundMessage | ~780 行 | |
| s05 Gateway | 5 级绑定表将 (channel, peer) 映射到 Agent,最具体的匹配胜出 | ~625 行 | |
| 智能 | s06 Intelligence | 8 层提示词(系统 → 身份 → 工具 → 记忆 → 技能 → 心跳 → 用户 → 摘要)+ 混合记忆检索 | ~750 行 |
| 自治 | s07 Heartbeat | 定时线程 + Cron 调度。Agent 从被动(等人发消息)变成主动(自检 + 定时任务) | ~660 行 |
| s08 Delivery | 预写投递:先写磁盘再发消息,崩溃也不丢。附带退避机制 | ~870 行 | |
| 生产 | s09 Resilience | 3 层重试洋葱:认证轮换 → 溢出压缩 → 工具循环重试 | ~1130 行 |
| s10 Concurrency | 命名车道 + FIFO 队列 + generation 追踪。同车道不乱序,跨车道真并发 | ~900 行 |
章节依赖关系
s01 → s02 → s03 → s04 → s05
| |
v v
s06 ──→ s07 → s08
| |
v v
s09 ──→ s10
- s01-s02:基础,无依赖
- s03:基于 s02,为工具循环添加持久化
- s04:基于 s03,通道产出 InboundMessage 给会话
- s05:基于 s04,将通道消息路由到 Agent
- s06:基于 s03,使用会话做上下文,叠加提示词层
- s07:基于 s06,心跳使用 Soul + 记忆构建提示词
- s08:基于 s07,心跳输出经由投递队列
- s09:基于 s03+s06,复用 ContextGuard 做溢出层和模型配置
- s10:基于 s07,将单一 Lock 替换为命名车道系统
依赖图揭示了一个重要事实:s06(Intelligence)是整个架构的分水岭。 从 s06 开始,Agent 不再只是一个”循环 + 工具”的骨架,而是有了人格、记忆和上下文组装能力——这恰好对应了 Harness工程 中”Harness 的核心是对上下文的精确控制”这一命题。
各阶段深入
阶段一:基础——比想象中更少的代码就能跑起来
s01 只有约 175 行 Python,核心就是一个 while True 循环 + stop_reason 判断。很多 Agent 教程在介绍概念之前先让你装框架——claw0 的思路相反:先让你看到最裸的 Agent Loop 长什么样,然后每一节只加一个新东西。Agent 概念笔记中讨论的”Agent 的本质是循环”在这里得到了最直接的代码演示。
s02 引入工具调用。设计极简:工具 = schema dict(定义给模型看)+ handler map(定义给程序执行)。模型从 schema 中选了哪个工具名字,程序就查表调用对应的 handler。不需要 MCP 协议、不需要工具注册中心。这一点与 pi-coding-agent 的 4 工具设计思路一致——工具是查表分发,不是框架功能。
阶段二:连接——让 Agent 活在你的日常聊天软件里
s03 用 JSONL 格式做会话持久化——追加写、顺序读,简单到不需要任何数据库依赖。溢出处理也很直接:消息太多?把旧消息发给模型做一次总结,用摘要替代原文。这是 上下文工程 中”上下文压缩”的基础形态。
s04 引入了一个关键的抽象——通道(Channel)。Telegram 的长轮询管线和飞书的 Webhook 回调实现完全不同,但它们最终都产出同一个数据结构 InboundMessage。网关的下游代码完全不关心消息是从哪个平台来的。这种”统一入站消息”的设计是 claw0 架构中最优雅的抽象之一。
s05 的网关路由机制用了一张绑定表(Binding Table),支持 5 级路由精度:从”一个 Agent 处理所有”到”每个用户有自己的 Agent”。规则是最具体的匹配优先(/channel/account/peer),找不到匹配则依次回退——最终保证每条消息一定有一个 Agent 来处理。
阶段三:智能——8 层提示词的组装艺术
s06 是整个教程最核心的章节。它把 System Prompt 拆成了 8 层,在每次对话开始前按规则逐层组装:
- System:全局规则(永远不变的底座)
- Identity:Agent 的身份定义(Soul)
- Tools:当前可用的工具列表
- Memory:从记忆库中检索出的相关记忆
- Skills:已安装的 Skill 说明
- Heartbeat:心跳/定时任务的指令
- User:用户自定义的偏好和规则
- Summary:对话历史的摘要
这种分层设计的关键好处是:换文件就换人格,不需要改代码。 要换一个 Agent 的性格?替换 IDENTITY.md。要加新记忆?写进 MEMORY.md。这与 [Agent Skill](Agent Skill.md) 的设计理念完全一致——能力是文件,不是代码。
记忆检索采用混合策略:语义搜索(向量相似度)+ 全文搜索(关键词匹配),两者结果取并集。既不会漏掉语义相关的记忆,也不会错过精确的关键词命中。
阶段四:自治——Agent 不再等你
s07 和 s08 让 Agent 从一个”等人@它”的被动工具变成”自己会动”的主动服务。
s07 Heartbeat 的核心是一个定时线程,每 N 秒问自己一个问题:“有没有什么该做的事?” 该做的事通过 Cron 表达式和心跳提示词定义。心跳产出的消息和用户消息走完全相同的管线——网关不区分”主动触发”和”被动响应”,统一路由到同一个 Agent。
s08 Delivery 解决了”消息发出去了但对面没收到”的问题。方案是预写投递(Write-Ahead Delivery):先把消息写入磁盘(JSONL),再尝试发送。如果在发送过程中崩溃,重启后从磁盘重新加载队列,继续发送。附带指数退避——发送失败后不等长间隔重试,越失败等越久,避免打爆下游。
阶段五:生产——三层洋葱和命名车道
s09 Resilience 是”让网关扛得住真实世界”的最后一层。3 层重试洋葱(从外到内):
- 认证轮换:API Key 过期或限流?自动切换到下一个 Key
- 溢出压缩:上下文超过模型窗口?自动触发总结压缩,腾出空间
- 工具循环:工具调用失败了?捕获异常、告知模型、让它重新选择工具
每层独立,不会互相干扰——认证问题不会触发上下文压缩,工具失败不会去换 API Key。
s10 Concurrency 解决多用户并发的终极问题。方案是命名车道(Named Lanes):每个用户分配一条车道(Lane),车道内部是 FIFO 队列——同车道的消息严格有序处理,不同车道之间真并发。这保证了两个用户同时发消息不会串,同一用户的两条消息不会乱序。逻辑从简单的”一把全局 Lock”演进到命名车道系统,性能随用户数线性扩展。
与 learn-claude-code 的姊妹关系
claw0 和 learn-claude-code(LCC)是 shareAI-lab 刻意设计的一对互补教程:
| 维度 | claw0 | learn-claude-code |
|---|---|---|
| 核心关注 | 网关路由 + 主动行为 | Agent Harness 内核 |
| 架构层次 | 网关层(Gateway) | 执行层(Harness) |
| 关键机制 | 心跳、Cron、IM 通道、记忆、Soul | 循环、规划、团队、worktree 隔离、三层 compact |
| Agent 角色 | 常驻服务(daemon) | 单次任务执行器 |
| 产物 | 一个可以跑在群聊里的 Agent | 一个可复现的编程 Agent 框架 |
两个教程一起学,覆盖了 Harness工程 和 三层架构(Gateway → Harness → Sandbox)的上两层——网关层和执行层。sandbox(隔离层)在 LCC 的 worktree 隔离中有所涉及,但尚未独立成章。
技术环境
前置要求:Python 3.11+、Anthropic API Key(或兼容服务商)
关键依赖:anthropic(模型调用)、websockets(实时通道)、croniter(Cron 解析)、python-telegram-bot(Telegram 接入)、httpx(HTTP 客户端)
仓库结构:每个语言文件夹自包含——sessions/{en,zh,ja}/ 下各自 10 个 .py + 10 个 .md,代码逻辑跨语言一致,注释和文档因语言而异。
重要引用
“逐章节构建一个最小化 AI Agent 网关。10 个章节,10 个核心概念,约 7,000 行 Python。”
“每节只引入一个新概念,前一节的代码原样保留。”
“大多数 Agent 教程停在’调一次 API’就结束了。这个仓库从那个 while 循环开始,一路带你到生产级网关。”