现在位置: 首页 > Hermes Agent > 正文

Hermes Agent 工具集

工具是 Hermes Agent 与外部世界交互的唯一通道——读写文件、执行命令、搜索网页、生成图片,所有能力都通过工具暴露。

Hermes 内置 70+ 工具,分为 28 个工具集。本章将逐一解析每个工具集的核心工具、参数和最佳实践。


工具系统架构

在深入具体工具之前,先理解工具的组织方式。

Hermes 采用三层结构管理工具:

工具(Tool)          ← 单个可调用函数,如 read_file、web_search
  └── 工具集(Toolset)   ← 相关工具的逻辑分组,如 file、web
        └── 平台配置        ← 哪个平台加载哪些工具集

关键设计:禁用一个工具集,其中的工具从系统提示词中完全消失——不只是不可调用,而是 Agent 根本不知道它们的存在。这既节省 Token,也防止 Agent 误用不该用的工具。

管理工具集的方式:

# TUI 交互式管理(推荐)
hermes tools

# 命令行管理
hermes tools list                # 列出所有工具及启用状态
hermes tools enable browser      # 启用指定工具集
hermes tools disable audio       # 禁用指定工具集

在 config.yaml 中配置:

# 文件路径:~/.hermes/config.yaml
# 按平台指定启用的工具集
platform_toolsets:
  cli:
    - hermes-cli         # CLI 核心工具集
    - file
    - terminal
    - web
    - memory
    - skills

桌面版,在左侧的技能与工具菜单:

仪表盘上也可以管理工具,在左侧技能菜单里:


文件与系统工具集

这类工具集让 Agent 能够操作本地文件系统、执行命令和管理进程。

file — 文件操作

最基础的工具集,Agent 几乎所有任务都依赖它来读写文件。

工具功能关键参数
read_file读取文件内容file_path(必填)、offset(起始行)、limit(行数上限)
write_file创建或覆盖文件file_path(必填)、content(必填)
edit_file精确替换文件中的文本file_path、old_string、new_string、replace_all
list_dir列出目录内容path(必填)、recursive(是否递归)
search_files按文件名模式搜索pattern(必填,支持 glob)、path(搜索根目录)
search_content在文件内容中搜索文本pattern(必填,支持正则)、path、file_types

edit_file 的工作原理:它使用精确子串匹配定位修改位置。Agent 提供 old_string(文件中实际存在的文本),工具找到它并替换为 new_string。如果 old_string 匹配到多处,设置 replace_all: true 替换所有出现。

edit_file 是 Agent 最常用的文件修改方式——它比 write_file 更安全,因为如果 old_string 找不到,操作会失败报错,不会意外覆盖文件。

terminal — Shell 命令执行

让 Agent 在指定的后端环境中执行 Shell 命令。

工具功能关键参数
run_command执行单条 Shell 命令command(必填)、workdir(工作目录)、timeout(超时毫秒)
run_script执行多行 Shell 脚本script(必填,多行脚本内容)、workdir、timeout

命令在配置的终端后端中执行——local(本机)、docker(容器)、ssh(远程)等。

执行结果包含 stdout、stderr 和退出码,Agent 可以根据这些信息判断命令是否成功。

code — 沙箱代码执行

在隔离沙箱中执行代码片段,支持 Python、JavaScript 和 Bash。

工具功能关键参数
execute_code在沙箱中运行代码language(python/js/bash)、code(必填)、timeout

与 terminal 的区别:code 工具在独立沙箱中运行,不能访问文件系统(除非显式挂载),适合运行算法验证、数据处理等不需要文件交互的代码。

computer — 桌面 GUI 自动化

控制桌面环境的鼠标、键盘和截图。

工具功能
screenshot截取屏幕或指定区域
click在指定坐标点击鼠标
type模拟键盘输入文本
scroll滚动鼠标滚轮
move移动鼠标到指定坐标

computer 工具集主要用于 GUI 应用测试和自动化操作。如果你的使用场景不涉及桌面应用,可以禁用以节省 Token。


网络与内容工具集

这类工具集让 Agent 能够搜索互联网、提取网页内容和自动化浏览器操作。

web — 网页搜索与内容提取

Agent 获取外部信息的主要渠道。

工具功能关键参数
web_search搜索互联网内容query(必填)、num_results(结果数量)
web_extract提取指定 URL 的正文内容url(必填)、extract_mode(auto/text/markdown)

web_search 返回搜索结果列表(标题 + URL + 摘要),Agent 通常先搜索,再对感兴趣的页面调用 web_extract 获取详细内容。

需要配置搜索 API 才能使用。支持多种提供商:

实例

# 文件路径:~/.hermes/config.yaml
# 配置网页搜索后端
web
:
  search_provider
: firecrawl    # 或 brave、serpapi、tavily
  # 在 .env 中设置对应的 API Key
  # FIRECRAWL_API_KEY=fc-...
  # 或 BRAVE_API_KEY=BS...

browser — 浏览器自动化

完整的浏览器控制能力——导航、点击、填表、截图,像人一样操作网页。

工具功能关键参数
navigate导航到指定 URLurl(必填)
click点击页面元素selector(CSS 选择器或文本描述)
fill_form填写表单字段fields(字段名到值的映射)
screenshot截取当前页面full_page(是否全页截图)
extract提取页面结构化数据selector、format(json/text)
execute_js在页面中执行 JavaScriptcode(必填)

browser 工具集需要 Playwright 或云端浏览器后端支持。

browser 工具集启动浏览器实例会消耗额外资源。如果只需要提取网页文本内容,优先使用 web_extract 而非 browser extract——前者是轻量 HTTP 请求,后者需要启动完整浏览器。

vision — 图片分析

让 Agent 「看懂」图片内容。

工具功能关键参数
analyze_image分析图片内容并生成描述image_path 或 image_url(必填)、question(可选,针对图片的特定问题)
describe_image生成图片的详细文字描述image_path 或 image_url(必填)

vision 工具将图片发送给支持视觉的 LLM(如 claude-sonnet-4-6、gpt-4o),由模型识别和描述图片内容。

audio — 音频处理

语音转文字和文字转语音。

工具功能关键参数
transcribe将音频文件转为文字audio_path(必填)、language(可选)
tts将文字转为语音文件text(必填)、voice(音色选择)、provider

Agent 能力工具集

这类工具集管理 Agent 自身的状态——记忆、技能、子 Agent 协作。

memory — 记忆管理

读写持久记忆和搜索跨会话历史。

工具功能关键参数
memory管理持久记忆(增删改)action(add/replace/remove)、target(memory/user)、content
session_search全文搜索历史会话query(必填,支持 FTS5 语法)

memory 工具没有 read 操作——持久记忆在会话启动时已注入系统提示词,Agent 无需额外读取。

skills — 技能管理

加载和管理可复用的工作流技能。

工具功能关键参数
skills_list列出所有已安装技能及其描述无(会话启动时自动调用)
skill_view加载技能的完整内容name(必填)、path(可选,加载 references 子文件)
skill_manage创建、修改或删除技能文件action、name、content

delegation — 子 Agent 委托

派生子 Agent 并行执行任务。

工具功能关键参数
spawn_agent创建单个子 Agent 执行任务prompt(必填)、model(可选)
spawn_parallel并行创建多个子 Agenttasks(必填,任务列表)

子 Agent 拥有独立的上下文窗口,不会污染主 Agent 的对话历史。执行完毕后返回结果摘要。

kanban — 多 Agent 看板

结构化的多 Agent 协作系统,需显式启用(all/* 也不自动开启)。

工具功能
task_create在看板中创建新任务
task_update更新任务状态(todo/in_progress/done)
task_list列出租户的所有任务
task_assign将任务分配给指定的工作者 Agent

Kanban 是多 Profile 协作的核心机制——一个编排者 Profile 创建任务,多个工作者 Profile 认领执行。这需要多个 Profile 的网关同时运行。


媒体创作工具集

这类工具集通常需要 Nous Portal 订阅或对应的第三方 API Key。

image_gen — AI 图片生成

根据文字描述生成图片,支持 9 种模型。

工具功能关键参数
generate_image根据 Prompt 生成图片prompt(必填)、model(flux/gpt-image/ideogram 等)、size、style

tts — 文字转语音

独立于 audio 工具集的 TTS 功能,提供更丰富的提供商选择。

工具功能
text_to_speech将文字转换为语音文件
list_voices列出可用的语音音色

自定义工具集

你可以将现有工具集组合为项目专属的自定义工具集:

实例

# 文件路径:~/.hermes/config.yaml
# 定义项目专属工具集组合
custom_toolsets
:
 # 数据科学项目需要的工具
  data-science
:
   - file
    - terminal
    - code
    - web

  # 纯写作项目只需文件操作
  writing
:
   - file
    - web
    - memory

  # 运维项目需要终端 + 文件,不需要浏览器
  devops
:
   - file
    - terminal
    - memory

使用时通过 --toolsets 参数指定:

实例

# 启动时使用自定义工具集
hermes --toolsets data-science chat

# 或在 Profile 配置中设为默认
coder config set toolsets data-science

工具调用流程

了解一次工具调用的完整流程有助于理解 Agent 的行为和排查问题。

一次完整的工具调用经过以下步骤:

  1. LLM 在生成回复时决定调用某个工具,输出工具名和参数
  2. tool_request Middleware 执行(可以修改参数)
  3. 审批检查——如果工具是危险操作,根据 approvals.mode 决定是否弹出确认
  4. 工具实际执行
  5. tool_execution Middleware 执行(可以修改结果)
  6. post_tool_call Hook 记录遥测数据
  7. 执行结果返回给 LLM,LLM 继续生成回复

如果你的 Middleware 修改了工具参数,修改后的参数是审批和实际执行的输入。如果你在 Middleware 中短路了执行(返回自定义结果),实际工具不会运行。


工具使用统计

了解哪些工具被频繁使用,有助于优化工具集配置和 Token 消耗。

在会话中查看本次会话的工具调用统计:

实例

# 查看本次会话的工具使用统计
/usage

# 输出示例:
# Token 用量: 输入 12,340 | 输出 5,678 | 总计 18,018
# 工具调用: read_file (15次) | edit_file (8次) |
#            terminal (3次) | web_search (2次)

批量处理场景中,statistics.json 文件记录了更详细的统计:

实例

// 文件路径:data/my_first_run/statistics.json
{
  "total_tool_calls": 1523,
  "tools": {
    "read_file": {"count": 520, "success": 510, "failure": 10},
    "edit_file": {"count": 380, "success": 375, "failure": 5},
    "terminal": {"count": 290, "success": 270, "failure": 20},
    "web_search": {"count": 180, "success": 178, "failure": 2}
  },
  "avg_tool_calls_per_turn": 2.4,
  "most_common_tool_sequence": [
    "read_file", "edit_file", "terminal"
  ]
}