内置插件

Hermes 附带了一小组内置插件,存储在仓库中。它们位于 <repo>/plugins/<name>/ 下,与用户安装在 ~/.hermes/plugins/ 下的插件一起自动加载。它们使用与第三方插件相同的插件接口——钩子、工具、斜杠命令——只是维护在代码树中。

请参阅插件页面了解通用插件系统,以及构建 Hermes 插件来编写你自己的插件。

发现机制

PluginManager 按顺序扫描四个来源:

  1. 内置——<repo>/plugins/<name>/(本页文档的内容)
  2. 用户——~/.hermes/plugins/<name>/
  3. 项目——./.hermes/plugins/<name>/(需要 HERMES_ENABLE_PROJECT_PLUGINS=1
  4. Pip 入口点——hermes_agent.plugins

发生名称冲突时,后面的来源优先——名为 disk-cleanup 的用户插件会替换内置插件。

plugins/memory/plugins/context_engine/ 被故意排除在内置扫描之外。这些目录使用自己的发现路径,因为记忆提供者和上下文引擎是通过 hermes memory setup / 配置中的 context.engine 配置的单选提供者。

内置插件是选择加入的

内置插件默认处于禁用状态。发现机制能找到它们(它们会出现在 hermes plugins list 和交互式 hermes plugins UI 中),但直到你显式启用才加载:

hermes plugins enable disk-cleanup

或通过 ~/.hermes/config.yaml

plugins:
  enabled:
    - disk-cleanup

这与用户安装的插件使用的机制相同。内置插件永远不会自动启用——无论是在全新安装时,还是在现有用户升级到新版 Hermes 时。你始终需要显式选择加入。

要再次关闭内置插件:

hermes plugins disable disk-cleanup
# 或:从 config.yaml 的 plugins.enabled 中移除

当前内置插件

仓库在 plugins/ 下提供以下内置插件。所有插件都是选择加入的——通过 hermes plugins enable <name> 启用。

插件类型用途
disk-cleanup钩子 + 斜杠命令自动跟踪临时文件并在会话结束时清理
observability/langfuse钩子将轮次/LLM 调用/工具追踪到 Langfuse
spotify后端(7 个工具)原生 Spotify 播放、队列、搜索、播放列表、专辑、库
google_meet独立加入 Meet 通话、实时字幕转录、可选实时双工音频
image_gen/openai图像后端OpenAI gpt-image-2 图像生成后端(替代 FAL)
image_gen/openai-codex图像后端通过 Codex OAuth 的 OpenAI 图像生成
image_gen/xai图像后端xAI grok-2-image 后端
hermes-achievements仪表盘标签从你的真实 Hermes 会话历史生成的 Steam 风格可收藏徽章
kanban/dashboard仪表盘标签多代理调度器的看板 UI——任务、评论、扇出、看板切换。详见看板多代理

记忆提供者(plugins/memory/*)和上下文引擎(plugins/context_engine/*)分别在记忆提供者中列出——它们通过 hermes memoryhermes plugins 分别管理。以下详细介绍两个基于钩子的长期运行插件。

disk-cleanup

自动跟踪和删除会话期间创建的临时文件——测试脚本、临时输出、定时任务日志、过时的 Chrome 配置文件——无需代理记住调用工具。

工作原理:

钩子行为
post_tool_callwrite_file / terminal / patchHERMES_HOME/tmp/hermes-* 内创建匹配 test_*tmp_**.test.* 的文件时,静默将其归类为 test / temp / cron-output 进行跟踪。
on_session_end如果轮次中自动跟踪了任何测试文件,运行安全的 quick 清理并记录一行摘要。否则保持静默。

删除规则:

类别阈值确认
test每次会话结束时从不
temp跟踪后超过 7 天从不
cron-output跟踪后超过 14 天从不
HERMES_HOME 下的空目录始终从不
research超过 30 天且不在最新的 10 个以内总是(仅深度清理)
chrome-profile跟踪后超过 14 天总是(仅深度清理)
大于 500 MB 的文件从不自动总是(仅深度清理)

斜杠命令——/disk-cleanup 在 CLI 和网关会话中均可用:

/disk-cleanup status                     # 分类详情 + 最大的前 10 个
/disk-cleanup dry-run                    # 预览而不删除
/disk-cleanup quick                      # 立即运行安全清理
/disk-cleanup deep                       # quick + 列出需要确认的项目
/disk-cleanup track <path> <category>    # 手动跟踪
/disk-cleanup forget <path>              # 停止跟踪(不删除)

状态——所有内容存储在 $HERMES_HOME/disk-cleanup/

文件内容
tracked.json跟踪的路径,包含类别、大小和时间戳
tracked.json.bak上述文件的原子写入备份
cleanup.log仅追加的审计日志,记录每次跟踪/跳过/拒绝/删除

安全——清理仅触及 HERMES_HOME/tmp/hermes-* 下的路径。Windows 挂载点(/mnt/c/...)被拒绝。已知的顶层状态目录(logs/memories/sessions/cron/cache/skills/plugins/disk-cleanup/ 本身)即使为空也永远不会被删除——全新安装不会在首次会话结束时被掏空。

启用: hermes plugins enable disk-cleanup(或在 hermes plugins 中勾选复选框)。

再次禁用: hermes plugins disable disk-cleanup

observability/langfuse

将 Hermes 轮次、LLM 调用和工具调用追踪到 Langfuse——一个开源 LLM 可观测性平台。每轮一个 span、每个 API 调用一个 generation、每个工具调用一个工具观测。使用量总计、按类型划分的 token 数和成本估算来自 Hermes 规范的 agent.usage_pricing 数字,因此 Langfuse 仪表盘会看到与 hermes logs 相同的细分(输入/输出/ cache_read_input_tokens / cache_creation_input_tokens / reasoning_tokens)。

该插件是故障开放的:没有安装 SDK、没有凭证或临时 Langfuse 错误——都会在钩子中静默变为无操作。代理循环永远不会受到影响。

设置:

pip install langfuse
hermes plugins enable observability/langfuse

或在交互式 hermes plugins UI 中勾选复选框。然后在 ~/.hermes/.env 中放入凭证:

HERMES_LANGFUSE_PUBLIC_KEY=pk-lf-...
HERMES_LANGFUSE_SECRET_KEY=sk-lf-...
HERMES_LANGFUSE_BASE_URL=https://cloud.langfuse.com   # 或你的自托管 URL

工作原理:

钩子行为
pre_api_request / pre_llm_call打开(或重用)每轮根 span “Hermes turn”。为此 API 调用启动一个 generation 子观测,输入为序列化的最近消息。
post_api_request / post_llm_call关闭 generation,附加 usage_detailscost_detailsfinish_reason、助手输出 + 工具调用。如果没有工具调用且内容非空,关闭该轮次。
pre_tool_call启动一个 tool 子观测,包含清理后的 args
post_tool_call关闭工具观测,包含清理后的 resultread_file 负载会被汇总(头部 + 尾部 + 省略行数),因此大文件读取保持在 HERMES_LANGFUSE_MAX_CHARS 以下。

会话分组以 Hermes 会话 ID(或子代理的任务 ID)为键,通过 langfuse.propagate_attributes 实现,因此单个 hermes chat 会话中的所有内容都位于一个 Langfuse 会话下。

验证:

hermes plugins list                 # observability/langfuse 应显示 "enabled"
hermes chat -q "hello"              # 在 Langfuse UI 中检查 "Hermes turn" 追踪

可选调优(在 .env 中):

变量默认值用途
HERMES_LANGFUSE_ENV追踪上的环境标签(productionstaging 等)
HERMES_LANGFUSE_RELEASE发布/版本标签
HERMES_LANGFUSE_SAMPLE_RATE1.0传递给 SDK 的采样率(0.0–1.0)
HERMES_LANGFUSE_MAX_CHARS12000消息内容/工具参数/工具结果的每字段截断
HERMES_LANGFUSE_DEBUGfalse详细插件日志输出到 agent.log

Hermes 前缀和标准 SDK 环境变量(LANGFUSE_PUBLIC_KEYLANGFUSE_SECRET_KEYLANGFUSE_BASE_URL)均可接受——同时设置时 Hermes 前缀优先。

性能: Langfuse 客户端在首次钩子调用后会被缓存。如果缺失凭证或 SDK,该决定也会被缓存——后续的钩子会快速返回,无需重新检查环境变量或重新加载配置。

禁用: hermes plugins disable observability/langfuse。插件模块仍然被发现,但直到你重新启用前不会有模块代码运行。

google_meet

让代理加入、转录和参与 Google Meet 通话——记录会议笔记、总结对话、跟进具体要点,以及(可选)通过 TTS 将回复朗读到通话中。

新增功能:

  • 一个无头虚拟参与者,使用浏览器自动化加入 Meet URL
  • 通过配置的 STT 提供商对会议音频进行实时转录
  • 代理调用的 meet_summarize / meet_speak / meet_followup 工具集,用于对其听到的内容采取行动
  • 会后产物(转录文本、按发言人归类的笔记、行动项)保存到 ~/.hermes/cache/google_meet/<meeting_id>/

设置:

hermes plugins enable google_meet
# 首次使用时通过插件的 OAuth 流程提示你登录——
# 需要一个具有 Meet 访问权限的 Google 账户。如果会议强制执行
# "仅限受邀参与者加入",可能需要主持人批准。

在聊天中使用:

“加入 meet.google.com/abc-defg-hij 并做笔记。通话结束后,向我发送带行动项的摘要。”

代理启动会议加入,随着通话进行将转录流式传输回其上下文,并在会议结束时(或当你告诉它停止时)生成结构化摘要。

何时使用: 需要机器人转录+总结给异步与会者的定期站会;需要结构化笔记的取证式访谈;任何否则需要 Fireflies / Otter / Grain 的场合。如果你不希望 AI 监听——请不要启用它。

禁用: hermes plugins disable google_meet。任何缓存的转录和录音会保留在 ~/.hermes/cache/google_meet/ 中,直到你手动删除。

hermes-achievements

在仪表盘上添加一个Steam 风格的成就标签——60+ 个可收藏的分层徽章,从你的真实 Hermes 会话历史中生成。涉及工具链的壮举、调试模式、vibe-coding 连胜、技能/记忆使用、模型/提供商多样性、生活风格怪癖(周末和夜间会话)。最初由 @PCinkusz 作为外部插件编写;引入代码树以与 Hermes 功能变更保持同步。

工作原理:

  • 在仪表盘后端扫描你的整个 ~/.hermes/state.db 会话历史
  • 每会话统计信息按 (started_at, last_active) 指纹缓存,因此只有新的或更改的会话会在后续扫描中重新分析
  • 首次扫描在后台线程中运行——仪表盘不会等待它,即使数据库有数千个会话
  • 解锁状态持久化到 $HERMES_HOME/plugins/hermes-achievements/state.json

等级 progression: Copper → Silver → Gold → Diamond → Olympian。每个卡片显示一个”计数依据”部分,列出正在跟踪的确切指标。

成就状态:

状态含义
已解锁至少达到一个等级
已发现已知成就,进度可见,尚未获得
隐藏隐藏,直到 Hermes 在你的历史中检测到第一个相关信号

API——路由挂载在 /api/plugins/hermes-achievements/

端点用途
GET /achievements完整目录,包含每个徽章的解锁状态(首次冷扫描运行时返回待处理占位符)
GET /scan-status后台扫描器状态:idle / running / failed、上次持续时间、运行次数
GET /recent-unlocks最近解锁的 20 个徽章,最新的在前
GET /sessions/{id}/badges主要在单个会话中获得的徽章
POST /rescan手动同步重新扫描(阻塞;在用户点击重新扫描按钮时使用)
POST /reset-state清除解锁历史和缓存快照

状态文件——存储在 $HERMES_HOME/plugins/hermes-achievements/ 下:

文件内容
state.json解锁历史:你获得了哪些徽章以及何时获得。在 Hermes 更新期间稳定。
scan_snapshot.json上次完成的扫描负载(仪表盘加载时立即提供)
scan_checkpoint.json按指纹键控的每会话统计缓存(使热重新扫描快速)

性能说明:

  • 对约 8,000 个会话的冷扫描需要几分钟。它在第一个仪表盘请求时在后台线程中运行;UI 显示待处理占位符并轮询 /scan-status
  • 冷扫描期间的增量结果——扫描器每约 250 个会话发布一次部分快照,因此每次仪表盘刷新都会显示更多已解锁的徽章。无需长时间盯着零值。
  • 热重新扫描对 started_at + last_active 指纹与检查点匹配的每个会话重用每会话统计信息——即使在大历史记录上也能在数秒内完成。
  • 内存快照 TTL 为 120 秒;过期请求立即提供旧快照并触发后台刷新。你不会因为 TTL 过期而等待旋转图标。

启用: 无需启用——hermes-achievements 是一个仅仪表盘插件(无生命周期钩子,无模型可见的工具)。它在首次启动时自动注册为 hermes dashboard 中的标签。plugins.enabled 配置仅控制生命周期/工具插件;仪表盘插件纯粹通过其 dashboard/manifest.json 被发现。

选择退出: 删除或重命名 plugins/hermes-achievements/dashboard/manifest.json,或用 ~/.hermes/plugins/hermes-achievements/ 下没有仪表板的同名用户插件覆盖它。该插件的状态文件在 $HERMES_HOME/plugins/hermes-achievements/ 下保留——重新安装会保存你的解锁历史。

添加内置插件

内置插件的编写方式与任何其他 Hermes 插件完全相同——请参阅构建 Hermes 插件。唯一的区别是:

  • 目录位于 <repo>/plugins/<name>/ 而非 ~/.hermes/plugins/<name>/
  • 清单来源在 hermes plugins list 中显示为 bundled
  • 同名的用户插件会覆盖内置版本

以下情况的插件适合内置:

  • 没有可选依赖项(或者它们已经是 pip install .[all] 的依赖)
  • 行为对大多数用户有益,且是选择退出而非选择加入
  • 逻辑涉及代理否则必须记得调用的生命周期钩子
  • 补充核心能力而不扩大模型可见的工具面

反例——应保持为用户可安装插件而非内置的内容:需要 API 密钥的第三方集成、小众工作流、大依赖树、任何会默认显著改变代理行为的内容。