← Agent Engine

Бюджет и контроль

agent-engine · workzone

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

Когда агент стартует

Все рычаги этой страницы сходятся в одно условие. Прогон стартует — по расписанию или вручную — только если открыты все четыре; закрытое любое гасит запуск целиком.

Пятое условие — владелец активен — не отдельная ось: деактивация пишет тот же enabled=false (жизненный цикл), поэтому эффективно осей контроля четыре. Любой замок гейтит старт; уже идущий прогон дорабатывает до конца — мгновенный обрыв (kill switch) — v2.

Пустая база — не пятое условие. Когда искать нечем (is_empty), агент всё равно стартует: ядро KS производно не подаётся (инструменты), и он деградирует на внешних инструментах либо честно выходит. Это состояние данных, не замок управления — наполнится база, ядро вернётся без вмешательства.

Недельный токен-бюджет

Админ задаёт недельный потолок токенов на пользователя — один на всех его агентов сразу. Расход суммируется из журнала прогонов за текущую неделю (agent_runs.tokens_used); отдельной таблицы-счётчика нет — потолок производный. Перед стартом прогона движок сверяет сумму с лимитом: уложился — поехали, перебрал — прогон не стартует.

расход недели · все агенты сотрудника потолок
израсходовано запас отказ лимит

За потолком прогоны помечаются skipped с причиной «лимит превышён» и ждут сброса недели: расход обнуляется в воскресенье 00:00 в зоне организации (неделя календарная, не скользящая), агенты оживают сами. Потолок предохраняет от разорения; потолок итераций страхует один прогон от зацикливания — разные тормоза.

Лимит — платформенная настройка на экране Расходы AI (platform_settings.agent_weekly_token_budget), единая на организацию; там же расход по людям и справочный бюджет чата. Денежные бюджеты, алерты на подходе к потолку и мгновенный kill switch — v2.

Модель агента

Прогон ведёт chat-модель, выбранная владельцем из списка, что admin разрешил агентам (agent_models). Выбор хранит model_id — ссылка на строку списка. Пока модель в списке, агент стартует; снял её admin — SET NULL обнуляет ссылку, и model_id IS NOT NULL в гейте становится ложным.

Снятая модель гасит агента, как замок: next_run_at обнулён, планировщик строку не сканирует, запись skipped не плодится. На экране агента — баннер «модель не поддерживается, выберите другую»; владелец возвращает агента в строй, выбрав модель из актуального списка. Неявного отката на дефолт нет — NULL значит «модели нет», а не «взять дефолт».

Два замка

Чтобы прогон стартовал, открытыми должны быть оба замка: выключатель владельца и замок администратора. Любой закрытый гасит агента целиком — ни по расписанию, ни вручную. Первый — рычаг хозяина агента, второй — рычаг надзора над чужим.

Закрытый замок гасит агента тихо: его next_run_at обнулён, планировщик строку не сканирует, кнопка ручного запуска недоступна — durable-стоп не плодит записей skipped, он виден статусом агента. Журналируется лишь рантайм-отказ, незаметный из настройки агента: выбранный бюджет и наложение на ещё идущий прогон. Чтобы стоп не был немым, владелец узнаёт о паузе и снятой модели личным уведомлением (targeted на него) — обработчик, ставящий флаг, поднимает событие.

Выключатель владельцаenabled. Включён — агент рабочий: идёт по расписанию, доступна кнопка «Запустить сейчас». Выключен — нерабочий: расписание молчит, ручной запуск недоступен. Хозяин волен щёлкать им как угодно.
снимает: владелец
Замок администратораadmin_paused, липкий: админ останавливает конкретного агента, не дожидаясь владельца и не удаляя его. Владелец снять его не может — на экране агента висит баннер «приостановлен администратором». Это единственный рычаг админа над чужим агентом.
снимает: админ владелец

Полноценный надзор над чужими агентами — массовые действия, правка, тонкие политики — это v2. У админа ровно замок: грубо, но достаточно, чтобы погасить проблему.

Жизненный цикл владельца

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

Удаление учётки строка users исчезает
каскад — личные агенты и весь их журнал прогонов уходят следом (ON DELETE CASCADE), ничего не осиротевает.
Деактивация строка цела
агенты выключаются — система гасит выключатель владельца (enabled=false) у всех его агентов: учётка и история целы, но прогоны замирают. Планировщик их не будит и журнала skipped не копит — выключенный агент дремлет молча. Реактивация выключатель не возвращает — вернувшийся сотрудник включает агентов сам.

Каскад описан в модели данных: FK прогонов на агента и агента на владельца несут ON DELETE CASCADE. Деактивация же отдельного состояния не заводит — она пишет тот самый выключатель enabled, и вернуть его вправе только владелец.