Делегирование и параллельная работа
VibeOS может порождать изолированные дочерние агенты для параллельной работы над задачами. Каждый под-агент получает собственный диалог, сессию терминала и набор инструментов. Обратно возвращается только итоговая сводка — промежуточные вызовы инструментов никогда не попадают в ваш контекст.
Полную документацию по функции см. в разделе Делегирование под-агентам.
Когда делегировать
Хорошие кандидаты для делегирования:
- Подзадачи, требующие глубоких рассуждений (отладка, ревью кода, синтез исследований)
- Задачи, которые засорили бы ваш контекст промежуточными данными
- Параллельные независимые потоки работы (исследование A и B одновременно)
- Задачи, требующие «свежего взгляда», когда агенту нужно подойти без предвзятости
Используйте что-то другое:
- Одиночный вызов инструмента → просто используйте инструмент напрямую
- Механическая многошаговая работа с логикой между шагами →
execute_code - Задачи, требующие взаимодействия с пользователем → под-агенты не могут использовать
clarify - Быстрые правки файлов → делайте их напрямую
- Долговременная работа, которая должна пережить текущий ход →
cronjobилиterminal(background=True, notify_on_complete=True).delegate_taskсинхронна: если родительский ход прерывается, активные дочерние агенты отменяются, а их работа отбрасывается.
Паттерн: Параллельное исследование
Исследуйте три темы одновременно и получите структурированные сводки:
Исследуй эти три темы параллельно:
1. Текущее состояние WebAssembly вне браузера
2. Внедрение серверных чипов RISC-V в 2025 году
3. Практические применения квантовых вычислений
Сосредоточься на последних разработках и ключевых игроках.
За кулисами VibeOS использует:
delegate_task(tasks=[
{
"goal": "Исследовать WebAssembly вне браузера в 2025",
"context": "Сосредоточиться на: рантаймах (Wasmtime, Wasmer), сценариях использования в облаке/на периферии, прогрессе WASI",
"toolsets": ["web"]
},
{
"goal": "Исследовать внедрение серверных чипов RISC-V",
"context": "Сосредоточиться на: выпускаемых серверных чипах, облачных провайдерах, внедряющих их, экосистеме ПО",
"toolsets": ["web"]
},
{
"goal": "Исследовать практические применения квантовых вычислений",
"context": "Сосредоточиться на: прорывах в коррекции ошибок, реальных примерах использования, ключевых компаниях",
"toolsets": ["web"]
}
])
Все три выполняются одновременно. Каждый под-агент независимо ищет в интернете и возвращает сводку. Родительский агент затем синтезирует их в связный брифинг.
Паттерн: Ревью кода
Делегируйте проверку безопасности под-агенту со свежим контекстом, который подходит к коду без предубеждений:
Проверь модуль аутентификации в src/auth/ на наличие проблем безопасности.
Проверь SQL-инъекции, проблемы с валидацией JWT, обработку паролей
и управление сессиями. Исправь всё, что найдёшь, и запусти тесты.
Ключевое значение имеет поле context — оно должно включать всё, что нужно под-агенту:
delegate_task(
goal="Проверить src/auth/ на проблемы безопасности и исправить найденные",
context="""Проект в /home/user/webapp. Python 3.11, Flask, PyJWT, bcrypt.
Файлы аутентификации: src/auth/login.py, src/auth/jwt.py, src/auth/middleware.py
Команда для тестов: pytest tests/auth/ -v
Сосредоточиться на: SQL-инъекциях, валидации JWT, хешировании паролей, управлении сессиями.
Исправить найденные проблемы и убедиться, что тесты проходят.""",
toolsets=["terminal", "file"]
)
Под-агенты абсолютно ничего не знают о вашем разговоре. Они начинают с чистого листа. Если вы делегируете «исправь баг, который мы обсуждали», под-агент понятия не имеет, о каком баге речь. Всегда явно передавайте пути к файлам, сообщения об ошибках, структуру проекта и ограничения.
Паттерн: Сравнение альтернатив
Оцените несколько подходов к одной и той же проблеме параллельно, затем выберите лучший:
Мне нужно добавить полнотекстовый поиск в наше Django-приложение. Оцени три подхода
параллельно:
1. PostgreSQL tsvector (встроенный)
2. Elasticsearch через django-elasticsearch-dsl
3. Meilisearch через meilisearch-python
Для каждого: сложность настройки, возможности запросов, требования к ресурсам
и затраты на обслуживание. Сравни их и порекомендуй один.
Каждый под-агент независимо исследует один вариант. Благодаря изоляции отсутствует перекрёстное влияние — каждая оценка опирается на собственные достоинства. Родительский агент получает все три сводки и проводит сравнение.
Паттерн: Рефакторинг нескольких файлов
Разделите крупную задачу рефакторинга между параллельными под-агентами, каждый из которых обрабатывает свою часть кодовой базы:
delegate_task(tasks=[
{
"goal": "Переработать все обработчики API-эндпоинтов под новый формат ответов",
"context": """Проект в /home/user/api-server.
Файлы: src/handlers/users.py, src/handlers/auth.py, src/handlers/billing.py
Старый формат: return {"data": result, "status": "ok"}
Новый формат: return APIResponse(data=result, status=200).to_dict()
Импорт: from src.responses import APIResponse
Запустить тесты после: pytest tests/handlers/ -v""",
"toolsets": ["terminal", "file"]
},
{
"goal": "Обновить все методы клиентского SDK для работы с новым форматом ответов",
"context": """Проект в /home/user/api-server.
Файлы: sdk/python/client.py, sdk/python/models.py
Старый парсинг: result = response.json()["data"]
Новый парсинг: result = response.json()["data"] (тот же ключ, но добавить проверку кода статуса)
Также обновить sdk/python/tests/test_client.py""",
"toolsets": ["terminal", "file"]
},
{
"goal": "Обновить API-документацию в соответствии с новым форматом ответов",
"context": """Проект в /home/user/api-server.
Документация в: docs/api/. Формат: Markdown с примерами кода.
Обновить все примеры ответов со старого формата на новый.
Добавить раздел 'Формат ответа' в docs/api/overview.md с объяснением схемы.""",
"toolsets": ["terminal", "file"]
}
])
Каждый под-агент получает собственную сессию терминала. Они могут работать в одном каталоге проекта, не мешая друг другу — при условии, что редактируют разные файлы. Если два под-агента могут затронуть один и тот же файл, обработайте этот файл самостоятельно после завершения параллельной работы.
Паттерн: Сбор, затем анализ
Используйте execute_code для механического сбора данных, затем делегируйте анализ, требующий рассуждений:
# Шаг 1: Механический сбор (execute_code лучше — рассуждения не нужны)
execute_code("""
from vibeos_tools import web_search, web_extract
results = []
for query in ["AI funding Q1 2026", "AI startup acquisitions 2026", "AI IPOs 2026"]:
r = web_search(query, limit=5)
for item in r["data"]["web"]:
results.append({"title": item["title"], "url": item["url"], "desc": item["description"]})
# Извлечь полное содержимое 5 наиболее релевантных
urls = [r["url"] for r in results[:5]]
content = web_extract(urls)
# Сохранить для этапа анализа
import json
with open("/tmp/ai-funding-data.json", "w") as f:
json.dump({"search_results": results, "extracted": content["results"]}, f)
print(f"Собрано {len(results)} результатов, извлечено {len(content['results'])} страниц")
""")
# Шаг 2: Анализ, требующий рассуждений (делегирование лучше)
delegate_task(
goal="Проанализировать данные о финансировании AI и написать рыночный отчёт",
context="""Необработанные данные в /tmp/ai-funding-data.json содержат результаты поиска и
извлечённые веб-страницы о финансировании AI, приобретениях и IPO в Q1 2026.
Написать структурированный рыночный отчёт: ключевые сделки, тренды, заметные игроки
и перспективы. Сосредоточиться на сделках свыше $100M.""",
toolsets=["terminal", "file"]
)
Это часто самый эффективный паттерн: execute_code дёшево обрабатывает 10+ последовательных вызовов инструментов, а затем под-агент выполняет единственную дорогую задачу рассуждения с чистым контекстом.
Выбор набора инструментов
Выбирайте наборы инструментов в зависимости от того, что нужно под-агенту:
| Тип задачи | Наборы инструментов | Почему |
|---|---|---|
| Веб-исследование | ["web"] | Только web_search + web_extract |
| Работа с кодом | ["terminal", "file"] | Доступ к оболочке + файловые операции |
| Полный стек | ["terminal", "file", "web"] | Всё, кроме обмена сообщениями |
| Анализ только для чтения | ["file"] | Может только читать файлы, без оболочки |
Ограничение наборов инструментов удерживает под-агента в фокусе и предотвращает случайные побочные эффекты (например, под-агент-исследователь, запускающий команды оболочки).
Ограничения
- По умолчанию 3 параллельные задачи: пакеты по умолчанию запускают 3 одновременных под-агента (настраивается через
delegation.max_concurrent_childrenв config.yaml, без жёсткого потолка, только нижняя граница 1) - Вложенное делегирование — опционально: листовые под-агенты (по умолчанию) не могут вызывать
delegate_task,clarify,memory,send_messageилиexecute_code. Под-агенты-оркестраторы (role="orchestrator") сохраняютdelegate_taskдля дальнейшего делегирования, но только еслиdelegation.max_spawn_depthподнят выше значения по умолчанию 1 (нижняя граница 1, без потолка); остальные четыре остаются заблокированными. Отключите глобально черезdelegation.orchestrator_enabled: false.
Настройка параллелизма и глубины
| Параметр | По умолчанию | Диапазон | Эффект |
|---|---|---|---|
max_concurrent_children | 3 | >=1 | Размер параллельного пакета на один вызов delegate_task |
max_spawn_depth | 1 | >=1 | Сколько уровней делегирования могут порождать дальнейшие |
Пример: запуск 30 параллельных рабочих с вложенными под-агентами:
delegation:
max_concurrent_children: 30
max_spawn_depth: 2
- Отдельные терминалы — каждый под-агент получает собственную сессию терминала с отдельным рабочим каталогом и состоянием
- Нет истории разговора — под-агенты видят только
goalиcontext, которые родительский агент передаёт при вызовеdelegate_task - По умолчанию 50 итераций — установите
max_iterationsниже для простых задач, чтобы сэкономить ресурсы - Не сохраняется —
delegate_taskсинхронна и выполняется внутри родительского хода. Если родитель прерывается (новое сообщение пользователя,/stop,/new), все активные дочерние агенты отменяются (status="interrupted"), а их работа отбрасывается. Для работы, которая должна пережить текущий ход, используйтеcronjobилиterminal(background=True, notify_on_complete=True).
Советы
Будьте конкретны в целях. «Исправь баг» — слишком расплывчато. «Исправь TypeError в api/handlers.py на строке 47, где process_request() получает None от parse_body()» даёт под-агенту достаточно информации для работы.
Указывайте пути к файлам. Под-агенты не знают структуру вашего проекта. Всегда указывайте абсолютные пути к соответствующим файлам, корень проекта и команду для тестов.
Используйте делегирование для изоляции контекста. Иногда нужен свежий взгляд. Делегирование заставляет вас чётко сформулировать проблему, и под-агент подходит к ней без предположений, накопившихся в вашем разговоре.
Проверяйте результаты. Сводки под-агентов — это всего лишь сводки. Если под-агент говорит «исправил баг, тесты проходят», проверьте это, запустив тесты самостоятельно или прочитав diff.
Полную документацию по делегированию — все параметры, интеграцию с ACP и расширенную конфигурацию — см. в разделе Делегирование под-агентам.