«Менеджмент» — это раздел для тех, у кого агентов много, а смотрят за ними один-два человека. Десять агентов ещё можно держать в голове, сто — уже нет: за каждым нужно следить, каждому что-то подтверждать, у каждого считать расходы. Раздел собран так, чтобы внимание уходило только на то, что действительно требует решения, а всё спокойное оставалось в стороне.
Главный принцип — управление по исключениям: пока всё в порядке, пульт почти пуст и молчит. Как только агенту нужно ваше решение или что-то пошло не так, это всплывает наверх — с коротким объяснением, чем агент занят и что от вас нужно. Состояния не выдуманы: каждое подтверждается проверяемым сигналом (состояние контейнера, связь с агентом, живой поток событий), и если доказательств нет, так и написано — «неизвестно», а не подставлено что-то похожее на правду.
Зачем нужен пульт
В обычной работе агенты никого не беспокоят: они запускаются по расписанию, отвечают в чатах, пишут код. Проблемы начинаются, когда агентов десятки: один ждёт подтверждения и часами стоит на месте, второй неожиданно дорого расходует бюджет, третий потерял связь, а четвёртый задаёт вопрос, который вы не заметили. Руками такое не отследить.
Пульт решает три задачи. Первая — показать с одного взгляда, всё ли в порядке. Вторая — собрать в одно место всё, что ждёт человека, и не дать этому потеряться. Третья — объяснить, куда уходят деньги и время, и не дать расходам вырасти незаметно.
Ещё одна особенность: уведомление здесь — это переход, а не состояние. Если ситуация повторилась, счётчик у уже существующей строки растёт, а новое уведомление не создаётся. Поэтому спокойный день не превращается в поток одинаковых сообщений.
Карта экранов
Раздел состоит из десяти экранов: корневой «Флот» и девять пунктов его списка — «Флоты», «Реестр», «Чаты», «Решения», «Стоимость», «Токены», «Готовность», «Политики» и «Аналитика» последней. С любого на любой можно перейти за пару шагов, а командная палитра ищет по всем сразу.
- «Флот» — корень раздела. Отвечает на главный вопрос: есть ли что-то, требующее внимания. Показывает состояние всех агентов, несколько ключевых чисел (сколько чатов выполняется сейчас, сколько решений ждёт, ошибки за сутки, расход за сутки), зону внимания с верхушкой очереди решений и последние события. Каждое число стоит рядом со своей нормой, чтобы было понятно, много это или мало; у каждого показателя есть собственный «предел спокойствия», и при его нарушении значение подсвечивается — значком и словом, а не только цветом;
- «Флоты» — именованные группы агентов, которые работают вместе. Участники одного флота могут стоять на разных серверах. Флот можно создать, изменить и удалить, имя должно быть уникальным. На карточке флота участники сгруппированы по серверам, и каждая группа серверов по умолчанию свёрнута: видно имя сервера и число участников, а сами участники раскрываются кликом по строке. Метка сервера ведёт на его страницу, имя участника — на карточку агента. Пустой флот не соответствует ни одному агенту, пока в него не добавят участников;
- «Реестр» — таблица всех агентов: состояние, чем занят, сколько простаивает, расходы за сегодня, класс риска и оставшееся время на ответ. Есть быстрые фильтры («требуют решения», «ошибки», «застряли >15 мин», «дорогие», «карантин», «теневые», «офлайн»), группировка по серверу, владельцу, меткам и состоянию, именованные представления и три уровня плотности строки. Здесь же — доска с колонками «В очереди», «В работе», «Заблокировано», «На проверке» и «Готово»: карточки можно перетаскивать, и это настоящее изменение очерёдности, а не перестановка на экране;
- «Чаты» — история чатов всех агентов: статус, длительность, стоимость, токены. Строки листаются нумерованными страницами по десять штук, и у списка есть точное общее число. Колонки «Сервер» и «Агент» — отдельные и кликабельные: сервер ведёт на свою страницу, агент — на свою. По любому чату открывается пошаговый разбор: что делал агент, сколько занял каждый шаг, где потерялось время, что вызвало ошибку. Разбор — это запись реального хода работы, а не повторный прогон;
- «Решения» — всё, что ждёт человека: вопросы агентов, проверки завершённых работ и просто сообщения. Подробно — ниже;
- «Стоимость» — во сколько обходится один успешный чат (а не отдельно расход токенов), с размером выборки. Здесь же расходы за сегодня, неделю и месяц, прогноз до конца месяца, потолки трат и разбивка по агентам, владельцам, серверам, меткам, типам задач и моделям;
- «Токены» — сколько токенов всего и куда они уходят. Одно число на сущность: вход, выход, чтение и запись временного хранилища складываются вместе и нигде не разбиваются по видам. Плюс токенов на успешный чат, окна за сегодня, неделю и месяц, прогноз до конца месяца, спокойные графики и та же разбивка, что на «Стоимости»;
- «Готовность» — оценка состояния инфраструктуры от 0 до 100: найденные слабые места (сломанные доступы, агенты без владельца, простаивающие контейнеры, лицензии на исходе, рост расходов против привычного), наблюдения за поведением, кто больше всех создаёт ошибок и расходов, и режим инцидента;
- «Политики» — правила автономности: что агент может делать сам, что обязан спросить, какие инструменты запрещены, сколько он может потратить и какие пороги уверенности включают очередь;
- «Аналитика» — графики по флоту с именованными фильтрами: есть «Все», сохранённые фильтры и «Новый фильтр», а внутри фильтра — вкладки «Флоты», «Серверы» и «Агенты».
В таблицах и на графиках агент подписан коротким именем, пока это имя в списке одно. Если имена совпадают, к имени добавляется сервер — «сервер/агент»: две строки с одинаковым именем никогда не выглядят одинаково. В тех местах, где сервер уже показан отдельной колонкой или заголовком группы, имя остаётся коротким.
Постоянные элементы висят над любым экраном: строка состояния в шапке, значок уведомлений, командная палитра и шпаргалка по клавишам. Полосы внизу экрана нет — очередь решений напоминает о себе значком в списке разделов, числом в заголовке вкладки браузера, метками в шапке, центром уведомлений и зоной внимания на самом «Флоте».
Строка состояния в шапке
В шапке всегда живут две отдельные метки, и каждая отвечает за своё. Это два разных сообщения, а не одно: клик по одной не повторяет клик по другой.
- Метка о проблемах — пока флот спокоен, её нет вовсе. Красной она становится, когда есть беда: «Агентов недоступно: N» или «Агентов застряло: N». Жёлтой — когда ждут решения: «N решений ожидают». Клик по красной открывает «Флот», клик по жёлтой — очередь решений;
- Метка о работе — есть всегда, зелёная, с числом «Чатов выполняется: N». Она считает именно чаты, а не занятых агентов: агент, который ведёт три чата сразу, даёт три, а не один. Клик открывает «Чаты» с фильтром «выполняется» — ровно те строки, что посчитаны.
Число в заголовке вкладки браузера — «(N)» — остаётся, пока очередь не пуста, и гаснет вместе с ней. А сам значок сайта на вкладке всегда один и тот же и не меняется ни по каким событиям: по нему нельзя понять, случилось ли что-то, — для этого есть метки в шапке.
Состояния агента
У каждого развёрнутого агента ровно одно состояние, и оно всегда подтверждено сигналом:
- занят — обрабатывает чат, то есть сейчас работает;
- думает — работа идёт, но последнее живое событие — рассуждение или шаг, который ещё выполняется;
- свободен — контейнер запущен, но ничего не обрабатывается;
- ждёт решения — в чате висит вопрос к человеку, и причина названа словами: нужен человек, ждём ответа от поставщика модели, внешнюю систему или инструмент;
- застрял — работа числится идущей, вопроса нет, но живых сигналов нет дольше порога тишины (по умолчанию 10 минут; для отдельного агента порог можно задать свой);
- офлайн — только по доказательству: связь с агентом не отвечает или проверка контейнера увидела, что он остановлен;
- неизвестно — доказательств нет ни за, ни против. Так бывает сразу после перезапуска Мультиагента или пока не отвечает связь с сервером. Такие агенты не считаются ни доступными, ни недоступными: они не попадают в числа «недоступно» и не окрашивают значки.
Отдельно стоит агент, которого в наблюдении нет вовсе. «Не развёрнут» — это не состояние, а признак: контейнера точно нет (агент ещё не развёрнут, запись импортирована одной строкой или контейнер убрали). Такой агент выпадает из наблюдения целиком — ни состояния, ни событий, ни чисел, — и возвращается сам, когда контейнер появится снова. Пропавший контейнер — это не авария и не восстановление, поэтому молчаливое выпадение из списка ничего не значит и ничего не уведомляет.
Важно, что «ждёт решения» не путается с «застрял». Если агент задал вопрос и терпеливо ждёт ответа, он так и помечен — сколько бы ни молчал. Порог тишины на него не действует. «Застрял» — это когда вопроса нет, а признаков жизни тоже нет: тогда стоит заглянуть в разбор чата. Такое разделение избавляет от ложной тревоги: вы точно знаете, где от вас чего-то ждут, а где что-то сломалось.
Смена состояния доходит до всех окон сразу, но повтор того же состояния не создаёт ни события, ни уведомления. Состояние видно не только цветом: у каждого есть значок и слово, поэтому даже в чёрно-белом виде всё различимо. Если данных нет вовсе, показывается знак вопроса и слово «Неизвестно», а не ноль и не догадка.
Очередь решений
Очередь решений — сердце раздела. Сюда попадает всё, что не может решиться само, и только это может вас прервать. Есть три вида записей:
- Вопрос — агент спрашивает и без ответа стоит на месте;
- Проверка — работа закончена, её нужно принять или отправить на доработку. Так приходят, например, ночные задания, которые выполнились без человека: утром вы видите, что получилось и сколько это стоило;
- Сообщение — просто уведомление. Оно никогда не прерывает, не имеет срока и не увеличивает счётчик на значке;
У каждой записи есть класс риска, и от него зависит, сколько времени есть на ответ:
- T1 — обратимое и дешёвое (например, небольшая сумма, которую легко вернуть). Такое решается само и в очередь вообще не попадает: остаётся только запись в журнале;
- T2 — обычное. На ответ отведено 60 минут;
- T3 — блокирующее: необратимое действие или крупная сумма. На ответ 15 минут, и если время вышло, работа агента приостанавливается, чтобы он не висел вечно в ожидании человека;
Порядок в очереди не по времени поступления, а по важности: риск, стоимость и близость срока. Разные запросы остаются отдельными строками и решаются по отдельности — пакетной кнопки «одобрить всё» нет. А вот полный повтор того же самого запроса новой строки не создаёт: у уже стоящей растёт счётчик «×N» — десять повторов одного запроса не превращаются в десять строк и не заваливают экран.
Строка ведёт туда, где решение принимается: клик по ней (или Enter) открывает чат, в котором агент ждёт ответа; у записи без чата — например, предложения поменять правила — открывается карточка с планом и кнопками. Для вопроса ответ даётся в чате: у такой строки есть только «Скрыть» и «Открыть», кнопок «Одобрить» и «Отклонить» на ней нет. Действие «Скрыть» убирает запись из очереди, ничего не решая: это не одобрение и не отказ, и в обучение правилам оно не идёт. А если на вопрос ответили прямо в чате и ярлык «вопрос» с него снят, запись закрывается сама с причиной «Отвечено в чате» — ждать, пока вы придёте в очередь, не нужно. Состояние меняется сразу, без перезагрузки страницы.
Решение всегда записывается в журнал: кто, когда и почему. При отклонении причина обязательна. Если запись отложена, она возвращается сама, когда подойдёт время, — с новым сроком на ответ. Отклонения с одинаковой причиной — это сигнал: после третьего такого раза очередь сама предложит поменять правило, вместо того чтобы в четвёртый раз спрашивать то же самое. А если какая-то повторяющаяся операция многократно подтверждается без споров, система может начать одобрять её сама — но только по заслугам и всегда с записью в журнал.
Над списком виден «бюджет» очереди: сколько решений принято сегодня, сколько на это уходит времени и сколько записей висит дольше суток. Ориентир — 40–60 решений в день; это предел, а не цель: если очередь просит больше, значит, агентам не хватает самостоятельности, и настраивать надо правила, а не ускоряться.
Записи, которые создал не человек и не аварийная ситуация, а обычный автозапуск по расписанию, в очередь не попадают вовсе: такой запуск живёт в «Чатах» как любая другая работа. В очереди остаётся только то, что действительно спрашивает человека.
Инцидент, заморозка и остановка
Когда случается крупная неприятность, пульт переходит в режим инцидента. Это единственное исключение из правила «молчащего экрана»: поверх всего приложения появляется полоса с причиной и длительностью инцидента, а раздел показывает максимум подробностей. Режим включают вручную (причина обязательна и попадает в журнал) или автоматически — если разом пропало много агентов либо посыпались ошибки. При выходе из режима собирается черновик разбора: что случилось, что делали, что решили.
Заморозка флота — это тормоз для того, что уже работает. Она останавливает текущие запуски и придерживает запросы, стоящие в очереди у этих чатов, чтобы агент не перезапустил их заново. Запросы, поступившие после заморозки, не придерживаются — заморозка не блокирует работу целиком. Снятие заморозки освобождает ровно те запросы, которые были придержаны: ничего лишнего не отпускается и ничего не забывается.
«Остановить все» последовательно останавливает контейнеры агентов и требует ввести слово подтверждения — настолько это серьёзное действие. Безопасный режим во время инцидента мягче: правила автономности опускаются до самого осторожного уровня «предлагать», а запросы, стоящие в очереди, придерживаются; уже идущие запуски при этом продолжают работу. При выходе из инцидента придержанное освобождается, а правила возвращаются к прежнему уровню.
Горячие клавиши и поиск действий
Всё, что можно сделать на пульте, доступно и с клавиатуры — это заметно ускоряет работу, когда решений много подряд. Командная палитра (⌘K или Ctrl+K) открывается с любого экрана и ищет по разделам, агентам, живым записям очереди и действиям. Клавиша ? открывает шпаргалку со всеми сочетаниями. Опасные действия всегда сначала спрашивают подтверждение, а необратимые требуют ввести имя.
- Переходы:
1–8— по восьми экранам раздела,i— очередь решений,/— фильтр списка,r— обновить данные; - По списку:
g/G— в начало и в конец,j/k— вниз и вверх; - По строке:
Space— быстрый просмотр,Enter— открыть,P— приостановить обработку,S— остановить,R— перезапустить,E— эскалировать,H— передача смены,A— одобрить,X— отклонить (нужна причина),D— отложить,Shift+S— скрыть, не принимая решения,T— разбор чата,Q— карантин; - Отмена:
⌘Zвозвращает последнее обратимое действие (например, снимает паузу и освобождает ровно те запросы, которые были придержаны),Escзакрывает окно.
Клавиши никогда не срабатывают во время ввода текста. Сочетания для строк и переходов можно переназначить под себя, а кнопка сброса вернёт исходные.
Оповещения
Уведомление появляется только если выполняется хотя бы одно условие: об этом просили, есть зависимость по времени, нужно ваше решение или это личный контекст. Всё остальное остаётся состоянием в интерфейсе и попадает разве что в ежедневную сводку. Благодаря этому пульт не превращается в ленту новостей.
Дойти уведомление может разными путями — и по каждому видно, что именно он несёт:
- Очередь решений — для того, что ждёт человека. О ней напоминают значок в списке разделов, «(N)» в заголовке вкладки браузера, метки в шапке и зона внимания на «Флоте»;
- Центр уведомлений (значок в шапке) — общий журнал произошедшего с одним действием «Открыть». Прочитанное в одном окне гаснет во всех остальных;
- Всплывающее сообщение и звук — только для блокирующих решений и пропущенных сроков, и только когда вкладка не на виду;
- Мессенджер — на внешний адрес вашей системы уходит короткое сообщение со ссылками. Одобрить можно только в интерфейсе: ссылка открывает карточку решения внутри приложения, где видно детали и кому вы отвечаете. Из мессенджера решение не принимается — это осознанное ограничение ради безопасности;
- Ежедневная сводка — что сделано, сколько потрачено, какие решения приняты и что осталось.
Есть тихие часы (по умолчанию с 23:00 до 08:00 по времени сервера): обычные уведомления копятся и приходят одной порцией после окончания окна. Блокирующие решения, сообщения о безопасности квот и оплаты и автоматически начавшиеся инциденты тихие часы обходят — о них узнаёте сразу. Общая громкость настраивается тремя уровнями: спокойный, обычный, продвинутый. Отдельные типы можно вовсе убрать в сводку или отключить прямо из строки уведомления, но у самых важных классов переключателя нет — вместо него написано, почему их нельзя отключить.
Агент сам просит решение
Агент может не просто ждать ответа в чате, а поставить вопрос прямо в очередь решений — тем же ключом доступа, которым пользуется программный Agent API. Так запрос попадает туда, где его точно заметят, и не теряется в переписке.
curl -X POST <адрес>/api/agent/inbox -H "X-API-Key: $MULTIAGENT_KEY" \
-H "Content-Type: application/json" \
-d '{"type":"review","title":"Развернуть в продуктиве?","dedupKey":"deploy:prod",
"riskHints":{"costEstimate":6000,"reversible":false},"agentChatId":42}'
Класс риска агент задаёт подсказками: обратимо ли действие и сколько примерно стоит. Дальше система решает честно: обратимое и дешёвое одобряется сразу (и остаётся только запись в журнале), дорогое или необратимое становится блокирующим с коротким сроком, остальное — обычным. Если отправлять одинаковый dedupKey, повторы не создадут новых записей, а увеличат счётчик у уже стоящей. Команда GET /api/agent/inbox показывает агенту его собственные активные запросы.
Что важно знать
Пульт не приукрашивает: где данных нет, там так и написано. Полезно заранее знать о границах:
- Карантин и запрет инструментов — это пометки уровня управления, а не ограничения внутри самого агента. Реально останавливают агента пауза, остановка и эскалация; запрет инструмента помечает его как нежелательный и показывает это в интерфейсе;
- Учёт «мыслей» — общий. Потолок ограничивает все токены запуска разом (и запрос, и ответ) и честно об этом говорит — отдельного учёта «мыслей» не ведётся;
- Часть чисел — последние известные. Расходы подтягиваются по мере обновления данных о чатах, то есть раз в несколько минут, а не в ту же секунду. Расход чата относится ко дню его последней активности и там и остаётся — перезапуск Мультиагента картину не сбрасывает и ничего заново не начинает;
- Списки листаются страницами. У каждого списка есть точное общее число и нумерованные страницы по десять строк — строки за пределами открытой страницы не теряются. Счётчики в шапке описывают последние несколько сотен строк и всегда называют, по какому объёму посчитаны;
- Разбор чата — это запись. Пошаговый просмотр и «проигрывание» показывают то, как всё было, и ничего не запускают заново;
- Дежурств и часовых поясов нет. Расписание смены — это сохранённая подпись для ожиданий команды, а не календарь. Если второго дежурного не настроили, система прямо скажет, что уведомление повторное, а не назовёт несуществующего дежурного;
- Разбивка расходов по аккаунтам недоступна, а разбивка по моделям — оценочная (данные о чатах не хранят отдельной истории по моделям). Об этом написано прямо на экране «Стоимость».
О том, как устроены сами агенты и их чаты, — на страницах Агенты и Чаты; о готовых наборах переменных для агентов и серверов — на странице Окружения.