In Plugins
На этой странице
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 и интерактивном UI hermes plugins), но ни один не загружается, пока вы явно не включите его:
[code] hermes plugins enable disk-cleanup
[/code]
Или через ~/.hermes/config.yaml:
[code] plugins: enabled: - disk-cleanup
[/code]
Это тот же механизм, что используется для пользовательских плагинов. Встроенные плагины никогда не включаются автоматически — ни при свежей установке, ни при обновлении Hermes существующими пользователями. Вы всегда включаете их явно.
Чтобы снова отключить встроенный плагин:
[code] hermes plugins disable disk-cleanup # или: удалите его из plugins.enabled в config.yaml
[/code]
Текущий состав¶
Репозиторий включает следующие встроенные плагины в 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 |
бэкенд изображений | Генерация изображений через OpenAI по OAuth Codex |
image_gen/xai |
бэкенд изображений | Бэкенд xAI grok-2-image |
hermes-achievements |
вкладка панели | Значки в стиле Steam, созданные на основе реальной истории сессий Hermes |
example-dashboard |
пример панели | Эталонный плагин панели для Расширения панели |
strike-freedom-cockpit |
скин панели | Пример пользовательского скина панели |
Провайдеры памяти (plugins/memory/*) и контекстные движки (plugins/context_engine/*) перечислены отдельно на странице Провайдеры памяти — они управляются через hermes memory и hermes plugins соответственно. Подробное описание двух долгоиграющих плагинов на хуках приводится ниже.
disk-cleanup¶
Автоматически отслеживает и удаляет временные файлы, созданные во время сессий — тестовые скрипты, временные выводы, логи cron, устаревшие профили Chrome — без необходимости агенту помнить о вызове инструмента.
Как это работает:
| Хук | Поведение |
|---|---|
post_tool_call |
Когда write_file / terminal / patch создаёт файл, соответствующий шаблону test_*, tmp_* или *.test.* внутри HERMES_HOME или /tmp/hermes-*, бесшумно отслеживает его как test / temp / cron-output. |
on_session_end |
Если во время витка были отслежены тестовые файлы, запускает безопасную quick очистку и выводит однострочную сводку. В противном случае ничего не делает. |
Правила удаления:
| Категория | Порог | Подтверждение |
|---|---|---|
test |
каждое завершение сессии | Никогда |
temp |
>7 дней с момента отслеживания | Никогда |
cron-output |
>14 дней с момента отслеживания | Никогда |
| пустые директории в HERMES_HOME | всегда | Никогда |
research |
>30 дней, кроме 10 последних | Всегда (только глубокая) |
chrome-profile |
>14 дней с момента отслеживания | Всегда (только глубокая) |
| файлы >500 МБ | никогда автоматически | Всегда (только глубокая) |
Слэш-команда — /disk-cleanup доступна как в CLI, так и в gateway-сессиях:
[code]
/disk-cleanup status # разбивка + топ-10 крупнейших
/disk-cleanup dry-run # предпросмотр без удаления
/disk-cleanup quick # запустить безопасную очистку сейчас
/disk-cleanup deep # quick + список элементов, требующих подтверждения
/disk-cleanup track
[/code]
Состояние — всё хранится в $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, одно наблюдение инструмента на вызов инструмента. Итоги использования, количество токенов по типам и оценка стоимости берутся из канонических чисел agent.usage_pricing Hermes, поэтому панель Langfuse видит ту же разбивку (ввод / вывод / cache_read_input_tokens / cache_creation_input_tokens / reasoning_tokens), что и в hermes logs.
Плагин работает по принципу fail-open: отсутствие SDK, учётных данных или временная ошибка Langfuse — всё превращается в бесшумное ничего неделание в хуке. Цикл агента никогда не затрагивается.
Настройка (интерактивная — рекомендуется):
[code] hermes tools # → Langfuse Observability → Cloud или Self-Hosted
[/code]
Мастер собирает ваши ключи, выполняет pip install SDK langfuse и добавляет observability/langfuse в plugins.enabled за вас. Перезапустите Hermes, и следующий виток отправит трассу.
Настройка (вручную):
[code] pip install langfuse hermes plugins enable observability/langfuse
[/code]
Затем поместите учётные данные в ~/.hermes/.env:
[code] HERMES_LANGFUSE_PUBLIC_KEY=pk-lf-... HERMES_LANGFUSE_SECRET_KEY=sk-lf-... HERMES_LANGFUSE_BASE_URL=https://cloud.langfuse.com # или ваш self-hosted URL
[/code]
Как это работает:
| Хук | Поведение |
|---|---|
pre_api_request / pre_llm_call |
Открывает (или переиспользует) корневой span на виток «Hermes turn». Запускает дочернее наблюдение generation для этого вызова API с сериализованными последними сообщениями в качестве ввода. |
post_api_request / post_llm_call |
Закрывает генерацию, прикрепляет usage_details, cost_details, finish_reason, вывод ассистента + вызовы инструментов. Если нет вызовов инструментов и непустое содержимое, закрывает виток. |
pre_tool_call |
Запускает дочернее наблюдение tool с санированными args. |
post_tool_call |
Закрывает наблюдение инструмента с санированным result. Полезная нагрузка read_file суммируется (начало + конец + количество пропущенных строк), чтобы большой файл оставался в пределах HERMES_LANGFUSE_MAX_CHARS. |
Группировка сессий осуществляется по ID сессии Hermes (или ID задачи для под-агентов) через langfuse.propagate_attributes, так что всё в рамках одной сессии hermes chat находится под одной сессией Langfuse.
Проверка:
[code] hermes plugins list # observability/langfuse должен показывать "enabled" hermes chat -q "hello" # проверьте UI Langfuse на наличие трассы "Hermes turn"
[/code]
Опциональная настройка (в .env):
| Переменная | По умолчанию | Назначение |
|---|---|---|
HERMES_LANGFUSE_ENV |
— | Тег окружения на трассах (production, staging, …) |
HERMES_LANGFUSE_RELEASE |
— | Тег релиза/версии |
HERMES_LANGFUSE_SAMPLE_RATE |
1.0 |
Коэффициент семплирования, передаваемый SDK (0.0–1.0) |
HERMES_LANGFUSE_MAX_CHARS |
12000 |
Усечение на поле для содержимого сообщений / аргументов инструментов / результатов инструментов |
HERMES_LANGFUSE_DEBUG |
false |
Подробное логирование плагина в agent.log |
Принимаются как переменные с префиксом Hermes, так и стандартные переменные SDK (LANGFUSE_PUBLIC_KEY, LANGFUSE_SECRET_KEY, LANGFUSE_BASE_URL) — приоритет у переменных с префиксом Hermes, если заданы оба варианта.
Производительность: клиент Langfuse кэшируется после первого вызова хука. Если учётные данные или SDK отсутствуют, это решение также кэшируется — последующие хуки быстро возвращаются без повторной проверки переменных окружения или перезагрузки конфига.
Отключение: hermes plugins disable observability/langfuse. Модуль плагина всё ещё обнаруживается, но код не выполняется, пока вы не включите его снова.
google_meet¶
Позволяет агенту подключаться, транскрибировать и участвовать в конференциях Google Meet — делать заметки на встрече, суммировать обсуждение после, уточнять определённые моменты и (опционально) озвучивать ответы обратно в конференцию через TTS.
Что добавляет:
* Безголовый виртуальный участник, подключающийся к Meet-ссылке через браузерную автоматизацию
* Живая транскрипция аудио конференции через настроенный STT-провайдер
* Набор инструментов meet_summarize / meet_speak / meet_followup, которые агент вызывает для действий на основе услышанного
* Артефакты после встречи (транскрипт, заметки с указанием говорящего, пункты действий), сохраняемые в ~/.hermes/cache/google_meet/<meeting_id>/
Настройка:
[code] hermes plugins enable google_meet # При первом использовании запросит вход через OAuth-поток плагина — # требуется аккаунт Google с доступом к Meet. Может потребоваться # одобрение организатора, если встреча ограничена «только приглашённые».
[/code]
Использование в чате:
«Подключись к meet.google.com/abc-defg-hij и делай заметки. После звонка отправь мне сводку с пунктами действий.»
Агент запускает подключение к конференции, транслирует транскрипцию обратно в свой контекст по ходу звонка и формирует структурированную сводку, когда встреча завершается (или когда вы скажете остановиться).
Когда использовать: регулярные ежедневные стендапы, где нужен бот для транскрипции + сводки для асинхронных участников; интервью типа депозиций, где нужны структурированные заметки; любые случаи, где иначе понадобились бы Fireflies / Otter / Grain. Если вы не хотите, чтобы ИИ слушал — не включайте его.
Отключение: 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
Прогресс уровней: Медь → Серебро → Золото → Алмаз → Олимпиец. Каждая карточка содержит раздел «Что учитывается» с указанием точной отслеживаемой метрики.
Состояния достижений:
| Состояние | Значение |
|---|---|
| Разблокировано | Достигнут как минимум один уровень |
| Обнаружено | Известное достижение, прогресс виден, ещё не получено |
| Секретное | Скрыто, пока Hermes не обнаружит первый соответствующий сигнал в вашей истории |
API — маршруты монтируются в /api/plugins/hermes-achievements/:
| Endpoint | Назначение |
|---|---|
GET /achievements |
Полный каталог с состоянием разблокировки каждого значка (возвращает заглушку «ожидание» пока выполняется первое холодное сканирование) |
GET /scan-status |
Состояние фонового сканера: idle / running / failed, последняя длительность, количество запусков |
GET /recent-unlocks |
Двадцать последних разблокированных значков, сначала новые |
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>/
* Источник манифеста отображается как bundled в hermes plugins list
* Пользовательские плагины с тем же именем переопределяют встроенную версию
Плагин является хорошим кандидатом для включения в репозиторий, когда:
* У него нет опциональных зависимостей (или они уже являются зависимостями pip install .[all])
* Поведение полезно большинству пользователей и лучше реализовано как opt-out, а не opt-in
* Логика привязана к хукам жизненного цикла, которые агенту иначе пришлось бы помнить и вызывать вручную
* Он дополняет основную функциональность, не расширяя поверхность инструментов, видимых модели
Контрпримеры — то, что должно оставаться устанавливаемыми пользователем плагинами, а не встроенными: сторонние интеграции с API-ключами, нишевые рабочие процессы, большие деревья зависимостей, всё, что существенно изменило бы поведение агента по умолчанию.