Мультиагентная маршрутизация
Цель: несколько изолированных агентов (отдельное рабочее пространство + agentDir + сессии), плюс несколько аккаунтов каналов (например, два WhatsApp) в одном работающем Gateway. Входящие сообщения направляются к агенту через привязки.
Что такое "один агент"?
Агент - это полностью ограниченный мозг со своими:
- Рабочим пространством (файлы, AGENTS.md/SOUL.md/USER.md, локальные заметки, правила персоны).
- Директорией состояния (agentDir) для профилей auth, реестра моделей и конфигурации для каждого агента.
- Хранилищем сессий (история чата + состояние маршрутизации) под ~/.openclaw/agents/<agentId>/sessions.
Профили auth для каждого агента. Каждый агент читает из своего:
~/.openclaw/agents/<agentId>/agent/auth-profiles.json
Учетные данные основного агента не являются общими автоматически. Никогда не используйте повторно agentDir между агентами (это вызывает коллизии auth/сессий). Если вы хотите поделиться учетными данными, скопируйте auth-profiles.json в agentDir другого агента.
Навыки для каждого агента через папку skills/ каждого рабочего пространства, с общими навыками доступными из ~/.openclaw/skills. См. Skills: per-agent vs shared.
Gateway может размещать одного агента (по умолчанию) или много агентов рядом.
Примечание к рабочему пространству: рабочее пространство каждого агента является cwd по умолчанию, а не жесткой песочницей. Относительные пути разрешаются внутри рабочего пространства, но абсолютные пути могут достичь других местоположений хоста, если не включена песочница. См. Sandboxing.
Пути (быстрая карта)
- Конфигурация: ~/.openclaw/openclaw.json (или OPENCLAW_CONFIG_PATH)
- Директория состояния: ~/.openclaw (или OPENCLAW_STATE_DIR)
- Рабочее пространство: ~/.openclaw/workspace (или ~/.openclaw/workspace-<agentId>)
- Директория агента: ~/.openclaw/agents/<agentId>/agent (или agents.list[].agentDir)
- Сессии: ~/.openclaw/agents/<agentId>/sessions
Режим одного агента (по умолчанию)
Если вы ничего не делаете, OpenClaw запускает одного агента:
- agentId по умолчанию main.
- Сессии имеют ключ agent:main:<mainKey>.
- Рабочее пространство по умолчанию ~/.openclaw/workspace (или ~/.openclaw/workspace-<profile>, когда установлен OPENCLAW_PROFILE).
- Состояние по умолчанию ~/.openclaw/agents/main/agent.
Помощник агента
Используйте мастер агента для добавления нового изолированного агента:
openclaw agents add work
Затем добавьте bindings (или позвольте мастеру сделать это), чтобы направить входящие сообщения.
Проверьте с помощью:
openclaw agents list --bindings
Несколько агентов = несколько людей, несколько личностей
С несколькими агентами каждый agentId становится полностью изолированной персоной:
- Разные номера телефонов/аккаунты (для каждого канала accountId).
- Разные личности (файлы рабочего пространства для каждого агента, такие как AGENTS.md и SOUL.md).
- Отдельные auth + сессии (без перекрестных разговоров, если явно не включено).
Это позволяет нескольким людям делиться одним сервером Gateway, сохраняя свои ИИ "мозги" и данные изолированными.
Один номер WhatsApp, несколько людей (разделение DM)
Вы можете направлять разные WhatsApp DM к разным агентам, оставаясь на одном аккаунте WhatsApp. Сопоставление по отправителю E.164 (например, +15551234567) с peer.kind: "dm". Ответы все еще приходят от того же номера WhatsApp (без идентификации отправителя для каждого агента).
Важная деталь: прямые чаты сворачиваются в основной ключ сессии агента, поэтому истинная изоляция требует одного агента на человека.
Пример:
{
agents: {
list: [
{ id: "alex", workspace: "~/.openclaw/workspace-alex" },
{ id: "mia", workspace: "~/.openclaw/workspace-mia" }
]
},
bindings: [
{ agentId: "alex", match: { channel: "whatsapp", peer: { kind: "dm", id: "+15551230001" } } },
{ agentId: "mia", match: { channel: "whatsapp", peer: { kind: "dm", id: "+15551230002" } } }
],
channels: {
whatsapp: {
dmPolicy: "allowlist",
allowFrom: ["+15551230001", "+15551230002"]
}
}
}
Примечания:
- Контроль доступа к DM глобален для каждого аккаунта WhatsApp (сопряжение/список разрешений), а не для каждого агента.
- Для общих групп привяжите группу к одному агенту или используйте Broadcast groups.
Правила маршрутизации (как сообщения выбирают агента)
Привязки детерминированы и выигрывает наиболее специфичный:
- Сопоставление peer (точный id DM/group/channel)
- guildId (Discord)
- teamId (Slack)
- Сопоставление accountId для канала
- Сопоставление на уровне канала (accountId: "*")
- откат к агенту по умолчанию (agents.list[].default, иначе первая запись списка, по умолчанию: main)
Несколько аккаунтов / номеров телефонов
Каналы, которые поддерживают несколько аккаунтов (например, WhatsApp), используют accountId для идентификации каждого входа. Каждый accountId может быть направлен к другому агенту, поэтому один сервер может размещать несколько номеров телефонов без смешивания сессий.
Концепции
- agentId: один "мозг" (рабочее пространство, auth для каждого агента, хранилище сессий для каждого агента).
- accountId: один экземпляр аккаунта канала (например, аккаунт WhatsApp "personal" vs "biz").
- binding: направляет входящие сообщения к agentId по (channel, accountId, peer) и дополнительно guild/team ids.
- Прямые чаты сворачиваются в agent:<agentId>:<mainKey> (основной для каждого агента; session.mainKey).
Пример: два WhatsApp → два агента
~/.openclaw/openclaw.json (JSON5):
{
agents: {
list: [
{
id: "home",
default: true,
name: "Home",
workspace: "~/.openclaw/workspace-home",
agentDir: "~/.openclaw/agents/home/agent",
},
{
id: "work",
name: "Work",
workspace: "~/.openclaw/workspace-work",
agentDir: "~/.openclaw/agents/work/agent",
},
],
},
// Детерминированная маршрутизация: выигрывает первое совпадение (сначала наиболее специфичное).
bindings: [
{ agentId: "home", match: { channel: "whatsapp", accountId: "personal" } },
{ agentId: "work", match: { channel: "whatsapp", accountId: "biz" } },
// Необязательное переопределение для каждого peer (пример: отправить конкретную группу к рабочему агенту).
{
agentId: "work",
match: {
channel: "whatsapp",
accountId: "personal",
peer: { kind: "group", id: "[email protected]" },
},
},
],
// По умолчанию отключено: обмен сообщениями агент-агент должен быть явно включен + внесен в список разрешений.
tools: {
agentToAgent: {
enabled: false,
allow: ["home", "work"],
},
},
channels: {
whatsapp: {
accounts: {
personal: {
// Необязательное переопределение. По умолчанию: ~/.openclaw/credentials/whatsapp/personal
// authDir: "~/.openclaw/credentials/whatsapp/personal",
},
biz: {
// Необязательное переопределение. По умолчанию: ~/.openclaw/credentials/whatsapp/biz
// authDir: "~/.openclaw/credentials/whatsapp/biz",
},
},
},
},
}
Пример: ежедневный чат WhatsApp + глубокая работа Telegram
Разделение по каналу: направить WhatsApp к быстрому ежедневному агенту, а Telegram к агенту Opus.
{
agents: {
list: [
{
id: "chat",
name: "Everyday",
workspace: "~/.openclaw/workspace-chat",
model: "anthropic/claude-sonnet-4-5"
},
{
id: "opus",
name: "Deep Work",
workspace: "~/.openclaw/workspace-opus",
model: "anthropic/claude-opus-4-5"
}
]
},
bindings: [
{ agentId: "chat", match: { channel: "whatsapp" } },
{ agentId: "opus", match: { channel: "telegram" } }
]
}
Примечания:
- Если у вас несколько аккаунтов для канала, добавьте accountId к привязке (например, \{ channel: "whatsapp", accountId: "personal" \}).
- Чтобы направить один DM/группу к Opus, сохраняя остальное на chat, добавьте привязку match.peer для этого peer; сопоставления peer всегда выигрывают над правилами на уровне канала.
Пример: тот же канал, один peer к Opus
Оставьте WhatsApp на быстром агенте, но направьте один DM к Opus:
{
agents: {
list: [
{ id: "chat", name: "Everyday", workspace: "~/.openclaw/workspace-chat", model: "anthropic/claude-sonnet-4-5" },
{ id: "opus", name: "Deep Work", workspace: "~/.openclaw/workspace-opus", model: "anthropic/claude-opus-4-5" }
]
},
bindings: [
{ agentId: "opus", match: { channel: "whatsapp", peer: { kind: "dm", id: "+15551234567" } } },
{ agentId: "chat", match: { channel: "whatsapp" } }
]
}
Привязки Peer всегда выигрывают, поэтому держите их выше правила на уровне канала.
Семейный агент, привязанный к группе WhatsApp
Привяжите выделенного семейного агента к одной группе WhatsApp с ограничением упоминаний и более строгой политикой инструментов:
{
agents: {
list: [
{
id: "family",
name: "Family",
workspace: "~/.openclaw/workspace-family",
identity: { name: "Family Bot" },
groupChat: {
mentionPatterns: ["@family", "@familybot", "@Family Bot"]
},
sandbox: {
mode: "all",
scope: "agent"
},
tools: {
allow: ["exec", "read", "sessions_list", "sessions_history", "sessions_send", "session_status"],
deny: ["write", "edit", "apply_patch", "browser", "canvas", "nodes", "cron"]
}
}
]
},
bindings: [
{
agentId: "family",
match: {
channel: "whatsapp",
peer: { kind: "group", id: "[email protected]" }
}
}
]
}
Примечания:
- Списки разрешения/запрета инструментов - это инструменты, а не навыки. Если навыку нужно запустить бинарный файл, убедитесь, что exec разрешен, а бинарный файл существует в песочнице.
- Для более строгого ограничения установите agents.list[].groupChat.mentionPatterns и сохраните списки разрешений групп включенными для канала.
Конфигурация песочницы и инструментов для каждого агента
Начиная с v2026.1.6, каждый агент может иметь свою песочницу и ограничения инструментов:
{
agents: {
list: [
{
id: "personal",
workspace: "~/.openclaw/workspace-personal",
sandbox: {
mode: "off", // Нет песочницы для личного агента
},
// Нет ограничений инструментов - все инструменты доступны
},
{
id: "family",
workspace: "~/.openclaw/workspace-family",
sandbox: {
mode: "all", // Всегда в песочнице
scope: "agent", // Один контейнер на агента
docker: {
// Необязательная одноразовая настройка после создания контейнера
setupCommand: "apt-get update && apt-get install -y git curl",
},
},
tools: {
allow: ["read"], // Только инструмент read
deny: ["exec", "write", "edit", "apply_patch"], // Запретить другие
},
},
],
},
}
Примечание: setupCommand находится под sandbox.docker и выполняется один раз при создании контейнера. Переопределения sandbox.docker.* для каждого агента игнорируются, когда разрешенная область видимости - "shared".
Преимущества:
- Изоляция безопасности: Ограничьте инструменты для недоверенных агентов
- Контроль ресурсов: Поместите конкретных агентов в песочницу, сохраняя других на хосте
- Гибкие политики: Разные разрешения для каждого агента
Примечание: tools.elevated глобален и основан на отправителе; он не настраивается для каждого агента. Если вам нужны границы для каждого агента, используйте agents.list[].tools, чтобы запретить exec. Для группового таргетинга используйте agents.list[].groupChat.mentionPatterns, чтобы @упоминания четко отображались на предназначенного агента.
См. Multi-Agent Sandbox & Tools для подробных примеров.