AI Agent 对比系列(三):工具系统 — 它们怎么「干活」?
AI Agent 对比系列(三):工具系统 — 它们怎么「干活」?
《AI Agent 对比系列》第三篇 · 整合对比版
本系列通过对比两个真实开源 AI Agent——OpenClaw 和 Hermes Agent——带你深入理解 AI Agent 的工具系统:它们有哪些工具、从哪里来、怎么控制、怎么扩展。
上一篇:记忆系统篇——AI Agent 怎么在对话之间记住你。
本篇:工具系统篇——AI Agent 的「手脚」是怎么组织和运行的。
先来做个实验
实验 1 — 数工具
对你的 Hermes 运行 hermes tools,看看多少工具集是打开的。
对 OpenClaw 问:「你现在能做什么?把你的所有工具列出来,按类别分。」
你会看到两份差距很大的清单——不是因为谁比谁强,而是两套完全不同的组织哲学。
实验 2 — 动手试试
打开浏览器,帮我搜一下今天的新闻,把结果抓回来。
如果配置了浏览器和搜索工具,你会在一个聊天框里,看到 Agent 驱动一个真正的浏览器去查网页。一个消息通道里的聊天框,在驱动一个真正的浏览器。
核心认知:工具 = 注册在中央目录的函数
大模型本身没有手脚。它的每个「能力」都是一个注册在系统中的函数,由 Agent Loop 在推理循环中按需调用。
聊天机器人(ChatGPT):你问 → 它答
AI Agent: 你派活 → 它思考 → 选工具 → 调工具 → 拿到结果 → 继续思考 → 输出
但这里有一个关键的设计问题:工具越多,Agent 能做的事越多——但工具列表越长,模型"挑"工具的成本越高。 每种工具都有自己的 Schema(参数定义),全发给模型的话,上下文里塞几百 KB 的工具定义,模型都不知道该看哪个。
两套工具系统解决的是同一个矛盾——如何让 Agent 有尽可能多的能力,同时不让工具列表撑爆上下文、又让你能控制住它?——但解法截然不同。
工具系统的「骨架」:三层架构对比
Hermes:注册中心 + 松耦合管道
┌──────────────────────────────────────────────┐
│ Agent Loop(run_agent.py) │
│ 决定:要不要调工具?调哪个?结果怎么处理? │
└─────────────────────┬────────────────────────┘
│
┌─────────────────────▼────────────────────────┐
│ 模型工具桥接层(model_tools.py) │
│ 把工具定义翻译成 LLM 认识的 function-calling │
│ 把 LLM 返回的 tool_call 翻译成实际函数调用 │
└─────────────────────┬────────────────────────┘
│
┌─────────────────────▼────────────────────────┐
│ 中央注册表(tools/registry.py) │
│ 70+ 已注册的工具,按 toolsets 分组, │
│ 每个工具带:name / schema / handler / check_fn │
└─────────────────────┬────────────────────────┘
│
┌────────┬───────┼───────┬────────┐
▼ ▼ ▼ ▼ ▼
💻 Terminal 📁 File 🌐 Browser 🔍 Web 🧩 MCP
6种后端 读写编辑 5种后端 4种后端 动态注册
三层松耦合:Registry 不管谁是 LLM,model_tools 不管怎么执行,Agent Loop 不管工具内部逻辑。
OpenClaw:三层来源 + 三层过滤
┌─────────────────────────────────┐
│ Agent Runtime │
│ (Agent Loop + 模型调用) │
└──────────┬──────────────────────┘
│ 工具可见性过滤
▼
┌─────────────────────────────────────────────────┐
│ 有效工具列表(发给模型) │
│ 经过 profile/allow/deny/plugin 层层过滤后 │
└─────────────────────────────────────────────────┘
│
┌────────────────┼────────────────┐
▼ ▼ ▼
┌──────────┐ ┌──────────┐ ┌──────────────────┐
│ 内置工具 │ │ 插件工具 │ │ MCP 服务器工具 │
│ (built-in)│ │ (plugin) │ │ (MCP servers) │
└──────────┘ └──────────┘ └──────────────────┘
三层聚合:工具来自不同渠道,汇聚后经策略层过滤再给到模型。
核心差异:Hermes 的架构是"分发式"——所有工具进注册表,统一处理;OpenClaw 是"聚合式"——不同来源的工具各自独立,通过策略层合并过滤。
三大机制对比
机制一:工具怎么注册进来的?
| Hermes | OpenClaw | |
|---|---|---|
| 方式 | registry.register() + AST 自动发现 |
api.registerTool() 显式注册 |
| 发现 | 启动时扫描 tools/*.py,自动导入含 register() 调用的模块 |
插件通过 manifest.json 声明,MCP 通过配置注册 |
| 新增工具 | 写一个 .py 文件放 tools/ 目录,重启自动生效 |
装插件、配置 MCP server,或开发自定义插件 |
| 失败处理 | 单个工具加载失败只影响自己,不炸全局 | 插件加载失败整体回退 |
Hermes 的核心创新在 auto-discovery:不需要手动维护工具列表,AST 扫描自动识别哪些 .py 文件注册了工具。OpenClaw 则更传统,每个工具必须通过 api.registerTool() 显式声明。
机制二:工具怎么被过滤?
| Hermes | OpenClaw | |
|---|---|---|
| 机制 | check_fn 运行时可用性门控 |
Tool Profile + Allow/Deny + 运行时约束 |
| 粒度 | 工具级(每个工具独立 check) | 配置级(Profile 预定义整组工具) |
| 判断依据 | API Key 存在?二进制装了?服务在跑? | 用户身份?聊天通道?沙箱环境?Provider 能力? |
| 默认行为 | check_fn 不通过 → 模型根本看不到这个工具 | Profile 不包含 → 模型根本看不到这个工具 |
两套思路的本质区别:
- Hermes 的 check_fn 是技术性过滤——“这个工具现在能用吗?”(钥匙到位了没?)
- OpenClaw 的 Profile 是策略性过滤——“这个场景下应该让 Agent 看到什么工具?”(该给员工哪套钥匙?)
机制三:工具怎么被调用?
两地最终都走 Agent Loop 分发,但细节不同:
| Hermes | OpenClaw | |
|---|---|---|
| 特殊工具 | 4 个 agent-loop 工具(todo/memory/session_search/delegate_task)不走 registry,由 Agent Loop 直接处理 | 部分工具(如 ask_user)也有特殊路由 |
| 错误包裹 | 双层 try/except,确保 LLM 永远拿到 JSON 而不是原始异常 | 适配层转成目标模型能理解的格式 |
| 异步 | 显式异步桥接(CLI 用持久事件循环,Gateway 用线程) | 同步架构为主 |
| 终端后端 | 6 种(local/docker/ssh/singularity/modal/daytona) | sandbox/gateway/host |
工具全景图
各自有什么工具
| 类别 | Hermes | OpenClaw |
|---|---|---|
| 终端/运行时 | terminal + process(6 后端) | exec + process + code_execution |
| 文件操作 | read_file / write_file / patch / search_files | read / write / edit / apply_patch |
| Web 搜索 | web_search / web_extract | web_search / web_fetch / x_search |
| 浏览器 | navigate / click / type / scroll / snapshot / vision(5 后端) | browser(独立浏览器控制) |
| 图片生成 | image_generate(9 种模型) | image_generate |
| 视觉分析 | vision_analyze | image(看图) |
| 语音 | text_to_speech | tts |
| 视频 | video_generate / video_analyze | video_generate / music_generate |
| 定时任务 | cronjob | cron / heartbeat_respond |
| 子任务 | delegate_task / execute_code | sessions_spawn / sessions_send / sessions_list |
| 消息 | (通过 Gateway 平台适配器) | message(直接发消息到聊天通道) |
| 目标管理 | todo / clarify | create_goal / update_goal / get_goal / ask_user |
| 技能 | skill_view / skill_manage / skills_list | skill_workshop |
| 集成 | MCP Server 工具 + Home Assistant + Spotify + Computer Use | MCP Server 工具 + 插件系统 |
| 特殊 | session_search(FTS5 历史对话检索) | gateway / nodes(网关状态查询) |
各自的数量级
| 指标 | Hermes | OpenClaw |
|---|---|---|
| 内置工具 | 70+(28 个 toolsets) | 10 大类别 |
| 默认配置 | 全量注册,按 toolsets + check_fn 过滤(CLI 典型 17/25) | coding profile(开发常用工具集合) |
| 扩展方式 | .py 自动注册 / MCP / 插件 | ClawHub 插件 / MCP / 自定义插件 |
| 社区生态 | Skills Hub(agentskills.io 标准) | ClawHub 插件市场 |
安全机制
两个 Agent 都意识到"工具给了能力,就必须有约束":
| Hermes | OpenClaw | |
|---|---|---|
| 执行保护 | DANGEROUS_PATTERNS 模式匹配(rm -rf、mkfs、DROP TABLE、curl sh 等) | Sandbox 隔离 + elevated 提升审批 |
| 审批流程 | CLI 交互式 / Gateway 异步回调 / 智能 LLM 辅助审批 | 配置审批后,exec 暂停等用户点"批准" |
| 缓存 | 审批结果 session 内缓存,可选永久加入 allowlist | 按会话/通道管理 |
| 分层 | 单层(危险命令检测) | 三层(Sandbox → Tool Policy → Elevated) |
差异思路:Hermes 相信"多数命令是安全的,标记少数危险模式";OpenClaw 相信"默认隔离沙箱,明确授权才逃逸"。
扩展路径对比
| 难度 | Hermes | OpenClaw |
|---|---|---|
| ⭐ | 启用已有的 toolset(hermes tools) |
装 ClawHub 插件 |
| ⭐⭐ | 装一个技能(写 SKILL.md 教怎么用工具) | 写一个 Skill(教怎么用已有工具) |
| ⭐⭐⭐ | 配置 MCP 服务器(当前已接入 Dify MCP,12 个工具) | 配置 MCP 服务器 |
| ⭐⭐⭐⭐ | 写一个 .py 文件放 tools/ 目录,自动注册 |
开发自定义插件 |
| 💰 | Tool Gateway(付费订阅,一个密钥覆盖 Web/图片/TTS/浏览器) | (无类似统一网关) |
人类类比
Hermes = 自由职业者,背着一个大工具箱
工具箱(Registry)→ 每个工具有独立的"锁"(check_fn)
→ 钥匙到了才能用
→ 没有预设场景,遇事现找工具
→ 6 种不同工作台(终端后端)可选
OpenClaw = 管理者,有预设的办公桌
办公桌(Profile)→ 按角色分配文件夹和权限
→ "你是 coding 岗,拿 coding 钥匙"
→ 开箱就有常用工具,不需要配
→ 想用特殊设备?填申请(审批流)
Hermes 越干工具越多,但每个工具自带"锁",钥匙不到位就是摆设。
OpenClaw 开箱配好了一套工具,按身份和场景渐进放开。
选择指南
| 场景 | 更推荐 |
|---|---|
| 需要多种终端执行环境(本地 + 容器 + 远程 + 云端) | Hermes(6 种后端) |
| 需要精细化的身份/通道权限控制 | OpenClaw(Profile + Allow/Deny) |
| 开箱不想配太多,默认就能干活 | OpenClaw(coding profile) |
| 经常加新工具,想写文件就生效 | Hermes(.py 自动注册) |
| 需要社区插件生态捡现成的 | OpenClaw(ClawHub) |
| 已经配了 MCP 服务器 | 两者都支持,无显著差异 |
| 想一个订阅覆盖所有工具能力 | Hermes(Tool Gateway) |
小测验
- 对你的 Hermes 运行
hermes tools,数数当前启用了多少个工具集 - 对照 OpenClaw 的 Profile 表,看你的需求更靠近 coding 还是 full
- 思考:如果你的 Agent 有一个能力没发挥出来——是因为它没有这个工具,还是因为工具被过滤/没配钥匙?
下期预告
| 文章 | 内容 |
|---|---|
| 感知系统篇 | AI Agent 怎么接收外界信息——视觉分析、语音合成、文档理解,感知管道在 Agent Loop 中的位置 |
信息源声明
- Hermes 信息来源:Tools & Toolsets、Tools Runtime、Tool Gateway、Architecture、本地 config.yaml 及
hermes tools实测输出 - OpenClaw 信息来源:docs.openclaw.ai/tools、docs.openclaw.ai/gateway/config-tools、本地 OpenClaw 运行时文档
- Hermes 当前实例:0.18.2,CLI 工具集 17/25 启用,Dify MCP 已接入
本文以 Hermes 的分析框架为主线组织,融合 OpenClaw 的视角进行对比。两个 Agent 的完整独立版本可从各自工作区获取。
更多推荐


所有评论(0)