Вывод скриптов в мессенджеры
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 | Показать встроенную справку. |
Форматы адресата
| Формат | Пример | Значение |
|---|---|---|
platform | telegram | Отправить в домашний канал платформы |
platform:chat_id | telegram:-1001234567890 | Конкретный чат / группа / пользователь по ID |
platform:chat_id:thread_id | telegram:-1001234567890:17585 | Конкретный тред или Telegram-топик форума |
platform:#channel | discord:#ops | Имя канала (резолвится по каталогу каналов) |
platform:+E164 | signal:+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 определяет тело сообщения в таком порядке:
- Позиционный аргумент —
hermes send --to telegram "hi" --file PATH—hermes send --to telegram --file msg.txt- 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.
Связанные материалы
- Автоматизация с cron — плановые задачи, результаты которых автоматически доставляются на любую платформу.
- Устройство шлюза —
роутер доставки, который
hermes sendразделяет с cron delivery. - Настройка платформ мессенджеров — разовая настройка каждой платформы.