Agent coordination
Субагенти
Субагенти — це фонові запуски агентів, створені з наявного запуску агента.
Кожен із них працює у власному сеансі (agent:<agentId>:subagent:<uuid>) і
після завершення повідомляє свій результат назад у канал чату запитувача.
Кожен запуск субагента відстежується як фонове завдання.
Цілі:
- Розпаралелювати дослідження, тривалі завдання та повільну роботу з інструментами, не блокуючи основний запуск.
- За замовчуванням ізолювати субагентів (окремі сеанси, необов’язкова ізоляція в пісочниці).
- Ускладнити неналежне використання набору інструментів: за замовчуванням субагенти не отримують інструментів для роботи із сеансами чи повідомленнями.
- Підтримувати налаштовувану глибину вкладеності для шаблонів оркестратора.
Команда з косою рискою
/subagents перевіряє запуски субагентів для поточного сеансу:
/subagents list/subagents log <id|#> [limit] [tools]/subagents info <id|#>/subagents info показує метадані запуску (стан, часові позначки, ідентифікатор сеансу,
шлях до транскрипту, очищення). /subagents log виводить останні репліки чату для
запуску; додайте токен tools, щоб включити повідомлення викликів інструментів і їхніх результатів (за замовчуванням
пропущені). Використовуйте sessions_history для обмеженого, відфільтрованого з міркувань безпеки перегляду
зсередини ходу агента або перегляньте шлях до транскрипту на диску, щоб отримати
необроблений повний транскрипт.
У Control UI батьківські сеанси з нещодавніми дочірніми запусками мають розгортний рядок на бічній панелі. Вкладені рядки показують стан і тривалість роботи дочірнього агента, а вибір одного з них відкриває чат цього дочірнього агента зі збереженням батьківської ієрархії.
Керування прив’язкою до гілки
Ці команди працюють у каналах із постійними прив’язками до гілок. Див. Канали з підтримкою гілок нижче.
/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. Коли Plugincodexувімкнено, для керування чатом або гілками Codex слід надавати перевагу/codex ...замість ACP, якщо користувач явно не просить ACP/acpx. - OpenClaw приховує
runtime: "acp", доки ACP не ввімкнено, запитувач не перебуває в пісочниці та не завантажено серверний Plugin, наприклад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) — не визначається з тексту моделі |
| Вміст результату | Останній видимий текст асистента від дочірнього агента |
| Подальша дія | Інструкція, що описує, коли відповідати, а коли не відповідати |
Завершені з помилкою запуски повідомляють про стан помилки без повторного відтворення захопленого тексту відповіді. Виведення інструменту/toolResult не переноситься до тексту результату дочірнього агента.
Рядок статистики
Корисні дані сповіщення містять наприкінці рядок статистики (навіть у разі перенесення):
- Час виконання (наприклад,
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).