Agent Loop:AI Agent 的唯一直心骨
一句话 :
while True调 LLM,有 tool 就执行、没 tool 就退出。所有 Agent 框架的底层都是这个循环。
一、核心代码(10 行骨架)
python
def agent_loop(messages: list):
while True:
# ① 调 LLM,带上工具定义
response = client.messages.create(
model=MODEL, messages=messages, tools=TOOLS, max_tokens=8000
)
messages.append({"role": "assistant", "content": response.content})
# ② 检查是否调用了工具
tool_calls = [b for b in response.content if b.type == "tool_use"]
if not tool_calls:
return # 没调工具 → 任务完成,break
# ③ 执行工具,收集结果
results = []
for block in tool_calls:
output = run_bash(block.input["command"])
results.append({"type": "tool_result", "tool_use_id": block.id, "content": output})
# ④ 结果喂回 messages,进入下一轮
messages.append({"role": "user", "content": results})
二、四步一判断

| 步骤 | 做什么 | 关键知识 |
|---|---|---|
| ① LLM | create(messages, tools) |
tools 参数告诉模型"你可以调用这些函数",模型在生成时会在内部做 function calling 决策 |
| ② 检查 | 过滤 tool_use 块 |
模型输出是混合内容:text + tool_use。没 tool_use 说明模型认为信息已够,直接给答案 |
| ③ 执行 | subprocess.run() / API / 搜索 |
这一步是同步阻塞的。工具执行期间 LLM 在等待,所以超时控制必须做 |
| ④ 喂回 | messages.append(results) |
把 Observation 以 user 角色塞回对话历史。下一轮 LLM 基于新数据重新推理 |
| 判断 | if not tool_calls: return |
唯一的退出条件。模型自己决定什么时候停,不是外部硬编码 |
三、为什么这个模式是"唯一"的
LangChain 的 AgentExecutor、OpenAI 的 Agents SDK、Anthropic 的 Claude Code、AutoGPT、CrewAI......所有 Agent 框架的底层骨架都是这个 while 循环。区别只在于外围包装:
| 框架 | 在这个循环上加了什么 |
|---|---|
| LangChain | 预置的 Agent 类型(ReAct、Plan-and-Execute)、回调钩子、记忆管理 |
| OpenAI Agents SDK | 内置的 handoffs(多 Agent 路由)、guardrails(输入输出校验) |
| Claude Code | 文件系统感知、git 集成、并行工具调用、权限确认层 |
| AutoGPT | 长期记忆(向量数据库)、目标分解、自主决策 |
剥掉所有包装,剩下的就是这个 10 行循环。 理解它,等于理解了所有 Agent 框架的底层协议。
四、生产必须加的三件事
上面的代码是骨架,上线必须补三块:
1. 最大循环次数(防死循环)
python
for step in range(MAX_STEPS): # 如 10 步
...
else:
raise RuntimeError("Max steps exceeded")
模型可能陷入"搜索 → 没结果 → 再搜索"的循环,必须硬上限。
2. 工具错误结构化返回
python
try:
output = run_bash(cmd)
except Exception as e:
output = f"[ERROR] {type(e).__name__}: {e}"
错误信息以 Observation 喂回,模型能在下一轮 Thought 中自适应修复(换命令、改参数、或承认失败)。
3. 上下文窗口管理
每轮循环追加 Thought + Action + Observation,messages 长度线性增长。长任务必须:
- 设置
max_steps硬上限 - 对历史做滑动窗口或摘要压缩
- 监控 token 用量,接近上限时触发摘要
五、一句话总结
Agent Loop =
while True: llm → check → exec → feed → loop。没有它,Agent 不存在;有了它,外面包什么都只是工程细节。