Підагенти
Підагенти — це фонові запуски агентів, створені з наявного запуску агента. Вони працюють у власній сесії (agent:<agentId>:subagent:<uuid>) і після завершення повідомляють про свій результат назад у чат-канал запитувача. Кожен запуск підагента відстежується як фонове завдання.
Слеш-команда
Використовуйте/subagents, щоб переглядати або керувати запусками підагентів для поточної сесії:
/subagents list/subagents kill <id|#|all>/subagents log <id|#> [limit] [tools]/subagents info <id|#>/subagents send <id|#> <message>/subagents steer <id|#> <message>/subagents spawn <agentId> <task> [--model <model>] [--thinking <level>]
/focus <subagent-label|session-key|session-id|session-label>/unfocus/agents/session idle <duration|off>/session max-age <duration|off>
/subagents info показує метадані запуску (статус, часові мітки, id сесії, шлях до транскрипту, очищення).
Використовуйте sessions_history для обмеженого, відфільтрованого з погляду безпеки перегляду історії; перевіряйте
шлях до транскрипту на диску, коли вам потрібен необроблений повний транскрипт.
Поведінка spawn
/subagents spawn запускає фоновий підагент як команду користувача, а не внутрішню пересилку, і надсилає одне фінальне оновлення про завершення назад у чат запитувача, коли запуск завершується.
- Команда spawn є неблокувальною; вона одразу повертає id запуску.
- Після завершення підагент повідомляє зведене/результуюче повідомлення назад у чат-канал запитувача.
- Доставка завершення є push-орієнтованою. Після запуску не опитуйте
/subagents list,sessions_listабоsessions_historyу циклі лише для того, щоб дочекатися завершення; перевіряйте статус лише за запитом для налагодження або втручання. - Після завершення OpenClaw у межах best-effort закриває відстежувані вкладки браузера/процеси, відкриті цією сесією підагента, перш ніж продовжиться потік очищення після повідомлення.
- Для ручних запусків доставка є стійкою:
- OpenClaw спочатку намагається виконати пряму доставку
agentзі стабільним ключем ідемпотентності. - Якщо пряма доставка не вдається, він переходить до маршрутизації через чергу.
- Якщо маршрутизація через чергу все ще недоступна, повідомлення повторно надсилається з коротким експоненційним backoff перед остаточною відмовою.
- OpenClaw спочатку намагається виконати пряму доставку
- Доставка завершення зберігає визначений маршрут запитувача:
- маршрути завершення, прив’язані до потоку або розмови, мають пріоритет, коли доступні
- якщо джерело завершення надає лише канал, OpenClaw заповнює відсутні target/account із визначеного маршруту сесії запитувача (
lastChannel/lastTo/lastAccountId), щоб пряма доставка все одно працювала
- Передача завершення до сесії запитувача — це внутрішній контекст, згенерований під час виконання (а не написаний користувачем текст), і містить:
Result(останній видимий текст відповідіassistant, інакше санітований останній текстtool/toolResult; завершені з помилкою запуски не повторно використовують захоплений текст відповіді)Status(completed successfully/failed/timed out/unknown)- компактну статистику виконання/токенів
- інструкцію доставки, яка вказує агенту запитувача переформулювати текст у звичайному голосі помічника (а не пересилати сирі внутрішні метадані)
--modelі--thinkingперевизначають значення за замовчуванням для цього конкретного запуску.- Використовуйте
info/log, щоб переглядати деталі та вивід після завершення. /subagents spawn— це одноразовий режим (mode: "run"). Для постійних сесій, прив’язаних до потоку, використовуйтеsessions_spawnізthread: trueіmode: "session".- Для сесій ACP harness (Codex, Claude Code, Gemini CLI) використовуйте
sessions_spawnізruntime: "acp"і див. ACP Agents, особливо модель доставки ACP під час налагодження завершень або циклів агент-до-агента.
- Розпаралелювати роботу типу «дослідження / довге завдання / повільний інструмент» без блокування основного запуску.
- За замовчуванням тримати підагентів ізольованими (розділення сесій + необов’язкове sandboxing).
- Зробити поверхню інструментів важкою для неправильного використання: підагенти не отримують інструменти сесій за замовчуванням.
- Підтримувати налаштовувану глибину вкладеності для патернів оркестрації.
agents.defaults.subagents.model або перевизначення для конкретного агента.
Інструмент
Використовуйтеsessions_spawn:
- Запускає підагента (
deliver: false, глобальна смуга:subagent) - Потім виконує крок повідомлення і публікує відповідь-повідомлення в чат-канал запитувача
- Модель за замовчуванням: успадковується від викликача, якщо ви не встановите
agents.defaults.subagents.model(абоagents.list[].subagents.modelдля конкретного агента); явне значенняsessions_spawn.modelусе одно має пріоритет. - Рівень thinking за замовчуванням: успадковується від викликача, якщо ви не встановите
agents.defaults.subagents.thinking(абоagents.list[].subagents.thinkingдля конкретного агента); явне значенняsessions_spawn.thinkingусе одно має пріоритет. - Тайм-аут запуску за замовчуванням: якщо
sessions_spawn.runTimeoutSecondsне вказано, OpenClaw використовуєagents.defaults.subagents.runTimeoutSeconds, якщо його встановлено; інакше використовується0(без тайм-ауту).
task(обов’язковий)label?(необов’язковий)agentId?(необов’язковий; запустити під іншим id агента, якщо це дозволено)model?(необов’язковий; перевизначає модель підагента; недійсні значення пропускаються, і підагент запускається на моделі за замовчуванням із попередженням у результаті інструмента)thinking?(необов’язковий; перевизначає рівень thinking для запуску підагента)runTimeoutSeconds?(за замовчуванням береться зagents.defaults.subagents.runTimeoutSeconds, якщо його встановлено, інакше0; якщо встановлено, запуск підагента переривається через N секунд)thread?(типовоfalse; колиtrue, запитує прив’язку до потоку каналу для цієї сесії підагента)mode?(run|session)- типове значення —
run - якщо
thread: trueіmodeне вказано, типовим стаєsession mode: "session"вимагаєthread: true
- типове значення —
cleanup?(delete|keep, типовоkeep)sandbox?(inherit|require, типовоinherit;requireвідхиляє запуск, якщо цільове дочірнє середовище виконання не ізольоване)sessions_spawnне приймає параметри доставки каналу (target,channel,to,threadId,replyTo,transport). Для доставки використовуйтеmessage/sessions_sendіз запущеного запуску.
Сесії, прив’язані до потоку
Коли прив’язки до потоку ввімкнені для каналу, підагент може залишатися прив’язаним до потоку, щоб подальші повідомлення користувача в цьому потоці й надалі маршрутизувалися до тієї самої сесії підагента.Канали з підтримкою потоків
- Discord (наразі єдиний підтримуваний канал): підтримує постійні сесії підагентів, прив’язані до потоку (
sessions_spawnізthread: true), ручні елементи керування потоками (/focus,/unfocus,/agents,/session idle,/session max-age) і ключі адаптераchannels.discord.threadBindings.enabled,channels.discord.threadBindings.idleHours,channels.discord.threadBindings.maxAgeHoursтаchannels.discord.threadBindings.spawnSubagentSessions.
- Запустіть через
sessions_spawn, використовуючиthread: true(і за потребиmode: "session"). - OpenClaw створює потік або прив’язує його до цілі цієї сесії в активному каналі.
- Відповіді та подальші повідомлення в цьому потоці маршрутизуються до прив’язаної сесії.
- Використовуйте
/session idle, щоб переглядати/оновлювати автоматичне зняття фокусу через неактивність, і/session max-age, щоб керувати жорстким лімітом. - Використовуйте
/unfocus, щоб від’єднати вручну.
/focus <target>прив’язує поточний потік (або створює його) до цілі підагента/сесії./unfocusвидаляє прив’язку для поточного прив’язаного потоку./agentsвиводить список активних запусків і стан прив’язки (thread:<id>абоunbound)./session idleі/session max-ageпрацюють лише для сфокусованих прив’язаних потоків.
- Глобальні значення за замовчуванням:
session.threadBindings.enabled,session.threadBindings.idleHours,session.threadBindings.maxAgeHours - Перевизначення для каналу та ключі автоматичної прив’язки під час запуску залежать від конкретного адаптера. Див. Канали з підтримкою потоків вище.
agents.list[].subagents.allowAgents: список id агентів, які можна вибрати черезagentId(["*"]— дозволити будь-який). Типово: лише агент запитувача.agents.defaults.subagents.allowAgents: список дозволених цільових агентів за замовчуванням, який використовується, коли агент запитувача не задає власнийsubagents.allowAgents.- Захист успадкування sandbox: якщо сесія запитувача ізольована,
sessions_spawnвідхиляє цілі, які працювали б без sandbox. agents.defaults.subagents.requireAgentId/agents.list[].subagents.requireAgentId: коли true, блокують викликиsessions_spawn, які не вказуютьagentId(примушує до явного вибору профілю). Типове значення: false.
- Використовуйте
agents_list, щоб побачити, які id агентів наразі дозволені дляsessions_spawn.
- Сесії підагентів автоматично архівуються після
agents.defaults.subagents.archiveAfterMinutes(типово: 60). - Архівування використовує
sessions.deleteі перейменовує транскрипт на*.deleted.<timestamp>(у тій самій папці). cleanup: "delete"архівує одразу після повідомлення (транскрипт усе одно зберігається через перейменування).- Автоархівування виконується в режимі best-effort; заплановані таймери втрачаються, якщо Gateway перезапускається.
runTimeoutSecondsне виконує автоархівування; він лише зупиняє запуск. Сесія залишається до автоархівування.- Автоархівування однаково застосовується до сесій глибини 1 і глибини 2.
- Очищення браузера є окремим від очищення архіву: відстежувані вкладки браузера/процеси закриваються в режимі best-effort після завершення запуску, навіть якщо транскрипт/запис сесії зберігається.
Вкладені підагенти
За замовчуванням підагенти не можуть запускати власних підагентів (maxSpawnDepth: 1). Ви можете ввімкнути один рівень вкладеності, встановивши maxSpawnDepth: 2, що дозволяє патерн оркестратора: main → підагент-оркестратор → підпідагенти-працівники.
Як увімкнути
Рівні глибини
| Глибина | Форма ключа сесії | Роль | Може запускати? |
|---|---|---|---|
| 0 | agent:<id>:main | Основний агент | Завжди |
| 1 | agent:<id>:subagent:<uuid> | Підагент (оркестратор, якщо дозволено depth 2) | Лише якщо maxSpawnDepth >= 2 |
| 2 | agent:<id>:subagent:<uuid>:subagent:<uuid> | Підпідагент (кінцевий виконавець) | Ніколи |
Ланцюг повідомлень
Результати повертаються вгору по ланцюгу:- Працівник depth-2 завершується → повідомляє свого батьківського агента (оркестратор depth-1)
- Оркестратор depth-1 отримує повідомлення, синтезує результати, завершується → повідомляє main
- Main-агент отримує повідомлення й доставляє його користувачу
- Запускайте дочірню роботу один раз і чекайте на події завершення замість побудови циклів
опитування навколо
sessions_list,sessions_history,/subagents listабо командexecзі сном. - Якщо подія завершення дочірнього агента надходить після того, як ви вже надіслали фінальну відповідь,
правильна подальша дія — це точний мовчазний токен
NO_REPLY/no_reply.
Політика інструментів за глибиною
- Роль і область керування записуються в метадані сесії під час spawn. Це запобігає тому, щоб плоскі або відновлені ключі сесій випадково знову отримали привілеї оркестратора.
- Depth 1 (оркестратор, коли
maxSpawnDepth >= 2): отримуєsessions_spawn,subagents,sessions_list,sessions_history, щоб керувати своїми дочірніми агентами. Інші інструменти сесій/системи залишаються забороненими. - Depth 1 (кінцевий виконавець, коли
maxSpawnDepth == 1): без інструментів сесії (поточна поведінка за замовчуванням). - Depth 2 (кінцевий працівник): без інструментів сесії —
sessions_spawnна depth 2 завжди заборонено. Не може запускати подальших дочірніх агентів.
Ліміт spawn для агента
Кожна сесія агента (на будь-якій глибині) може одночасно мати не більшеmaxChildrenPerAgent (типово: 5) активних дочірніх агентів. Це запобігає неконтрольованому fan-out від одного оркестратора.
Каскадна зупинка
Зупинка оркестратора depth-1 автоматично зупиняє всіх його дочірніх агентів depth-2:/stopв основному чаті зупиняє всіх агентів depth-1 і каскадно зупиняє їхніх дочірніх агентів depth-2./subagents kill <id>зупиняє конкретного підагента і каскадно зупиняє його дочірніх агентів./subagents kill allзупиняє всіх підагентів для запитувача і виконує каскадну зупинку.
Автентифікація
Автентифікація підагента визначається за id агента, а не за типом сесії:- Ключ сесії підагента:
agent:<agentId>:subagent:<uuid>. - Сховище автентифікації завантажується з
agentDirцього агента. - Профілі автентифікації основного агента зливаються як резервний варіант; профілі агента мають пріоритет над профілями основного агента у разі конфліктів.
Повідомлення про завершення
Підагенти звітують назад через крок повідомлення про завершення:- Крок повідомлення про завершення виконується всередині сесії підагента (а не сесії запитувача).
- Якщо підагент відповідає точно
ANNOUNCE_SKIP, нічого не публікується. - Якщо останній текст assistant є точним мовчазним токеном
NO_REPLY/no_reply, вивід повідомлення про завершення пригнічується, навіть якщо раніше був видимий прогрес. - Інакше доставка залежить від глибини запитувача:
- для сесій запитувача верхнього рівня використовується подальший виклик
agentіз зовнішньою доставкою (deliver=true) - вкладені сесії підагента-запитувача отримують внутрішню ін’єкцію подальших дій (
deliver=false), щоб оркестратор міг синтезувати результати дочірніх агентів у межах сесії - якщо вкладена сесія підагента-запитувача вже відсутня, OpenClaw за можливості повертається до запитувача цієї сесії
- для сесій запитувача верхнього рівня використовується подальший виклик
- Для сесій запитувача верхнього рівня пряма доставка в режимі завершення спочатку визначає будь-який прив’язаний маршрут розмови/потоку та перевизначення hook, а потім заповнює відсутні поля channel-target зі збереженого маршруту сесії запитувача. Це утримує завершення в правильному чаті/темі, навіть коли джерело завершення ідентифікує лише канал.
- Агрегація завершень дочірніх агентів обмежується поточним запуском запитувача під час побудови вкладених результатів завершення, що запобігає витоку застарілих виводів дочірніх агентів із попередніх запусків у поточне повідомлення.
- Відповіді повідомлення про завершення зберігають маршрутизацію потоку/теми, коли вона доступна в адаптерах каналів.
- Контекст повідомлення про завершення нормалізується до стабільного внутрішнього блоку подій:
- джерело (
subagentабоcron) - ключ/id дочірньої сесії
- тип повідомлення про завершення + мітка завдання
- рядок статусу, виведений із результату виконання (
success,error,timeoutабоunknown) - вміст результату, вибраний з останнього видимого тексту assistant, інакше — санітований останній текст
tool/toolResult; запуски, що завершилися помилкою, повідомляють про статус помилки без повторного відтворення захопленого тексту відповіді - інструкція подальших дій, яка описує, коли потрібно відповідати, а коли — мовчати
- джерело (
Statusне виводиться з відповіді моделі; він надходить із сигналів результату виконання.- У разі тайм-ауту, якщо дочірній агент встиг пройти лише через виклики інструментів, повідомлення про завершення може згорнути цю історію в коротке зведення часткового прогресу замість відтворення сирого виводу інструментів.
- Час виконання (наприклад,
runtime 5m12s) - Використання токенів (input/output/total)
- Орієнтовна вартість, коли налаштовано ціни моделей (
models.providers.*.models[].cost) sessionKey,sessionIdі шлях до транскрипту (щоб основний агент міг отримати історію черезsessions_historyабо перевірити файл на диску)- Внутрішні метадані призначені лише для оркестрації; відповіді для користувачів слід переписувати звичайним голосом помічника.
sessions_history — безпечніший шлях оркестрації:
- history assistant спочатку нормалізується:
- теги thinking видаляються
- службові блоки
<relevant-memories>/<relevant_memories>видаляються - прості текстові XML-блоки payload-ів викликів інструментів, такі як
<tool_call>...</tool_call>,<function_call>...</function_call>,<tool_calls>...</tool_calls>і<function_calls>...</function_calls>, видаляються, зокрема й усічені payload-и, які так і не закрилися коректно - службові структури викликів/результатів інструментів і маркери історичного контексту в downgraded-формі видаляються
- витоки керувальних токенів моделі, як-от
<|assistant|>, інші ASCII-токени<|...|>і full-width варіанти<|...|>, видаляються - некоректний XML викликів інструментів MiniMax видаляється
- текст, схожий на облікові дані/токени, редагується
- довгі блоки можуть бути обрізані
- у дуже великих історіях старіші рядки можуть відкидатися або надто великий рядок може бути замінений на
[sessions_history omitted: message too large] - перевірка сирого транскрипту на диску — це резервний варіант, коли вам потрібен повний побайтовий транскрипт
Політика інструментів (інструменти підагента)
За замовчуванням підагенти отримують усі інструменти, крім інструментів сесії та системних інструментів:sessions_listsessions_historysessions_sendsessions_spawn
sessions_history також залишається обмеженим, санітованим поданням історії; це не
дамп сирого транскрипту.
Коли maxSpawnDepth >= 2, підагенти-оркестратори depth-1 додатково отримують sessions_spawn, subagents, sessions_list і sessions_history, щоб керувати своїми дочірніми агентами.
Перевизначення через конфігурацію:
Одночасність
Підагенти використовують окрему смугу черги в межах процесу:- Назва смуги:
subagent - Одночасність:
agents.defaults.subagents.maxConcurrent(типово8)
Зупинка
- Надсилання
/stopу чаті запитувача перериває сесію запитувача і зупиняє всі активні запуски підагентів, створені з неї, каскадно охоплюючи вкладених дочірніх агентів. /subagents kill <id>зупиняє конкретного підагента і каскадно зупиняє його дочірніх агентів.
Обмеження
- Повідомлення підагента про завершення виконується в режимі best-effort. Якщо gateway перезапуститься, очікувана робота з «повідомленням назад» буде втрачена.
- Підагенти все ще спільно використовують ресурси того самого процесу gateway; розглядайте
maxConcurrentяк запобіжний клапан. sessions_spawnзавжди неблокувальний: він одразу повертає{ status: "accepted", runId, childSessionKey }.- Контекст підагента ін’єктує лише
AGENTS.md+TOOLS.md(безSOUL.md,IDENTITY.md,USER.md,HEARTBEAT.mdабоBOOTSTRAP.md). - Максимальна глибина вкладеності — 5 (діапазон
maxSpawnDepth: 1–5). Для більшості випадків використання рекомендується depth 2. maxChildrenPerAgentобмежує кількість активних дочірніх агентів на сесію (типово: 5, діапазон: 1–20).