Всем привет! Недавно я писал про мультиагентный комбайн, который работает на одной подписке Google AI - с делегацией задач в фоновый пул и кросс-модельным консенсусом в качестве киллер-фичи. Тогда всю оркестрацию приходилось делать вручную. Сейчас расскажу, как мы это автоматизировали.
Важный момент: agent-pool - это MCP-сервер, который работает и в IDE, и внутри самого Gemini CLI. Воркер может сам делегировать задачи дальше - создавать подгруппы и запускать своих воркеров. На этом строится вся фрактальная оркестрация.
Проблема: агент-оркестратор тратит себя на ожидание
Когда шаги зависят друг от друга (анализ → рефакторинг → тесты), основной агент вынужден вручную следить за цепочкой: дергать get_task_result, парсить ответ, запускать следующего. Вместо полезной работы он сидит диспетчером.
Pipeline: автоматические цепочки
Инструмент create_pipeline собирает шаги заранее. Фоновый демон сам стартует воркеров и прокидывает зависимости. Процесс демона полностью отвязан (detached) и выживает при перезагрузке IDE.
Триггеры связывают агентов:
on_complete- старт после конкретного шагаon_complete_all- fan-in, ждем группу воркеровon_file- реагируем на появление файла на диске
┌─ frontend ─┐ research ─┤ ├── deploy └─ backend ─┘
Signals и Bounce-back: агенты общаются
Просто запустить процесс недостаточно. Внутри пайплайна агенты получают вызов signal_step_complete. Команда сообщает демону, что шаг готов и можно дергать следующий.
Иногда на вход прилетает неполная информация. Инструмент bounce_back возвращает задачу на предыдущий этап с подробной причиной ошибки. Это прямой аналог "Request Changes" в GitHub. Воркер получает фидбек "не хватает логов", дорабатывает файл и снова сигнализирует о готовности. От бесконечных циклов защищает лимит maxBounces.
Cron scheduler
Иногда нужно просто запускать агента по расписанию. Инструмент schedule_task вешает задачу на стандартный cron (0 9 * * *).
Планировщик висит в фоне. Он ставит атомарные файловые блокировки на выполнение. Открой десять окон IDE одновременно - скрипт все равно выполнится ровно один раз. Результаты аккуратно складываются в .agents/scheduled-results/. Можно повесить чек серверов каждый час или сбор недельного отчета.
SSH runners: агенты на удаленном сервере
По умолчанию воркеры крутятся локально. Но можно прописать SSH-раннер в agent-pool.config.json - и задачи полетят на удаленный сервер:
{ "runners": { "remote": { "type": "ssh", "host": "dev-server.company.com", "user": "agent", "geminiPath": "/home/agent/.nvm/versions/node/v22.0.0/bin/gemini" } } }
delegate_task( prompt: "Прогони тесты в изолированном окружении", runner: "remote" )
Запустил задачу, закрыл ноутбук - процессы продолжаются. На удаленке крутится фрактальная группа агентов, которые читают код, принимают решения и пишут файлы. Стандартный сценарий: агенты работают в отдельной ветке, делают коммиты, пушат результат. Утром открываешь PR и ревьюишь.
Сессии: передача контекста
У Gemini CLI есть встроенные сессии. Каждая сессия хранит полную историю разговора. Пул это использует: когда один агент заканчивает ресерч и записывает результат, следующий агент может подхватить его сессию:
# Первый агент исследует кодовую базу delegate_task(prompt: "Проанализируй src/auth/") -> task_1 # Достаем session_id из результата get_task_result(task_1) -> { session_id: "abc-123" } # Второй агент продолжает с того же места delegate_task( prompt: "Используя результаты анализа, напиши тесты", session_id: "abc-123" )
При этом можно посмотреть все активные сессии через list_sessions и подключиться к любой из них.
Политики: ограничение прав
Не каждому воркеру нужен полный доступ. Параметр policy ограничивает набор инструментов:
# Ревьюер только читает - не может менять файлы delegate_task_readonly( prompt: "Проверь src/auth/ на уязвимости", policy: "read-only" ) # Редактор может править файлы, но не запускать команды delegate_task( prompt: "Исправь типы в src/models/", policy: "safe-edit" )
Встроенные шаблоны read-only и safe-edit покрывают базовые сценарии. Для сложных случаев - пиши свой YAML-файл с точным списком разрешенных инструментов.
Параметр include_dirs работает в паре: по умолчанию агент видит только рабочую директорию. Нужен доступ к конфигам в другом месте - добавляешь путь явно.
Группы: фрактальные команды
Когда одни и те же настройки (раннер, скилл, политика) повторяются в каждом вызове - это сигнал вынести их в группу:
create_group({ name: "backend", runner: "remote", skill: "node-dev", policy: "safe-edit", max_agents: 3 }) # Отправляем двух агентов из группы delegate_to_group("backend", "Отрефактори auth-модуль", count: 2)
Каждый агент в группе автоматически наследует конфиг: раннер, скилл, политику. Не нужно дублировать параметры в каждом delegate_task. Параметр max_agents страхует от бесконтрольного размножения процессов.
Группы сохраняются в .agents/groups.json и переживают перезагрузку IDE.
Группы также нативно интегрированы в Пайплайны. Можно передать group и count прямо в конфигурацию шага:
create_pipeline({ name: "Build & Test", steps: [{ name: "run_tests", group: "backend", count: 3, prompt: "Запусти набор тестов для своей части" }] })
В этом случае демон пайплайнов автоматически запустит трех параллельных агентов (каждому пробросится AGENT_INDEX). Демон дождется успешного завершения всех воркеров, а благодаря встроенной fail-fast семантике - если хотя бы один из них упадет с ошибкой (или вернет bounce-back), остальные процессы будут немедленно принудительно отменены, экономя время и ресурсы.
Что дальше + установка
В следующих версиях добавим in-memory состояние для пайплайнов и прямой обмен сообщениями между агентами.
Быстрый старт:
npx agent-pool-mcp --check
