把 Claude Code 拆到最底层,它的核心其实是一个极简的 while 循环:接收输入 → 模型判断下一步 → 调用工具执行 → 把结果喂回模型 → 重复直到模型不再发出工具调用。Anthropic 官方文档把它称为「包裹在 LLM 外面的 Agentic harness」——模型是大脑,harness 提供工具、上下文管理与执行环境;二者组合才是「能干活的 Agent」,单独哪一边都跑不起来。
一、Agentic Loop 的最小骨架
Agentic Loop 之所以被称为「循环」,是因为它让模型能根据工具的真实输出来调整下一步动作。下图是社区公认的最小实现,写下来不到 20 行:
conversation = [system_prompt, user_message]
while True:
response = model(conversation) # 模型思考
conversation.append(response)
if response.has_tool_calls:
results = run(response.tool_calls) # harness 真正动手
conversation.append(results) # 结果回喂
else:
break # 模型结束思考,输出最终答案
每一轮循环都把「到目前为止的完整对话」重新喂给模型。模型看到的是:用户最初的请求、自己之前调过的工具、每个工具的返回结果,再决定下一步是再调一个工具还是直接给答案。这条回路把模型从「只能生成文本」升级成「能在真实环境里持续操作」。
二、模型与工具的角色边界
模型和工具在同一循环里的分工是严格互补的。把它们各自的职责列清楚,工程上才不会混淆「该让 LLM 做」和「该让程序做」。
| 维度 | 模型(Models) | 工具(Tools) |
|---|---|---|
| 本质能力 | 读懂意图、规划步骤、产出结构化输出 | 执行具体动作:读文件、跑命令、查数据库 |
| 输入 | 完整对话历史 | 模型发出的结构化调用请求 |
| 输出 | 文本回复或 tool_use 调用 |
真实副作用 + 结果回填到对话 |
| 错误来源 | 推理偏差、上下文不足 | 权限拒绝、超时、命令不存在 |
| 状态 | 无状态,每轮从对话重读 | 进程内可变,可能有副作用 |
| 数量 | 通常 1 个主模型 | 多个,可由 MCP 动态扩展 |
模型决定「接下来做什么」,但它无法自己动手——它不能直接打开文件、跑 shell、调 HTTP。工具负责「把模型想做的事真的做完」,但工具本身没有判断力,只按照模型传来的参数执行。结果反馈给模型后,模型再决定下一步,整个系统才「活」起来。
三、为什么强调 Claude Code 是 Agentic Harness
「harness」一词强调的是「围绕模型的工程化外壳」。Claude Code 文档中明确写到,它是为软件工程场景定制的 harness,给模型提供程序员日常使用的工具集合,并加上权限、上下文、IDE 桥接等支撑。设计哲学可总结为「保持循环简单,把投资放在 harness 上」。
Claude Code 的工程复杂度不在循环本身,而在循环周围的五大子系统:
| 子系统 | 关键职责 | 典型实现 |
|---|---|---|
| 工具系统 | 注册、调度 30+ 内置工具;MCP 动态扩展 | Bash、Read、Edit、Grep、WebFetch |
| 权限门控 | 每个工具独立的允许/询问/拒绝策略 | 危险命令前弹出确认 |
| 上下文管理 | 窗口接近上限时多级压缩 | 清理旧工具输出 → 摘要历史 → 持久化到磁盘 |
| 子 Agent 调度 | 受限深度委派子任务,防止递归失控 | 子 Agent 不再生子 Agent |
| IDE / CLI 桥接 | 与 VS Code、JetBrains 双向通信 | bridge 模块 |
正是这些子系统,让 Claude Code 不止是一个「会调工具的 LLM」,而是一个「可被工程师托付日常编码任务」的产品。模型在中心提供推理能力,harness 围绕它提供可执行环境、安全边界、长流程稳定性——这就是官方把 Claude Code 称作「围绕 Claude 模型构建的 agentic harness」的根因。
四、循环稳定运行的两条工程经验
「工具调用失败」是循环里最常见的异常。Claude Code 的做法不是让模型硬扛,而是给 harness 配四层恢复:
- PTL(Prompt Too Long)恢复:上下文快满时主动压缩;
- 输出超限恢复:工具结果超长时切片回填;
- 模型过载回退:上游接口 5xx 时按指数退避重试;
- 工具错误自然恢复:让模型从错误信息推理下一步。
另一个常见踩坑是「循环不收敛」——模型反复调同一工具但拿不到想要的结果。工程上需要给循环加最大步数或时间预算上限,触顶后强制让模型总结现状并向用户求助,而不是无限重试。
到这里,agentic loop 中模型与工具的角色分工就比较清楚了:模型做决策,工具执行动作,harness 把它们装进一个能稳定跑几十分钟的闭环。Claude Code 之所以强调「围绕 Claude 模型构建的 agentic harness」,是因为价值不在模型本身,而在循环周围那套被精心打磨的工具、权限、上下文与恢复机制。
常见问题(FAQ)
Q1:模型能直接读写文件吗?
不能。模型只产出结构化调用请求,由 harness 中的工具实际执行 I/O。
Q2:Agentic Loop 和普通对话有什么区别?
普通对话一轮就结束;Agentic Loop 会让模型多次调用工具,直到模型不再发出工具调用才退出。
Q3:为什么不直接用大模型做所有事?
大模型只能生成文本,不能保证真实执行;harness 把模型推理与外部副作用桥接起来,才能形成可用的 Agent。