Claude Code Agent 工作流详解
本文档说明使用 Claude Code 时,从用户输入一条需求开始,到 Agent 调用 LLM、读取上下文、执行工具、修改文件、运行命令、再把结果返回给用户的完整交互过程。
说明:不同版本的 Claude Code、Cursor、MCP 或具体工具实现会有差异,但核心 Agent 工作流大体一致:用户提出目标,Agent 组织上下文,LLM 推理下一步,工具执行外部动作,结果回填给 LLM,循环直到任务完成。
1. 总体架构
Claude Code 可以理解为一个“带工具的 LLM Agent”。LLM 本身只负责理解、推理和生成下一步动作;真正读取文件、搜索代码、执行命令、编辑文件、调用外部系统的是 Agent Runtime 提供的工具层。

2. 核心组成部分
2.1 用户输入
用户输入是整个流程的起点,通常包含:
-
目标:例如“修复这个 bug”“解释这段代码”“帮我写测试”。
-
约束:例如“不要改接口”“用中文回复”“只改当前文件”。
-
上下文引用:例如文件路径、错误日志、PR 链接、截图、终端输出。
-
期望产物:例如代码修改、文档、提交记录、PR 描述、测试结果。
Agent 首先会判断任务类型:是只需要回答问题,还是需要读代码、改文件、运行测试、调用外部服务。
2.2 Agent Runtime
Agent Runtime 是 LLM 和外部世界之间的执行层。它负责:
-
接收用户输入。
-
组装发给 LLM 的上下文。
-
暴露可用工具列表和工具参数 schema。
-
接收 LLM 的工具调用意图。
-
真正执行工具。
-
把工具结果回填给 LLM。
-
管理多轮循环、权限、安全策略和终止条件。
可以把 Runtime 理解成“项目经理 + 执行助理”:LLM 负责判断要做什么,Runtime 负责把动作安全地执行出来。
2.3 上下文管理器
LLM 每次推理都不是只看到用户最新一句话,而是会看到一组被整理后的上下文:
-
系统级规则:例如输出格式、安全边界、工具使用规则。
-
开发者规则:例如代码风格、不能破坏用户已有改动。
-
用户偏好:例如始终用简体中文回复。
-
当前对话历史:包括用户之前的要求、Agent 的操作和工具结果。
-
工作区状态:当前目录、打开文件、诊断信息、终端状态等。
-
项目文件内容:通过读取文件、搜索代码后动态加入。
上下文窗口有限,所以 Agent 会优先保留与当前任务最相关的信息。长任务中,旧信息可能被压缩成摘要。
2.4 LLM
LLM 是推理核心,主要做这些事情:
-
理解用户意图。
-
判断需要哪些上下文。
-
选择下一步动作。
-
生成工具调用参数。
-
根据工具结果继续推理。
-
最终生成对用户可读的结果。
LLM 自己不能直接访问本地文件、运行命令或联网;它必须通过工具层完成这些动作。
2.5 工具层
工具是 Agent 的“手和眼睛”。常见工具包括:
-
文件读取工具:读取源码、配置、日志、文档。
-
搜索工具:按关键字、语义或文件名查找相关代码。
-
编辑工具:创建文件、修改文件、删除文件。
-
Shell 工具:运行测试、构建、脚本、Git 命令。
-
MCP 工具:连接 GitHub、Linear、Slack、数据库、浏览器等外部系统。
-
网络工具:搜索或抓取公开网页内容。
-
Todo 工具:维护多步骤任务进度。
工具调用通常是一个闭环:
-
LLM 决定需要工具。
-
LLM 按工具 schema 生成参数。
-
Runtime 校验权限和参数。
-
Runtime 执行工具。
-
工具返回结构化或文本结果。
-
结果进入下一轮 LLM 上下文。
3. 一次交互的详细过程
下面以“用户要求修改代码”为例,描述一次典型 Agent 工作流。

4. Agent 的循环模型
Agent 的核心不是“一次性回答”,而是一个多轮循环。

这个循环通常会持续到满足以下条件之一:
-
用户目标已经完成。
-
测试或验证通过。
-
缺少必要信息,需要向用户提问。
-
权限不足或工具不可用。
-
出现风险,需要用户确认。
5. 工具调用的内部细节
一次工具调用通常包含以下信息:
{
"tool": "ReadFile",
"arguments": {
"path": "/project/src/app.ts"
},
"reason": "需要查看入口文件以定位初始化逻辑"
}
Runtime 收到后会做几类处理:
-
参数校验:路径、类型、必填字段是否正确。
-
权限检查:是否允许读取、写入、联网、执行命令。
-
沙箱控制:限制危险操作或需要用户批准。
-
执行工具:把请求发送给具体工具实现。
-
结果标准化:把输出整理成 LLM 可以继续理解的文本或结构化数据。
工具结果可能类似:
ReadFile success:
1|import { createApp } from "vue";
2|import App from "./App.vue";
3|createApp(App).mount("#app");
LLM 会基于这些结果继续判断:是否还要读别的文件、是否可以编辑、是否需要运行测试。
6. 上下文如何影响结果
同样一句用户输入,在不同上下文下可能触发不同动作。
例如用户说:
“帮我修一下这个报错。”
如果上下文里有终端报错,Agent 会先分析报错栈;如果当前打开的是测试文件,Agent 可能先读相关实现;如果没有任何线索,Agent 会询问报错内容或主动搜索项目中最近失败的测试。
上下文常见来源包括:
-
用户明确贴出的错误信息。
-
当前打开文件和光标位置。
-
最近修改过的文件。
-
Git diff。
-
终端输出。
-
项目规则文档。
-
已执行工具返回的结果。
7. 示例:修复一个测试失败
假设用户输入:
“运行测试发现登录页测试失败了,帮我修复。”
7.1 第一步:理解任务
Agent 会把任务拆成几个问题:
-
测试失败的具体命令是什么?
-
失败日志在哪里?
-
登录页组件和测试文件在哪里?
-
是测试写错、组件行为变了,还是依赖环境问题?
如果没有足够信息,Agent 通常会先运行测试或搜索测试文件。
7.2 第二步:收集上下文
Agent 可能调用搜索工具:
搜索关键词:login、LoginPage、登录页、auth
找到这些文件:
src/pages/LoginPage.tsx
src/pages/LoginPage.test.tsx
src/services/auth.ts
然后读取相关文件内容,理解组件行为和测试预期。
7.3 第三步:运行测试
Agent 可能调用 Shell:
npm test -- LoginPage
得到失败输出:
Expected button to be enabled
Received button is disabled
这个观察结果会被送回 LLM。LLM 看到测试预期是“输入邮箱和密码后按钮可点击”,但组件当前逻辑可能要求额外勾选协议。
7.4 第四步:定位原因
Agent 继续读取组件代码,可能发现:
const canSubmit = email && password && acceptedTerms;
而测试只填写了邮箱和密码,没有勾选协议。此时有两种可能:
-
产品行为确实要求勾选协议:应修改测试,增加勾选动作。
-
产品行为不应该要求勾选协议:应修改组件逻辑。
Agent 会根据项目上下文、需求文档或现有测试风格判断。如果无法判断,会向用户确认。
7.5 第五步:执行修改
如果判断产品行为是正确的,Agent 会编辑测试:
await user.click(screen.getByRole("checkbox", { name: /同意协议/ }));
expect(screen.getByRole("button", { name: /登录/ })).toBeEnabled();
编辑完成后,工具返回“文件已修改”。这个结果再进入下一轮 LLM。
7.6 第六步:验证
Agent 再次运行:
npm test -- LoginPage
如果测试通过,可能还会运行更大范围验证:
npm test
是否运行全量测试取决于修改范围、项目规模和用户要求。
7.7 第七步:总结给用户
最终回复通常包括:
-
修复了什么。
-
改了哪些行为或文件。
-
运行了什么验证。
-
是否还有风险或未验证内容。
例如:
已修复登录页测试失败。原因是组件当前要求用户勾选协议后才能提交,但测试只填写了邮箱和密码。我更新了测试流程,增加勾选协议步骤。
验证:npm test -- LoginPage 已通过。
8. Agent 为什么会反复读取和验证
一个可靠的 coding agent 不应该只凭猜测改代码。它通常会反复执行:
-
读代码:确认实际实现。
-
搜索调用点:确认影响范围。
-
看测试:确认期望行为。
-
小步编辑:降低破坏范围。
-
跑测试:验证修改是否有效。
-
看 Git diff:确认没有误改。
这就是为什么一次看似简单的需求,Agent 可能会进行多次工具调用。工具调用越充分,最终修改通常越稳。
9. 常见安全与权限边界
Agent 通常会避免或请求确认以下操作:
-
删除大量文件。
-
覆盖用户未提交改动。
-
执行危险 Shell 命令。
-
修改 Git 历史。
-
推送代码到远端。
-
访问需要认证的外部系统。
-
安装依赖或联网执行脚本。
这类边界由系统规则、工具权限、沙箱和用户确认共同控制。
10. 一句话总结
Claude Code 的 Agent 工作流可以概括为:
用户给目标,Agent 组织上下文,LLM 决定下一步,工具执行现实动作,执行结果回到上下文,LLM 继续推理,循环直到完成并总结。
真正关键的是:LLM 不直接“操作电脑”,它通过 Agent Runtime 暴露的工具间接完成文件读取、代码修改、命令执行和外部系统交互。
更多推荐
所有评论(0)