Skip to Content
Руководство для пользователейВозможностиЗапланированные задачи

Запуск промптов по расписанию

Используйте /loop и инструменты планирования cron для многократного запуска промптов, опроса статуса или установки разовых напоминаний в рамках сессии Qwen Code.

Запланированные задачи позволяют Qwen Code автоматически перезапускать промпт через заданные интервалы. Используйте их для опроса статуса деплоя, мониторинга PR, проверки длительных сборок или напоминания о необходимости выполнить какое-либо действие позже в рамках сессии.

Задачи, созданные из терминала, привязаны к сессии: они существуют только в текущем процессе Qwen Code и удаляются при выходе. На диск ничего не записывается.

Каналы обмена сообщениями используют отдельный постоянный планировщик, чтобы результаты могли быть отправлены обратно в исходный чат после завершения текущего хода. См. Scheduled Channel Loops для команд каналов, поведения сохранения и ограничений доставки.

Совет: Запланированные задачи включены по умолчанию. Чтобы отключить их, установите experimental.cron: false в настройках или задайте переменную окружения QWEN_CODE_DISABLE_CRON=1.

Планирование повторяющегося промпта с помощью /loop

Встроенный навык /loop — это самый быстрый способ запланировать повторяющийся промпт. Передайте необязательный интервал и сам промпт, и Qwen Code настроит cron-задачу, которая будет выполняться в фоновом режиме, пока сессия открыта.

/loop 5m check if the deployment finished and tell me what happened

Qwen Code разбирает интервал, преобразует его в cron-выражение, планирует задачу и подтверждает частоту выполнения и ID задачи. Затем он немедленно выполняет промпт один раз — вам не нужно ждать первого срабатывания cron.

Синтаксис интервалов

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

ФормаПримерРазобранный интервал
Интервал в начале/loop 30m check the buildкаждые 30 минут
Конструкция every в конце/loop check the build every 2 hoursкаждые 2 часа
Без интервала/loop check the buildпо умолчанию каждые 10 минут

Поддерживаемые единицы измерения: s для секунд, m для минут, h для часов и d для дней. Секунды округляются до ближайшей минуты, так как минимальная гранулярность cron составляет одну минуту. Интервалы, которые не делятся нацело на свою единицу, например 7m или 90m, округляются до ближайшего кратного значения, и Qwen Code сообщает, какой интервал был выбран.

Запуск другой команды в цикле

Запланированный промпт может сам быть командой или вызовом навыка. Это полезно для повторного запуска уже упакованного рабочего процесса.

/loop 20m /review-pr 1234

При каждом срабатывании задачи Qwen Code выполняет /review-pr 1234 так, как если бы вы ввели это вручную.

Автономный режим

Запуск /loop без промпта запускает автономный цикл вместо повторения фиксированного промпта. Qwen Code выступает в роли куратора работы, уже определенной в диалоге, — он продолжает двигать задачу вперед, пока вас нет:

/loop

Простой /loop (без промпта и интервала) запускает автономный цикл в собственном темпе; /loop <интервал> без промпта запускает тот же автономный цикл с фиксированной частотой (например, /loop 10m). При каждом срабатывании он продвигает то, что уже было задано в диалоге: завершает начатые вами дела, поддерживает PR в рабочем состоянии (отвечает на комментарии в ревью, чинит падающий CI, разрешает конфликты) и выполняет взятые на себя обязательства. Он работает только с задачами, которые уже определены в истории диалога: он никогда не придумывает новую работу и не вносит необратимые изменения (push, delete, send) без явного разрешения, и останавливается, когда все задачи выполнены.

Управление циклами

/loop также поддерживает две подкоманды для управления существующими задачами:

/loop list

Выводит список всех запланированных задач с их ID и cron-выражениями.

/loop clear

Отменяет все запланированные задачи сразу.

Установка разового напоминания

Для разовых напоминаний опишите то, что вам нужно, на естественном языке вместо использования /loop. Qwen Code запланирует задачу с однократным срабатыванием, которая удалит сама себя после выполнения.

remind me at 3pm to push the release branch
in 45 minutes, check whether the integration tests passed

Qwen Code фиксирует время срабатывания на конкретной минуте и часе с помощью cron-выражения и подтверждает, когда оно произойдет.

Пробуждение сессии только при изменениях

Повторяющаяся задача может иметь гейт: shell-команду, которая выполняется при каждом срабатывании вне модели. Если она ничего не выводит и завершается с кодом 0, срабатывание пропускается — ход не выполняется и ничего не добавляется в диалог. Если она выводит данные, промпт задачи выполняется с этими данными, прикрепленными и помеченными как данные, полученные от команды. Команда, которая завершилась с ошибкой, выводит двоичные данные или выполняется дольше 60 секунд, сообщается один раз, затем тихо подсчитывается, пока команда не выполнится успешно или не будет заблокирована; CronList показывает этот счетчик.

Используйте гейт для наблюдений, которые обычно молчат, с командой, которая хранит собственный курсор и выводит только изменения:

every 2 minutes, run ./check-pr.sh 15057 as a gate; when it prints something, handle the events it lists

Qwen Code вызывает CronCreate с gate: "./check-pr.sh 15057" и подтверждает команду так же, как подтверждает команду Monitor: один раз, при создании задачи, с возможностью всегда разрешать её. Затем команда выполняется без участия пользователя из каталога проекта с окружением сессии. Постоянная задача с гейтом продолжает работать после перезапуска, если команда доступна только для чтения, сохраненное правило Monitor(...) или Bash(...) разрешает её, или сессия работает в режиме auto или yolo; в противном случае при следующем срабатывании будет сообщено о правиле, которое нужно добавить, вместо выполнения команды. Это правило — то же, которое сохранила бы кнопка “always allow” в Monitor, и для составной команды (проверка подстановки команды, if, heredoc) оно может не покрывать каждую часть; поместите такую команду в скрипт и разрешите скрипт вместо неё. Правило запрета для команды останавливает гейт в любом режиме.

Гейт должен завершаться в foreground, поэтому команда, которая переводит любую свою часть в фоновый режим с помощью &, отклоняется, как и команда, состоящая только из комментариев. Гейт уже выполняется в оболочке, поэтому пишите саму команду, а не обёртку оболочки вокруг неё: bash -c '…' отклоняется, чтобы правила проверок прав проверяли именно тот текст, который выполняется; ошибка называет команду, которую они бы проверили. Проверка & читает текст, а не запускает его, поэтому в случае неуверенности она отклоняет: & внутри комментария, heredoc или (( … )) тоже отклоняется, поэтому поместите такую команду в скрипт и используйте скрипт как гейт. Конструкция, которую нельзя выполнить (eval, скрипт, переданный через pipe в sh), обнаруживается при запуске гейта: гейт, который завершается без вывода в stdout, пока что-то запущенное им в фоновом режиме всё ещё удерживает свой stdout, сообщается как ошибка, а не тихо пропускается, и то, что он оставил работающим в своей группе процессов, останавливается (на Linux и macOS; часть, перешедшая в собственную группу процессов, как делает setsid, не останавливается). В песочнице выполнения оболочки bwrap (недоступна для сессий qwen serve) фоновая часть завершается вместе с командой, поэтому здесь применяется только проверка текста.

Формулируйте промпт с гейтом как инструкции (“для каждого события в выводе гейта, …”), а не как слеш-команду. В демоне qwen serve форма запланированных задач в Web Shell предлагает ту же команду гейта, карточка задачи показывает её недавние результаты, а “Run now” для задачи с гейтом просит модель сначала выполнить сам гейт, ровно как написано, и продолжить задачу только когда команда завершается с кодом 0 и выводит что-то в стандартный вывод (запланированное срабатывание игнорирует предупреждения в стандартном потоке ошибок, и модель должна делать так же); задача, привязанная к текущему диалогу демона (sessionMode: "current"), тоже может иметь гейт.

Управление запланированными задачами

Попросите Qwen Code на естественном языке вывести список или отменить задачи, либо обратитесь к базовым инструментам напрямую.

what scheduled tasks do I have?
cancel the deploy check job

Под капотом Qwen Code использует следующие инструменты:

ИнструментНазначение
CronCreateПланирование новой задачи. Принимает cron-выражение из 5 полей, промпт для запуска, указание, будет ли она повторяться или сработает один раз, и необязательную команду гейта.
CronListВывод списка всех запланированных задач с их ID, расписаниями, промптами, а также гейтом и его недавними результатами, если он задан.
CronDeleteОтмена задачи по ID.

Каждая запланированная задача имеет 8-символьный ID, который можно передать в CronDelete. В рамках одной сессии может быть до 50 запланированных задач одновременно.

Как выполняются запланированные задачи

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

Все время интерпретируется в вашем локальном часовом поясе. Cron-выражение вроде 0 9 * * * означает 9 утра там, где вы запускаете Qwen Code, а не по UTC.

Джиттер

Чтобы избежать одновременного обращения всех сессий к API в одно и то же абсолютное время, планировщик добавляет небольшое детерминированное смещение ко времени срабатывания:

  • Повторяющиеся задачи срабатывают с задержкой до 10% от их периода, но не более 15 минут. Часовая задача может сработать в любое время от :00 до :06.
  • Разовые задачи, запланированные на начало или середину часа (минута :00 или :30), срабатывают на 90 секунд раньше.

Смещение вычисляется на основе ID задачи, поэтому одна и та же задача всегда получает одно и то же смещение. Если точное время имеет значение, выберите минуту, отличную от :00 или :30, например 3 9 * * * вместо 0 9 * * *, и джиттер для разовых задач не будет применяться.

Срок жизни повторяющихся задач

По умолчанию повторяющиеся задачи автоматически истекают через 7 дней после создания. Задача срабатывает в последний раз, а затем удаляет сама себя. Это ограничивает время работы забытого цикла.

Чтобы изменить этот лимит, установите experimental.cronRecurringMaxAgeDays в настройках или задайте переменную окружения QWEN_CODE_CRON_MAX_AGE_DAYS (переменная окружения имеет приоритет — это удобно для облачных или контейнерных развертываний, где редактирование settings.json нецелесообразно). Значение 0 полностью отключает срок жизни, поэтому задачи будут выполняться до тех пор, пока вы их не удалите. Это полезно для долгоживущих развертываний с демоном, которые генерируют ежедневные отчеты, дайджесты или осуществляют постоянный мониторинг. Настроенный лимит также применяется к постоянным задачам, восстановленным с диска после перезапуска.

Разовые задачи не истекают по таймеру — они просто удаляют сами себя после однократного срабатывания.

Справочник по cron-выражениям

CronCreate принимает стандартные cron-выражения из 5 полей: минута час день_месяца месяц день_недели. Все поля поддерживают подстановочные знаки (*), одиночные значения (5), шаги (*/15), диапазоны (1-5) и списки, разделенные запятыми (1,15,30).

ПримерЗначение
*/5 * * * *Каждые 5 минут
0 * * * *Каждый час в начале часа
7 * * * *Каждый час на 7-й минуте
0 9 * * *Каждый день в 9:00 по местному времени
0 9 * * 1-5По будням в 9:00 по местному времени
30 14 15 3 *15 марта в 14:30 по местному времени

В поле день_недели используется 0 или 7 для воскресенья и 6 для субботы. Если ограничены оба поля: день_месяца и день_недели (ни одно из них не равно *), дата совпадает, если совпадает хотя бы одно из полей — это соответствует стандартной семантике vixie-cron.

Расширенный синтаксис, такой как L, W, ?, и псевдонимы названий, такие как MON или JAN, не поддерживаются.

Ограничения

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

  • Задачи срабатывают только тогда, когда Qwen Code запущен и простаивает. Закрытие терминала или завершение сессии отменяет все задачи.
  • Нет компенсации пропущенных срабатываний. Если время выполнения задачи прошло, пока Qwen Code был занят длительным запросом, она сработает один раз, когда Qwen Code освободится, а не по одному разу за каждый пропущенный интервал.
  • Нет сохранения между перезапусками. Перезапуск Qwen Code очищает все задачи, привязанные к сессии.
Last updated on