news 2026/9/7 20:02:42

Hermes Agent 自定义工具集实战:一个工具从注册到被 Agent 调用的全链路

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Hermes Agent 自定义工具集实战:一个工具从注册到被 Agent 调用的全链路

Hermes Agent 自定义工具集实战:一个工具从注册到被 Agent 调用的全链路

【免费下载链接】hermes-agentThe agent that grows with you项目地址: https://gitcode.com/GitHub_Trending/he/hermes-agent

你想让 Agent 批量改写文档大小写,翻遍内置工具没现成的。Hermes Agent 的扩展开发里,需求分两层:工具(Tool)是真正干活的函数;自定义工具集(Toolset)决定 Agent 能看见哪些工具。两层分清,注册和调试才不乱。

心智模型:Tool 干活,Toolset 发工牌

打开toolsets.py,所有工具集都挂在同一个TOOLSETS字典上。每个集合就三个字段:description写给人和文档看,tools列出这个集合直接包含的工具名,includes声明它还要把哪些别的工具集合并进来。

"web": { "description": "Web research and content extraction", "tools": ["web_search", "web_extract"], "includes": [] }

可以把工具集想成文件夹:tools是放进去的文件,includes是软链接,指向另一个文件夹,展开时一起算进来。另外还有一个_HERMES_CORE_TOOLS,它是所有平台都默认继承的公共基础包,各平台工具集在它之上做加减。

一条主线:从写函数到 Agent 真正调起它

先写处理函数。新建tools/text_transform.py,实现真正干活的逻辑。Hermes 的硬性约定是:所有 handler 必须返回 JSON 字符串,注册层负责 schema 收集、分发、可用性检查和错误包装。

import json def text_transform(text: str, transform_type: str = "uppercase") -> str: if transform_type == "uppercase": return json.dumps({"success": True, "data": text.upper()}) return json.dumps({"success": True, "data": text.lower()})

这段代码里最值得记住的是:返回值必须是 JSON 字符串,注册系统只替你兜错误包装,不兜数据格式。

把参数描述成 JSON Schema,然后注册。Schema 就是模型看到的函数说明书,name / description / parameters一样都不能少。

from tools.registry import registry registry.register( name="text_transform", toolset="text_processing", schema={"name": "text_transform", "description": "转换文本大小写", "parameters": {"type": "object", "properties": {"text": {"type": "string"}, "transform_type": {"type": "string", "enum": ["uppercase", "lowercase"]}}, "required": ["text"]}}, handler=lambda args, **kw: text_transform(args.get("text", ""), args.get("transform_type", "uppercase")), )

这段代码里最值得记住的是:tools/下任何带顶层registry.register()调用的 .py 文件都会被自动发现并导入,但自动发现只注册 schema,不代表工具已经暴露给 Agent。

把工具挂进工具集。打开toolsets.py,把工具名写进某个集合的tools里——这是唯一必须手动做的装配步骤。

TOOLSETS = { "text_processing": { "description": "文本处理工具集", "tools": ["text_transform"], "includes": ["web"] }, }

这段代码里最值得记住的是:工具名没出现在任何 toolset 里,Agent 就永远看不见它,挂集合不是可选项。

验证并启动。先跑校验函数确认名字和依赖都没拼错,再用命令行指定工具集起会话:

from toolsets import validate_toolset validate_toolset("text_processing")
hermes run --toolset text_processing

这段代码里最值得记住的是:validate 失败十有八九是工具名拼错,或者includes指向了一个不存在的集合名。

进阶玩法与排坑清单

运行时创建工具集:不改文件也能加

不想为了一个临时组合去改toolsets.py再重启?create_custom_toolset可以在运行时直接挂一个动态工具集,toolsincludes的写法与静态定义完全一致,会话结束即失效,适合做实验性组合。

from toolsets import create_custom_toolset create_custom_toolset( name="my_dynamic_toolset", description="运行时创建的动态工具集", tools=["text_transform"], includes=["web"], )

先问一句"工具到底在不在"

症状是 Agent 报"工具不存在"。原因多半不是没注册,而是check_fnrequires_env没满足——比如工具依赖的 API key 没配。解法:调一次registry.check_tool_availability(),它会分开返回可用和不可用的工具两组名字,缺什么一目了然。

用依赖树排查 toolset includes 指向问题

症状是工具明明注册了,某个平台下却用不了。原因通常是 includes 链条上有一环指错了集合名,或者被平台配置关掉了。解法:print_toolset_tree("text_processing")会把依赖树递归打出来,includes 断在哪一层、哪些工具没被展开,看一眼树就清楚。

💡 工具注册了,为什么 Agent 看不见

症状:registry.register()执行成功、validate 也过了,Agent 就是不调用。原因:注册只把 schema 放进注册表,暴露给 Agent 的开关在工具集那一层。解法:确认工具名出现在某个 toolset 的tools里;如果工具只给自己用,更干净的路是走插件——在~/.hermes/plugins/<name>/__init__.py里用ctx.register_tool(...)注册,插件工具集会被自动发现,完全不用动核心文件。

收尾:速查表与延伸入口

📋 不知道往哪下手时,先查这张表:

我想做什么该改哪个文件调哪个函数
写一个新核心工具tools/your_tool.pyregistry.register(...)
把工具暴露给 Agenttoolsets.py写进TOOLSETStools
校验工具集定义toolsets.pyvalidate_toolset(name)
运行时动态建工具集无需改文件create_custom_toolset(...)
按平台开关工具config.yaml或 CLIhermes tools

延伸入口从toolsets.pytools/registry.py读起,回归用例在tests/test_toolsets.py。工具是肌肉,工具集是神经系统——挂对位置,Agent 才会真的伸手去用。

【免费下载链接】hermes-agentThe agent that grows with you项目地址: https://gitcode.com/GitHub_Trending/he/hermes-agent

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/8/31 1:06:14

MATLAB GUI开发实战:从App Designer入门到应用部署全解析

1. 从命令行到图形界面&#xff1a;为什么MATLAB GUI值得你投入时间 如果你已经用MATLAB写过不少脚本和函数&#xff0c;处理过矩阵运算&#xff0c;画过各种漂亮的二维三维图&#xff0c;那你可能会开始思考一个问题&#xff1a;这些功能能不能打包成一个更直观、更易用的工具…

作者头像 李华
网站建设 2026/8/31 4:02:13

通信网络资源分配博弈:从斯坦伯格博弈到分布式算法实践

1. 项目概述&#xff1a;从一道赛题看通信网络中的资源分配博弈去年和朋友组队参加了华为举办的数学建模挑战赛&#xff0c;其中D题给我留下了极深的印象。这道题表面上是一个经典的优化问题&#xff0c;但深入下去&#xff0c;你会发现它完美地模拟了现代通信网络中&#xff0…

作者头像 李华
网站建设 2026/8/30 4:54:09

对话智能体评测:别让Benchmark成为你的决策陷阱

一个多月前&#xff0c;有个做客服产品的朋友来找我。他根据某个榜单把线上客服机器人换成了“排名更好”的对话模型&#xff0c;结果用户一句口语化的追问&#xff0c;机器人就开始答非所问。他第一反应是提示词写得不够好&#xff0c;反复改了好几版&#xff0c;问题依然存在…

作者头像 李华
网站建设 2026/9/1 10:14:19

AI产业链拆解:算力、模型、平台与应用层的盈利机会与工程实践

2024 年至今&#xff0c;身边讨论 AI 的人越来越多。但比起“大模型又能写诗了”“哪个 Agent 又上线了”&#xff0c;办公室里更常听到的其实是另一句&#xff1a; AI 这么火&#xff0c;钱到底被谁赚走了&#xff1f; 这个问题看似是个商业话题&#xff0c;但对于做技术的…

作者头像 李华