【从零手写 ClaudeCode:learn-claude-code 项目实战笔记】(1)The Agent Loop (智能体循环)

简介: 本专栏精讲AI智能体核心——Agent Loop循环机制,基于开源项目learn-claude-code,用不到50行Python代码实现ReAct范式(思考→行动→观察)。含逐行中文注释、踩坑记录与Bash工具实战,助新手快速入门AI Agent开发。(239字)

第一章 The Agent Loop (智能体循环)

[ s01 ] s02 > s03 > s04 > s05 > s06 | s07 > s08 > s09 > s10 > s11 > s12

“本专栏基于开源项目 learn-claude-code 的官方文档。原文档非常硬核,为了方便像我一样的新手小白理解,我对文档进行了逐行精读,并加入了很多中文注释、大白话解释和踩坑记录。希望这套‘咀嚼版’教程能帮你推开 AI Agent 开发的大门。”

项目地址:shareAI-lab/learn-claude-code: Bash is all you need - A nano Claude Code–like agent, built from 0 to 1

"One loop & Bash is all you need" -- 一个工具 + 一个循环 = 一个智能体。

一、问题

语言模型能推理代码, 但碰不到真实世界 -- 不能读文件、跑测试、看报错。没有循环, 每次工具调用你都得手动把结果粘回去。你自己就是那个循环。

二、解决方案

+--------+      +-------+      +---------+
|  User  | ---> |  LLM  | ---> |  Tool   |
| prompt |      |       |      | execute |
+--------+      +---+---+      +----+----+
                    ^                |
                    |   tool_result  |
                    +----------------+
                    (loop until stop_reason != "tool_use")

一个退出条件控制整个流程。循环持续运行, 直到模型不再调用工具。s01_agent_loop.py 所做的事情,就是用不到 50 行代码,把你自己这一部分给自动化了。

这就是经典的 ReAct (Reasoning and Acting) 范式:让 AI 边思考边行动的交互模式,让大语言模型能够像人类一样推理→行动→观察→再推理,逐步解决复杂问题。

┌─────────────┐     ┌─────────────┐     ┌─────────────┐     ┌─────────────┐
│   Thought   │ ──→ │    Action   │ ──→ │ Observation │ ──→ │   Thought   │
│   (思考)     │     │    (行动)    │    │   (观察)     │     │  (再思考)    │
└─────────────┘     └─────────────┘     └─────────────┘     └──────┬──────┘
                              任务完成 ←────────────────────────────┘
                              给出答案

三、工作原理

  1. 用户 prompt 作为第一条消息。
messages.append({"role": "user", "content": query})
  1. 将消息和工具定义一起发给 LLM。我们定义的TOOLS的列表,这就像是一本“工具使用手册”,你把它作为输入的一部分喂给了大模型。
response = client.messages.create(
    model=MODEL, system=SYSTEM, messages=messages,
    tools=TOOLS, max_tokens=8000,
)
  1. 追加助手响应。检查 stop_reason -- 如果模型没有调用工具, 结束。
messages.append({"role": "assistant", "content": response.content})
if response.stop_reason != "tool_use":
    return
  1. 执行每个工具调用, 收集结果, 作为 user 消息追加。回到第 2 步。
results = []
for block in response.content:
    if block.type == "tool_use":
        output = run_bash(block.input["command"])
        results.append({
            "type": "tool_result",
            "tool_use_id": block.id,
            "content": output,
        })
messages.append({"role": "user", "content": results})
  1. 组装为一个完整函数:
def agent_loop(query):
    messages = [{"role": "user", "content": query}]
    while True: # 循环开始,理论上可以无限跑
      # ... 这里是 LLM 思考的过程 ...
        response = client.messages.create(
            model=MODEL, system=SYSTEM, messages=messages,
            tools=TOOLS, max_tokens=8000,
        )
        messages.append({"role": "assistant", "content": response.content})
    
    # ... 这里就是那个“唯一的退出条件” ... 
        if response.stop_reason != "tool_use":
            return
        results = []
        for block in response.content:
            if block.type == "tool_use":
                output = run_bash(block.input["command"])
                results.append({
                    "type": "tool_result",
                    "tool_use_id": block.id,
                    "content": output,
                })
        messages.append({"role": "user", "content": results})

不到 30 行, 这就是整个智能体。后面 11 个章节都在这个循环上叠加机制 -- 循环本身始终不变。

四、变更内容

组件 之前 之后
Agent loop (无) while True + stop_reason
Tools (无) bash (单一工具)
Messages (无) 累积式消息列表
Control flow (无) stop_reason != "tool_use"

五、试一试

想要跑通之前记得不要忘记了添加.env文件哦。

cd learn-claude-code
python agents/s01_agent_loop.py

试试这些 prompt (英文 prompt 对 LLM 效果更好, 也可以用中文):

  1. Create a file called hello.py that prints "Hello, World!"
  2. List all Python files in this directory
  3. What is the current git branch?
  4. Create a directory called test_output and write 3 files in it

六、其他

block长什么样?

将block打印出来,也就是response.content,它是ToolUseBlock 对象

ToolUseBlock( 
  id='bash_0', # 工具调用唯一标识符 
  caller=None, # 调用者信息(教学版中为None) 
  input={'command': 'echo \'print("Hello, World!")\' > hello2.py'}, # ← 核心参数 
  name='bash', # 工具名称 
  type='tool_use' # 块类型 
  )
目录
相关文章
|
6月前
|
存储 人工智能 Shell
【从零手写 ClaudeCode:learn-claude-code 项目实战笔记】(3)TodoWrite (待办写入)
本章详解 s03 版本 TodoWrite 机制:通过 `todo` 工具+`TodoManager` 实现显式任务状态管理(pending/in_progress/completed),强制单任务聚焦;并引入“nag 提醒”——连续3轮未更新待办时自动注入提醒,解决大模型长链路任务健忘问题。代码精简可运行。
1121 3
|
6月前
|
人工智能 安全 Shell
【从零手写 ClaudeCode:learn-claude-code 项目实战笔记】(2)Tool Use (工具使用)
本章详解如何为AI Agent添加专用工具(如read/write/edit_file),通过dispatch map机制实现“加工具只加handler”,无需改动主循环;引入safe_path路径沙箱提升安全性与鲁棒性,告别bash滥用。配套代码清晰易懂,新手友好。
1787 1
|
6月前
|
人工智能 JSON 安全
【从零手写 ClaudeCode:learn-claude-code 项目实战笔记】(9)Agent Teams (智能体团队)
本章构建持久化智能体团队,解决一次性子智能体和哑后台任务的问题。每个队友拥有独立线程与 LLM 循环,通过 JSONL 文件邮箱实现跨轮通信;TeammateManager 维护团队名册与生命周期,MessageBus 提供线程安全的消息收发,支持并行协作、任务分派与状态同步,为大型项目多 Agent 协同奠定基础。
1463 4
|
6月前
|
人工智能 前端开发 Java
【SpringAIAlibaba新手村系列】(4)流式输出与响应式编程
本文围绕 Spring AI 中的流式输出与响应式编程展开,重点解释了传统一次性响应与流式返回的差异,以及 Flux 在异步数据流中的核心作用。文章结合 ChatModel.stream() 与 ChatClient 的多种代码示例,说明如何实现 AI 内容的边生成边返回,并帮助读者理解流式调用在用户体验、性能和长文本场景中的实际价值。
1767 4
【SpringAIAlibaba新手村系列】(4)流式输出与响应式编程
|
6月前
|
存储 JSON 开发工具
【从零手写 ClaudeCode:learn-claude-code 项目实战笔记】(12)Worktree + Task Isolation (Worktree 任务隔离)
本章引入 Git worktree 实现任务隔离:为每个任务分配独立目录与分支,通过任务 ID 双向绑定控制平面(`.tasks/`)与执行平面(`.worktrees/`),配合事件总线记录全生命周期,解决多任务并发修改冲突问题,提升可恢复性与可观测性。
820 0
|
6月前
|
JSON 人工智能 Shell
【从零手写 ClaudeCode:learn-claude-code 项目实战笔记】(7)Task System (任务系统)
本章详解任务系统(s07):将内存中扁平待办升级为磁盘持久化的有向无环任务图(DAG),支持依赖(blockedBy/blocks)、状态流转(pending→in_progress→completed)与自动解锁,成为多Agent协作的调度骨架。
832 1
|
NoSQL Java 关系型数据库
【AgentScope Java新手村系列】(5)记忆与会话管理
记忆与会话管理 — AgentState 管理上下文窗口,AgentStateStore 持久化,RuntimeContext.sessionId 隔离多用户会话。
655 0
|
前端开发 NoSQL Java
【AgentScope Java新手村系列】(2)第一个Agent-基础对话
第一个Agent-基础对话 — 演示 HarnessAgent 的 Builder 模式创建、ReAct 推理循环、流式事件与思考模式三个核心能力。
901 2
|
6月前
|
消息中间件 人工智能 安全
【从零手写 ClaudeCode:learn-claude-code 项目实战笔记】(8)Background Tasks (后台任务)
本节详解s08后台任务机制:通过守护线程异步执行`npm install`等耗时命令,用线程安全通知队列将结果注入LLM调用前的上下文,实现“边跑边想”。含完整代码、踩坑注释与实操示例,助新手理解AI Agent并发设计核心。
1177 0
|
6月前
|
人工智能 Shell 开发工具
【从零手写 ClaudeCode:learn-claude-code 项目实战笔记】(5)Skills (技能加载)
本文介绍AI Agent的技能加载机制,解决系统提示词臃肿问题。通过两层设计:系统提示只保留技能名称(低成本),需要时通过tool_result按需加载完整内容。SkillLoader扫描skills目录下的SKILL.md文件,解析YAML元数据,实现渐进式知识披露,大幅节省token消耗。
2297 1

热门文章

最新文章