Маршрутизація кількох агентів
Мета: кілька ізольованих агентів (окремий workspace +agentDir + sessions), а також кілька облікових записів каналів (наприклад, два WhatsApp) в одному запущеному Gateway. Вхідні повідомлення маршрутизуються до агента через bindings.
Що таке “один агент”?
Агент — це повністю ізольований інтелект зі своїми власними:- Workspace (файли, AGENTS.md/SOUL.md/USER.md, локальні нотатки, правила персони).
- Каталогом стану (
agentDir) для профілів автентифікації, реєстру моделей і конфігурації для конкретного агента. - Сховищем сесій (історія чатів + стан маршрутизації) у
~/.openclaw/agents/<agentId>/sessions.
sessions_history і тут є безпечнішим шляхом для міжсесійного згадування: він повертає
обмежений, очищений вигляд, а не дамп сирого transcript. Згадування асистента прибирає
теги thinking, каркас <relevant-memories>, XML-payload викликів інструментів у звичайному тексті
(включно з <tool_call>...</tool_call>,
<function_call>...</function_call>, <tool_calls>...</tool_calls>,
<function_calls>...</function_calls> і обрізаними блоками викликів інструментів),
понижений каркас викликів інструментів, витоки ASCII/full-width токенів керування моделлю
та некоректний MiniMax XML викликів інструментів до редагування/обрізання.
Облікові дані основного агента не надаються спільно автоматично. Ніколи не використовуйте повторно agentDir
між агентами (це спричиняє конфлікти auth/session). Якщо ви хочете спільно використовувати облікові дані,
скопіюйте auth-profiles.json до agentDir іншого агента.
Skills завантажуються з workspace кожного агента, а також зі спільних кореневих каталогів, таких як
~/.openclaw/skills, а потім фільтруються за ефективним allowlist skills агента, якщо він налаштований.
Використовуйте agents.defaults.skills для спільної базової конфігурації та
agents.list[].skills для заміни для конкретного агента. Див.
Skills: per-agent vs shared і
Skills: agent skill allowlists.
Gateway може розміщувати одного агента (типово) або багатьох агентів паралельно.
Примітка щодо workspace: workspace кожного агента є типовим cwd, а не жорсткою
пісочницею. Відносні шляхи розв’язуються всередині workspace, але абсолютні шляхи можуть
досягати інших місць хоста, якщо не ввімкнено sandboxing. Див.
Sandboxing.
Шляхи (швидка схема)
- Config:
~/.openclaw/openclaw.json(абоOPENCLAW_CONFIG_PATH) - Каталог стану:
~/.openclaw(абоOPENCLAW_STATE_DIR) - Workspace:
~/.openclaw/workspace(або~/.openclaw/workspace-<agentId>) - Agent dir:
~/.openclaw/agents/<agentId>/agent(абоagents.list[].agentDir) - Sessions:
~/.openclaw/agents/<agentId>/sessions
Режим одного агента (типовий)
Якщо нічого не налаштовувати, OpenClaw запускає одного агента:agentIdтипово дорівнюєmain.- Sessions мають ключі у форматі
agent:main:<mainKey>. - Workspace типово
~/.openclaw/workspace(або~/.openclaw/workspace-<profile>, коли заданоOPENCLAW_PROFILE). - State типово
~/.openclaw/agents/main/agent.
Помічник агента
Використовуйте майстер агентів, щоб додати нового ізольованого агента:bindings (або дозвольте майстру зробити це), щоб маршрутизувати вхідні повідомлення.
Перевірка:
Швидкий старт
Створіть workspace для кожного агента
Використайте майстер або створіть workspaces вручну:Кожен агент отримує власний workspace з
SOUL.md, AGENTS.md і необов’язковим USER.md, а також окремі agentDir і сховище sessions у ~/.openclaw/agents/<agentId>.Створіть облікові записи каналів
Створіть по одному обліковому запису на агента у ваших бажаних каналах:Див. посібники каналів: Discord, Telegram, WhatsApp.
- Discord: по одному боту на агента, увімкніть Message Content Intent, скопіюйте кожен токен.
- Telegram: по одному боту на агента через BotFather, скопіюйте кожен токен.
- WhatsApp: прив’яжіть кожен номер телефону до окремого облікового запису.
Додайте агентів, облікові записи та bindings
Додайте агентів у
agents.list, облікові записи каналів у channels.<channel>.accounts, а потім з’єднайте їх через bindings (приклади нижче).Кілька агентів = кілька людей, кілька особистостей
За наявності кількох агентів коженagentId стає повністю ізольованою персоною:
- Різні phone numbers/accounts (через
accountIdдля кожного каналу). - Різні особистості (через файли workspace для конкретного агента, такі як
AGENTS.mdіSOUL.md). - Окремі auth + sessions (без перетину, якщо це явно не ввімкнено).
Пошук у пам’яті QMD між агентами
Якщо один агент має шукати в session transcripts QMD іншого агента, додайте додаткові collections уagents.list[].memorySearch.qmd.extraCollections.
Використовуйте agents.defaults.memorySearch.qmd.extraCollections лише тоді, коли кожен агент
має успадковувати однакові спільні collections transcript.
Один номер WhatsApp, кілька людей (поділ DM)
Ви можете маршрутизувати різні DM WhatsApp до різних агентів, залишаючись в межах одного облікового запису WhatsApp. Зіставлення виконується за E.164 відправника (наприклад,+15551234567) через peer.kind: "direct". Відповіді все одно надходитимуть з того самого номера WhatsApp (без sender identity для кожного агента).
Важлива деталь: прямі чати зводяться до основного ключа сесії агента, тому для справжньої ізоляції потрібен один агент на людину.
Приклад:
- Контроль доступу до DM є глобальним для кожного облікового запису WhatsApp (pairing/allowlist), а не для кожного агента.
- Для спільних груп прив’яжіть групу до одного агента або використайте Broadcast groups.
Правила маршрутизації (як повідомлення вибирають агента)
Bindings є детермінованими, і найбільш специфічний збіг має пріоритет:- збіг
peer(точний id DM/group/channel) - збіг
parentPeer(успадкування thread) guildId + roles(маршрутизація ролей Discord)guildId(Discord)teamId(Slack)- збіг
accountIdдля каналу - збіг на рівні каналу (
accountId: "*") - резервний перехід до типового агента (
agents.list[].default, інакше перший елемент списку, типово:main)
peer + guildId), усі вказані поля є обов’язковими (семантика AND).
Важлива деталь щодо області дії облікового запису:
- Binding без
accountIdзбігається лише з типовим обліковим записом. - Використовуйте
accountId: "*"для резервного правила на рівні каналу для всіх облікових записів. - Якщо пізніше ви додасте такий самий binding для того самого агента з явним id облікового запису, OpenClaw оновить наявний binding лише для каналу до області дії облікового запису замість дублювання.
Кілька облікових записів / phone numbers
Канали, що підтримують кілька облікових записів (наприклад, WhatsApp), використовуютьaccountId для позначення
кожного входу. Кожен accountId може маршрутизуватися до іншого агента, тож один сервер може обслуговувати
кілька phone numbers без змішування sessions.
Якщо вам потрібен типовий обліковий запис для всього каналу, коли accountId не вказано, задайте
channels.<channel>.defaultAccount (необов’язково). Якщо його не задано, OpenClaw резервно використовує
default, якщо він існує, інакше перший налаштований id облікового запису (у відсортованому порядку).
Типові канали, що підтримують цей шаблон:
whatsapp,telegram,discord,slack,signal,imessageirc,line,googlechat,mattermost,matrix,nextcloud-talkbluebubbles,zalo,zalouser,nostr,feishu
Поняття
agentId: один «мозок» (workspace, auth для конкретного агента, сховище sessions для конкретного агента).accountId: один екземпляр облікового запису каналу (наприклад, обліковий запис WhatsApp"personal"проти"biz").binding: маршрутизує вхідні повідомлення доagentIdза(channel, accountId, peer)і за потреби guild/team ids.- Прямі чати зводяться до
agent:<agentId>:<mainKey>(основний ключ конкретного агента;session.mainKey).
Приклади платформ
Discord-боти для кожного агента
Кожен обліковий запис бота Discord зіставляється з унікальнимaccountId. Прив’яжіть кожен обліковий запис до агента та зберігайте allowlists окремо для кожного бота.
- Запросіть кожного бота до guild і ввімкніть Message Content Intent.
- Токени зберігаються в
channels.discord.accounts.<id>.token(типовий обліковий запис може використовуватиDISCORD_BOT_TOKEN).
Telegram-боти для кожного агента
- Створіть по одному боту на агента через BotFather і скопіюйте кожен токен.
- Токени зберігаються в
channels.telegram.accounts.<id>.botToken(типовий обліковий запис може використовуватиTELEGRAM_BOT_TOKEN).
Номери WhatsApp для кожного агента
Прив’яжіть кожен обліковий запис перед запуском gateway:~/.openclaw/openclaw.json (JSON5):
Приклад: щоденний чат у WhatsApp + глибока робота в Telegram
Розділення за каналом: маршрутизуйте WhatsApp до швидкого повсякденного агента, а Telegram — до агента Opus.- Якщо для каналу у вас є кілька облікових записів, додайте
accountIdдо binding (наприклад,{ channel: "whatsapp", accountId: "personal" }). - Щоб маршрутизувати один DM/group до Opus, залишивши решту на chat, додайте binding
match.peerдля цього peer; збіги peer завжди мають пріоритет над правилами для всього каналу.
Приклад: той самий канал, один peer до Opus
Залиште WhatsApp на швидкому агенті, але один DM маршрутизуйте до Opus:Сімейний агент, прив’язаний до групи WhatsApp
Прив’яжіть окремого сімейного агента до однієї групи WhatsApp, з активацією за згадкою та суворішою політикою інструментів:- Allow/deny lists для інструментів — це саме tools, а не skills. Якщо skill має запускати
бінарний файл, переконайтеся, що
execдозволено й бінарний файл існує в sandbox. - Для суворішого контролю задайте
agents.list[].groupChat.mentionPatternsі залишайте allowlists груп увімкненими для каналу.
Sandbox і конфігурація інструментів для кожного агента
Кожен агент може мати власні обмеження sandbox і tools:setupCommand розташовано в sandbox.docker і він виконується один раз під час створення контейнера.
Перевизначення sandbox.docker.* для конкретного агента ігноруються, коли ефективна область дії дорівнює "shared".
Переваги:
- Ізоляція безпеки: обмежуйте інструменти для недовірених агентів
- Контроль ресурсів: ізолюйте в sandbox конкретних агентів, залишаючи інших на хості
- Гнучкі політики: різні дозволи для різних агентів
tools.elevated є глобальним і залежить від відправника; його не можна налаштовувати для кожного агента.
Якщо вам потрібні межі для кожного агента, використовуйте agents.list[].tools, щоб заборонити exec.
Для націлення на групи використовуйте agents.list[].groupChat.mentionPatterns, щоб @mentions чітко зіставлялися з потрібним агентом.
Див. Multi-Agent Sandbox & Tools, щоб ознайомитися з докладними прикладами.
Пов’язане
- Channel Routing — як повідомлення маршрутизуються до агентів
- Sub-Agents — запуск фонових виконань агентів
- ACP Agents — запуск зовнішніх середовищ для кодування
- Presence — присутність і доступність агента
- Session — ізоляція та маршрутизація сесій