
字节笔记本
2026年10月24日 · 约 9 分钟读完
40 章走完,你已经能从 0 写 Agent 了

本文是《从 0 写 Agent》系列第 40 章。这个系列基于开源项目 agents-go(OpenAI Agents SDK 的 Go 移植版),用 Go 从零实现一个生产级 Agent 运行时;本章讲「结语:你现在已经能从 0 写 Agent 了」。
恭喜,你读完了全系列 40 章。
从第 1 章的 30 行循环,到第 39 章的完整 Web 平台,你走完了"从 0 写 Agent"的全旅程。这一章做个总结,Agent 运行时的 7 个核心设计模式、Go 做 Agent 的优劣、以及下一步学什么。
全书回顾:从循环到平台
| Part | 主题 | 你得到了什么 |
|---|---|---|
| Part 0 | 前言 | 系列地图 |
| Part I | 最小 Agent | 循环、Model 接口、Tool、并发、流式 |
| Part II | 状态记忆 | Session、FileSession 崩溃安全、SQL、分叉压缩、HITL、RunState 序列化、Guardrails |
| Part III | 多 Agent | Handoff、历史处理、NestHandoffHistory、Agent-as-Tool、Lifecycle Hooks |
| Part IV | 模型可观测 | Router、Retry、Fallback、装饰器组合、Tracing 四层、BatchProcessor、Exporter |
| Part V | 工具生态 | MCP、Skills、os.Root、Sandbox 抽象、Docker 纵深防御 |
| Part VI | 完整应用 | agents-server 四层架构、数据库、WebSocket、HITL 端到端、前端、OAuth |
从最简循环到完整平台,这就是"从 0 写 Agent"的全部旅程。

Agent 运行时的 7 个核心设计模式
贯穿全书,反复出现的设计模式:
1. 配置 vs 执行分离
Agent 是静态配置(指令、工具、模型),runner 是动态执行器(持有运行时状态),RunContext 是动态可变状态。配置不可变,执行器管理变化。 这个分离让 Agent 定义可序列化、可配置(存数据库),执行器专注跑循环。
2. 封闭接口 + 私有 marker 方法
Tool.isTool()、RunItem.isRunItem()、StreamEvent.streamEvent(),小写方法让类型集合对本包关闭,强制走构造函数。保证只有包内定义的类型能进入运行时,外部不能造不合规对象。
3. 装饰器模式
Model 接口的 Retry/Fallback/Router 都是装饰器,实现同一接口,包装增强能力,任意组合。这是"能力可组合"的关键,不修改原代码,只包装。
4. 双列表/双视角
generatedItems(模型视角,可被 handoff filter 重写)vs sessionItems(持久化视角,永不重置)。让"模型看到的"和"存储的"分离,各取所需。
5. 错误分层的回喂 vs 中断
- 输入/输出 guardrail:硬失败(跳闸中断)
- 工具错误:默认回喂(模型自愈),关键操作中断
- Sandbox:代码错回喂,基础设施错中断
- "可恢复的错误回喂,不可恢复的错误中断",这是错误处理的统一原则。
6. resume 复用而非重算
HITL 恢复时,复用 InterruptedResponse(不重新调模型)、复用 turn 计数(不重新计轮次)、复用 usage(不重复计 token)。暂停和恢复是确定性的,不产生副作用。
7. 异步不阻塞业务
- Tracing 的 BatchProcessor 后台异步导出
- HTTPExporter 失败静默丢弃
- "telemetry 永远不能反过来搞挂应用",可观测性是 best-effort,不是 critical path。
这 7 个模式不只适用于 agents-go,它们是工业级 Agent 运行时的通用设计原则。 你写自己的 Agent 框架,也会用到这些。
Go 做 Agent:优势与劣势
优势
- 并发模型,goroutine 天然适合多工具并行、流式事件、异步导出。不用 asyncio 满天飞。
- 类型安全,编译期检查工具参数、Agent 配置。减少运行时错误。
- 单二进制部署,后端 + 前端 + SQLite 全在一个文件。运维极致简单。
- 错误处理,显式的 error 返回值,强制处理,比 try/except 严谨。
劣势(诚实说)
- JSON Schema 反射不如 Pydantic,struct tag 啰嗦,复杂 schema 难写。
- 生态不如 Python,AI/ML 库大多 Python,Go 这边少。
- 迭代速度,Go 的类型系统让快速原型比 Python 慢一点(但生产更稳)。
- AI 原生能力,TensorFlow/PyTorch 的 Go 绑定远不如 Python。
结论,Go 做"Agent 运行时/平台/后端"是优秀选择(并发、部署、类型),做"模型训练/数据处理"不是(生态不足)。 agents-go 证明了前者。
下一步学什么
读完全系列,你可以往这些方向深入:
方向一:读 Python SDK 源码
agents-go 是 openai-agents-python 的移植。对比读两个版本的源码,能深刻理解"同一个设计,不同语言怎么表达"。 Python 版的 async/generic(TypeScript 风格)vs Go 版的 goroutine/泛型,对照着看收获巨大。
方向二:研究其他 Agent 框架
- LangGraph(Python),状态图式的 Agent 编排
- CrewAI(Python),角色扮演式多 Agent
- agent-native(TypeScript),defineAction 多端复用
- 对比它们和 agents-go 的设计差异,理解不同取舍
方向三:读《企业级 Agent 平台工程》
前面推荐的 xuxin 那本开源书。agents-go 是"单机 SDK",那本书讲"企业平台",权限、审计、多租户、SLO、成本治理。从 SDK 到企业平台,差距在哪。
方向四:做一个自己的 Agent 项目
最好的学习是动手。用 agents-go(或自己从 0 写)做一个真实项目,客服 Agent、数据分析 Agent、代码助手。真实场景会暴露你看书时想不到的问题。
一句话总结
Agent 不是魔法,是工程。
它的核心就是一个循环,调模型、判断是否调工具、执行工具、回填历史、重复。所有复杂,Session、HITL、Guardrails、Handoff、Tracing、MCP、Sandbox,都是给这个循环加的配件。
理解了循环,你理解了 Agent 的 80%。理解了配件为什么这么设计,你理解了剩下 20%。
读完这 40 章,你应该能:
- 从 0 写一个能跑的 Agent 内核
- 理解任何 Agent 框架(LangChain/CrewAI/Claude Code)的内部机制
- 判断一个 Agent 系统能不能进生产
- 用 Go 做出比 Python 更易部署的 Agent 服务
这些能力,就是"从 0 写 Agent"给你的。
全系列正文到此结束。附录 A-D 提供源码地图、生产化差距、常见问题和术语表。
本文是《从 0 写 Agent》系列第 40 章,案例代码基于开源项目 agents-go(OpenAI Agents SDK 的 Go 移植版)。全系列目录见总览。
