跟着learn claude code学习shareAI-lab/learn-claude-code: Bash is all you need - A nano claude code--like 「agent harness」, built from 0 to 1
https://github.com/shareAI-lab/learn-claude-code/tree/main
1. Agent循环
1.1 最小心智模型
工具结果必须重新进入消息历史,成为下一轮推理的输入。
user message
|
v
LLM
|
+-- 普通回答 ----------> 结束
|
+-- tool_use ----------> 执行工具
|
v
tool_result
|
v
写回 messages
|
v
下一轮继续
1.2 最小实现
输入messages = [{"role": "user", "content": query}]
python
def agent_loop(state):
while True:
response = client.messages.create(
model=MODEL,
system=SYSTEM,
messages=state["messages"],
tools=TOOLS,
max_tokens=8000,
)
state["messages"].append({
"role": "assistant",
"content": response.content,
})
if response.stop_reason != "tool_use":
state["transition_reason"] = None
return
results = []
for block in response.content:
if block.type == "tool_use":
output = run_tool(block)
results.append({
"type": "tool_result",
"tool_use_id": block.id,
"content": output,
})
state["messages"].append({"role": "user", "content": results})
state["turn_count"] += 1
state["transition_reason"] = "tool_result"
这里面有两个点之前是没注意到的:
1.大模型回复中可能包括多个工具调用tool_use,这里是用tool_use_id将每个工具调用区分开来,将所有工具调用的结果都存放在results中。
2.工具调用的结果是放在user中返回的
接下来我使用claude code中的read和write工具验证一下这个流程:
1.我发现的确是将工具调用的结果放在user的content中返回了,只不过第一次调用Glod查找的是大写的README,所以失败了

2.第二次大模型一次性输出了三个tool_use,包括一个Bash和两个Glob命令,除了Glob:3因为查找的是.md文件而我创建的是txt文件,所以失败了,其他两个都成功检索到了。

3.检索到后大模型又准备调用Read工具读取文件内容,调用Edit工具写入信息。因为Edit是替换旧内容,但是旧内容是大模型自己编的,所以自然就没有找到要替换的字符串,就报错了

4.大模型又调用了一边Edit工具,并且cc的tui界面也做了权限的管控


5.最后也是成功的写入了
