Когда агент срабатывает и где исполняется его прогон. Запуск — два повода: вручную кнопкой и по простому расписанию. А сам агентный цикл идёт отдельной фоновой полосой — многошаговый и неторопливый, он не должен ни тормозить живой чат, ни ждать синхронизацию источников.
Ручной «Запустить сейчас» расписания не требует, но чтит замки: прогон
стартует, если агент включён владельцем, не заперт админом и бюджет
недели не выбран. Расписание — необязательная надстройка:
интервал («каждые N часов») либо
календарный слот («ежедневно / еженедельно в HH:MM»).
Хранится одним полем schedule; пустое — агент чисто ручной. Сырой cron и
событийные триггеры намеренно за бортом: v2.
Расписание считает следующий слот в
next_run_at;
планировщик будит агента по нему и ставит прогон в фоновую очередь.
Выключенный владельцем, запертый админом или оставшийся без модели
агент в скане не участвует: его next_run_at обнулён —
закрытое условие гейта
не оставляет следа в журнале (наложение ниже — оставляет).
Календарный «09:00» резолвится против часового пояса
владельца (его timezone, при NULL
— пояс организации из platform_settings) и только затем
ложится в next_run_at как UTC. Событийные триггеры (новый
коммит, инцидент) и сырой cron — горизонт v2.
Прогоны одного агента не накладываются: у агента максимум один
незавершённый прогон — это держит замок в самой базе (partial unique
на state queued/running —
модель
данных). Наступивший слот или ручной запуск поверх ещё идущего
нового цикла не плодит — пишется skipped с
reason=already_running, пропуск виден в журнале, а не
теряется молчанием. Умер воркер, не закрыв прогон, — протухший
heartbeat_at отпускает замок (зависший прогон жнётся в
failed/stale), и агент стартует снова: зомби
его не запирает.
Прогон агента — это секунды-минуты многошагового цикла. Пустить такое по пути живого чата значило бы подвесить пользователя; встать в очередь синхронизации — ждать импорт. Поэтому агенты бегут своей фоновой полосой, отдельным пулом воркеров. А раз чтение KS у них строго read-only, полоса спокойно идёт параллельно записям графа — синхронизации и доводке: конкурировать за данные не за что.
три независимые полосы · агенты не ждут запись и не тормозят чат
У провайдера модели один общий rate-limit на всю платформу. Агентный цикл прожорлив — много вызовов за прогон, — и если пустить его в общий котёл, он выест лимит у живого чата: пользователь будет ждать, пока чей-то фоновый агент крутит десятый шаг. Поэтому у агентов свой потолок одновременных LLM-вызовов, отделённый от интерактивного трафика: фон уступает дорогу отклику.
Сам потолок — платформенная настройка
(platform_settings.agent_max_concurrency, одно число на
организацию), рядом с
потолком итераций и
недельным бюджетом.
Это потолок параллелизма полосы, не недельный расход: бюджет
ограничивает, сколько сотрудник тратит за неделю; здесь — сколько
прогонов крутится разом, чтобы не задеть чат.