以"帮我优化这段代码"为例,展示从用户输入到最终回答的完整链路,涵盖上下文组装、queryLoop、工具执行、记忆回写全过程。
启动时扫描三层文件:
~/.claude/CLAUDE.md 全局规则
/项目/CLAUDE.md 项目规则
/子目录/CLAUDE.md 目录规则
注册所有可用工具(ReadFile、WriteFile、RunBash、WebSearch 等),生成工具描述列表,准备注入 System Prompt。
角色定义
行为规范
工具列表 + Schema
CLAUDE.md 内容
用户档案
近期状态摘要
RAG 检索结果
(用户看不到)
保留最近 N 轮
早期轮次已压缩
工具结果已摘要
"帮我优化
这段代码"
← 用户唯一
可控部分
统计消息包当前 token 总量,预留 LLM 输出空间(按最大值估算),判断是否需要提前压缩。
模型读取完整上下文包,输出以下两种内容之一:
自然语言回复
→ 直接返回给用户
→ 本轮循环结束
tool_use 结构化请求
→ 进入工具执行流程
→ 继续下一步
校验工具 Schema、参数合法性、是否只读、是否危险、是否需要用户确认。
删除文件、执行 Shell、写入等危险操作,用户看到确认弹窗,决定是否授权。
宿主程序真的读文件、跑命令、调 API。最多 10 个工具并发执行。
得到的是真实世界的结果,不是模型脑补。
把执行结果作为 tool_result 加入消息队列,LLM 下一轮能看到真实反馈,再决定下一步。
还有未完成的工具调用
任务未达成
LLM 判断需要更多信息
任务完成
Token 预算耗尽
发生不可恢复的错误
用户中止
LLM 生成的自然语言回复,通过 Ink/React 渲染层展示在终端界面。流式输出,逐字显示。
若对话中出现值得记住的内容(新规则、用户偏好、重要事件),LLM 主动调用 WriteFile 写入 CLAUDE.md,下次会话自动生效。
上下文窗口内的所有内容随会话销毁;只有写入 CLAUDE.md 的内容会跨会话保留。
整个流程里,LLM 只做两件事:判断 + 输出,从不直接接触真实世界。
真正读文件、跑命令、写数据的,是宿主程序的工具层。
产品能力的天花板 = 你给 LLM 组装了什么上下文 + 注册了哪些工具 + 怎么管理记忆。