一、前言

上一节课我们实现了最小Agent闭环,其中的while循环就是Agent Loop的雏形。但在工业级项目中(比如Claude Code),简单的while循环远远不够——会出现无限循环、状态同步异常、Token超限、用户强制退出等问题。本节课我们深入拆解Agent Loop的核心设计,结合Claude Code的源码,教你设计一个稳定、高效、可扩展的Agent Loop。

核心结论:Agent Loop是Agent的“骨架”,没有设计好的Loop,再强大的工具和记忆系统,也无法稳定运行。

二、工业级Agent Loop的核心需求

一个能落地的Agent Loop,必须解决以下4个核心问题:

1. 终止条件:什么时候停止循环?(用户退出、任务完成、异常、Token超限);

2. 状态同步:Agent的思考、执行、输出,如何实时同步给用户?(流式输出、进度提示);

3. 异常处理:工具调用失败、网络异常、权限不足时,如何处理?(重试、降级、提示用户);

4. 资源控制:Token、内存、CPU占用,如何避免过度消耗?(Token监控、资源限制)。

三、Claude Code中的Agent Loop实现(源码解析)

Claude Code的Agent Loop核心类是com.claudecode.core.AgentLoop,我们提取核心代码,拆解其设计逻辑(简化版,保留核心流程)。

1. 核心属性(存储循环所需状态)
// Claude Code AgentLoop 核心属性(简化)
public class AgentLoop {
    // 会话记忆(存储历史对话、工具结果)
    private final ConversationMemory memory;
    // Token追踪器(监控Token使用量,防止超限)
    private final TokenTracker tokenTracker;
    // 工具注册中心(管理所有可调用工具)
    private final ToolRegistry toolRegistry;
    // 权限管理器(控制工具调用权限)
    private final PermissionManager permissionManager;
    // 循环终止标志
    private boolean terminated = false;
    // 最大循环轮次(防止无限循环)
    private static final int MAX_LOOP_COUNT = 100;
}
    
2. 核心循环流程(重点)
// 核心循环方法
public void startLoop(String userInput) {
    // 1. 初始化:将用户输入加入记忆
    memory.addUserMessage(userInput);
    int loopCount = 0;

    // 2. 循环主体
    while (!terminated && loopCount < MAX_LOOP_COUNT) {
        loopCount++;
        try {
            // 步骤1:构建上下文(记忆+系统提示+Token检查)
            String context = buildContext();
            // 步骤2:调用LLM推理,获取思考结果和动作指令
            AgentResponse response = llmClient.generateResponse(context);
            // 步骤3:流式输出思考过程(提升用户体验)
            terminalRenderer.renderThinking(response.getThinking());

            // 步骤4:解析动作指令(是否调用工具)
            if (response.isToolCall()) {
                // 4.1 权限校验
                if (!permissionManager.checkPermission(response.getTool())) {
                    terminalRenderer.renderError("权限不足,无法执行该工具");
                    continue;
                }
                // 4.2 调用工具,获取结果
                ToolResult toolResult = toolRegistry.executeTool(response.getTool(), response.getParameters());
                // 4.3 将工具结果加入记忆
                memory.addToolResult(toolResult);
                // 4.4 输出工具执行结果
                terminalRenderer.renderToolResult(toolResult);
            } else {
                // 不调用工具,直接输出AI回复,终止循环
                terminalRenderer.renderFinalResponse(response.getContent());
                terminate();
            }

            // 步骤5:检查Token是否超限,若超限则触发压缩
            if (tokenTracker.isOverThreshold()) {
                contextCompressor.compress(memory);
            }

        } catch (Exception e) {
            // 异常处理:输出错误信息,重试1次后继续
            terminalRenderer.renderError("执行异常:" + e.getMessage() + ",将重试");
            if (loopCount > 3) {
                terminalRenderer.renderError("连续3次异常,终止任务");
                terminate();
            }
        }
    }

    // 3. 循环结束:处理收尾工作
    if (loopCount >= MAX_LOOP_COUNT) {
        terminalRenderer.renderError("达到最大循环轮次,终止任务");
    }
    memory.saveSession(); // 保存会话
}

// 终止循环
private void terminate() {
    this.terminated = true;
}
    

四、关键设计点详解(避坑重点)

1. 终止条件设计(避免无限循环)

Claude Code采用“双重保险”:

- 主动终止:任务完成(输出最终回复)、用户强制退出(Ctrl+D)、异常终止;

- 被动终止:最大循环轮次(MAX_LOOP_COUNT=100),防止因LLM推理异常导致无限循环。

实操建议:你的Agent Loop也需要设置最大轮次,根据任务复杂度调整(比如简单任务设20,复杂任务设100)。

2. 状态同步:流式输出与实时反馈

用户使用Agent时,最忌讳“等待太久”。Claude Code通过两个设计提升体验:

- 思考过程流式输出:LLM生成思考内容时,逐token输出,让用户知道Agent在“做事”;

- 工具执行状态反馈:工具调用过程中,输出进度(比如“正在读取文件...”“正在执行Shell命令...”)。

3. 异常处理:重试与降级

工业级Agent必须能应对异常,Claude Code的处理逻辑:

- 轻微异常(如工具调用超时):自动重试1次;

- 连续异常(3次及以上):终止任务,提示用户;

- 权限异常:直接拒绝执行,提示用户权限不足。

4. 资源控制:Token监控与压缩触发

LLM的Token有上限(比如GPT-4o是128k),Agent Loop中必须实时监控Token使用量:

- TokenTracker实时统计上下文长度;

- 达到阈值(Claude Code中是93%),自动触发上下文压缩(下一节课详解)。

五、实操练习:改造上节课的最小Agent Loop

结合本节课所学,改造第01课的最小Agent,添加终止条件、异常处理、状态同步,让它更接近工业级标准。

六、本课重点总结

1. Agent Loop的核心是“稳定循环+可控终止”,解决无限循环、异常、资源浪费三大问题;

2. 工业级Loop必须包含:上下文构建、LLM推理、动作解析、工具执行、异常处理、资源监控6个核心步骤;

3. 关键避坑点:设置最大循环轮次、实时状态同步、异常重试降级、Token监控。

下节课预告

第03课:上下文管理与Token控制——Agent的“短期记忆”如何设计,如何避免上下文过长、关键信息遗忘,对应Claude Code的ConversationMemory和TokenTracker源码解析。

Logo

这里是“一人公司”的成长家园。我们提供从产品曝光、技术变现到法律财税的全栈内容,并连接云服务、办公空间等稀缺资源,助你专注创造,无忧运营。

更多推荐