Managed Deep Agents v0.9: cron-расписание для агента

Managed Deep Agents v0.9 умеет запускать агента по cron через обычный файл в папке schedules/. Разбираем по шагам: объявление расписания, входные данные, треды, доставка в Slack и деплой - с живым поиском через срезAI.

Виталий Болгар6 мин чтенияManaged Deep Agents v0.9cronLangSmithdefine_scheduleживой веб-поиск
Блок-схема работы планировщика cron: запуск задачи по расписанию
Схема работы cron - расписание в Managed Deep Agents устроено так же: событие таймера запускает один прогон агента.

Что понадобится

  • Проект Managed Deep Agents с агентом, у которого есть доступ к инструментам поиска.
  • Пакет managed-deepagents версии 0.9.0 или новее.
  • Аккаунт LangSmith и доступ к деплою: mda deploy создает cron-задачи после завершения процесса.
  • Ключ срезAI для живого поиска.

Managed Deep Agents работает как хостед-рантайм для агентов внутри LangSmith. Вы пишете код в репозитории, а CLI собирает его и разворачивает в облаке LangGraph. С версии 0.9 у агентов появилось встроенное расписание. Это решает проблему утренних дайджестов: агент сам просыпается, идет в интернет через веб-поиск, собирает сводку и отправляет ее в Slack.

Шаг 1. Как объявить расписание

Расписания хранятся в папке schedules/. Один файл - одно расписание. Имя файла задает название задачи, а внутри модуля нужно объявить переменную schedule.

python
# schedules/daily_digest.py
from managed_deepagents import define_schedule schedule = define_schedule( cron="0 8 * * 1-5", timezone="Europe/Moscow", prompt="Собери утренний дайджест: найди через MCP-поиск свежие новости по нашим темам и сделай сводку.",
)

Поле cron принимает пять стандартных значений. Секунды здесь не поддерживаются. Если пропустить timezone, система выберет UTC. Я так однажды получил утренний отчет в 5 утра вместо 8, так что лучше всегда указывать часовой пояс явно.

Шаг 2. Выбор между prompt и input

В декларации должно быть ровно одно из этих полей. Prompt - это просто текст сообщения пользователя. Input пригодится, если вашему графу нужен сложный объект со стейтом или набором сообщений.

python
# schedules/nightly_sweep.py
from managed_deepagents import define_schedule schedule = define_schedule( cron="30 2 * * *", timezone="Europe/Moscow", input={ "messages": [ {"role": "user", "content": "Собери упоминания компании и подготовь сводку."} ] },
)

Для простых задач хватает prompt. Выбирайте input, если логика графа завязана на конкретные ключи в состоянии или параметры ветвления.

Шаг 3. Выбор треда: ephemeral или persistent

Обычно каждый запуск создает новый тред, который удаляется после работы. Это удобно для разовых сводок. Persistent тред нужен, если агент должен помнить контекст прошлых запусков - например, не повторять новости, которые уже присылал.

КритерийEphemeralPersistent
Состояние между прогонамиСбрасываетсяНакапливается
ПодготовкаНе требуетсяСоздать тред в Studio вручную
ID тредаАвтоматическийТолько UUID существующего треда
ПрименениеРазовые дайджестыНепрерывный мониторинг

Для persistent-режима в поле id нужно вставить именно UUID. Мы однажды ошиблись и вставили slug из адресной строки - сервер сразу выдал ошибку 422. UUID берется в настройках треда в LangSmith Studio.

python
# schedules/nightly_memory.py
from managed_deepagents import define_schedule schedule = define_schedule( cron="0 3 * * *", timezone="Europe/Moscow", prompt="Проверь текущую память проекта и выпиши задачи на доработку.", thread={ "mode": "persistent", "id": "8b1f0e2a-4c7d-4a2b-9f3c-1e5d7a8b9c0e", },
)

Тред создается один раз. CLI не умеет генерировать его на лету, поэтому сначала заходим в Studio, создаем пустой чат и копируем его идентификатор.

Шаг 4. Доставка в Slack

Флаг deliver_to отправляет итог работы агента в канал. Это важно, так как у cron-задачи нет интерфейса чата, куда можно вывести ответ. Для работы нужна версия библиотеки не ниже 0.4.0.

python
# schedules/monday_greeting.py
from managed_deepagents import define_schedule schedule = define_schedule( cron="0 9 * * 1", timezone="Europe/Moscow", prompt="Напиши короткую сводку понедельника и приложи ссылки.", deliver_to={ "channel": "slack", "to": { "type": "provider_conversation", "conversation_id": "C0123456789", }, },
)

Обязательно добавьте бота в нужный канал. Если этого не сделать, в LangSmith вы увидите успешный лог отправки, но само сообщение в Slack не появится.

Шаг 5. Деплой и проверка

После локальной отладки в mda dev используйте mda deploy. Когда проект перейдет в статус DEPLOYED, сервер обновит список задач. Если вы удалили файл из папки schedules, соответствующий триггер в облаке тоже сотрется.

Трейсы в LangSmith покажут каждый шаг: как агент ходил в поиск и какие ссылки нашел. Это основной способ отладки фоновых задач.

Дашборд LangSmith со списком запусков и трейсами агента
Через трейсы в LangSmith можно отследить, как прошел запуск и сколько раз агент использовал поиск.

Не используйте флаг --no-wait при обновлении расписаний. Если CLI выйдет до завершения сборки, новые задачи могут не провижниться. Также помните, что локальный mda dev показывает расписания в консоли, но никогда их не запускает. Это сбивает с толку, когда ждешь срабатывания на домашней машине.

Агент на cron должен искать вживую. срезAI отдаст агенту текст страниц и цитаты по одному ключу - 0,10 ₽ за запрос и 100 ₽ на счет при регистрации.

Получить ключ срезAI

Что не сработает и почему

Конфигурация расписания должна быть статичной. Система считывает файл на этапе компиляции, поэтому динамика здесь запрещена. Это не сработает - если вы попытаетесь вычислить время запуска через функцию.

  • Нельзя использовать переменные окружения или вызывать функции в теле декларации - только литералы.
  • Для проверки cron всегда нужен девелоперский деплой, mda dev для этого не подходит.
  • Параметры канала и выбор треда нельзя изменить после создания декларации без передеплоя.

Проверить логику самого агента можно в локальной Studio, отправив ему тот же промпт вручную. Для теста расписания придется деплоить.

Агент создает расписания сам - runtime API

Runtime-API позволяет агенту самому планировать задачи прямо во время разговора. Для этого нужен пакет версии 0.9.0.

python
# tools/schedules.py
from langchain.tools import tool
from managed_deepagents import schedules @tool
async def remind_me(prompt: str, cron: str, timezone: str = "UTC") -> str: """Запускает промпт для текущего пользователя по cron.""" item = await schedules.create( owner={"type": "user"}, cron=cron, timezone=timezone, prompt=prompt, ) return f"Created schedule {item['id']}."

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

Частые ошибки при сборке

ОшибкаПричинаЧто делать
must export a named schedule declarationПропущена переменная scheduleДобавьте экспорт schedule = define_schedule(...)
must define exactly one of prompt or inputКонфликт полей вводаОставьте либо prompt, либо input
cron must be a standard 5-field expressionНеверный формат времениИспользуйте формат: минуты часы дни месяцы дни_недели
schedule is not staticДинамический код в файлеЗамените вызовы функций на константы
Invalid thread IDНеверный формат UUIDСкопируйте корректный UUID из LangSmith Studio

Расписание запустится под mda dev?

Нет. Локальный сервер только проверяет синтаксис файлов в папке schedules/, но не ставит задачи в очередь.

Что будет, если удалить файл расписания и передеплоить?

Система синхронизирует состояние: если файла больше нет, соответствующая cron-задача на сервере будет удалена.

Можно ли читать env-переменные прямо в файле расписания?

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

Зачем нужен persistent тред?

Это дает агенту память. Он сможет использовать данные предыдущих запусков, если ID треда указан верно.

Сколько стоит поиск срезAI?

Один запрос стоит 0,10 ₽. При регистрации даем 100 ₽ - этого хватит на сотни дайджестов.

Как проверить, что расписание отработало?

Смотрите логи в LangSmith. Там отображаются все запуски, включая ошибки выполнения и задержки.

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

Читайте также