Планируйте автоматический запуск задач с помощью естественного языка или выражений cron. Hermes предоставляет управление cron с помощью единого инструмента cronjob с операциями в стиле действий вместо отдельных инструментов планирования/списка/удаления.
Что cron теперь может сделать
Задания Cron могут:
планировать разовые или повторяющиеся задачи
приостанавливать, возобновлять, редактировать, запускать и удалять задания
прикреплять к работе ноль, один или несколько навыков
доставлять результаты обратно в исходный чат, локальные файлы или настроенные целевые платформы.
запуск новых сеансов агента с обычным статическим списком инструментов
запуск в режиме без агента — сценарий по расписанию, его стандартный вывод доставляется дословно, нулевое участие LLM (см. раздел режим без агента ниже)
Все это доступно самому Hermes через инструмент cronjob, поэтому вы можете создавать, приостанавливать, редактировать и удалять задания, запрашивая простым языком — CLI не требуется.:::предупреждение
Сеансы, запускаемые Cron, не могут рекурсивно создавать дополнительные задания cron. Hermes отключает инструменты управления cron внутри выполнения cron, чтобы предотвратить неконтролируемые циклы планирования.
Создание запланированных задач
В чате с /cron
/cronadd30m"Remind me to check the build"
/cronadd"every 2h""Check server status"
/cronadd"every 1h""Summarize new feed items"--skillblogwatcher
/cronadd"every 1h""Use both skills and combine the result"--skillblogwatcher--skillmaps
Из автономного интерфейса командной строки
hermescroncreate"every 2h""Check server status"
hermescroncreate"every 1h""Summarize new feed items"--skillblogwatcher
hermescroncreate"every 1h""Use both skills and combine the result"\--skillblogwatcher\--skillmaps\--name"Skill combo"
Через естественный разговор
Спросите Гермеса обычно:
Every morning at 9am, check Hacker News for AI news and send me a summary on Telegram.
Hermes будет использовать единый инструмент cronjob для внутренних целей.
Задания cron, поддерживаемые навыками
Задание cron может загрузить один или несколько навыков до запуска приглашения.
Один навык
cronjob(action="create",skill="blogwatcher",prompt="Check the configured feeds and summarize anything new.",schedule="0 9 * * *",name="Morning feeds",)
Несколько навыков
Навыки загружаются по порядку. Подсказка становится инструкцией по выполнению задачи, наложенной поверх этих навыков.
cronjob(action="create",skills=["blogwatcher","maps"],prompt="Look for new local events and interesting nearby places, then combine them into one short brief.",schedule="every 6h",name="Local brief",)
Это полезно, если вы хотите, чтобы запланированный агент наследовал многократно используемые рабочие процессы, не вставляя полный текст навыка в саму подсказку cron.
Запуск задания внутри каталога проекта
Задания Cron по умолчанию выполняются отдельно от любого репозитория — никакие AGENTS.md, CLAUDE.md или .cursorrules не загружаются, а инструменты терминала/файла/code-exec запускаются из любого рабочего каталога, в котором запущен шлюз. Передайте --workdir (CLI) или workdir= (вызов инструмента), чтобы изменить это:
# Standalone CLI (schedule and prompt are positional)
hermescroncreate"every 1d at 09:00"\"Audit open PRs, summarize CI health, and post to #eng"\--workdir/home/me/projects/acme
# From a chat, via the cronjob toolcronjob(action="create",schedule="every 1d at 09:00",workdir="/home/me/projects/acme",prompt="Audit open PRs, summarize CI health, and post to #eng",)
Когда установлен workdir:
AGENTS.md, CLAUDE.md и .cursorrules из этого каталога вводятся в системную подсказку (тот же порядок обнаружения, что и в интерактивном интерфейсе командной строки)
terminal, read_file, write_file, patch, search_files и execute_code используют этот каталог в качестве своего рабочего каталога (через TERMINAL_CWD)
Путь должен быть абсолютным существующим каталогом — относительные пути и отсутствующие каталоги отклоняются во время создания/обновления.
Передайте --workdir "" (или workdir="" через инструмент) при редактировании, чтобы очистить его и восстановить старое поведение.:::примечание Сериализация
Задания с рабочим каталогом выполняются последовательно по такту планировщика, а не в параллельном пуле. Это сделано намеренно — TERMINAL_CWD является глобальным для процесса, поэтому два задания в рабочем каталоге, выполняемые одновременно, могут повредить cwd друг друга. Задания без рабочего каталога по-прежнему выполняются параллельно, как и раньше.
Редактирование заданий
Вам не нужно удалять и заново создавать задания только для того, чтобы их изменить.
Чат
/cronedit<job_id>--schedule"every 4h"
/cronedit<job_id>--prompt"Use the revised task"
/cronedit<job_id>--skillblogwatcher--skillmaps
/cronedit<job_id>--remove-skillblogwatcher
/cronedit<job_id>--clear-skills
Автономный интерфейс командной строки
hermescronedit<job_id>--schedule"every 4h"
hermescronedit<job_id>--prompt"Use the revised task"
hermescronedit<job_id>--skillblogwatcher--skillmaps
hermescronedit<job_id>--add-skillmaps
hermescronedit<job_id>--remove-skillblogwatcher
hermescronedit<job_id>--clear-skills
Примечания:
повторный --skill заменяет прикрепленный к заданию список навыков
--add-skill добавляется к существующему списку, не заменяя его.
«пауза» — оставить задание, но прекратить его планировать
resume — повторно включить задание и вычислить следующий будущий запуск
run — запустить задание на следующем тике планировщика
remove — удалить полностью
Как это работает
Выполнение Cron осуществляется демоном шлюза. Шлюз проверяет планировщик каждые 60 секунд, выполняя все необходимые задания в изолированных сеансах агента.
hermesgatewayinstall# Install as a user service
sudohermesgatewayinstall--system# Linux: boot-time system service for servers
hermesgateway# Or run in foreground
hermescronlist
hermescronstatus
Поведение планировщика шлюза
На каждом тике Гермеса:
загружает задания из ~/.hermes/cron/jobs.json
сверяет next_run_at с текущим временем
запускает новый сеанс AIAgent для каждого выполняемого задания.
при необходимости добавляет в новую сессию один или несколько дополнительных навыков.
запускает подсказку до завершения
дает окончательный ответ
обновления запускают метаданные и следующее запланированное время.
Блокировка файла ~/.hermes/cron/.tick.lock предотвращает перекрытие тактов планировщика от двойного запуска одного и того же пакета заданий.
Варианты доставки
При планировании заданий вы указываете, куда направляются выходные данные:
Вариант
Описание
Пример
"происхождение"
Назад туда, где была создана вакансия
По умолчанию на платформах обмена сообщениями
"местный"
Сохранять только в локальные файлы (~/.hermes/cron/output/)
По умолчанию в CLI
"телеграмма"
Домашний канал Telegram
Использует TELEGRAM_HOME_CHANNEL
"телеграмма:123456"
Конкретный чат Telegram по ID
Прямая доставка
"телеграмма:-100123:17585"
Конкретная тема Telegram
формат chat_id:thread_id
"раздор"
Домашний канал Discord
Использует DISCORD_HOME_CHANNEL
"discord:#engineering"
Конкретный канал Discord
По названию канала
"слаба"
Домашний канал Slack
"WhatsApp"
WhatsApp дома
"сигнал"
Сигнал
"матрица"
Матрица домашняя комната
"самое важное"
Самый важный домашний канал
"электронная почта"
Электронная почта
"смс"
СМС через Twilio
"домашний помощник"
Домашний помощник
"Динтолк"
ДинТок
"фейшу"
Фейшу/Жаворонок
"Веком"
ВеКом
"Вэйсинь"
Вэйсинь (WeChat)
"голубые пузыри"
BlueBubbles (iMessage)
"qqbot"
QQ-бот (Tencent QQ)
Окончательный ответ агента доставляется автоматически. Вам не нужно вызывать send_message в командной строке cron.
Перенос ответа
По умолчанию доставленные выходные данные cron оборачиваются верхним и нижним колонтитулом, чтобы получатель знал, что они получены в результате запланированной задачи:
Cronjob Response: Morning feeds
-------------
<agent output here>
Note: The agent cannot see this message, and therefore cannot respond to it.
Чтобы доставить необработанный вывод агента без оболочки, установите для параметра cron.wrap_response значение false:
# ~/.hermes/config.yamlcron:wrap_response:false
Тихое подавление
Если окончательный ответ агента начинается с [SILENT], доставка полностью подавляется. Вывод по-прежнему сохраняется локально для аудита (в ~/.hermes/cron/output/), но никакое сообщение не отправляется адресату доставки.
Это полезно для мониторинга заданий, которые должны сообщать только о том, что что-то не так:
Check if nginx is running. If everything is healthy, respond with only [SILENT].
Otherwise, report the issue.
Неудачные задания всегда выполняются независимо от маркера [SILENT] — только успешные запуски могут быть отключены.
Таймаут скрипта
Сценарии перед запуском (прикрепляемые через параметр script) имеют время ожидания по умолчанию 120 секунд. Если вашим сценариям требуется больше времени — например, для включения рандомизированных задержек, которые позволяют избежать шаблонов синхронизации, подобных боту, — вы можете увеличить это значение:
Или установите переменную среды HERMES_CRON_SCRIPT_TIMEOUT. Порядок разрешения: env var → config.yaml → 120 с по умолчанию.
Режим без агента (задания только для сценариев)
Для повторяющихся заданий, которые не требуют рассуждений LLM — классических сторожевых таймеров, предупреждений о диске/памяти, тактовых импульсов, пингов CI — передайте no_agent=True во время создания. Планировщик запускает ваш скрипт по расписанию и доставляет его стандартный вывод напрямую, полностью пропуская агент:
Стандартный вывод сценария (обрезанный) → дословно доставлен в виде сообщения.
Пустой стандартный вывод → тихая галочка, доставка отсутствует. Это сторожевой шаблон: «говори что-нибудь только тогда, когда что-то не так».
Ненулевой выход или тайм-аут → выдается предупреждение об ошибке, поэтому сломанный сторожевой таймер не может выйти из строя молча.
{"wakeAgent": false} в последней строке → тихая галочка (те же ворота, которые используются в заданиях LLM).
— Никаких токенов, никакой модели, никакого резервного поставщика — задание никогда не затрагивает уровень вывода.
Файлы .sh/.bash запускаются в /bin/bash; что-нибудь еще в текущем интерпретаторе Python (sys.executable). Скрипты должны находиться в ~/.hermes/scripts/ (то же правило песочницы, что и для шлюза предварительного запуска скриптов).
Агент настроит их для вас
Схема инструмента cronjob предоставляет no_agent непосредственно Hermes, поэтому вы можете описать сторожевой таймер в чате и позволить агенту подключить его:
Ping me on Telegram if RAM is over 85%, every 5 minutes.
Hermes запишет сценарий проверки в ~/.hermes/scripts/ через write_file, а затем вызовет:
Он выбирает no_agent=True автоматически, когда содержимое сообщения полностью определяется сценарием (сторожевые таймеры, пороговые оповещения, контрольные сигналы). Тот же инструмент также позволяет агенту приостанавливать, возобновлять, редактировать и удалять задания — таким образом, весь жизненный цикл управляется через чат, и никто не затрагивает интерфейс командной строки.
Задания Cron наследуют настроенных резервных поставщиков и ротацию пула учетных данных. Если основной ключ API ограничен по скорости или поставщик возвращает ошибку, агент cron может:
Вернитесь к альтернативному поставщику, если у вас есть fallback_providers (или устаревшая fallback_model), настроенная в config.yaml
Переход к следующим учетным данным в вашем пуле учетных данных для того же поставщика.
Это означает, что задания cron, которые выполняются с высокой частотой или в часы пик, более устойчивы — один ключ с ограниченной скоростью не приведет к сбою на протяжении всего выполнения.
Форматы расписания
Окончательный ответ агента доставляется автоматически — вам нет необходимости включать send_message в приглашение cron для того же пункта назначения. Если запуск cron вызывает send_message для точной цели, куда планировщик уже доставил сообщение, Hermes пропускает эту дублирующую отправку и сообщает модели вместо этого поместить контент, ориентированный на пользователя, в окончательный ответ. Используйте send_message только для дополнительных или других целей.
Относительные задержки (однократные)
30m → Run once in 30 minutes
2h → Run once in 2 hours
1d → Run once in 1 day
Интервалы (повторяющиеся)
every 30m → Every 30 minutes
every 2h → Every 2 hours
every 1d → Every day
Выражения Cron
0 9 * * * → Daily at 9:00 AM
0 9 * * 1-5 → Weekdays at 9:00 AM
0 */6 * * * → Every 6 hours
30 8 1 * * → First of every month at 8:30 AM
0 0 * * 0 → Every Sunday at midnight
Временные метки ISO
2026-03-15T09:00:00 → One-time at March 15, 2026 9:00 AM
Для update передайте skills=[], чтобы удалить все прикрепленные навыки.
Наборы инструментов, доступные для заданий cron
Cron запускает каждое задание в новом сеансе агента без подключения платформы чата. По умолчанию агент cron получает набор инструментов, который вы настроили для платформы cron в инструментах Hermes, а не CLI по умолчанию и не все на свете.
hermestools
# → pick the "cron" platform in the curses UI# → toggle toolsets on/off just like you would for Telegram/Discord/etc.
Более жесткий контроль над каждым заданием доступен через поле enabled_toolsets в cronjob.create (или в существующем задании через cronjob.update):
cronjob(action="create", name="weekly-news-summary",
schedule="every sunday 9am",
enabled_toolsets=["web", "file"], # just web + file, no terminal/browser/etc.
prompt="Summarize this week's AI news:...")
Когда для задания установлен enabled_toolsets, оно выигрывает; в противном случае побеждает конфигурация cron-платформы hermestools; в противном случае Hermes вернется к встроенным настройкам по умолчанию. Это важно для контроля затрат: включение «moa», «браузера» и «делегирования» в каждое крошечное задание по получению новостей приводит к раздуванию подсказки схемы инструмента при каждом вызове LLM.
Полный пропуск агента: wakeAgent
Если к вашему заданию cron прилагается сценарий предварительной проверки (через script=), сценарий может решить во время выполнения, следует ли Hermes вообще вызывать агент. Выдайте последнюю строку стандартного вывода формы:
{"wakeAgent": false}
…и cron полностью пропускает запуск агента для этого тика. Полезно для частых опросов (каждые 1–5 минут), при которых LLM необходимо разбудить только тогда, когда состояние действительно изменилось — в противном случае вы снова и снова платите за обороты агента с нулевым содержанием.
# pre-check scriptimportjson,syslatest=fetch_latest_issue_count()prev=read_state("issue_count")iflatest==prev:print(json.dumps({"wakeAgent":False}))# skip this ticksys.exit(0)write_state("issue_count",latest)print(json.dumps({"wakeAgent":True,"context":{"new_issues":latest-prev}}))
Если wakeAgent опущен, значением по умолчанию является true (разбудить агент как обычно).
Объединение заданий: context_from
Задание cron может использовать самые последние успешные выходные данные одного или нескольких других заданий, перечислив их имена (или идентификаторы) в context_from:
cronjob(action="create", name="daily-digest",
schedule="every day 7am",
context_from=["ai-news-fetch", "github-prs-fetch"],
prompt="Write the daily digest using the outputs above.")
Результаты последних завершенных заданий, на которые имеются ссылки, вставляются над приглашением в качестве контекста для этого запуска. Каждая восходящая запись должна быть действительным идентификатором или именем задания (см. cronjob action="list"). Примечание: цепочка считывает самые последние завершенные выходные данные — она не ожидает выполнения вышестоящих заданий, выполняющихся в тот же такт.
Хранилище заданий
Рабочие места хранятся в ~/.hermes/cron/jobs.json. Вывод результатов выполнения заданий сохраняется в ~/.hermes/cron/output/{job_id}/{timestamp}.md.
Задания могут хранить значения «модель» и «поставщик» как «нулевые». Если эти поля опущены, Hermes разрешает их во время выполнения из глобальной конфигурации. Они появляются в записи о задании только в том случае, если установлено переопределение для каждого задания.
В хранилище используется атомарная запись файлов, поэтому прерванные записи не оставляют после себя частично записанный файл задания.
Самостоятельные подсказки по-прежнему имеют значение:::предупреждение Важно
Задания Cron выполняются в совершенно новом сеансе агента. Приглашение должно содержать все, что нужно агенту, чего еще не предусмотрено прикрепленными навыками.
ПЛОХО:"Проверьте проблему с этим сервером"
ХОРОШО:"Подключитесь по SSH к серверу 192.168.1.100 от имени пользователя "deploy", проверьте, работает ли nginx с "systemctl status nginx", и убедитесь, что https://example.com возвращает HTTP 200."
Безопасность
Запросы запланированных задач сканируются на предмет шаблонов внедрения подсказок и кражи учетных данных во время создания и обновления. Запросы, содержащие невидимые трюки Unicode, попытки бэкдора SSH или очевидные полезные данные для раскрытия секретов, блокируются.