Hermes Agent:一次对话,多轮工具调用自己跑完
Hermes Agent 是一个能接 OpenAI、Anthropic、OpenRouter 等后端的 AI 代理框架,它把多轮工具调用循环装进一次对话:你给一个任务,它反复调工具、读回输出、决定下一步,直到干完才停。读完这篇,你能说出它三个核心文件各管一段、一轮执行按什么顺序走,自己动手跑通第一个任务。
先说个直观画面:你在终端输入"检查项目有没有编译错误",Hermes 不会回你一句"可以试试 grep"就结束。它自己起命令、读回报错、追相关文件,十几秒后给你一份带修复建议的报告。你发完消息就能走开,这一屏全自动的过程,就是标题里说的工具调用循环。
三个文件各管一段
把整个工具调用循环拆成三件事:控制流、执行层、收尾。控制流是一条单线程流水线,工具执行挂在一旁的线程池里。
| 文件 | 职责 | 一句话 |
|---|---|---|
| agent/conversation_loop.py | 控制流:组装请求、发调用、收响应、判断续跑 | 整个循环的"节拍器" |
| agent/tool_executor.py | 执行层:工具批次派给临时线程池,逐个执行 | 模型一次响应带多个调用也不互相卡 |
| agent/turn_finalizer.py | 收尾:预算统计、轨迹导出、历史落库、组装结果字典 | 循环外的所有账目都在这记 |
循环主体是 conversation_loop.py 里的run_conversation:你每发一条消息,它就把历史、系统提示、工具定义打包成一次模型请求,拿到响应后检查"模型还想调工具吗"——想就执行、回填、再发一次;不想就退出。工具那边,tool_executor.py 按批次开工,线程池上限 8 个并发、单工具默认 420 秒超时;一个慢工具不会拖住同批的其他工具,报错也只写回该工具自己的结果位,循环不会崩。
跑完一轮还不是终点,接着看这条消息到底怎么走的。
回车之后发生了什么
按时间顺序回放"检查项目有没有编译错误"这条消息:
- 开场准备。循环开始先刷新凭证、重建设计好的系统提示、检查上下文是否逼近压缩阈值。
- 发出第一次请求。注意请求带着完整历史——模型"看到"的是上一步的输出,全靠这个。
- 模型响应。模型说"我要调 terminal 工具跑构建"。循环先把这条 assistant 消息记进历史,再验证工具名是否在启用列表里、解析参数。
- 工具执行。调用丢进线程池,stdout/stderr 变成一条 tool 结果消息回填历史。
- 判断续跑。有工具调用就回到第 3 步;没有工具调用,循环退出,最终回复和你的消息一起落库。
第 2 步里"带完整历史"是关键:模型的每步决策都建立在"它能看见全部前文"之上。第 5 步的退出条件有双重约束——轮数上限max_iterations与迭代预算,任一用完循环即停,并把停因写进结果,而不是静默截断。
明白了单轮怎么转,下面看它适合装在哪、怎么三步跑起来。
适合哪三类活,怎么跑通
- 长任务自动化:定时跑日报、夜间备份。内置 cron 调度,跑完把结果投到 Telegram、Slack 这些平台(
hermes gateway起网关)。 - 本地开发代理:在你机器上读写文件、跑命令,配合容器后端隔离风险。
- 研究 Agent 循环的人:代码没有黑盒,每一轮都能打断点看请求原文。
上手就三步:
curl -fsSL https://hermes-agent.nousresearch.com/install.sh | bash hermes setup # 配置向导 hermes # 进入终端,丢第一个任务跑通第一个任务后,用hermes model换模型后端、hermes tools调启用哪些工具,改配置即可,不动代码。
一条主线加若干插件
工具调用循环不神秘:一条"模型响应 → 工具执行 → 结果回填"的流转,一个结果容器,一个线程池。其余模块——压缩、重试、网关、cron——全是挂在这条主线上的可插拔件。想继续深挖,从 agent/ 目录按上表三个文件读起,每一轮发生了什么都能自己验证。
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考