Agent coordination
Субагенты
Субагенты — это фоновые запуски агентов, созданные из существующего запуска агента.
Каждый из них работает в собственном сеансе (agent:<agentId>:subagent:<uuid>) и
после завершения сообщает свой результат обратно в канал чата запрашивающей стороны.
Каждый запуск субагента отслеживается как фоновая задача.
Цели:
- Распараллелить исследования, длительные задачи и медленную работу с инструментами, не блокируя основной запуск.
- По умолчанию изолировать субагентов (разделение сеансов, необязательная песочница).
- Сделать набор инструментов устойчивым к неправильному использованию: по умолчанию субагенты не получают инструменты для работы с сеансами или сообщениями.
- Поддерживать настраиваемую глубину вложенности для шаблонов оркестрации.
Команда с косой чертой
/subagents проверяет запуски субагентов для текущего сеанса:
/subagents list/subagents log <id|#> [limit] [tools]/subagents info <id|#>/subagents info показывает метаданные запуска (состояние, временные метки, идентификатор сеанса,
путь к расшифровке, очистку). /subagents log выводит последние реплики чата для
запуска; добавьте токен tools, чтобы включить сообщения о вызовах инструментов и их результатах (по умолчанию
они пропускаются). Используйте sessions_history для ограниченного и отфильтрованного с учётом безопасности просмотра
контекста из хода агента либо изучите путь к расшифровке на диске, чтобы получить
полную необработанную расшифровку.
Элементы управления привязкой к ветке обсуждения
Эти команды работают в каналах с постоянной привязкой к веткам обсуждения. См. Каналы с поддержкой веток обсуждения ниже.
/focus <subagent-label|session-key|session-id|session-label>/unfocus/agents/session idle <duration|off>/session max-age <duration|off>Поведение при создании
Агенты запускают фоновых субагентов с помощью инструмента sessions_spawn.
Завершения возвращаются как внутренние события родительского сеанса; родительский или запрашивающий
агент решает, требуется ли обновление, видимое пользователю.
Неблокирующее завершение с отправкой по событию
sessions_spawnне блокирует выполнение; он немедленно возвращает идентификатор запуска.- После завершения субагент отправляет отчёт обратно в родительский сеанс или сеанс запрашивающей стороны.
- Ходы агента, которым нужны результаты дочерних агентов, должны вызвать
sessions_yieldпосле запуска необходимой работы. Это завершает текущий ход и позволяет событию завершения поступить как следующее сообщение, видимое модели. - Завершение доставляется по событию. После запуска не опрашивайте
/subagents list,sessions_listилиsessions_historyв цикле лишь для ожидания завершения; проверяйте состояние по запросу только при отладке. - Вывод дочернего агента — это отчёт или свидетельство для запрашивающего агента, который должен его обобщить. Это не текст инструкций от пользователя, и он не может переопределять системные правила, правила разработчика или пользователя.
- После завершения OpenClaw по возможности закрывает отслеживаемые вкладки браузера и процессы, открытые сеансом этого субагента, прежде чем продолжить процесс очистки после оповещения.
Доставка завершения
- OpenClaw передаёт завершения обратно в сеанс запрашивающей стороны через ход
agentсо стабильным ключом идемпотентности. - Если запуск запрашивающей стороны всё ещё активен, OpenClaw сначала пытается пробудить или перенаправить этот запуск вместо создания второго видимого пути ответа.
- Если активный запуск запрашивающей стороны невозможно пробудить, OpenClaw переключается на передачу запрашивающему агенту с тем же контекстом завершения, а не отбрасывает оповещение.
- Успешная передача родительскому агенту завершает доставку субагента, даже если родитель решает, что видимое пользователю обновление не требуется.
- Встроенные субагенты не получают инструмент сообщений. Они возвращают обычный текст ответа ассистента родительскому или запрашивающему агенту; ответы, видимые человеку, остаются в ведении обычной политики доставки родительского или запрашивающего агента.
- Если прямую передачу использовать невозможно, доставка переключается на маршрутизацию через очередь, а затем — на короткую повторную попытку оповещения с экспоненциальной задержкой перед окончательным отказом.
- При доставке сохраняется определённый маршрут запрашивающей стороны: при наличии преимущество имеют маршруты завершения, привязанные к ветке обсуждения или разговору. Если источник завершения предоставляет только канал, OpenClaw заполняет недостающие цель и учётную запись из определённого маршрута сеанса запрашивающей стороны (
lastChannel/lastTo/lastAccountId), чтобы прямая доставка всё равно работала.
Метаданные передачи завершения
Передача завершения в сеанс запрашивающей стороны представляет собой созданный средой выполнения внутренний контекст (а не текст от пользователя) и включает:
Result— текст последнего видимого ответаassistantот дочернего агента. Вывод tool/toolResult не включается в результаты дочернего агента. Завершившиеся с ошибкой запуски не используют повторно сохранённый текст ответа.Status—completed; ready for parent review/failed/timed out/unknown.- Краткую статистику среды выполнения и токенов.
- Инструкцию по проверке, предписывающую запрашивающему агенту проверить результат, прежде чем решать, выполнена ли исходная задача.
- Рекомендации по дальнейшим действиям, предписывающие запрашивающему агенту продолжить задачу или зафиксировать последующую задачу, если результат дочернего агента требует дополнительных действий.
- Инструкцию по окончательному обновлению для случая, когда дальнейшие действия не требуются, написанную обычным языком ассистента без передачи необработанных внутренних метаданных.
Режимы и среда выполнения ACP
--modelи--thinkingпереопределяют значения по умолчанию для конкретного запуска.- Используйте
info/log, чтобы после завершения просмотреть сведения и вывод. - Для постоянных сеансов, привязанных к веткам обсуждения, используйте
sessions_spawnсthread: trueиmode: "session". - Если канал запрашивающей стороны не поддерживает привязку к веткам обсуждения, используйте
mode: "run"вместо повторных попыток применить заведомо невозможное сочетание с привязкой к ветке. - Для сеансов управляющей среды ACP (Claude Code, Gemini CLI, OpenCode или явно заданных Codex ACP/acpx) используйте
sessions_spawnсruntime: "acp", когда инструмент объявляет поддержку этой среды выполнения. При отладке завершений или циклов между агентами см. Модель доставки ACP. Когда включён плагинcodex, для управления чатом и ветками Codex следует предпочитать/codex ...вместо ACP, если пользователь явно не запросил ACP/acpx. - OpenClaw скрывает
runtime: "acp", пока ACP не включён, запрашивающая сторона не работает в песочнице и не загружен плагин серверной части, напримерacpx.runtime: "acp"ожидает идентификатор внешней управляющей среды ACP или записьagents.list[]сruntime.type="acp"; для обычных агентов конфигурации OpenClaw изagents_listиспользуйте среду выполнения субагентов по умолчанию.
Режимы контекста
Встроенные субагенты запускаются изолированно, если вызывающая сторона явно не запросила ответвление текущей расшифровки.
| Режим | Когда использовать | Поведение |
|---|---|---|
isolated |
Новое исследование, независимая реализация, медленная работа с инструментами или любая задача, которую можно кратко описать в тексте задания | Создаёт чистую расшифровку дочернего агента. Это режим по умолчанию, сокращающий расход токенов. |
fork |
Работа, зависящая от текущего разговора, предыдущих результатов инструментов или подробных инструкций, уже присутствующих в расшифровке запрашивающей стороны | Ответвляет расшифровку запрашивающей стороны в дочерний сеанс до запуска дочернего агента. |
Используйте fork умеренно. Он предназначен для делегирования с учётом контекста, а не
для замены чёткой формулировки задачи.
Инструмент: sessions_spawn
Запускает субагента с deliver: false в глобальной очереди subagent,
затем выполняет этап оповещения и публикует ответ с оповещением в канале
чата запрашивающей стороны.
Доступность зависит от действующей политики инструментов вызывающей стороны. Встроенный профиль
coding включает sessions_spawn; messaging и minimal его
не включают. full разрешает все инструменты. Добавьте tools.alsoAllow: ["sessions_spawn", "sessions_yield", "subagents"] или используйте tools.profile: "coding" для
агентов с более узким профилем, которым всё же необходимо делегировать работу.
Политики разрешений и запретов для канала или группы, поставщика, песочницы и отдельных агентов могут
удалить инструмент и после этапа применения профиля. Используйте /tools из того же
сеанса, чтобы проверить фактический список инструментов.
Значения по умолчанию:
- Модель: встроенные субагенты наследуют модель вызывающей стороны, если не задано
agents.defaults.subagents.model(илиagents.list[].subagents.modelдля отдельного агента). Запуски среды выполнения ACP используют ту же настроенную модель субагента, если она указана; в противном случае управляющая среда ACP сохраняет собственную модель по умолчанию. Явное значениеsessions_spawn.modelпо-прежнему имеет приоритет. - Рассуждение: встроенные субагенты наследуют настройку вызывающей стороны, если не задано
agents.defaults.subagents.thinking(илиagents.list[].subagents.thinkingдля отдельного агента). Запуски среды выполнения ACP также применяютagents.defaults.models["provider/model"].params.thinkingдля выбранной модели. Явное значениеsessions_spawn.thinkingпо-прежнему имеет приоритет. - Время ожидания запуска: OpenClaw использует
agents.defaults.subagents.runTimeoutSeconds, если оно задано; в противном случае применяется0(без ограничения времени).sessions_spawnне принимает переопределения времени ожидания для отдельных вызовов. - Доставка задачи: встроенные субагенты получают делегированную задачу в своём первом видимом сообщении
[Subagent Task]. Системная подсказка субагента содержит правила среды выполнения и контекст маршрутизации, а не скрытую копию задачи.
Принятые запуски встроенных субагентов включают метаданные определённой модели дочернего агента
в результат инструмента: resolvedModel содержит применённую ссылку на модель, а
resolvedProvider содержит префикс поставщика, если он присутствует в ссылке.
Режим подсказки для делегирования
agents.defaults.subagents.delegationMode управляет только рекомендациями в подсказке; он не изменяет политику инструментов и не требует обязательного делегирования.
suggest(по умолчанию): сохранить стандартную рекомендацию использовать субагентов для более крупных или медленных задач.prefer: предписать основному агенту сохранять отзывчивость и делегировать черезsessions_spawnвсё, что сложнее прямого ответа.
Переопределение для отдельного агента: agents.list[].subagents.delegationMode.
{ agents: { defaults: { subagents: { delegationMode: "prefer", maxConcurrent: 4, }, }, list: [ { id: "coordinator", subagents: { delegationMode: "prefer" }, }, ], },}Параметры инструмента
taskstringrequiredОписание задачи для субагента.
taskNamestringНеобязательный стабильный дескриптор для идентификации конкретного дочернего агента в последующем выводе состояния. Должен соответствовать [a-z][a-z0-9_-]{0,63} и не может быть зарезервированной целью, такой как last или all.
labelstringНеобязательная удобочитаемая метка.
agentIdstringЗапускает процесс для другого настроенного идентификатора агента, если это разрешено параметром subagents.allowAgents.
cwdstringНеобязательный рабочий каталог задачи для дочернего запуска. Нативные субагенты по-прежнему загружают файлы начальной настройки из рабочей области целевого агента; cwd изменяет только расположение, в котором инструменты среды выполнения и CLI-обвязки выполняют делегированную работу.
runtime"subagent" | "acp"default: subagentacp предназначен только для внешних ACP-обвязок (claude, droid, gemini, opencode или явно запрошенных Codex ACP/acpx), а также для записей agents.list[], у которых runtime.type имеет значение acp.
resumeSessionIdstringТолько для ACP. Возобновляет существующий сеанс ACP-обвязки, если runtime: "acp"; игнорируется при запуске нативных субагентов.
streamTo"parent"Только для ACP. Передаёт вывод запуска ACP в родительский сеанс, если runtime: "acp"; не указывайте при запуске нативных субагентов.
modelstringПереопределяет модель субагента. Недопустимые значения пропускаются, и субагент запускается с моделью по умолчанию, а результат инструмента содержит предупреждение.
thinkingstringПереопределяет уровень рассуждений для запуска субагента.
threadbooleandefault: falseЕсли true, запрашивает привязку к ветке канала для этого сеанса субагента.
mode"run" | "session"default: runЕсли thread: true и параметр mode не указан, значением по умолчанию становится session. Для mode: "session" требуется thread: true.
Если привязка к ветке недоступна для канала инициатора запроса, используйте вместо неё mode: "run".
cleanup"delete" | "keep"default: keep"delete" архивирует сеанс сразу после объявления (расшифровка всё равно сохраняется путём переименования).
sandbox"inherit" | "require"default: inheritrequire отклоняет запуск, если среда выполнения целевого дочернего агента не изолирована.
context"isolated" | "fork"default: isolatedfork ответвляет текущую расшифровку инициатора запроса в дочерний сеанс. Только для нативных субагентов. Для запусков с привязкой к ветке по умолчанию используется fork; для запусков без привязки — isolated.
Имена задач и выбор цели
taskName — доступный модели дескриптор для оркестрации, а не ключ сеанса.
Используйте его для стабильных имён дочерних агентов, таких как review_subagents,
linux_validation или docs_update, когда координатору может потребоваться позднее проверить
этого дочернего агента.
При разрешении цели принимаются точные совпадения taskName и однозначные
префиксы. Сопоставление ограничено тем же окном активных и недавних целей, которое используется
для нумерованных целей /subagents, поэтому устаревший завершённый дочерний агент не делает
повторно использованный дескриптор неоднозначным. Если два активных или недавних дочерних агента имеют одинаковое
значение taskName, цель неоднозначна; вместо него используйте индекс списка, ключ сеанса или
идентификатор запуска.
Зарезервированные цели last и all не являются допустимыми значениями taskName,
поскольку у них уже есть управляющее назначение.
Инструмент: sessions_yield
Завершает текущий ход модели и ожидает, пока события среды выполнения, прежде всего события завершения субагентов, поступят следующим сообщением. Используйте его после запуска обязательной дочерней работы, если инициатор запроса не может дать окончательный ответ до получения результатов её выполнения.
sessions_yield — примитив ожидания. Не заменяйте его циклами опроса
subagents, sessions_list, sessions_history, командами оболочки
sleep или опросом процессов только для обнаружения завершения дочернего агента.
Используйте sessions_yield только тогда, когда он присутствует в фактическом списке инструментов
сеанса. Некоторые минимальные или пользовательские профили инструментов могут предоставлять sessions_spawn и
subagents, не предоставляя sessions_yield; в таком случае не создавайте
цикл опроса только ради ожидания завершения.
При наличии активных дочерних агентов OpenClaw внедряет компактный блок подсказки
Active Subagents, сформированный средой выполнения, в обычные ходы, чтобы инициатор запроса мог видеть
текущие дочерние сеансы, идентификаторы запусков, состояния, метки, задачи и
псевдонимы taskName без опроса. Поля задачи и метки в этом
блоке заключены в кавычки как данные, а не как инструкции, поскольку они могут поступать
из предоставленных пользователем или моделью аргументов запуска.
Инструмент: subagents
Выводит список запусков субагентов, принадлежащих сеансу инициатора запроса. Область действия ограничена текущим инициатором запроса; дочерний агент может видеть только собственных подконтрольных дочерних агентов.
Используйте subagents для получения состояния по запросу и отладки. Используйте sessions_yield для
ожидания событий завершения.
Сеансы с привязкой к веткам
Когда для канала включены привязки к веткам, субагент может оставаться привязанным к ветке, чтобы последующие сообщения пользователя в этой ветке продолжали направляться в тот же сеанс субагента.
Каналы с поддержкой веток
Канал поддерживает постоянные сеансы субагентов с привязкой к веткам
(sessions_spawn со значением thread: true), если он регистрирует адаптер привязки
диалогов. Встроенные каналы с такой поддержкой: Discord,
iMessage, Matrix и Telegram. Discord и Matrix по умолчанию
создают дочернюю ветку; Telegram и iMessage по умолчанию привязывают
текущий диалог. Для включения, настройки тайм-аутов и spawnSessions
используйте ключи конфигурации threadBindings соответствующего канала.
Краткая схема
Запуск
sessions_spawn с thread: true (и при необходимости mode: "session").
Привязка
OpenClaw создаёт или привязывает ветку к цели этого сеанса в активном канале.
Маршрутизация последующих сообщений
Ответы и последующие сообщения в этой ветке направляются в привязанный сеанс.
Проверка тайм-аутов
Используйте /session idle для проверки или изменения автоматического снятия фокуса при бездействии и
/session max-age для управления жёстким ограничением.
Отсоединение
Используйте /unfocus для ручного отсоединения.
Ручное управление
| Команда | Действие |
|---|---|
/focus <target> |
Привязать текущую ветку (или создать её) к цели субагента или сеанса |
/unfocus |
Удалить привязку для текущей привязанной ветки |
/agents |
Вывести активные запуски и состояние привязки (binding:<id>, unbound или bindings unavailable) |
/session idle |
Проверить или изменить автоматическое снятие фокуса при бездействии (только для привязанных веток в фокусе) |
/session max-age |
Проверить или изменить жёсткое ограничение (только для привязанных веток в фокусе) |
Переключатели конфигурации
- Глобальное значение по умолчанию:
session.threadBindings.enabled,session.threadBindings.idleHours,session.threadBindings.maxAgeHours. - Ключи переопределения для канала и автоматической привязки при запуске зависят от адаптера. См. раздел Каналы с поддержкой веток выше.
Актуальные сведения об адаптерах см. в разделах Справочник по конфигурации и Команды с косой чертой.
Список разрешений
agents.list[].subagents.allowAgentsstring[]Список идентификаторов настроенных агентов, которые можно выбирать явно через agentId (["*"] разрешает любую настроенную цель). По умолчанию разрешён только агент — инициатор запроса. Если вы задаёте список и хотите, чтобы инициатор запроса по-прежнему мог запускать самого себя с помощью agentId, включите идентификатор инициатора запроса в список.
agents.defaults.subagents.allowAgentsstring[]Настроенный по умолчанию список разрешённых целевых агентов, используемый, когда агент — инициатор запроса не задаёт собственное значение subagents.allowAgents.
agents.defaults.subagents.requireAgentIdbooleandefault: falseБлокирует вызовы sessions_spawn, в которых не указан agentId (принудительно требует явного выбора профиля). Переопределение для отдельного агента: agents.list[].subagents.requireAgentId.
agents.defaults.subagents.announceTimeoutMsnumberdefault: 120000Тайм-аут для каждой попытки доставки объявления Gateway agent. Значения задаются положительным целым числом миллисекунд и ограничиваются максимальным безопасным для платформы значением таймера. Повторные попытки после временных сбоев могут увеличить общее время ожидания объявления сверх одного настроенного тайм-аута.
Если сеанс инициатора запроса изолирован, sessions_spawn отклоняет цели,
которые будут выполняться без изоляции.
Обнаружение
Используйте agents_list, чтобы узнать, какие идентификаторы агентов сейчас разрешены для
sessions_spawn. Ответ содержит фактическую модель каждого указанного агента
и встроенные метаданные среды выполнения, чтобы вызывающая сторона могла различать OpenClaw, сервер приложений Codex
и другие настроенные нативные среды выполнения.
Записи allowAgents должны указывать на идентификаторы настроенных агентов в agents.list[].
["*"] означает любого настроенного целевого агента, а также инициатора запроса. Если конфигурация агента
удалена, но его идентификатор остаётся в allowAgents, sessions_spawn отклоняет этот идентификатор,
а agents_list не включает его в вывод. Запустите openclaw doctor --fix, чтобы удалить устаревшие
записи списка разрешений, или добавьте минимальную запись agents.list[], если цель должна
оставаться доступной для запуска и наследовать значения по умолчанию.
Автоматическое архивирование
- Сеансы субагентов автоматически архивируются по истечении
agents.defaults.subagents.archiveAfterMinutes(по умолчанию60). - При архивировании используется
sessions.delete, а расшифровка переименовывается в*.deleted.<timestamp>(в той же папке). cleanup: "delete"архивирует сеанс сразу после объявления (расшифровка всё равно сохраняется путём переименования).- Автоматическое архивирование выполняется по мере возможности; ожидающие таймеры теряются при перезапуске Gateway.
- Настроенные тайм-ауты выполнения не запускают автоматическое архивирование; они только останавливают выполнение. Сеанс сохраняется до автоматического архивирования.
- Автоматическое архивирование одинаково применяется к сеансам глубины 1 и глубины 2.
- Очистка браузера выполняется отдельно от очистки архива: отслеживаемые вкладки и процессы браузера по мере возможности закрываются после завершения запуска, даже если расшифровка или запись сеанса сохраняется.
Вложенные субагенты
По умолчанию субагенты не могут запускать собственных субагентов
(maxSpawnDepth: 1). Задайте maxSpawnDepth: 2, чтобы разрешить один уровень
вложенности — шаблон оркестратора: основной агент → субагент-оркестратор →
рабочие субсубагенты.
{ agents: { defaults: { subagents: { maxSpawnDepth: 2, // разрешить субагентам запускать дочерних агентов (по умолчанию: 1, диапазон 1–5) maxChildrenPerAgent: 5, // максимальное число активных дочерних агентов на сеанс агента (по умолчанию: 5, диапазон 1–20) maxConcurrent: 8, // глобальное ограничение параллелизма (по умолчанию: 8) runTimeoutSeconds: 900, // тайм-аут по умолчанию для sessions_spawn (0 = без тайм-аута) announceTimeoutMs: 120000, // тайм-аут объявления Gateway для каждого вызова }, }, },}Уровни глубины
| Глубина | Формат ключа сеанса | Роль | Может создавать дочерние агенты? |
|---|---|---|---|
| 0 | agent:<id>:main |
Основной агент | Всегда |
| 1 | agent:<id>:subagent:<uuid> |
Субагент (оркестратор, если разрешена глубина 2) | Только если maxSpawnDepth >= 2 |
| 2 | agent:<id>:subagent:<uuid>:subagent:<uuid> |
Суб-субагент (конечный исполнитель) | Никогда |
Цепочка уведомлений
Результаты передаются вверх по цепочке:
- Исполнитель глубины 2 завершает работу → уведомляет своего родителя (оркестратора глубины 1).
- Оркестратор глубины 1 получает уведомление, обобщает результаты, завершает работу → уведомляет основного агента.
- Основной агент получает уведомление и передаёт результат пользователю.
Каждый уровень видит только уведомления от своих непосредственных дочерних агентов.
Политика инструментов по глубине
- Роль и область управления записываются в метаданные сеанса при создании. Благодаря этому плоские или восстановленные ключи сеансов не могут случайно снова получить привилегии оркестратора.
- Глубина 1 (оркестратор, когда
maxSpawnDepth >= 2): получаетsessions_spawn,subagents,sessions_list,sessions_history, чтобы создавать дочерние агенты и проверять их состояние. Остальные инструменты сеанса и системы остаются запрещёнными. - Глубина 1 (конечный исполнитель, когда
maxSpawnDepth == 1): инструменты сеанса недоступны (текущее поведение по умолчанию). - Глубина 2 (конечный исполнитель): инструменты сеанса недоступны —
sessions_spawnвсегда запрещён на глубине 2. Создавать дополнительные дочерние агенты нельзя.
Ограничение создания дочерних агентов для каждого агента
Каждый сеанс агента (на любой глубине) может одновременно иметь не более maxChildrenPerAgent
(по умолчанию 5) активных дочерних агентов. Это предотвращает неконтролируемое разветвление
из одного оркестратора.
Каскадная остановка
Остановка оркестратора глубины 1 автоматически останавливает все его дочерние агенты глубины 2:
/stopв основном чате останавливает всех агентов глубины 1 и каскадно останавливает их дочерние агенты глубины 2.
Аутентификация
Аутентификация субагента определяется по идентификатору агента, а не по типу сеанса:
- Ключ сеанса субагента —
agent:<agentId>:subagent:<uuid>. - Хранилище аутентификации загружается из
agentDirэтого агента. - Профили аутентификации основного агента объединяются в качестве резервных; при конфликтах профили агента переопределяют профили основного агента.
Объединение выполняется аддитивно, поэтому профили основного агента всегда доступны как резервные. Полностью изолированная аутентификация для каждого агента пока не поддерживается.
Уведомление
Субагенты передают результаты через этап уведомления:
- Этап уведомления выполняется в сеансе субагента (а не в сеансе запрашивающего агента).
- Если субагент отвечает в точности
ANNOUNCE_SKIP, ничего не публикуется. - Если последний текст ассистента в точности совпадает с беззвучным токеном
NO_REPLY/no_reply, вывод уведомления подавляется, даже если ранее отображался видимый ход выполнения.
Способ доставки зависит от глубины запрашивающего агента:
- Сеансы запрашивающего агента верхнего уровня используют последующий вызов
agentс внешней доставкой (deliver=true). - Вложенные сеансы запрашивающих субагентов получают внутреннюю последующую инъекцию (
deliver=false), чтобы оркестратор мог обобщить результаты дочерних агентов в рамках сеанса. - Если вложенный сеанс запрашивающего субагента завершён, OpenClaw по возможности переключается на запрашивающего агента этого сеанса.
Для сеансов запрашивающего агента верхнего уровня прямая доставка в режиме завершения сначала определяет привязанный маршрут беседы или ветки и переопределение обработчика, а затем заполняет отсутствующие поля канала и получателя из сохранённого маршрута сеанса запрашивающего агента. Благодаря этому результаты поступают в нужный чат или тему, даже если источник завершения указывает только канал.
При формировании результатов вложенного завершения агрегация завершений дочерних агентов ограничивается текущим запуском запрашивающего агента, что предотвращает попадание устаревших результатов дочерних агентов из предыдущего запуска в текущее уведомление. Ответы с уведомлениями сохраняют маршрутизацию по веткам и темам, если адаптеры каналов её поддерживают.
Контекст уведомления
Контекст уведомления нормализуется в стабильный внутренний блок событий:
| Поле | Источник |
|---|---|
| Источник | subagent или cron |
| Идентификаторы сеанса | Ключ или идентификатор дочернего сеанса |
| Тип | Тип уведомления + метка задачи |
| Состояние | Определяется по результату выполнения (ok, error, timeout или unknown) — не выводится из текста модели |
| Содержимое результата | Последний видимый текст ассистента от дочернего агента |
| Последующее действие | Инструкция, описывающая, когда отвечать, а когда сохранять молчание |
Завершившиеся с ошибкой запуски сообщают о состоянии ошибки без повторного воспроизведения перехваченного текста ответа. Вывод инструмента или результата инструмента не переносится в текст результата дочернего агента.
Строка статистики
В конце содержимого уведомления добавляется строка статистики (даже при переносе):
- Время выполнения (например,
runtime 5m12s). - Использование токенов (ввод/вывод/всего).
- Ориентировочная стоимость, если настроены цены модели (
models.providers.*.models[].cost). sessionKey,sessionIdи путь к расшифровке, чтобы основной агент мог получить историю черезsessions_historyили просмотреть файл на диске.
Внутренние метаданные предназначены только для оркестрации; ответы пользователю следует переформулировать обычным стилем ассистента.
Почему предпочтителен sessions_history
sessions_history — более безопасный способ оркестрации для чтения расшифровки дочернего агента
в рамках хода агента:
- Скрывает текст, похожий на учётные данные или токены, даже если универсальное скрытие конфиденциальных данных в журналах отключено.
- Обрезает длинные текстовые блоки (4000 символов на блок) и удаляет сигнатуры размышлений, данные повторного воспроизведения рассуждений и встроенные данные изображений.
- Устанавливает ограничение ответа в 80 КБ; слишком большие строки заменяются на
[sessions_history omitted: message too large]. - Используйте
nextOffset, если он присутствует, для постраничного перехода назад к более старым окнам расшифровки. sessions_historyне удаляет теги рассуждений, каркас<relevant-memories>или XML вызовов инструментов из текста сообщений — он возвращает структурированные блоки содержимого, близкие к необработанному формату расшифровки, но со скрытыми конфиденциальными данными и ограниченным размером./subagents logприменяет более строгую очистку прозы (удаляет теги рассуждений, каркас памяти и XML вызовов инструментов), поскольку отображает обычные строки чата вместо структурированных блоков.- Просмотр необработанной расшифровки на диске служит резервным вариантом, когда требуется полная побайтовая расшифровка.
Политика инструментов
Сначала к субагентам применяется тот же профиль и конвейер политики инструментов, что и к родительскому или целевому агенту. После этого OpenClaw применяет уровень ограничений субагента.
Субагенты всегда лишаются gateway, agents_list, session_status и
cron независимо от глубины или роли (системные/интерактивные инструменты либо
инструменты, работу с которыми должен координировать основной агент). Конечные субагенты (поведение
по умолчанию на глубине 1 и всегда на глубине 2) дополнительно лишаются subagents,
sessions_list, sessions_history и sessions_spawn. Субагенты никогда
не получают инструмент message — он отключается при создании, а не фильтруется
этим списком запретов; sessions_send также остаётся запрещённым, поэтому субагенты
обмениваются данными только через цепочку уведомлений.
sessions_history и здесь остаётся ограниченным и очищенным представлением сохранённых данных —
это не дамп необработанной расшифровки.
Когда maxSpawnDepth >= 2, субагенты-оркестраторы глубины 1 дополнительно
получают sessions_spawn, subagents, sessions_list и
sessions_history, чтобы управлять своими дочерними агентами.
Переопределение через конфигурацию
{ agents: { defaults: { subagents: { maxConcurrent: 1, }, }, }, tools: { subagents: { tools: { // запрет имеет приоритет deny: ["gateway", "cron"], // если задан allow, он становится исключительным списком разрешений (запрет по-прежнему имеет приоритет) // allow: ["read", "exec", "process"] }, }, },}tools.subagents.tools.allow — это окончательный исключительный фильтр разрешений. Он может сузить
уже определённый набор инструментов, но не может вернуть инструмент, удалённый
посредством tools.profile. Например, tools.profile: "coding" включает
web_search/web_fetch, но не инструмент browser. Чтобы разрешить
субагентам с профилем программирования использовать автоматизацию браузера, добавьте браузер
на этапе профиля:
{ tools: { profile: "coding", alsoAllow: ["browser"], },}Используйте индивидуальный agents.list[].tools.alsoAllow: ["browser"], если автоматизацию браузера
должен получить только один агент.
Параллелизм
Субагенты используют отдельную внутрипроцессную очередь:
- Имя очереди:
subagent - Параллелизм:
agents.defaults.subagents.maxConcurrent(по умолчанию8)
Контроль активности и восстановление
OpenClaw не считает отсутствие endedAt окончательным доказательством того, что
субагент всё ещё активен. Незавершённые запуски старше окна устаревания
(2 часа либо настроенное время ожидания запуска плюс небольшой дополнительный период —
в зависимости от того, что больше) перестают учитываться как активные или ожидающие в /subagents list,
сводках состояний, блокировке завершения потомков и проверках параллелизма
для каждого сеанса.
После перезапуска Gateway устаревшие восстановленные незавершённые запуски удаляются, если
их дочерний сеанс не помечен как abortedLastRun: true. Запуски, прерванные
перезапуском, остаются зарегистрированными для процесса восстановления потерянных субагентов:
устаревшие запуски завершаются без возобновления, а активные дочерние сеансы получают
синтетическое сообщение о возобновлении до снятия отметки о прерывании.
Автоматическое восстановление после перезапуска ограничивается отдельно для каждого дочернего сеанса. Если один и тот же
дочерний субагент неоднократно принимается для восстановления потерянного процесса в течение
окна быстрого повторного зависания, OpenClaw сохраняет в этом сеансе отметку блокировки восстановления
и прекращает его автоматическое возобновление при последующих перезапусках. Выполните
openclaw tasks maintenance --apply, чтобы согласовать запись задачи, или
openclaw doctor --fix, чтобы удалить устаревшие отметки прерванного восстановления
в заблокированных сеансах.
Остановка
- Отправка
/stopв чат инициатора прерывает его сеанс и останавливает все запущенные из него активные выполнения субагентов, распространяя остановку на вложенных дочерних агентов.
Ограничения
- Уведомление субагента выполняется по мере возможности. При перезапуске Gateway ожидающие задачи «обратного уведомления» теряются.
- Субагенты по-прежнему совместно используют ресурсы одного процесса Gateway; рассматривайте
maxConcurrentкак предохранительный механизм. sessions_spawnвсегда выполняется без блокировки: он немедленно возвращает{ status: "accepted", runId, childSessionKey }.- В контекст субагента добавляются только
AGENTS.mdиTOOLS.md(безSOUL.md,IDENTITY.md,USER.md,MEMORY.md,HEARTBEAT.mdиBOOTSTRAP.md). Нативные субагенты Codex следуют той же границе:TOOLS.mdостаётся в унаследованных инструкциях потока Codex, а предназначенные только для родительского агента файлы персоны, идентичности и пользователя добавляются как ограниченные текущим ходом инструкции по совместной работе, чтобы дочерние агенты их не клонировали. - Максимальная глубина вложенности — 5 (диапазон
maxSpawnDepth: 1-5). Для большинства сценариев рекомендуется глубина 2. maxChildrenPerAgentограничивает количество активных дочерних агентов на сеанс (по умолчанию5, диапазон1-20).