一个 while True 循环,为什么可以成为 Agent 的起点?
本文是「从零理解 Claude Code20 个 Agent Harness 机制」系列的第 2 篇。源码仓库shareAI-lab/learn-claude-codeClaude Code 能读文件、跑命令、改代码看起来像是一个住在终端里的开发者。但把它最核心的逻辑抽出来代码其实不到 30 行。没有任务编排没有工作流画布没有多 Agent也没有什么神秘提示词。它做的事情很直接模型要调用工具 → 程序执行工具 → 把结果交回模型 → 模型决定是否继续把这段过程写成代码就是一个while True。这一篇不讨论复杂架构只把这件事讲明白模型为什么会调用工具、工具结果为什么还要发回模型、循环又是怎么停下来的。一、模型会写命令为什么还不算 Agent先看一个很普通的需求列出当前目录下的 Python 文件然后运行 demo.py。如果把这句话发给普通聊天模型它通常知道该怎么做find.-name*.py但它把命令写出来后任务就中断了。因为模型没有终端也没有文件系统。它不能亲自执行这条命令更看不到命令输出。接下来只能由人接手复制模型给出的命令打开终端执行复制输出结果粘贴回聊天框等模型给出下一步。如果模型接着要求运行python demo.py人就再做一遍。这时模型负责思考终端负责执行人负责在两者之间传递信息。最小 Agent Loop 的作用就是把这段人工操作交给程序。二、先看最终代码这一章的核心代码如下defagent_loop(messages):whileTrue:responseclient.messages.create(modelMODEL,systemSYSTEM,messagesmessages,toolsTOOLS,max_tokens8000,)messages.append({role:assistant,content:response.content,})ifresponse.stop_reason!tool_use:returnresults[]forblockinresponse.content:ifblock.typetool_use:outputrun_bash(block.input[command])results.append({type:tool_result,tool_use_id:block.id,content:output,})messages.append({role:user,content:results,})先不用急着逐行看。这段代码只有一个判断ifresponse.stop_reason!tool_use:return模型没有调用工具就结束。模型调用了工具就执行工具把结果追加回消息列表再重新请求模型。整个循环的控制权并不在程序手里而在模型手里。三、第一步模型不是直接执行命令而是请求工具模型回复时可能返回普通文本也可能返回工具调用。例如模型希望搜索 Python 文件它返回的不是终端输出而是一份工具调用请求工具名称bash 参数 { command: find . -name \*.py\ }程序从模型响应中取出工具参数forblockinresponse.content:ifblock.typetool_use:outputrun_bash(block.input[command])这里真正执行命令的是run_bash。outputrun_bash(block.input[command])模型负责说自己想做什么程序负责真正调用 Shell。这个边界很重要。角色工作模型决定调用什么工具、传什么参数程序执行工具调用Shell在操作系统中执行命令工具结果把真实环境的反馈带回模型模型不是直接拥有电脑权限而是通过工具请求间接影响环境。四、第二步工具执行完为什么还要再发回模型命令执行以后程序可以拿到输出。例如find.-name*.py返回./demo.py ./hello.py这份结果不能只打印在终端里。模型必须看到它才能知道下一步应该怎么做。所以代码会把工具结果包装成tool_resultresults.append({type:tool_result,tool_use_id:block.id,content:output,})然后追加到messagesmessages.append({role:user,content:results,})这里的tool_use_id用来把结果和之前那次工具调用对应起来。模型之前说的是我要调用 bash执行 find . -name *.py程序返回时相当于在说你刚才请求执行的那条命令结果在这里。如果没有这一步模型就不知道命令到底有没有成功也不知道输出内容是什么。五、messages里保存的是整个执行现场第一次调用模型前消息列表里只有用户任务messages[{role:user,content:列出当前目录下的 Python 文件然后运行 demo.py。}]随着循环继续messages会不断追加内容。最终它大致会记录成这样用户列出当前目录下的 Python 文件然后运行 demo.py。 助手调用 bash 命令find . -name *.py 工具结果 ./demo.py ./hello.py 助手调用 bash 命令python demo.py 工具结果 Hello, World!下一轮请求模型时这些内容会一起发送。因此模型不是凭空知道demo.py存在也不是凭空知道程序已经运行成功。它是通过前面工具返回的结果一步一步获得环境信息。这也是为什么 Agent 不只是一次 API 调用。一次 API 调用只会产生一段回答Agent Loop 会让模型根据新信息持续更新下一步动作。六、一次完整任务是怎么跑完的还是看运行demo.py这个任务。第 1 轮搜索文件模型调用find.-name*.py程序执行命令后返回./demo.py ./hello.py模型看到结果知道目标文件存在。第 2 轮运行程序模型继续调用python demo.py程序执行后返回Hello, World!模型看到输出知道程序已经正常运行。第 3 轮结束任务这时模型不再需要工具直接回复当前目录中找到了 demo.py程序已成功运行输出为 Hello, World!由于这一轮没有工具调用response.stop_reason!tool_use循环执行return任务结束。可以把整个过程看成下面这样轮次模型做什么程序做什么第 1 轮请求搜索文件执行find返回结果第 2 轮请求运行文件执行python demo.py返回结果第 3 轮输出最终回答不再执行工具结束循环程序没有预先写死任务一共三步。模型根据每一轮返回的结果自己决定是否继续行动。七、循环为什么不会无限执行很多人看到while True的第一反应是它不会一直跑下去吗答案是不会。循环的出口就是这段代码ifresponse.stop_reason!tool_use:return只有模型明确请求工具循环才继续。模型返回状态程序行为tool_use执行工具把结果交回模型普通文本回复结束循环因此程序不需要写死执行顺序。它不需要规定先读文件 再找文件 再运行测试 最后总结不同任务的路径不一样。有时模型先看日志有时先读配置有时根本不需要工具。循环只负责确保模型需要行动时有工具可用工具运行后结果能回到模型手里。八、这个最小版本还缺什么这段循环足够让模型开始行动但它还只是教学版。目前它只有一个bash工具能做的事情比较粗。而且代码虽然拦截了少量危险命令dangerous[rm -rf /,sudo,shutdown,reboot]但这显然不是完整的权限系统。真实的 Agent 还要处理很多问题文件读写应该用专门工具还是全部交给 Shell哪些操作可以直接执行哪些操作必须让用户确认命令超时和执行失败怎么处理上下文太长时历史消息怎么压缩多个 Agent 同时工作时如何避免互相干扰。这些会在后面的章节中逐步补上。但它们都建立在同一个基础上模型发起工具调用 → 程序执行 → 结果回传 → 模型继续判断九、动手验证如果想自己跑一遍可以在临时目录中配置好环境后执行python s01_agent_loop/code.py建议先试这几个简单任务List all Python files in this directoryCreate a file called hello.py that prints Hello, World!What is the current git branch?运行时不用急着看模型最后说了什么先观察终端里打印出的命令。重点看两个问题模型什么时候开始调用bash命令返回结果后模型为什么会继续调用工具或者为什么会结束。把这两个问题看明白Agent Loop 的核心就已经掌握了。小结Claude Code 看起来复杂但最底层的行动方式并不复杂。模型不会直接读文件也不会直接执行命令。它只能提出工具调用请求。程序执行请求把真实结果交回模型模型看到结果后再判断是否继续。while True不是为了让程序无限运行而是为了让模型在任务没有结束前能够持续获得行动和观察的机会。下一篇会继续在这个循环上增加能力当 Agent 不再只有一个bash而是拥有读文件、写文件、编辑文件和搜索文件等工具时工具应该怎样组织才不会把主循环写乱参考资料最小 Agent Loop源码与文档learn-claude-code 项目仓库

相关新闻

Java Thread 类基础用法完整总结 —— 线程创建、中断、等待、休眠、线程实例获取、分清为start/run,避开sleep坑点

Java Thread 类基础用法完整总结 —— 线程创建、中断、等待、休眠、线程实例获取、分清为start/run,避开sleep坑点

📑 目录 1. 线程创建 1.1 继承Thread类1.2 实现Runnable接口1.3 Lambda简化创建线程 2. 线程中断 2.1 interrupt() 标记中断2.2 isInterrupted() 判断中断标记2.3 interrupted() 清除中断标记 3. 线程等待 3.1 join() 等待线程执行完毕3.2 join(long) 限时等待 4. …

2026/7/21 5:44:46阅读更多 →
RTX50系显卡性能对比与选购指南

RTX50系显卡性能对比与选购指南

1. 五款RTX50系显卡规格参数对比让我们先来看一下RTX5060到5070Ti五款显卡的核心规格差异:型号CUDA核心显存容量显存类型显存位宽加速频率TDP功耗首发价格RTX506038408GBGDDR6128-bit2.4GHz170W2499RTX5060 Ti486412GBGDDR6192-bit2.45GHz200W3299RTX5070614412GBGD…

2026/7/21 5:44:46阅读更多 →
SQL面试解题心法:从窗口函数到NULL安全的四大核心能力

SQL面试解题心法:从窗口函数到NULL安全的四大核心能力

1. 这不是题库搬运,而是一套可复用的SQL面试解题心法 你刷过几百道SQL题,但一到真实面试现场,面对白板或共享编辑器,手还是抖?写完代码自己都心虚——不确定窗口函数该用 RANK() 还是 DENSE_RANK() ,分…

2026/7/21 5:44:46阅读更多 →
redis持久化RDB与AOF

redis持久化RDB与AOF

文章目录 RDB简介持久化触发条件RDB的优缺点AOF简介AOF的三种持久化规则AOF的重写机制AOF文件修复AOF的优缺点 RDB简介 RDB是Redis默认用来进行持久化的一种方式,根据配置文件中的save m n配置自动触发bgsave将当前内存中的数据集以快照的方式写入到磁盘中并生成一…

2026/7/21 15:51:37阅读更多 →
AI竞争力跃迁公式:掌握这7个底层思维模型,3个月甩开90%同行

AI竞争力跃迁公式:掌握这7个底层思维模型,3个月甩开90%同行

更多请点击: https://kaifayun.com 第一章:AI时代竞争力跃迁的本质逻辑 在AI技术深度渗透各行业的当下,个体与组织的竞争力跃迁已不再依赖于单一技能的线性积累,而源于认知范式、工具链协同与价值交付节奏的系统性重构。这种跃迁…

2026/7/21 15:51:37阅读更多 →
async 和 await(详解)

async 和 await(详解)

一、async 和 await promise 使用 .then 链式调用,但也是基于回调函数async/await 更加优雅的异步编程的写法 1.它是消灭异步回调的终极武器 2.它是同步语法,也就是用同步的写法写异步的代码 案例1:promise异步加载图片 分别使用 .then 和 aw…

2026/7/21 15:51:37阅读更多 →
网安面试真相:为什么你知识点全会,面试却总是挂科?

网安面试真相:为什么你知识点全会,面试却总是挂科?

📌 前言很多新人刷题无数、笔记满满、漏洞全会复现,但是一到面试就挂。面试官真正淘汰新人的原因,从来不是你不会漏洞,而是你没有工程思维、没有实战逻辑、只会背诵答案。本篇拆解网安面试“隐形扣分点”,帮你解决学得…

2026/7/21 15:51:37阅读更多 →
OpenCV-Python实战(1)——OpenCV简介与图像处理基础

OpenCV-Python实战(1)——OpenCV简介与图像处理基础

OpenCV-Python实战(1)——OpenCV简介与图像处理基础OpenCV介绍Python安装OpenCVOpenCV主要模块OpenCV应用场景OpenCV图像处理基础图像基础图像处理中的主要问题图像处理流程像素、颜色、通道、图像和颜色空间图像描述图像文件类型OpenCV中的坐标系OpenCV…

2026/7/21 15:51:37阅读更多 →
为什么选择command-line-args?深度解析5大核心优势与使用场景

为什么选择command-line-args?深度解析5大核心优势与使用场景

为什么选择command-line-args?深度解析5大核心优势与使用场景 【免费下载链接】command-line-args A mature, feature-complete library to parse command-line options. 项目地址: https://gitcode.com/gh_mirrors/co/command-line-args 在Node.js生态系统中…

2026/7/21 15:49:37阅读更多 →
Go语言静态资源打包方案对比与实践指南

Go语言静态资源打包方案对比与实践指南

1. 项目背景与核心需求在Go语言开发中,我们经常需要处理静态资源文件的打包问题。无论是Web应用的模板文件、前端资源,还是配置文件、证书等,都需要随程序一起分发。传统做法是将这些文件与编译后的二进制文件放在同一目录下,但这…

2026/7/21 0:51:49阅读更多 →
Go语言实现高性能LDAP认证服务的架构与实践

Go语言实现高性能LDAP认证服务的架构与实践

1. 项目背景与核心价值LDAP(轻量级目录访问协议)作为企业级身份认证的黄金标准,已经服务了超过80%的财富500强公司。我在金融科技领域实施统一认证体系时,发现传统Java方案存在启动慢、内存占用高等痛点。而Go语言凭借其协程并发模…

2026/7/21 0:51:49阅读更多 →
【AI面试官实战指南】:用ChatGPT模拟10类高频技术岗面试,3天提升应答精准度92%

【AI面试官实战指南】:用ChatGPT模拟10类高频技术岗面试,3天提升应答精准度92%

更多请点击: https://intelliparadigm.com 第一章:AI面试官实战指南的核心价值与适用场景 AI面试官并非替代人类HR的“黑箱工具”,而是以可解释、可审计、可迭代的方式,赋能招聘全链路的关键基础设施。其核心价值在于将主观经验沉…

2026/7/21 0:51:49阅读更多 →
Windows+macOS 通用 OpenClaw 部署流程,内置依赖一键启动智能桌面助手

Windows+macOS 通用 OpenClaw 部署流程,内置依赖一键启动智能桌面助手

📌教程适配:OpenClaw v2.7.9 | 兼容 Windows10/11、macOS 双系统 📖前言 当下各类本地 AI 工具层出不穷,多数产品仅能完成文字问答交互,很难直接操控电脑执行实际操作。OpenClaw,业内常称小龙虾 AI&#…

2026/7/21 0:01:46阅读更多 →
Codex 接入后 Bug 反增?复盘从个人演示到团队协作的“流程陷阱”

Codex 接入后 Bug 反增?复盘从个人演示到团队协作的“流程陷阱”

聊《一次Codex项目复盘,问题最后出在流程而不是模型》之前,先说一句实在的:别急着背概念,先看它在真实项目里到底解决什么问题。摘要先把这篇文章的目标说清楚:看完之后,你应该能判断这件事值不值得做&…

2026/7/21 0:01:46阅读更多 →
手把手搓一个五子棋游戏,零代码也能当“游戏开发者”

手把手搓一个五子棋游戏,零代码也能当“游戏开发者”

大家好,还是我。前几期带大家做了心情日记本和可视化大屏,后台有朋友留言:“能不能教点好玩的?我想做游戏,但一行代码都不会。”行,这期就安排。今天的目标:从零做一个五子棋游戏。 带AI对战、三…

2026/7/21 0:03:46阅读更多 →
YOLOv8推理性能优化:从1.2FPS到35FPS的全链路加速实践

YOLOv8推理性能优化:从1.2FPS到35FPS的全链路加速实践

如果你在部署 YOLOv8 时,发现推理速度只有可怜的 1-2 FPS,而别人的演示视频却能跑到 30 FPS 以上,那么问题很可能不在模型本身,而在于你的整个处理链路。很多开发者拿到一个训练好的 YOLOv8 模型后,会直接使用官方示例…

2026/7/20 22:51:39阅读更多 →
Coze与Dify对比指南:低代码AI应用开发从入门到实战

Coze与Dify对比指南:低代码AI应用开发从入门到实战

1. 从零到一:为什么你需要了解 Coze 和 Dify?如果你对 AI 应用开发感兴趣,但一看到“大模型”、“智能体”、“工作流”这些词就头疼,觉得门槛太高,那这篇文章就是为你准备的。很多开发者,包括我自己&#…

2026/7/20 18:51:18阅读更多 →
AI生图工具怎么选?2026年6月版实测对比

AI生图工具怎么选?2026年6月版实测对比

做自媒体的朋友应该都有体会:配图一直是个让人头疼的问题。2026年,AI生图工具已经非常成熟了,但工具太多反而不知道怎么选。以下是截至2026年6月我对主流AI生图工具的实测对比。Midjourney V8.1:速度之王2026年6月11日&#xff0c…

2026/7/20 18:51:18阅读更多 →