分支① 行动的循环
这条分支补主干的哪块缺口: 原始模型「只跑一次就停」。这条分支把一次模型调用,包成一个**「想 → 做 → 看 → 再决定」的循环**,让模型能连续行动;再往上,管多个 agent 怎么协作编排。这是 agent 之所以是 agent 的最小内核,其余五条分支都是给这个循环加能力。
1. 这条分支是什么(第一性原理)
一个原始 LLM 调用是这样:给它一段文字(提示),它吐一段文字。就这一下,完了。
要让它变成「agent」,只需加一个循环和工具:
┌───────────────────────── agent 循环(最小内核) ─────────────────────────┐
│ │
│ 1. 组装上下文(系统提示 + 历史 + 新消息 + 可用工具的定义) │
│ │ │
│ ▼ │
│ 2. 调模型 ── 模型要么「直接回话」,要么「请求调某个工具」 │
│ │ │
│ ┌─────────────┴─────────────┐ │
│ ▼ ▼ │
│ 3a. 调了工具:执行它、 3b. 没调工具: │
│ 把结果塞回上下文 ──► 回到第 1 步 收尾、结束循环 │
│ │
└──────────────────────────────────────────────────────────────────────────┘
这个循环就是全部秘密。「调了工具就继续、没调工具就停」几乎是所有 agent 框架共享的终止规则(letta v3 写得最直白1)。分支里的库,差别全在这个循环被做成什么形状、以及多个这样的循环怎么拼在一起。
2. 分支内有哪几种做法(流派)
行动的循环
│
┌────────────┼───────────────┬─────────────────────┐
▼ ▼ ▼ ▼
极简循环 图状有状态 多 agent 团队 第一方/工程化 SDK
「内核多小」 「可中断可回放」 「谁跟谁协作」 「标准化的循环形状」
mini-swe langgraph crewai / autogen openai-agents-* /
nanobot agno / clawteam pydantic-ai / mastra
vercel-ai-sdk / adk / goose
- 极简循环派:把循环压到极致,用来证明内核有多小、哪些东西是可砍的。
- 图状有状态派:把循环显式画成图,加上检查点、中断、回放——为长跑、可恢复、人在环里。
- 多 agent 团队派:一个循环不够,多个专精 agent 怎么分工、交接、群聊。
- 第一方/工程化 SDK 派:厂商或工程团队给出的「标准循环形状」,带 handoff、guardrail、类型安全、流式 UI 等生产配件。
3. 对比矩阵(子库区别,逐格接地)
3.1 循环本身怎么做
| 库 | 循环的形状 | 终止/继续规则 | 一句话差异 | 代码锚点 |
|---|---|---|---|---|
| mini-swe-agent | 极简 while 循环,只有「模型 + bash」 | 模型输出里没有命令就停 | 砍到一个文件、~100 行,证明内核多小;每条命令开新 subprocess(无常驻 shell) | src/minisweagent/agents/default.py:38 DefaultAgent,:88 run,:96 while,:124 step |
| nanobot | 极小核 + 工具注册表 + 渠道连接器 | 同「调工具则继续」 | 极简但带聊天平台渠道,面向「个人 agent」 | (TODO: 待 nanobot 子库 doc;克隆 nanobot/ agent core) |
| openai-agents-python | Runner.run 驱动的循环,带 max_turns 上限 | 产出最终 output 或超出 turn 上限 | 第一方最小但可生产的参考循环 | src/agents/run.py:197 Runner,:199 run,:205 max_turns |
| langgraph | 把循环建成状态图(节点=步、边=转移) | 由图的边/条件决定,可在节点处中断 | 唯一把循环显式做成可检查点、可中断、可时间旅行的图 | (TODO: 待 langgraph 子库 doc;libs/checkpoint* 后端) |
| letta | 工具驱动主循环 + 三层记忆 | 调工具继续、没调工具停(v3) | 循环里内置「自编辑记忆」工具,见分支③ | docs/letta/02-agent-loop.md1 |
| pydantic-ai | 类型化 agent,工具/输出都带类型校验 | 输出通过类型校验即停,校验失败可重试 | 把「结构化输出 + 校验重试」做进循环 | (TODO: 待 pydantic-ai 子库 doc;pydantic_ai_slim/pydantic_ai/_output.py、result.py) |
3.2 多 agent 怎么编排
| 库 | 编排模型 | 协作方式 | 一句话差异 | 代码锚点 |
|---|---|---|---|---|
| crewai | Crews(自治团队)与 Flows(事件驱动) | 角色/目标/背景故事 + 任务分配;顺序或层级 process | 「一队专家」的产品化形状;Crews vs Flows 是核心 API 分水岭 | (TODO: 待 crewai 子库 doc;monorepo 包在 lib/crewai/) |
| autogen | 事件驱动运行时(autogen-core)+ 高层团队(agentchat) | 群聊:selector / round-robin / handoff | 把「运行时」和「高层团队 API」分层;跨语言(Py/.NET) | (TODO: 待 autogen 子库 doc;python/packages/autogen-core、autogen-agentchat) |
| openai-agents-python/js | 单 agent + handoff 把控制权交给别的 agent | handoff + input/output guardrail | 第一方:把「交接 + 护栏」做成一等公民 | src/agents/handoffs/__init__.py(py;Handoff 类、handoff() 工厂);packages/(js) |
| agno | 高性能多 agent 平台(agents/teams/workflows) | 团队协作模式 + 内置运行时 AgentOS | 主打实例化性能(微基准),非 LangChain 血统 | (TODO: 待 agno 子库 doc;libs/agno/) |
| hkuds-clawteam | 研究级协作团队 | 在共享代码库/工件上协调、定轮次避免冲突 | 学术视角:协作结果与产品框架宣传的分歧 | (TODO: 待 hkuds-clawteam 子库 doc) |
3.3 工程化栈(语言生态 / 生产配件)
| 库 | 主打 | 一句话差异 | 代码锚点 |
|---|---|---|---|
| mastra | TS 原生:agents + 工作流(suspend/resume)+ 内置记忆 | TS 全家桶,模型层建在 Vercel AI SDK 上 | (TODO: 待 mastra 子库 doc;packages/、stores/) |
| vercel-ai-sdk | 供应商无关的模型抽象 + 流式 UI 协议 | 偏「模型/流式」底座,常是 mastra 等的下层 | (TODO: 待 vercel-ai-sdk 子库 doc;packages/ai) |
| google-adk-python | 代码优先 agent + 内置评测 + Vertex 部署 + 原生 A2A | 绑 Google 栈(Gemini/Vertex);自带评测见分支⑥ | (TODO: 待 google-adk-python 子库 doc;src/google/adk/) |
| goose | 本地优先、模型无关运行时(CLI/桌面/API),MCP 原生 | 扩展=MCP server;recipe 打包可复用工作流;亦属分支④ | (TODO: 待 goose 子库 doc;crates/goose*) |
4. 模式与权衡
- 循环越薄越透明,越厚越省事。 mini-swe-agent 一个文件让你看清内核,但生产要的重试、并发、持久化得自己加;langgraph/SDK 帮你扛下来,代价是更多概念与依赖。
- 「调工具则继续」是共识,但「何时强制停」各异。 SDK 普遍靠
max_turns兜底(openai-agents 的MaxTurnsExceeded),图状框架靠图结构控制,极简循环靠「模型不再发命令」。 - 多 agent 不是越多越好。 crewai/autogen 提供团队编排,但 hkuds-clawteam 这类研究提醒:协调开销、冲突、轮次协议是真成本,单 agent + 好工具常常够用。
- 状态归谁管要早定。 langgraph 的 checkpointer、letta 的 server 状态都是「参考模式」,别不假思索把它当强依赖嫁接到自己已有的状态模型上(两库的卡片都明确这点)。
5. 趋势
- 从「手搓循环」收敛到「第一方 SDK 形状」:handoff + guardrail + session + tracing 正成为事实标准词汇(openai-agents 的 py/js 双实现在带头)。
- 图/可恢复执行上行:长跑、人在环、可中断成为刚需,langgraph 的 checkpoint、pydantic 的 durable execution、mastra 的 suspend/resume 都在往这走。
- MCP 成为默认扩展口:goose 把「扩展=MCP server」做成核心理念,工具接入正从框架私有 API 转向协议(详见姊妹货架 ai-protocol-reference)。
6. 代表作 + 深入
- 想用一个文件彻底看懂 agent 内核 → mini-swe-agent(
src/minisweagent/agents/default.py先读这一个文件)。 - 想要工业级、可中断、可回放的循环 → langgraph。
- 要第一方、最小但可生产的循环 + 交接/护栏 → openai-agents-python(
src/agents/run.py的Runner)。 - 要一队 agent 协作 → crewai(产品化)或 autogen(运行时分层)。
- 要看「循环里内置自编辑记忆」的完整拆解 → 已写好的子库 doc
docs/letta/02-agent-loop.md。