夜雨聆风学习资料网

ARTICLE · 1016523

Hermes Agent 的插件系统:用最少的核心代码,装下最多的可能性

Hermes Agent 的插件系统:用最少的核心代码,装下最多的可能性
核心保持精简,能力交给插件。这是 Hermes 的架构哲学。

一、为什么要用插件?

打开 Hermes 的 plugins/ 目录,你会看到十几个子目录:

plugins/
├── memory/          # 记忆后端:honcho、mem0、holographic...
├── model-providers/ # 推理后端:anthropic、alibaba、bedrock...
├── platforms/       # 消息平台:discord、telegram、feishu...
├── image_gen/       # 图像生成:openai、fal、xai...
├── spotify/         # Spotify 播放控制
├── disk-cleanup/    # 自动清理临时文件
├── google_meet/     # Google Meet 音频桥接
├── kanban/          # 看板式任务编排
└── ...

这不是"什么都塞进核心"的做法。Hermes 的设计原则很明确:

核心是窄腰,能力在边缘。

每增加一个核心工具,每次 API 调用都要多付一次 token 费用。所以新能力优先以插件形式交付——按需加载,不用不花钱。


二、插件的四种类型

Hermes 的插件系统支持四种 kind,对应不同的扩展方式:

1. backend(后端插件)

最通用的类型。可以注册新工具、挂载钩子、添加 slash 命令。

以 Spotify 插件为例,它的 plugin.yaml:

name:spotify
version:1.0.0
kind:backend
description:"Native Spotify integration — 7 tools using Spotify Web API + PKCE OAuth."
provides_tools:
-spotify_playback
-spotify_devices
-spotify_queue
-spotify_search
-spotify_playlists
-spotify_albums
-spotify_library

七个工具,覆盖播放控制、设备管理、队列操作、搜索、播放列表、专辑、音乐库。只有当用户配置了 Spotify 认证后,这些工具才会出现在 Agent 的工具列表中。

2. model_provider(模型提供商)

接入新的推理后端。目前 plugins/model-providers/ 下有超过 20 个提供商:anthropic、alibaba、azure-foundry、bedrock、openrouter、gemini……每个提供商只需实现模型列表和 API 调用逻辑,其余路由、重试、降级由核心处理。

3. platform(消息平台)

让 Agent 能在不同聊天平台上运行。Discord、Telegram、Slack、飞书、钉钉、企业微信、Google Chat、Home Assistant……每个平台是一个独立适配器,实现消息收发和会话管理。

4. hook(钩子插件)

最轻量的扩展方式。不增加工具,只在特定事件发生时执行逻辑。

以 disk-cleanup 插件为例:

name:disk-cleanup
version:2.0.0
description:"Auto-track and clean up ephemeral files created during sessions."
hooks:
-post_tool_call# 每次工具调用后检查
-on_session_end# 会话结束时清理

它在 post_tool_call 钩子中静默追踪新创建的临时文件,在 on_session_end 时自动清理。Agent 完全不需要知道这个插件的存在——零侵入。


三、plugin.yaml:插件的身份证

每个插件目录必须有一个 plugin.yaml,声明元数据和加载规则:

name:my-plugin# 唯一标识
version:1.0.0# 版本号
kind:backend# 插件类型
description:"..."# 描述
author:"@yourname"# 作者

# 可选字段
provides_tools: [...]    # 提供的工具列表
hooks: [...]             # 挂载的钩子
kind:model_provider# 或 platform、hook

加载器(plugins.py 中的 discover_plugins())扫描所有插件目录,读取 plugin.yaml,根据 kind 决定如何注册。


四、加载流程:自动发现,按需启用

启动
  ↓
discover_plugins()
扫描 ~/.hermes/plugins/ 和内置 plugins/
  ↓
读取每个插件的 plugin.yaml
  ↓
根据 kind 分类注册:
  backend  → 注册工具 + 钩子
  provider → 注册模型路由
  platform → 注册消息适配器
  hook     → 注册事件监听
  ↓
检查启用状态(config.yaml 或 hermes tools 命令)
  ↓
已启用的插件 → 工具进入 Agent schema
未启用的插件 → 跳过,不占 token

关键设计:未启用的插件不会出现在模型的工具列表中。这意味着你可以安装 50 个插件,但只有实际使用的 5 个会影响 API 调用成本。


五、插件能力系统(Plugin Capabilities)

插件不只是"加几个工具"。plugin_capabilities.py 定义了一套标准化的能力接口,让插件可以深入参与 Agent 的行为:

  • 记忆后端
    替换默认的内存存储,接入 honcho、mem0 等外部记忆系统
  • 上下文引擎
    自定义上下文文件的加载和处理逻辑
  • 认证提供者
    集成 OAuth、API Key 等多种认证方式
  • 看板调度
    将 Agent 接入 Kanban 工作流

这套接口通过 ABC(抽象基类)定义,插件只需实现对应方法即可接入。核心代码不依赖任何具体插件——依赖倒置,插件可插拔。


六、社区插件索引

除了内置插件,Hermes 还有一个社区插件索引(plugin_index.py),类似 Skills Hub 的模式:

远程索引 → 本地缓存(24h TTL)→ 内置种子(离线兜底)

搜索社区插件:

hermes plugins search spotify

安装社区插件:

hermes plugins install owner/repo

索引条目会固定一个不可变的 ref(tag 或 commit SHA),确保安装的可重复性。

值得注意的是,索引明确声明:Indexed ≠ audited。收录只意味着元数据经过审核,不代表代码经过审计。安装前务必自行检查。


七、写一个最简单的插件

假设你想让 Agent 在每次会话结束时打印一句总结。只需三步:

1. 创建目录和 plugin.yaml:

~/.hermes/plugins/session-summary/
├── plugin.yaml
└── __init__.py
name:session-summary
version:1.0.0
kind:hook
description:"Print a summary when a session ends."
hooks:
-on_session_end

2. 实现钩子逻辑(init.py):

defon_session_end(session_id, context):
print(f"Session {session_id} finished.")

3. 启用插件:

hermes tools enable session-summary

完成。下次会话结束时,你会看到打印输出。


八、设计哲学总结

原则
做法
核心精简
新能力优先做插件,不进核心
按需加载
未启用的插件不占 token
类型分明
backend / provider / platform / hook 四种 kind
零侵入
hook 插件对 Agent 完全透明
社区扩展
插件索引 + 标准化接口
安全第一
Indexed ≠ audited,用户自主审查

Hermes 的插件系统不是"越多越好"的堆砌,而是"核心保持窄腰,能力在边缘生长"的有机扩展。每个插件都有明确的边界、清晰的接口、独立的启用开关。

这才是插件系统该有的样子。

相关学习资料