← Agent Engine

Запуск и полосы

agent-engine · workzone

Когда агент срабатывает и где исполняется его прогон. Запуск — два повода: вручную кнопкой и по простому расписанию. А сам агентный цикл идёт отдельной фоновой полосой — многошаговый и неторопливый, он не должен ни тормозить живой чат, ни ждать синхронизацию источников.

Два повода запуска → Cache & Workers

Ручной «Запустить сейчас» расписания не требует, но чтит замки: прогон стартует, если агент включён владельцем, не заперт админом и бюджет недели не выбран. Расписание — необязательная надстройка: интервал («каждые N часов») либо календарный слот («ежедневно / еженедельно в HH:MM»). Хранится одним полем schedule; пустое — агент чисто ручной. Сырой cron и событийные триггеры намеренно за бортом: v2.

▶ Вручную
Запустить сейчас
кнопка на экране агента — расписания не требует; доступна, пока агент включён и не заперт админом.
↻ Интервал
каждые 6 ч
простой период — для регулярного фонового присмотра.
Календарно
пн 09:00
ежедневно или еженедельно в заданный час — утренняя сводка.

Расписание считает следующий слот в 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), и агент стартует снова: зомби его не запирает.

Фоновая полоса исполнения → Cache & Workers

Прогон агента — это секунды-минуты многошагового цикла. Пустить такое по пути живого чата значило бы подвесить пользователя; встать в очередь синхронизации — ждать импорт. Поэтому агенты бегут своей фоновой полосой, отдельным пулом воркеров. А раз чтение KS у них строго read-only, полоса спокойно идёт параллельно записям графа — синхронизации и доводке: конкурировать за данные не за что.

Живой чат синхронно
low-latency ответ пользователю здесь и сейчас — приоритет на отклик
Синхронизация фоново
пишет граф импорт и доводка знаний — Harvester и Curation Pass
Агенты фоново · наша полоса
читает граф агентные циклы — свой пул воркеров, read-only к KS

три независимые полосы · агенты не ждут запись и не тормозят чат

Отдельный лимит на модель → Cache & Workers

У провайдера модели один общий rate-limit на всю платформу. Агентный цикл прожорлив — много вызовов за прогон, — и если пустить его в общий котёл, он выест лимит у живого чата: пользователь будет ждать, пока чей-то фоновый агент крутит десятый шаг. Поэтому у агентов свой потолок одновременных LLM-вызовов, отделённый от интерактивного трафика: фон уступает дорогу отклику.

Сам потолок — платформенная настройка (platform_settings.agent_max_concurrency, одно число на организацию), рядом с потолком итераций и недельным бюджетом. Это потолок параллелизма полосы, не недельный расход: бюджет ограничивает, сколько сотрудник тратит за неделю; здесь — сколько прогонов крутится разом, чтобы не задеть чат.