Перейти к основному содержимому

Запланированные задачи (Cron)

Планируйте автоматический запуск задач с помощью естественного языка или выражений cron. VibeOS предоставляет управление cron с помощью одного инструмента cronjob с операциями в стиле действий вместо отдельных инструментов Schedule/list/remove.

Что cron теперь может сделать​

Задания Cron могут:

  • планировать разовые или повторяющиеся задачи
  • приостанавливать, возобновлять, редактировать, запускать и удалять задания
  • прикреплять к работе ноль, один или несколько навыков
  • доставлять результаты обратно в исходный чат, локальные файлы или настроенные целевые платформы.
  • запуск новых сеансов агента с обычным статическим списком инструментов
  • запуск в режиме без агента — сценарий по расписанию, его стандартный вывод доставляется дословно, без участия LLM (см. раздел режим без агента ниже)

Все это доступно самому VibeOS через инструмент cronjob, поэтому вы можете создавать, приостанавливать, редактировать и удалять задания, задавая простой вопрос — CLI не требуется.

подсказка

При создании незакрепленное задание (которое вы не задаете в явном виде provider/model) следует глобальному умолчанию, выбранному vibeos model, а VibeOS снимки этого поставщика и модели в задании. Если впоследствии глобальное значение по умолчанию изменится, задание не закроется: оно пропускает выполнение, не выполняет никаких вызовов вывода и отправляет предупреждение, предлагающее явно закрепить поставщика /model (cronjob action=update job_id=… provider=… model=…) для продолжения. Это не позволяет автоматическому заданию незаметно унаследовать переход на платного провайдера /model и тратить деньги, которые вы не собирались (# 44585). Чтобы задание намеренно отслеживало глобальные значения по умолчанию, прикрепите его к новым значениям после их изменения. vibeos setup --portal — это вариант с минимальными трудностями для автоматического запуска, поскольку обновление OAuth происходит автоматически. См. Портал Ноус.

предупреждение

Сеансы, запускаемые Cron, не могут рекурсивно создавать дополнительные задания cron. VibeOS отключает инструменты управления cron внутри выполнения cron, чтобы предотвратить неконтролируемые циклы планирования.

Приостановка планировщика gateway​

По умолчанию gateway запускает триггер cron. Чтобы запустить messaging gateway без выполнения запланированных задач, установите переключатель:

# ~/.vibeos/config.yaml
cron:
enabled: false

Это не удаляет, не ставит на паузу и не переписывает задания. Переключатель только запрещает gateway запускать ticker/provider cron. Верните true (или удалите ключ) и перезапустите gateway, чтобы возобновить расписание. Режим удобен для ограниченных smoke-тестов gateway и технических окон.

Создание запланированных задач​

В чате с /cron​

/cron add 30m "Remind me to check the build"
/cron add "every 2h" "Check server status"
/cron add "every 1h" "Summarize new feed items" --skill blogwatcher
/cron add "every 1h" "Use both skills and combine the result" --skill blogwatcher --skill maps

Из автономного CLI​

vibeos cron create "every 2h" "Check server status"
vibeos cron create "every 1h" "Summarize new feed items" --skill blogwatcher
vibeos cron create "every 1h" "Use both skills and combine the result" \
--skill blogwatcher \
--skill maps \
--name "Skill combo"

Через естественный разговор​

Спросите VibeOS обычно:

Every morning at 9am, check Hacker News for AI news and send me a summary on Telegram.

VibeOS будет использовать унифицированный инструмент 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)
vibeos cron create "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 tool
cronjob(
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 из этого каталога вводятся в системную подсказку (тот же порядок обнаружения, что и для интерактивного CLI)
  • terminal, read_file, write_file, patch, search_files и execute_code используют этот каталог в качестве рабочего каталога.
  • Путь должен быть абсолютным существующим каталогом — относительные пути и отсутствующие каталоги отклоняются во время создания/обновления.
  • Передайте --workdir "" (или workdir="" через инструмент) при редактировании, чтобы очистить его и восстановить старое поведение.
Сериализация

Задания с workdir выполняются последовательно по такту планировщика, а не в параллельном пуле. Это намеренно: работник cron применяет рабочий каталог задания через глобальное состояние терминала процесса, поэтому два задания рабочего каталога, выполняемые одновременно, повредят cwd друг друга. Задания без рабочего каталога по-прежнему выполняются параллельно, как и раньше.

Редактирование заданий​

Вам не нужно удалять и заново создавать задания только для того, чтобы их изменить.

Ссылка на вакансию

Заполнитель <job_id> ниже (и в [Действиях жизненного цикла](#lifecycle-actions)) также принимает имя задания (без учета регистра) — это удобно, если вы помните morning-digest`, но не шестнадцатеричный идентификатор. Точный идентификатор задания имеет приоритет над совпадениями имен; если ссылка не является идентификатором, а имя соответствует более чем одному заданию, команда отклоняет и печатает идентификаторы кандидатов, чтобы вы могли устранить неоднозначность.

Чат​

/cron edit <job_id> --schedule "every 4h"
/cron edit <job_id> --prompt "Use the revised task"
/cron edit <job_id> --skill blogwatcher --skill maps
/cron edit <job_id> --remove-skill blogwatcher
/cron edit <job_id> --clear-skills

Автономный CLI​

vibeos cron edit <job_id> --schedule "every 4h"
vibeos cron edit <job_id> --prompt "Use the revised task"
vibeos cron edit <job_id> --skill blogwatcher --skill maps
vibeos cron edit <job_id> --add-skill maps
vibeos cron edit <job_id> --remove-skill blogwatcher
vibeos cron edit <job_id> --clear-skills

Примечания:

  • повторный --skill заменяет прикрепленный к заданию список навыков.
  • --add-skill добавляется к существующему списку, не заменяя его.
  • --remove-skill удаляет определенные прикрепленные навыки.
  • --clear-skills удаляет все прикрепленные навыки.

Действия жизненного цикла​

Задания Cron теперь имеют более полный жизненный цикл, чем просто создание /remove..

Чат​

/cron list
/cron pause <job_id>
/cron resume <job_id>
/cron run <job_id>
/cron remove <job_id>

Автономный CLI​

vibeos cron list
vibeos cron pause <job_id_or_name>
vibeos cron resume <job_id_or_name>
vibeos cron run <job_id_or_name>
vibeos cron remove <job_id_or_name>
vibeos cron edit <job_id_or_name> [...flags]
vibeos cron status
vibeos cron tick

Что они делают:

  • pause — сохранить задание, но прекратить его планирование.
  • resume — повторно включите задание и вычислите следующий будущий запуск.
  • run — запустить задание на следующем тике планировщика.
  • remove — удалить полностью
  • edit — изменить расписание, приглашение, доставку и т. д.

Поиск по имени. Все четыре мутирующих глагола (pause, resume, run, remove, edit), а также инструмент агента cronjob теперь принимают задание name (без учета регистра) вместо шестнадцатеричного идентификатора. И агент, и CLI предпочитают точное совпадение идентификаторов, если таковое существует; неоднозначные совпадения имен (несколько вакансий с одинаковым именем) отклоняются при использовании полного списка идентификаторов кандидатов, поэтому вы можете выбрать один явно. Имена не уникальны, поэтому эта защита является несущей — она предотвращает скрытое изменение неправильного задания, когда у двух одинаковые имена.

Как это работает​

Выполнение Cron осуществляется демоном шлюза. Шлюз проверяет планировщик каждые 60 секунд, выполняя все необходимые задания в изолированных сеансах агента.

vibeos gateway install     # Install as a user service
sudo vibeos gateway install --system # Linux: boot-time system service for servers
vibeos gateway # Or run in foreground

vibeos cron list
vibeos cron status

Поведение планировщика шлюза​

На каждом тике VibeOS:

  1. загружает задания из ~/.vibeos/cron/jobs.json
  2. сверяет next_run_at с текущим временем
  3. запускает новый сеанс AIAgent для каждого выполняемого задания.
  4. при необходимости добавляет в новую сессию один или несколько дополнительных навыков.
  5. запускает подсказку до завершения
  6. дает окончательный ответ
  7. обновления запускают метаданные и следующее запланированное время.

Блокировка файла по адресу ~/.vibeos/cron/.tick.lock предотвращает перекрытие тактов планировщика от двойного запуска одного и того же пакета заданий.

Варианты доставки​

При планировании заданий вы указываете, куда направляются выходные данные:

ВариантОписаниеПример
"origin"Назад туда, где была создана вакансияПо умолчанию на платформах обмена сообщениями
"local"Сохранять только в локальные файлы (~/.vibeos/cron/output/)По умолчанию на CLI
"telegram"Домашний канал TelegramИспользует TELEGRAM_HOME_CHANNEL
"telegram:123456"Конкретный чат Telegram по IDПрямая доставка
"telegram:-100123:17585"Конкретная тема TelegramФормат chat_id:thread_id
"discord"Домашний канал DiscordИспользует DISCORD_HOME_CHANNEL
"discord:#engineering"Конкретный канал DiscordПо названию канала
"slack"Домашний канал Slack
"whatsapp"WhatsApp дома
"signal"Signal
"matrix"Домашняя комната Matrix
"mattermost"Домашний канал Mattermost
"email"Email
"sms"SMS через Twilio
"homeassistant"Home Assistant
"dingtalk"DingTalk
"feishu"Feishu/Lark
"wecom"WeCom
"weixin"Weixin (WeChat)
"bluebubbles"BlueBubbles (iMessage)
"qqbot"QQ-бот (Tencent QQ)
"all"Разветвление на каждый подключенный домашний каналРешено во время пожара
"telegram,discord"Распределение по определенному набору каналовСписок, разделенный запятыми
"origin,all"Доставка до источника плюс по всем остальным подключенным каналамОбъединяйте любые жетоны

Окончательный ответ агента доставляется автоматически. Вам не нужно вызывать send_message в приглашении cron.

Назначение маршрутизации (all)​

all позволяет отправлять одно задание cron на каждый настроенный вами канал обмена сообщениями без необходимости перечислять их по имени. Это решается во время пожара, поэтому задание, созданное до того, как вы подключили Telegram, подхватит Telegram на следующем такте после установки TELEGRAM_HOME_CHANNEL.

Семантика: all распространяется на каждую платформу с настроенным домашним каналом. Ноль в порядке; задание просто не создает целевых показателей доставки и регистрируется как сбой доставки в восходящем направлении.

all сочиняет с явными целями. origin,all доставляет информацию в исходный чат плюс на любой другой подключенный домашний канал, дублируясь (platform, chat_id, thread_id).

Тема cron Telegram (TELEGRAM_CRON_THREAD_ID)​

Когда включен тематический режим Telegram, корневой DM зарезервирован как системное лобби — отправленные туда ответы отклоняются с напоминанием о лобби, а reply_to_message_id удаляется, поэтому вы не можете ответить на сообщение cron, которое попало в основной чат.

Вместо этого укажите cron на специальную тему форума:

  1. В Telegram откройте DM бота и создайте тему, например. Cron. Нажмите и удерживайте заголовок темы → Копировать ссылку; последнее целое число — это message_thread_id темы.
  2. Установите TELEGRAM_CRON_THREAD_ID=&lt;that id&gt; в свой .env`.

Это относится только к поставкам cron. TELEGRAM_HOME_CHANNEL_THREAD_ID (используется в других местах, например, в уведомлениях о перезапуске) не изменился. Явные цели deliver="telegram:chat_id:thread_id" продолжают побеждать переменную env. Ответы на сообщения 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:

# ~/.vibeos/config.yaml
cron:
wrap_response: false

Продолжаемые задания (ответ на доставку cron)​

По умолчанию доставка cron осуществляется по принципу «запустил и забыл»: сообщение отправляется, но оно не отправляется. не отображается в истории разговоров чата, поэтому, если вы ответите на него, агент не имеет записи о том, что он сказал. Установите задание продолжаемое и доставленное задание становится разговором, на который вы можете ответить — у агента есть краткая информация в контексте вместо вопроса «Что такое Задача №2?».

Включено, по умолчанию отключено. Включите глобально в конфигурации или для каждого задания через cronjob. attach_to_session инструмента (который переопределяет глобальные настройки для этого задания):

# ~/.vibeos/config.yaml
cron:
mirror_delivery: false # set true to make cron deliveries continuable

Поведение является предпочтительным для потока и ограничено исходным чатом задания:

  • Платформы с поддержкой потоков (темы Telegram, темы Discord/Slack): каждая доставка открывает отдельную ветку, и в нее помещается краткое описание сеанс потока, поэтому ответ внутри потока продолжается с полным контекстом. А повторяющееся задание (например, ежедневное задание) открывает новую ветку при каждом запуске, сохраняя каждое последующее обсуждение доставки изолировано.
  • Платформы только для личных сообщений (WhatsApp, Signal, SMS): тем не существует, поэтому краткое описание Вместо этого зеркально отображается исходный сеанс DM — сам DM является поверхность продолжения.

Затрагивается только исходный чат: цели разветвления/трансляции (all, явные поставки в другой чат) никогда не становятся непрерывными. Зеркало записан как помеченная очередь пользователя ([Cron delivery: &lt;task name&gt;]), которая сохраняет история разговоров защищена от изменений для всех поставщиков моделей.

Тихое подавление​

Если окончательный ответ агента содержит [SILENT], доставка полностью подавляется. Вывод по-прежнему сохраняется локально для аудита (в ~/.vibeos/cron/output/), но сообщение адресату доставки не отправляется.

Это полезно для мониторинга заданий, которые должны сообщать только о том, что что-то не так:

Check if nginx is running. If everything is healthy, respond with only [SILENT].
Otherwise, report the issue.

Неудачные задания всегда выполняются независимо от маркера [SILENT] — отключить звук можно только при успешных запусках. Для заданий тихого мониторинга предложите агенту ответить только [SILENT], если не о чем сообщить.

Таймаут скрипта​

Предварительные сценарии (подключаемые с помощью параметра script) имеют время ожидания по умолчанию 120 секунд. Если вашим сценариям требуется больше времени — например, для включения рандомизированных задержек, которые позволяют избежать шаблонов синхронизации, подобных боту, — вы можете увеличить это значение:

# ~/.vibeos/config.yaml
cron:
script_timeout_seconds: 300 # 5 minutes

Или установите переменную среды VIBEOS_CRON_SCRIPT_TIMEOUT. Порядок разрешения: env var → config.yaml → 120 с по умолчанию.

Режим без агента (задания только для сценариев)​

Для повторяющихся заданий, для которых не требуется рассуждение LLM — классические сторожевые таймеры, оповещения disk/memory, контрольные сигналы, пинги CI — передайте no_agent=True во время создания. Планировщик запускает ваш скрипт по расписанию и доставляет его стандартный вывод напрямую, полностью пропуская агент:

vibeos cron create "every 5m" \
--no-agent \
--script memory-watchdog.sh \
--deliver telegram \
--name "memory-watchdog"

Семантика:

  • Стандартный вывод сценария (обрезанный) → дословно доставлен в виде сообщения.
  • Пустой стандартный вывод → тихая галочка, доставка отсутствует. Это сторожевой шаблон: «говори что-нибудь только тогда, когда что-то не так».
  • Ненулевой выход или тайм-аут → выдается предупреждение об ошибке, поэтому сломанный сторожевой таймер не может выйти из строя молча.
  • {"wakeAgent": false} в последней строке → тихая галочка (тот же шлюз, который используется в заданиях LLM). — Никаких токенов, никакой модели, никакого резервного поставщика — задание никогда не затрагивает уровень вывода.

Файлы .sh/.bash выполняются под /bin/bash; что-нибудь еще в текущем интерпретаторе Python (sys.executable). Сценарии должны находиться в ~/.vibeos/scripts/ (то же правило песочницы, что и для шлюза предварительного запуска сценариев).

Агент настроит их для вас​

Схема инструмента cronjob напрямую предоставляет no_agent VibeOS, поэтому вы можете описать сторожевой таймер в чате и позволить агенту подключить его:

Ping me on Telegram if RAM is over 85%, every 5 minutes.

VibeOS запишет сценарий проверки в ~/.vibeos/scripts/ через write_file, затем вызовет:

cronjob(action="create", schedule="every 5m",
script="memory-watchdog.sh", no_agent=True,
deliver="telegram", name="memory-watchdog")

Он выбирает no_agent=True автоматически, когда содержимое сообщения полностью определяется сценарием (сторожевые таймеры, пороговые оповещения, контрольные сигналы). Этот же инструмент также позволяет агенту приостанавливать, возобновлять, редактировать и удалять задания — таким образом, весь жизненный цикл управляется через чат, и никто не прикасается к CLI.

См. рабочие примеры в Руководстве по заданиям Cron только для сценариев.

Объединение заданий с помощью context_from​

Задания Cron выполняются в изолированных сеансах без памяти о предыдущих запусках. Но иногда результат одной работы — это именно то, что нужно следующей работе. Параметр context_from автоматически устанавливает это соединение — приглашение задания B получает самые последние выходные данные задания A, добавленные в качестве контекста во время выполнения.

# Job 1: Collect raw data
cronjob(
action="create",
prompt="Fetch the top 10 AI/ML stories from Hacker News. Save them to ~/.vibeos/data/briefs/raw.md in markdown format with title, URL, and score.",
schedule="0 7 * * *",
name="AI News Collector",
)

# Job 2: Triage — receives Job 1's output as context
# Get Job 1's ID from: cronjob(action="list")
cronjob(
action="create",
prompt="Read ~/.vibeos/data/briefs/raw.md. Score each story 1–10 for engagement potential and novelty. Output the top 5 to ~/.vibeos/data/briefs/ranked.md.",
schedule="30 7 * * *",
context_from="<job1_id>",
name="AI News Triage",
)

# Job 3: Ship — receives Job 2's output as context
cronjob(
action="create",
prompt="Read ~/.vibeos/data/briefs/ranked.md. Write 3 tweet drafts (hook + body + hashtags). Deliver to telegram:7976161601.",
schedule="0 8 * * *",
context_from="<job2_id>",
name="AI News Brief",
)

Как это работает:

  • Когда запускается задание 2, VibeOS считывает последний вывод задания 1 из ~/.vibeos/cron/output/{job1_id}/*.md.
  • Этот вывод автоматически добавляется к приглашению задания 2.
  • Заданию 2 не нужно жестко запрограммировать «прочитать этот файл» — оно получает содержимое в качестве контекста.
  • Цепочка может быть любой длины: Работа 1 → Работа 2 → Работа 3 → ...

Что принимает context_from:

ФорматПример
Идентификатор отдельного задания (строка)context_from="a1b2c3d4"
Несколько идентификаторов вакансий (список)context_from=["job_a", "job_b"]

Выходы объединяются в указанном порядке.

Когда использовать:

  • Многоэтапные конвейеры (собрать → фильтровать → форматировать → доставить)
  • Зависимые задачи, в которых работа шага N зависит от результатов шага N-1.
  • Шаблоны разветвления /fan-in, при которых одно задание объединяет результаты нескольких других.

Восстановление провайдера​

Задания Cron наследуют настроенных резервных поставщиков и ротацию пула учетных данных. Если основной ключ API ограничен по скорости или поставщик возвращает ошибку, агент cron может:

  • Вернитесь к альтернативному провайдеру, если у вас есть fallback_providers (или устаревший fallback_model), настроенный в config.yaml.
  • Переход к следующим учетным данным в вашем пуле учетных данных для того же поставщика.

Это означает, что задания cron, которые выполняются с высокой частотой или в часы пик, более устойчивы — один ключ с ограниченной скоростью не приведет к сбою на протяжении всего выполнения.

Форматы расписания​

Окончательный ответ агента доставляется автоматически — вам нет необходимости включать send_message в приглашение cron для того же пункта назначения. Если запуск cron вызывает send_message к точной цели, куда планировщик уже доставил, VibeOS пропускает эту дублирующую отправку и сообщает модели вместо этого поместить контент, ориентированный на пользователя, в окончательный ответ. Используйте 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

Повторить поведение​

Тип расписанияПовтор по умолчаниюПоведение
Одноразовый (30m, временная метка)1Запускается один раз
Интервал (every 2h)навсегдаРаботает, пока не будет удален
Выражение CronнавсегдаРаботает, пока не будет удален

Вы можете переопределить его:

cronjob(
action="create",
prompt="...",
schedule="every 2h",
repeat=5,
)

Программное управление заданиями​

API, ориентированный на агента, представляет собой один из инструментов:

cronjob(action="create", ...)
cronjob(action="list")
cronjob(action="update", job_id="...")
cronjob(action="pause", job_id="...")
cronjob(action="resume", job_id="...")
cronjob(action="run", job_id="...")
cronjob(action="remove", job_id="...")

Для update введите skills=[], чтобы удалить все прикрепленные навыки.

Наборы инструментов, доступные для заданий cron​

Cron запускает каждое задание в новом сеансе агента без подключения платформы чата. По умолчанию агент cron получает набор инструментов, который вы настроили для платформы cron в vibeos tools — а не CLI по умолчанию, не все под солнцем.

vibeos tools
# → 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-платформы vibeos tools; в противном случае VibeOS возвращается к встроенным настройкам по умолчанию. Это имеет значение для контроля затрат: внесение browser, delegation в каждую крошечную задачу «извлечения новостей» приводит к раздуванию подсказки схемы инструмента при каждом вызове LLM.

Полный пропуск агента: wakeAgent​

Если к вашему заданию cron прикреплен сценарий предварительной проверки (через script=), сценарий может решить во время выполнения, должен ли VibeOS вообще вызывать агент. Выдайте последнюю строку стандартного вывода формы:

{"wakeAgent": false}

…и cron полностью пропускает запуск агента для этого тика. Полезно для частых опросов (каждые 1–5 минут), при которых LLM необходимо разбудить только тогда, когда состояние действительно изменилось — в противном случае вы снова и снова платите за переключение агента с нулевым содержанием.

# pre-check script
import json, sys
latest = fetch_latest_issue_count()
prev = read_state("issue_count")
if latest == prev:
print(json.dumps({"wakeAgent": False})) # skip this tick
sys.exit(0)
write_state("issue_count", latest)
print(json.dumps({"wakeAgent": True, "context": {"new_issues": latest - prev}}))

Если wakeAgent опущен, значением по умолчанию является true (разбудить агент как обычно).

####Рецепты: дешевые ворота заранее

Шлюз wakeAgent дает вам возможность за 0 долларов решить, должно ли запланированное задание вообще тратить токены LLM. Три шаблона охватывают большинство случаев использования.

Шлюз изменения файла — запускается только в том случае, если в отслеживаемом файле появилось новое содержимое с момента последнего успешного тика. Планировщик записывает last_run_at каждого задания; сравните его с mtime файла.

#!/bin/bash
# ~/.vibeos/scripts/feed-changed.sh
FEED="$HOME/data/feed.json"
STATE="$HOME/.vibeos/scripts/.feed-changed.last"
test -f "$FEED" || { echo '{"wakeAgent": false}'; exit 0; }
mtime=$(stat -c %Y "$FEED")
last=$(cat "$STATE" 2>/dev/null || echo 0)
if [ "$mtime" -le "$last" ]; then
echo '{"wakeAgent": false}'
else
echo "$mtime" > "$STATE"
echo '{"wakeAgent": true}'
fi
cronjob(action="create", name="process-feed",
schedule="every 30m",
script="feed-changed.sh",
prompt="A new ~/data/feed.json has landed. Summarize what changed.")

Шлюз внешнего флага — запускается только тогда, когда какой-либо другой процесс сигнализирует о готовности (например, перехватчик развертывания удаляет файл, задание CI устанавливает значение в вашем хранилище состояний).

#!/bin/bash
# ~/.vibeos/scripts/flag-ready.sh
if test -f /tmp/new-data-ready; then
rm -f /tmp/new-data-ready
echo '{"wakeAgent": true}'
else
echo '{"wakeAgent": false}'
fi
cronjob(action="create", name="nightly-analysis",
schedule="0 9 * * *",
script="flag-ready.sh",
prompt="Run the nightly analysis over today's batch.")

SQL-count Gate — запускается только тогда, когда в вашей собственной базе данных есть новые строки для обработки. Сценарий также может передавать счетчик агенту через context, чтобы агент знал, сколько он просматривает, без повторного запроса.

#!/usr/bin/env python
# ~/.vibeos/scripts/new-rows.py
import json, sqlite3
conn = sqlite3.connect("/home/me/data/app.db")
n = conn.execute(
"SELECT COUNT(*) FROM messages WHERE ts > strftime('%s','now','-2 hours')"
).fetchone()[0]
if n < 1:
print(json.dumps({"wakeAgent": False}))
else:
print(json.dumps({"wakeAgent": True, "context": {"new_rows": n}}))
cronjob(action="create", name="summarize-new-msgs",
schedule="every 2h",
script="new-rows.py",
prompt="Summarize the new messages from the last 2 hours.")

Тот же шаблон работает для любого источника данных, который вы можете запросить из сценария — Postgres, HTTP, API, вашего собственного хранилища состояний — без включения оценщика SQL в подсистему cron.

подсказка

Собственная VibeOS ~/.vibeos/state.db — это внутренняя схема, которая меняется между выпусками. Не запрашивайте его из предварительно запущенного шлюза — вместо этого укажите на свою собственную базу данных или канал.

Кредит: этот набор рецептов был вызван исследованием @iankar8 в #2654, в котором предлагалось добавить триггеры sql/file/command в качестве параллельного механизма. Ворота script + wakeAgent уже охватывают все три случая по цене 0 долларов, поэтому вместо этого работа была представлена ​​в виде документации.

Объединение заданий: 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"). Примечание: цепочка считывает самые последние завершенные выходные данные — она не ожидает выполнения вышестоящих заданий, выполняющихся в тот же такт.

Хранилище заданий​

Задания хранятся в ~/.vibeos/cron/jobs.json. Результаты выполнения заданий сохраняются в ~/.vibeos/cron/output/{job_id}/{timestamp}.md.

Задания могут хранить model и provider как null. Если эти поля опущены, VibeOS разрешает их во время выполнения из глобальной конфигурации. Они появляются в записи о задании только в том случае, если установлено переопределение для каждого задания.

В хранилище используется атомарная запись файлов, поэтому прерванные записи не оставляют после себя частично записанный файл задания.

Самостоятельные подсказки по-прежнему имеют значение​

Важно

Задания Cron выполняются в совершенно новом сеансе агента. Приглашение должно содержать все, что нужно агенту, чего еще не предусмотрено прикрепленными навыками.

BAD: "Check on that server issue"

GOOD: "SSH into server 192.168.1.100 as user 'deploy', check if nginx is running with 'systemctl status nginx', and verify https://example.com returns HTTP 200."

Безопасность​

Запросы запланированных задач сканируются на предмет шаблонов внедрения подсказок и кражи учетных данных во время создания и обновления. Запросы, содержащие невидимые трюки Unicode, попытки бэкдора SSH или очевидные полезные данные для раскрытия секретов, блокируются.