跳到主要内容

分支① 行动的循环

这条分支补主干的哪块缺口: 原始模型「只跑一次就停」。这条分支把一次模型调用,包成一个**「想 → 做 → 看 → 再决定」的循环**,让模型能连续行动;再往上,管多个 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-pythonRunner.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.pyresult.py)

3.2 多 agent 怎么编排

编排模型协作方式一句话差异代码锚点
crewaiCrews(自治团队)与 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-coreautogen-agentchat)
openai-agents-python/js单 agent + handoff 把控制权交给别的 agenthandoff + 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 工程化栈(语言生态 / 生产配件)

主打一句话差异代码锚点
mastraTS 原生: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.pyRunner)。
  • 要一队 agent 协作crewai(产品化)或 autogen(运行时分层)。
  • 要看「循环里内置自编辑记忆」的完整拆解 → 已写好的子库 doc docs/letta/02-agent-loop.md

Footnotes

  1. letta/agents/letta_agent_v3.py:1979(「调工具则继续、否则停」的终止规则);完整拆解见 docs/letta/02-agent-loop.md 2