要为hermesagent扩展能力需编写自定义tool:一、定义继承基类的tool类,声明name、description和parameters;二、实现call方法处理参数、调用api并返回结构化结果;三、注册tool到agent实例;四、编写单元测试验证异常与正常流程;五、将tool描述注入system prompt以支持llm调用。
☞☞☞AI 智能聊天, 问答助手, AI 智能搜索, 多模态理解力帮你轻松跨越从0到1的创作门槛☜☜☜

如果您希望为HermesAgent扩展能力,使其能调用外部系统或执行特定任务,则需要编写一个自定义Tool。以下是创建首个Tool的完整流程:
一、定义Tool类结构
Tool必须继承HermesAgent提供的基类,并实现必要接口,以确保框架能正确识别、序列化和调度该工具。类中需声明名称、描述及参数定义,这些信息将用于LLM的工具选择推理。
1、创建Python文件,例如weather_tool.py。
2、导入HermesTool基类与tool装饰器(若使用装饰器模式)或直接继承基类。
3、定义类名,如WeatherQueryTool,并设置name = "get_weather"、description = "根据城市名获取当前天气信息"。
4、在类中声明parameters字典,包含"city"(类型为str)、"unit"(默认"celsius")等字段及其type和description。
二、实现call方法逻辑
该方法是Tool被执行时的实际入口,接收标准化的JSON参数字典,返回可被LLM理解的结构化结果。必须确保异常可捕获且返回友好错误消息,避免中断Agent工作流。
1、在Tool类中定义def call(self, **kwargs) -> dict:方法。
2、从kwargs中提取city值,校验其非空且为字符串类型。
3、构造HTTP请求URL,调用公开天气API(如OpenWeatherMap),携带API key与参数。
4、解析响应JSON,提取temperature、condition、humidity字段。
5、返回字典:{"temperature": 23.5, "condition": "partly cloudy", "humidity": 64}。
三、注册Tool到Agent实例
Tool需显式注册至HermesAgent运行时环境,否则LLM无法感知其存在。注册过程将触发元数据校验与内部索引构建。
1、在初始化Agent对象后,调用agent.register_tool(WeatherQueryTool())。
2、确认注册成功日志输出:Registered tool: get_weather。
3、检查agent.list_tools()返回结果中是否包含get_weather条目及其完整描述。
4、若使用YAML配置方式,需在tools.yaml中添加对应块,并指定模块路径与类名。
四、编写单元测试验证行为
测试确保Tool在各种输入条件下返回预期格式与内容,防止因参数缺失、网络失败或类型错误导致Agent崩溃。
1、创建test_weather_tool.py,导入pytest与WeatherQueryTool。
2、编写测试函数test_call_with_valid_city,传入{"city": "Beijing"},断言返回字典含"temperature"键。
3、编写test_call_with_empty_city,验证抛出ValueError时返回{"error": "city cannot be empty"}。
4、使用responses库模拟HTTP响应,隔离外部依赖。
五、集成至Agent提示工程
LLM需通过系统提示词了解Tool功能边界与调用语法。必须将Tool描述注入system prompt的tools section,否则模型不会生成tool_calls。
1、调用agent.get_tool_descriptions()获取标准JSON Schema片段。
2、将该片段嵌入system prompt末尾,格式为{"name": "...", "description": "...", "parameters": {...}}。
3、确保prompt中明确指示:“仅当用户问题明确涉及天气查询时,才调用get_weather工具;否则不调用任何工具。”
4、验证LLM输出token中是否出现{"name": "get_weather", "arguments": "{...}"}结构。











