词元之母TOK.MOM - 平台充值汇率 1:1 即 1 人民币充值到账 1 美元,支持一个 Key 调用近 600+ 海内外模型,限时特价模型低至 1 折,欢迎上岸!
register_* API,另一些是配置驱动或放入指定目录即可生效。请先查阅下表:| 如果你想添加… | 请阅读 |
|---|---|
| 自定义工具、钩子、斜杠命令、技能或 CLI 子命令 | 本指南(通用插件接口) |
| LLM / 推理后端(新提供商) | 模型提供商插件 |
| 网关频道(Discord/Telegram/IRC/Teams 等) | 添加平台适配器 |
| 记忆后端(Honcho/Mem0/Supermemory 等) | 记忆提供商插件 |
| 上下文压缩引擎 | 上下文引擎插件 |
| 图像生成后端 | 图像生成提供商插件 |
| 视频生成后端 | 视频生成提供商插件 |
| TTS 后端(任意 CLI——Piper、VoxCPM、Kokoro、声音克隆等) | TTS 自定义命令提供商——配置驱动,无需 Python |
| STT 后端(自定义 whisper / ASR CLI) | 语音消息转录——将 HERMES_LOCAL_STT_COMMAND 设置为 shell 模板 |
| 通过 MCP 接入外部工具(文件系统、GitHub、Linear、任意 MCP 服务器) | MCP——在 config.yaml 中声明 mcp_servers.<name> |
| 网关事件钩子(在启动、会话事件、命令时触发) | 事件钩子——将 HOOK.yaml + handler.py 放入 ~/.hermes/hooks/<name>/ |
| Shell 钩子(在事件发生时运行 shell 命令) | Shell 钩子——在 config.yaml 的 hooks: 下声明 |
| 额外技能来源(自定义 GitHub 仓库、私有技能索引) | 技能——hermes skills tap add <repo> · 发布 tap |
| 一流的核心推理提供商(非插件) | 添加提供商 |
calculate——计算数学表达式(2**16、sqrt(144)、pi * 5**2)unit_convert——在单位之间转换(100 F → 37.78 C、5 km → 3.11 mi)plugin.yaml:provides_tools 和 provides_hooks 字段是插件注册内容的列表。schemas.py——这是 LLM 读取以决定何时调用你的工具的内容:description 字段决定了 LLM 何时使用你的工具。请明确说明工具的功能和使用时机。parameters 定义了 LLM 传入的参数。tools.py——这是 LLM 调用工具时实际执行的代码:def my_handler(args: dict, **kwargs) -> str**kwargs: Hermes 未来可能传入额外上下 文。__init__.py——将 schema 与处理器连接起来:register() 的作用:ctx.register_tool() 将你的工具放入注册表——模型立即可见ctx.register_hook() 订阅生命周期事件ctx.register_cli_command() 注册 CLI 子命令(例如 hermes my-plugin <subcommand>)ctx.register_command() 注册会话内斜杠命令(例如在 CLI / 网关聊天中输入 /myplugin <args>)——详见下方注册斜杠命令ctx.dispatch_tool(name, arguments) ——以父代理的上下文(审批、凭证、task_id 自动连接)调用任意其他工具(内置或来自其他插件)。适用于需要直接调用 terminal、read_file 或其他工具的斜杠命令处理器,效果等同于模型直接调用。dispatch_tool 示例——执行工具的斜杠命令:calculator: calculate, unit_convert。What's 2 to the power of 16?
Convert 100 fahrenheit to celsius
What's the square root of 2 times pi?
How many gigabytes is 1.5 terabytes?/pluginsPlugins (1):
✓ calculator v1.0.0 (2 tools, 1 hooks)HERMES_PLUGINS_DEBUG=1 可在 stderr 获取详细的发现日志:disabled via config、not enabled in config、exclusive plugin、no plugin.yaml, depth cap reachedregister(ctx) 注册内容的单行摘要(工具、钩子、斜杠命令、CLI 命令)register() 失败时:指向 __init__.py 中抛出异常的行的完整堆栈跟踪~/.hermes/logs/agent.log,失败时为 WARNING 级别,设 置环境变量时为 DEBUG 级别(全部内容)。如果无法使用环境变量运行(例如从网关内部),可以改为追踪日志文件:hermes plugins enable <name>(名称来自 plugins list 输出,嵌套布局下可能是 <category>/<plugin>)。~/.hermes/plugins/<plugin-name>/plugin.yaml(扁平)或 ~/.hermes/plugins/<category>/<plugin-name>/plugin.yaml(一级分类嵌套,最多)。更深层的目录会被忽略。__init__.py——插件目录需要同时包含 plugin.yaml 和带有 register(ctx) 函数的 __init__.py。kind 错误——网关适配器需要在清单中设置 kind: platform。记忆提供商会被自动检测为 kind: exclusive,并通过 memory.provider 配置路由,而非 plugins.enabled。~/.hermes/plugins/calculator/
├── plugin.yaml # "我是 calculator,我提供工具和钩子"
├── __init__.py # 连接:schema → 处理器,注册钩子
├── schemas.py # LLM 读取的内容(描述 + 参数规格)
└── tools.py # 实际运行的代码(calculate、unit_convert 函数)skill_view("plugin:skill") 加载。在 __init__.py 中注册:~/.hermes/plugins/my-plugin/
├── __init__.py
├── plugin.yaml
└── skills/
├── my-workflow/
│ └── SKILL.md
└── my-checklist/
└── SKILL.md~/.hermes/skills/,也无法通过 skill_manage 编辑。<available_skills> 索引中——需要显式加载。shutil.copy2 模式(将技能复制到 ~/.hermes/skills/)仍然有效,但存在与内置技能名称冲突的风险。新插件请优先使用 ctx.register_skill()。WEATHER_API_KEY 未设置,插件将被禁用并显示清晰的提示信息。不会崩溃,代理中也不会报错——只会显示"Plugin weather disabled (missing: WEATHER_API_KEY)"。hermes plugins install 时,会交互式提示输入任何缺失的 requires_env 变量。值会自动保存到 .env。| 字段 | 必填 | 描述 |
|---|---|---|
name | 是 | 环境变量名称 |
description | 否 | 安装 提示时显示给用户 |
url | 否 | 获取凭证的地址 |
secret | 否 | 若为 true,输入时隐藏(类似密码字段) |
import 它。在工具处理器内部使用 tools.lazy_deps.ensure(...) 辅助函数——Hermes 会在首次使用时安装该包,并受用户 security.allow_lazy_installs 配置的控制。tools/lazy_deps.py 安全模型的两条规则:| 规则 | 原因 |
|---|---|
你的功能键必须出现在内置的 LAZY_DEPS 允许列表中 | 防止恶意配置诱使 Hermes 安装任意包——只有 Hermes 自身随附的规格才符合条件 |
| 规格仅限 PyPI 包名 | 不允许 --index-url、git+https:// 或 file: 路径。在允许列表条目中使用 PEP 440 固定版本("my-sdk>=1.2,<2") |
pyproject.toml 中将可选依赖声明为 [project.optional-dependencies] extras,并告知用户执行 pip install your-plugin[backend]——该路径不经过 lazy_deps。懒加载安装最适合内置插件,因为对每次安装都强制依赖会增加 Hermes 基础安装的体积。security.allow_lazy_installs: false 时,ensure() 会立即抛出 FeatureUnavailable 并附带修复提示——你的插件应捕获该异常并优雅降级(返回错误结果,而非让工具循环崩溃)。web_search 替换为自定义企业索引),传入 override=True:override=True 时,注册表会拒绝任何会遮蔽来自不同 toolset 的已有工具的注册——这防止了意外覆盖。覆盖操作会以 INFO 级别记录日志,可在 ~/.hermes/logs/agent.log 中审计。插件在内置工具之后加载,因此注册顺序 是正确的:你的处理器会替换内置处理器。| 钩子 | 触发时机 | 回调签名 | 返回值 |
|---|---|---|---|
pre_tool_call | 任意工具执行前 | tool_name: str, args: dict, task_id: str | 忽略 |
post_tool_call | 任意工具返回后 | tool_name: str, args: dict, result: str, task_id: str, duration_ms: int | 忽略 |
pre_llm_call | 每轮一次,工具调用循环前 | session_id: str, user_message: str, conversation_history: list, is_first_turn: bool, model: str, platform: str | 上下文注入 |
post_llm_call | 每轮一次,工具调用循环后(仅成功轮次) | session_id: str, user_message: str, assistant_response: str, conversation_history: list, model: str, platform: str | 忽略 |
on_session_start | 新会话创建(仅第一轮) | session_id: str, model: str, platform: str | 忽略 |
on_session_end | 每次 run_conversation 调用结束 + CLI 退出 | session_id: str, completed: bool, interrupted: bool, model: str, platform: str | 忽略 |
on_session_finalize | CLI/网关销毁活跃会话 | session_id: str | None, platform: str | 忽略 |
on_session_reset | 网关切换新会话键(/new、/reset) | session_id: str, platform: str | 忽略 |
pre_llm_call,它可以向对话中注入上下文。**kwargs 以保持向前兼容性。如果钩子回调崩溃,会被记录日志并跳过。其他钩子和代理继续正常运行。pre_llm_call 上下文注入pre_llm_call 回调返回包含 "context" 键的字典(或纯字符串)时,Hermes 会将该文本注入当前轮次的用户消息中。这是记忆插件、RAG 集成、护栏以及任何需要向模型提供额外上下文的插件所使用的机制。"context" 键(或为非空纯字符串),都会被收集并追加到当前轮次的用户消息中。pre_llm_call 返回上下文时,它们的输出以双换行符连接,一起追加到用户消息中。顺序遵循插件发现顺序(按插件目录名称字母排序)。hermes <plugin> 子命令树:hermes my-plugin status、hermes my-plugin config 等命令。cli.py 文件中添加 register_cli(subparser) 函数。记忆插件发现系统会自动找到它——无需调用 ctx.register_cli_command()。详见记忆提供商插件指南。memory.provider 时才会出现。如果用户尚未设置你的提供商,你的 CLI 命令不会出现在帮助输出中。/lcm status 或 /ping)。这些命令在 CLI 和网关(Telegram、Discord 等)中均可使用。/mystatus。该命令会出现在自动补全、/help 输出和 Telegram 机器人菜单中。ctx.register_command(name: str, handler: Callable, description: str = "")| 参数 | 类型 | 描述 |
|---|---|---|
name | str | 不含前导斜杠的命令名称(例如 "lcm"、"mystatus") |
handler | Callable[[str], str | None] | 以原始参数字符串 调用。也可以是 async。 |
description | str | 显示在 /help、自动补全和 Telegram 机器人菜单中 |
register_cli_command() 的主要区别:register_command() | register_cli_command() | |
|---|---|---|
| 调用方式 | 会话中的 /name | 终端中的 hermes name |
| 适用范围 | CLI 会话、Telegram、Discord 等 | 仅终端 |
| 处理器接收 | 原始参数字符串 | argparse Namespace |
| 使用场景 | 诊断、状态查询、快速操作 | 复杂子命令树、设置向导 |
help、model、new 等)冲突的名称,注册会被静默拒绝并记录警告日志。内置命令始终优先。delegate_task、调用 file_edit 等)应使用 ctx.dispatch_tool(),而非深入框架内部。父代理上下文(工作区提示、spinner、模型继承)会自动连接。ctx.dispatch_tool(name: str, args: dict, *, parent_agent=None) -> str| 参数 | 类型 | 描述 |
|---|---|---|
name | str | 工具注册表中的工具名称(例如 "delegate_task"、"file_edit") |
args | dict | 工具参数,与模型发送的格式相同 |
parent_agent | Agent | None | 可选覆盖。省略时从当前 CLI 代理解析(网关模式下优雅降级) |
parent_agent 从活跃的 CLI 代理解析,工作区提示、spinner 和模型选择按预期继承。TERMINAL_CWD 读取,不显示 spinner。parent_agent=,则尊重该值,不会被覆盖。ctx._cli_ref.agent 或类似的私有状态。plugins/<category>/<name>/(内置)或 ~/.hermes/plugins/<category>/<name>/(用户)下。各类别的约定不同——选择你需要的类型,然后阅读其完整指南。plugins/model-providers/<name>/ 下放置一个配置文件:get_provider_profile() 或 list_providers() 的地方首次使用时懒加载发现——auth.py、config.py、doctor.py、models.py、runtime_provider.py 和 chat_completions 传输层会自动连接。用户插件按名称覆盖内置插件。prepare_messages、build_extra_body、build_api_kwargs_extras、fetch_models)、api_mode 选择、认证类型、测试。plugins/platforms/<name>/ 下放置适配器:BasePlatformAdapter 约定、消息路由、认证限制、设置向导集成。参考 plugins/platforms/irc/ 获取仅使用标准库的可用示例。plugins/memory/<name>/ 下实现 MemoryProvider:config.yaml 中的 memory.provider 选择。MemoryProvider ABC、线程约定、配置文件隔离、通过 cli.py 注册 CLI 命令。config.yaml 中的 context.engine 选择。plugins/image_gen/<name>/ 下放置提供商:ImageGenProvider ABC、list_models() / get_setup_schema() 元数据、success_response()/error_response() 辅助函数、base64 与 URL 输出、用户覆盖、pip 分发。plugins/image_gen/openai/(DALL-E / GPT-Image via OpenAI SDK)、plugins/image_gen/openai-codex/、plugins/image_gen/xai/(Grok 图像生成)。~/.hermes/config.yaml 中声明:~/.hermes/hooks/<name>/:gateway:startup、session:start、session:end、session:reset、agent:start、agent:step、agent:end 以及通配符 command:*。钩子中的错误会被捕获并 记录日志——它们不会阻塞主流程。config.yaml 中使用 shell 钩子——无需 Python:pre_tool_call、post_tool_call、pre_llm_call、post_llm_call、on_session_start、on_session_end、pre_gateway_dispatch),以及用于 pre_tool_call 阻断决策的结构化 JSON 输出。skills/<skill-name>/SKILL.md 目录的 GitHub 仓库——无需服务器或注册表注册。config.yaml 接入——无需 Python 代码:HERMES_LOCAL_STT_COMMAND 指向一个 shell 模板。支持的占位符:{input_path}、{output_path}、{format}、{voice}、{model}、{speed}(TTS);{input_path}、{output_dir}、{language}、{model}(STT)。任何与路径交互的 CLI 都自动成为插件。# pyproject.toml
[project.entry-points."hermes_agent.plugins"]
my-plugin = "my_plugin_package"pyproject.toml,NixOS 用户可以声明式安装你的插件:pyproject.toml):**kwargs: