Вывод скриптов в мессенджеры

hermes send — это маленький, удобный для скриптования CLI, который отправляет сообщение на любую платформу, уже настроенную в Hermes. По сути это кроссплатформенный аналог curl для уведомлений — не нужен запущенный шлюз, не нужен LLM, и не нужно каждый раз вставлять токены ботов в очередной скрипт.

Удобен для:

  • Мониторинга системы (память, диск, температура GPU, завершение долгой задачи)
  • Уведомлений CI/CD (деплой завершён, тесты упали)
  • Cron-скриптов, которым нужно отчитаться о результатах
  • Быстрых разовых сообщений из терминала
  • Перенаправления вывода любого инструмента куда угодно (make | hermes send --to slack:#builds)

Команда использует те же учётные данные и адаптеры платформ, что и hermes gateway, — никакой второй конфигурации обслуживать не нужно.


Быстрый старт

# Простой текст в домашний канал платформы
hermes send --to telegram "deploy finished"

# Передать stdout через пайп
echo "RAM 92%" | hermes send --to telegram:-1001234567890

# Отправить файл
hermes send --to discord:#ops --file ~/.hermes/cache/scratch/report.md

# Добавить тему / заголовок
hermes send --to slack:#eng --subject "[CI] build.log" --file build.log

# Адресация треда (Telegram-топик, Discord-тред)
hermes send --to telegram:-1001234567890:17585 "threaded reply"

# Список всех настроенных адресатов
hermes send --list

# Фильтр по платформе
hermes send --list telegram

Справочник аргументов

ФлагОписание
-t, --to TARGETАдресат. Форматы — см. ниже.
message (позиционный)Текст сообщения. Если опущен — берётся из --file или stdin.
-f, --file PATHЧитать тело из файла. --file - принудительно использует stdin.
-s, --subject LINEДобавить заголовок / тему перед телом сообщения.
-l, --listПоказать доступные адресаты. Опциональный позиционный аргумент — фильтр по платформе.
-q, --quietНе выводить ничего в stdout при успехе (только код возврата — удобно для скриптов).
--jsonВернуть сырой JSON-результат отправки.
-h, --helpПоказать встроенную справку.

Форматы адресата

ФорматПримерЗначение
platformtelegramОтправить в домашний канал платформы
platform:chat_idtelegram:-1001234567890Конкретный чат / группа / пользователь по ID
platform:chat_id:thread_idtelegram:-1001234567890:17585Конкретный тред или Telegram-топик форума
platform:#channeldiscord:#opsИмя канала (резолвится по каталогу каналов)
platform:+E164signal:+15551234567Платформы с адресацией по номеру телефона: Signal, SMS, WhatsApp

Любая платформа, для которой Hermes поставляет адаптер, может быть адресатом: telegram, discord, slack, signal, sms, whatsapp, matrix, mattermost, feishu, dingtalk, wecom, weixin, email и другие.

Коды возврата

КодЗначение
0Отправка (или листинг) прошла успешно
1Ошибка доставки на стороне платформы (авторизация, права, сеть)
2Ошибка использования / аргументов / конфигурации

Коды следуют стандарту Unix — ветвить скрипты по ним можно так же, как по результату curl или grep.


Порядок резолвинга тела сообщения

hermes send определяет тело сообщения в таком порядке:

  1. Позиционный аргумент — hermes send --to telegram "hi"
  2. --file PATH — hermes send --to telegram --file msg.txt
  3. Piped stdin — echo hi | hermes send --to telegram

Если stdin — это TTY (без пайпа), Hermes не ждёт ввода, а сразу выдаёт понятную ошибку. Скрипт не зависнет, если тело случайно не передано.


Примеры из реальной жизни

Мониторинг: оповещения о памяти и диске

Замените разрозненные curl https://api.telegram.org/... в ваших watchdog-скриптах одной переносимой строкой:

#!/usr/bin/env bash
ram_pct=$(free | awk '/^Mem:/ {printf "%d", $3 * 100 / $2}')
if [ "$ram_pct" -ge 85 ]; then
  hermes send --to telegram --subject "⚠ MEMORY WARNING" \
    "RAM ${ram_pct}% on $(hostname)"
fi

Так как hermes send использует вашу конфигурацию Hermes, тот же скрипт работает на любом хосте с установленным Hermes — токены ботов вручную экспортировать не нужно.

совет
Не оповещайте шлюз о нём самом

Для watchdog-ов, которые могут сработать, когда шлюз сам испытывает проблемы (OOM, переполнение диска), оставьте минимальный curl вместо hermes send. Если Python-интерпретатор не может загрузиться из-за перегрузки системы, вы всё равно хотите получить это оповещение.

CI/CD: результаты сборки и тестов

# В .github/workflows/deploy.yml или любом CI-скрипте
if ./scripts/deploy.sh; then
  hermes send --to slack:#deploys "✅ ${CI_COMMIT_SHA:0:7} deployed"
else
  tail -n 100 deploy.log | hermes send \
    --to slack:#deploys --subject "❌ deploy failed"
  exit 1
fi

Cron: ежедневный отчёт

# Запись в crontab
0 9 * * * /usr/local/bin/generate-metrics.sh \
  | /home/me/.hermes/bin/hermes send \
      --to telegram --subject "Daily metrics $(date +%Y-%m-%d)"

Долгие задачи: уведомление о завершении

./train.py --epochs 200 && \
  hermes send --to telegram "training done" || \
  hermes send --to telegram "training failed (exit $?)"

Скриптование с --json и --quiet

# Жёстко прерваться, если доставка не удалась; не засорять логи при успехе
hermes send --to telegram --quiet "keepalive" || {
  echo "Telegram delivery failed" >&2
  exit 1
}

# Сохранить ID сообщения для последующего редактирования / треда
msg_id=$(hermes send --to discord:#ops --json "build started" \
  | jq -r .message_id)

Нужен ли шлюз для hermes send?

Как правило — нет. Для любой платформы с bot-токеном — Telegram, Discord, Slack, Signal, SMS, WhatsApp Cloud API и большинства других — hermes send обращается к REST-эндпоинту платформы напрямую, используя учётные данные из ~/.hermes/.env и ~/.hermes/config.yaml (или из таких же файлов в вашем фактическом домашнем каталоге Hermes — %LOCALAPPDATA%\hermes в Windows или каталог профиля, если задан HERMES_HOME / -p). Это самостоятельный подпроцесс, который завершается сразу после доставки сообщения.

Если платформа сообщает not configured, в ошибке перечислены точные файлы, которые были прочитаны, и что нашлось в каждом, например: Looked in: C:\Users\me\AppData\Local\hermes\.env (no DISCORD_BOT_TOKEN), C:\Users\me\AppData\Local\hermes\config.yaml (no platforms.discord block), environment (DISCORD_BOT_TOKEN unset), external secret sources (none configured). Если шлюз, запущенный из того же домашнего каталога, эту платформу подключил, значит, токен есть только в окружении процесса шлюза — добавьте его в .env этого каталога, чтобы им мог воспользоваться hermes send. Если оболочка привязана к домашнему каталогу профиля (HERMES_HOME=<root>/profiles/<name>), а подключённый шлюз работает из корня по умолчанию, ошибка так и скажет: шлюз .env профиля никогда не читал, а hermes send --list смотрит в channel_directory.json корня.

Живой шлюз нужен только для плагинных платформ, которые зависят от постоянного соединения адаптера (например, пользовательский плагин с долгоживущим WebSocket). В таком случае вы получите понятную ошибку с указанием на шлюз — запустите его через hermes gateway start и повторите попытку.


Листинг и обнаружение адресатов

Перед отправкой в конкретный канал можно проверить, что доступно:

# Все адресаты по всем настроенным платформам
hermes send --list

# Только Telegram
hermes send --list telegram

# В машиночитаемом виде
hermes send --list --json

Листинг строится по ~/.hermes/channel_directory.json — шлюз обновляет этот файл каждые несколько минут во время работы. Если вы видите «no channels discovered yet», запустите шлюз хотя бы один раз (hermes gateway start), чтобы заполнить кэш.

Человекочитаемые имена (discord:#ops, slack:#engineering) резолвятся по этому кэшу в момент отправки — запоминать числовые ID не нужно.


Сравнение подходов

ПодходМультиплатформ.Повторно использует credsНужен шлюзЛучше всего для
hermes send✅✅Нет (bot-token)Всё перечисленное ниже
Прямой curl к каждой платформеОтдельно для каждойВручнуюНетКритичные watchdog-и
Cron-задача с --deliver✅✅НетЗапланированные задачи агента

hermes send — намеренно самый простой интерфейс. Если нужно, чтобы агент сам решал, что написать, — запланируйте cron-задачу: финальный ответ агента автоматически доставляется в целевой канал, указанный в deliver: (агент больше не отправляет сообщения сам). Если нужен плановый запуск с контентом от LLM — используйте cronjob(action='create', prompt=...) с deliver='telegram:...'. Если нужно просто передать строку — hermes send.


Связанные материалы

перевод и редактура:

обновлено

⌕ ESC