第 4 讲:插件系统——PluginContext API、钩子系统、中间件与平台适配器模式

Hermes Agent 源码解析 · 第 4 讲

Hermes Agent 源码解析 第 4 讲:插件系统——PluginContext API、钩子系统、中间件与平台适配器模式 基于 Hermes Agent v0.16.0 源码 · 2026-06-17 一、插件系统:Hermes 的"能力边界扩展器" 前三讲我们建立了全局架构地图、深入了对话循环、解析了工具系统的三层架构。这一讲聚焦 Hermes 最灵活、最具扩展性的子系统—— 插件系统 (Plugin System)。 插件是 Hermes "窄腰宽边"设计哲学的核心体现:核心保持稳定,能力通过插件向外延伸。从自定义工具、生命周期钩子、中间件,到平台适配器、模型提供者、图像/视频/TTS 后端——几乎所有新功能都通过插件机制接入,而非修改核心代码。 📦 源码仓库 https://github.com/NousResearch/hermes-agent 本地源码: ~/.hermes/hermes-agent/ 本讲核心文件: hermes_cli/plugins.py (2046 行)— 插件管理器 hermes_cli/middleware.py (313 行)— 中间件契约 gateway/platforms/base.py (4884 行)— 平台适配器基类 gateway/platform_registry.py (260 行)— 平台注册表 plugins/ (50+ 预置插件)— 插件目录 二、插件发现:四源扫描与优先级覆盖 Hermes 插件系统从 四个来源 自动发现插件,按优先级递增排列——后发现的同名插件覆盖先发现的: 插件发现优先级 (低 > 高,后者覆盖前者): 1 Bundled plugins bundled 2. _scan_directory(user_dir) > user 3. _scan_directory(project_dir) > project (条件) 4. _scan_entry_points() > pip 5. winners = {manifest.key: manifest} > 后者覆盖前者 6. 对每个 winner: _load_plugin() 两种目录布局 插件扫描器 _scan_directory_level() (L1339-1393)支持两种混合布局: Flat 布局 (standalone 插件): plugins/disk-cleanup/plugin.yaml > key = "disk-cleanup" Category 布局 (backend 插件): plugins/image_gen/openai/plugin.yaml > key = "image_gen/openai" 深度限制: 最多 2 层 (plugins/a/b/ 有效, plugins/a/b/c/ 被跳过) 源码: hermes_cli/plugins.py:1339-1393 插件种类 (Plugin Kinds) PluginManifest.kind 字段决定加载策略,共五种: _VALID_PLUGIN_KINDS = {"standalone", "backend", "exclusive", "platform", "model-provider"} +--------------+------------------+------------------------------------------+ | Kind | 加载策略 | 典型场景 | +--------------+------------------+------------------------------------------+ | standalone | opt-in (plugins | 自定义工具、钩子、slash 命令 | | | .enabled 白名单) | | +--------------+------------------+------------------------------------------+ | backend | bundled 自动加载 | image_gen/openai, web/brave, tts/edge | | | user 需 …

阅读全文:Hermes Agent 源码解析 第 4 讲