30行代码构建你的第一个AI Agent
"One loop & Bash is all you need" —— 一个工具 + 一个循环 = 一个智能体。
在前一篇文章中,我们理解了 Agent 的本质:Agent 是模型,Harness 是框架。今天,让我们动手构建最简单的 Agent Harness。
只需要 30 行 Python 代码,你就能拥有一个真正能与现实世界交互的 AI Agent。
一、问题:模型被困在象牙塔里
大语言模型能推理代码,但碰不到真实世界——不能读文件、跑测试、看报错。
没有循环,每次工具调用你都得手动把结果粘回去。你自己就是那个循环。
这既不优雅,也不可扩展。我们需要让模型能够自主地与工具交互,形成一个闭环。
二、解决方案:Agent 循环
核心思想很简单:
+--------+ +-------+ +---------+
| User | ---> | LLM | ---> | Tool |
| prompt | | | | execute |
+--------+ +---+---+ +----+----+
^ |
| tool_result |
+----------------+
(loop until stop_reason != "tool_use")
一个退出条件控制整个流程。循环持续运行,直到模型不再调用工具。
三、工作原理
1. 用户 prompt 作为第一条消息
messages.append({"role": "user", "content": query})
2. 将消息和工具定义一起发给 LLM
response = client.messages.create(
model=MODEL, system=SYSTEM, messages=messages,
tools=TOOLS, max_tokens=8000,
)
3. 追加助手响应,检查 stop_reason
messages.append({"role": "assistant", "content": response.content})
if response.stop_reason != "tool_use":
return
如果模型没有调用工具,任务完成。
4. 执行每个工具调用,收集结果,作为 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})
四、完整代码
组装为一个完整函数:
def agent_loop(query):
messages = [{"role": "user", "content": query}]
while True:
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 行,这就是整个智能体。
后面所有复杂的机制(规划、子 Agent、任务系统、团队协作)都是在这个循环上叠加的——循环本身始终不变。
五、核心组件
| 组件 | 作用 |
|---|---|
| Agent loop | while True + stop_reason 检查
|
| Tools | 从 bash 开始,单一工具足矣
|
| Messages | 累积式消息列表,记录完整对话历史 |
| Control flow | stop_reason != "tool_use" 决定退出
|
六、试一试
git clone https://github.com/shareAI-lab/learn-claude-code
cd learn-claude-code
python agents/s01_agent_loop.py
试试这些 prompt:
Create a file called hello.py that prints "Hello, World!"List all Python files in this directoryWhat is the current git branch?Create a directory called test_output and write 3 files in it
你会看到 Agent 自主地调用 Bash 工具,执行命令,读取结果,然后决定下一步做什么,直到任务完成。
七、关键洞察
模型决定什么时候调用工具,什么时候停止。
代码只是执行模型要求做的事。这个循环属于 Agent,机制属于 Harness。
这个看似简单的循环是所有现代 AI Agent(包括 Claude Code、Devin、OpenCode)的基础。无论 Agent 多复杂,核心都是这个循环:
messages[] --> LLM --> response
|
stop_reason == "tool_use"?
/ \
yes no
| |
执行工具 返回文本
追加结果
循环回去 ----------> messages[]
八、下一步
这只是一个开始。在这个基础上,我们将逐步添加:
- 工具扩展:不只 Bash,还有文件读写、代码编辑、搜索
- 规划能力:让 Agent 列步骤再执行
- 子 Agent:大任务拆小,上下文隔离
- 知识加载:按需注入领域知识
- 上下文压缩:处理长对话
- 任务系统:持久化的目标管理
- 团队协作:多 Agent 并行工作
但在那之前,先掌握这个循环。理解它,你就理解了 Agent 的本质。
Bash 就够了。真正的 Agent 是宇宙所需要的全部。
延伸阅读:learn-claude-code 开源项目,12 个渐进式教程,从简单循环到隔离式自主执行。