# 从一个 while 循环开始,搭一个完整的 AI Agent(参考开源项目 learn claude code)
写在前面
这系列文章记录了我拆解 Claude Code 源码的过程。
起因很简单:用了几个月 Claude Code,越用越好奇------它到底是怎么做到"自己写代码、自己跑测试、自己修 bug"的?于是我学习开源项目learn claude code总结了一下自己的学习经验,拆成了 12 个最小可运行的 demo,从最简单的 while + tool_use 开始,一步步搭到多 Agent 团队协作。
全文地图
s01 Agent Loop while + tool_use,一切的起点
s02 多工具 dispatch map,加工具不改循环
s03 待办管理 模型自己列计划,3 轮不更新就催它
s04 子智能体 独立上下文,干完只返回摘要
s05 技能加载 system prompt 放名称,按需加载完整内容
s06 上下文压缩 三层压缩,换个方式"忘记"
s07 持久化任务 任务写磁盘,带依赖关系
s08 后台任务 子线程跑命令,主线程不卡住
s09 团队协作 队友 + JSONL 收件箱
s10 团队协议 request_id 关联的请求-响应握手
s11 自治 队友自己看板抢活,身份重注入
s12 目录隔离 每个任务一个 git worktree
核心洞察
每一步解决一个问题,加一个机制,循环永远不变。
s01 的循环是这样的:
python
while True:
response = LLM(messages, tools)
if response.stop_reason != "tool_use":
break
执行工具 → 结果追加到 messages
s12 的循环还是这样。变的是 tools 列表越来越长,messages 越来越聪明(会压缩、会注入、会重唤醒),但骨架没动过。
这就是 Agent 的本质:一个循环,加上模型能调用的工具。 工具决定了 Agent 能做什么,循环决定了 Agent 能做多久。
从 demo 到产品
这 12 个 demo 覆盖了 Claude Code 的核心机制:
| demo | Claude Code 对应 |
|---|---|
| s01-s02 | 工具系统(Bash、Read、Write、Edit) |
| s03 | TaskCreate / TaskUpdate |
| s04 | Agent 子代理 |
| s05 | Skill 按需加载 |
| s06 | 上下文压缩(auto-compact) |
| s07 | 任务持久化(.tasks/) |
| s08 | 后台任务(BackgroundManager) |
| s09-s10 | 多 Agent 通信 |
| s11 | 自治 Agent + 身份重注入 |
| s12 | Worktree 隔离 |
当然,真实产品比 demo 复杂得多------错误处理、权限控制、安全沙箱、流式输出、UI 交互......但骨架是一样的。
怎么用这些 demo
每个 demo 都能独立运行:
bash
cd agents
python s01_minimal_demo.py # 最小 agent
python s02_minimal_demo.py # 多工具
# ...
python full_demo.py # 完整版
建议从 s01 开始,每个跑一遍,看一遍注释,理解了再往下走。跳步容易迷路。
技术栈
- Python 3.10+
- Anthropic SDK (
anthropic) - 环境变量:
ANTHROPIC_API_KEY、MODEL_ID、ANTHROPIC_BASE_URL(可选)
最后
写这些 demo 的过程中,我最大的感受是:Agent 不是一个模型,是一个系统。模型只是其中一环,真正让 Agent 工作起来的是周围的 harness------工具定义、上下文管理、任务调度、团队通信、目录隔离。
模型决定了 Agent 的上限,harness 决定了 Agent 能不能稳定地接近那个上限。
**如果感兴趣的话欢迎关注我该专栏("learn claude code")我会持续更新