Routing wielu agentów
Cel: wiele izolowanych agentów (oddzielny workspace +agentDir + sesje), a także wiele kont kanałów (np. dwa konta WhatsApp) w jednym uruchomionym Gateway. Ruch przychodzący jest kierowany do agenta przez powiązania.
Co oznacza „jeden agent”?
Agent to w pełni wydzielony „mózg” z własnymi:- Workspace (pliki, AGENTS.md/SOUL.md/USER.md, lokalne notatki, reguły persony).
- Katalogiem stanu (
agentDir) dla profili uwierzytelniania, rejestru modeli i config per agent. - Magazynem sesji (historia czatu + stan routingu) w
~/.openclaw/agents/<agentId>/sessions.
sessions_history jest bezpieczniejszą ścieżką przywoływania między sesjami: zwraca
ograniczony, oczyszczony widok, a nie surowy zrzut transkryptu. Przywoływanie wypowiedzi asystenta usuwa
tagi myślenia, rusztowanie <relevant-memories>, ładunki XML wywołań narzędzi w postaci zwykłego tekstu
(w tym <tool_call>...</tool_call>,
<function_call>...</function_call>, <tool_calls>...</tool_calls>,
<function_calls>...</function_calls> oraz obcięte bloki wywołań narzędzi),
obniżone do zwykłego tekstu rusztowanie wywołań narzędzi, wyciekłe tokeny sterujące modelu w ASCII/pełnej szerokości
oraz nieprawidłowy XML wywołań narzędzi MiniMax przed redakcją/obcięciem.
Poświadczenia głównego agenta nie są automatycznie współdzielone. Nigdy nie używaj ponownie agentDir
między agentami (powoduje to kolizje uwierzytelniania/sesji). Jeśli chcesz współdzielić poświadczenia,
skopiuj auth-profiles.json do agentDir drugiego agenta.
Skills są ładowane z workspace każdego agenta oraz ze współdzielonych katalogów głównych, takich jak
~/.openclaw/skills, a następnie filtrowane przez efektywną listę dozwolonych Skills agenta, jeśli jest skonfigurowana.
Użyj agents.defaults.skills dla współdzielonej bazy oraz
agents.list[].skills do zastąpienia per agent. Zobacz
Skills: per-agent vs shared oraz
Skills: agent skill allowlists.
Gateway może hostować jednego agenta (domyślnie) albo wielu agentów obok siebie.
Uwaga dotycząca workspace: workspace każdego agenta jest domyślnym cwd, a nie twardą
piaskownicą. Ścieżki względne są rozwiązywane wewnątrz workspace, ale ścieżki bezwzględne mogą
sięgać do innych lokalizacji hosta, chyba że piaskownica jest włączona. Zobacz
Sandboxing.
Ścieżki (szybka mapa)
- Config:
~/.openclaw/openclaw.json(lubOPENCLAW_CONFIG_PATH) - Katalog stanu:
~/.openclaw(lubOPENCLAW_STATE_DIR) - Workspace:
~/.openclaw/workspace(lub~/.openclaw/workspace-<agentId>) - Agent dir:
~/.openclaw/agents/<agentId>/agent(lubagents.list[].agentDir) - Sesje:
~/.openclaw/agents/<agentId>/sessions
Tryb jednego agenta (domyślny)
Jeśli nic nie zrobisz, OpenClaw uruchomi jednego agenta:agentIddomyślnie ma wartośćmain.- Klucze sesji mają postać
agent:main:<mainKey>. - Workspace domyślnie to
~/.openclaw/workspace(lub~/.openclaw/workspace-<profile>, gdy ustawionoOPENCLAW_PROFILE). - Stan domyślnie to
~/.openclaw/agents/main/agent.
Pomocnik agentów
Użyj kreatora agentów, aby dodać nowego izolowanego agenta:bindings (albo pozwól zrobić to kreatorowi), aby kierować wiadomości przychodzące.
Zweryfikuj za pomocą:
Szybki start
Create each agent workspace
Użyj kreatora albo utwórz workspace ręcznie:Każdy agent otrzymuje własny workspace z
SOUL.md, AGENTS.md i opcjonalnym USER.md, a także dedykowany agentDir i magazyn sesji w ~/.openclaw/agents/<agentId>.Create channel accounts
Utwórz jedno konto na agenta w preferowanych kanałach:Zobacz przewodniki po kanałach: Discord, Telegram, WhatsApp.
- Discord: jeden bot na agenta, włącz Message Content Intent, skopiuj każdy token.
- Telegram: jeden bot na agenta przez BotFather, skopiuj każdy token.
- WhatsApp: podłącz każdy numer telefonu per konto.
Add agents, accounts, and bindings
Dodaj agentów w
agents.list, konta kanałów w channels.<channel>.accounts i połącz je za pomocą bindings (przykłady poniżej).Wielu agentów = wiele osób, wiele osobowości
W przypadku wielu agentów każdyagentId staje się w pełni izolowaną personą:
- Różne numery telefonów/konta (per
accountIdkanału). - Różne osobowości (pliki workspace per agent, takie jak
AGENTS.mdiSOUL.md). - Oddzielne uwierzytelnianie + sesje (brak przenikania, chyba że jawnie je włączysz).
Przeszukiwanie pamięci QMD między agentami
Jeśli jeden agent ma przeszukiwać transkrypty sesji QMD innego agenta, dodaj dodatkowe kolekcje wagents.list[].memorySearch.qmd.extraCollections.
Używaj agents.defaults.memorySearch.qmd.extraCollections tylko wtedy, gdy każdy agent
ma dziedziczyć te same współdzielone kolekcje transkryptów.
Jeden numer WhatsApp, wiele osób (podział DM)
Możesz kierować różne DM na WhatsAppie do różnych agentów, pozostając przy jednym koncie WhatsApp. Dopasowuj po E.164 nadawcy (np.+15551234567) przy użyciu peer.kind: "direct". Odpowiedzi nadal będą wychodzić z tego samego numeru WhatsApp (bez tożsamości nadawcy per agent).
Ważny szczegół: czaty bezpośrednie zapadają się do głównego klucza sesji agenta, więc prawdziwa izolacja wymaga jednego agenta na osobę.
Przykład:
- Kontrola dostępu do DM jest globalna per konto WhatsApp (parowanie/lista dozwolonych), a nie per agent.
- Dla współdzielonych grup przypisz grupę do jednego agenta albo użyj Broadcast groups.
Reguły routingu (jak wiadomości wybierają agenta)
Powiązania są deterministyczne i obowiązuje zasada najbardziej szczegółowe wygrywa:- dopasowanie
peer(dokładny identyfikator DM/grupy/kanału) - dopasowanie
parentPeer(dziedziczenie wątku) guildId + roles(routing po rolach Discord)guildId(Discord)teamId(Slack)- dopasowanie
accountIddla kanału - dopasowanie na poziomie kanału (
accountId: "*") - fallback do domyślnego agenta (
agents.list[].default, w przeciwnym razie pierwszy wpis na liście, domyślnie:main)
peer + guildId), wszystkie określone pola są wymagane (semantyka AND).
Ważny szczegół dotyczący zakresu konta:
- Powiązanie, które pomija
accountId, pasuje tylko do konta domyślnego. - Użyj
accountId: "*"dla fallbacku na poziomie kanału obejmującego wszystkie konta. - Jeśli później dodasz to samo powiązanie dla tego samego agenta z jawnym identyfikatorem konta, OpenClaw przekształci istniejące powiązanie tylko na poziomie kanału w powiązanie o zakresie konta zamiast je duplikować.
Wiele kont / numerów telefonów
Kanały obsługujące wiele kont (np. WhatsApp) używająaccountId do identyfikacji
każdego logowania. Każdy accountId może być kierowany do innego agenta, dzięki czemu jeden serwer może hostować
wiele numerów telefonów bez mieszania sesji.
Jeśli chcesz mieć domyślne konto na poziomie kanału, gdy accountId jest pominięte, ustaw
channels.<channel>.defaultAccount (opcjonalnie). Gdy nie jest ustawione, OpenClaw wraca
do default, jeśli istnieje, w przeciwnym razie do pierwszego skonfigurowanego accountId (posortowanego).
Typowe kanały obsługujące ten wzorzec to:
whatsapp,telegram,discord,slack,signal,imessageirc,line,googlechat,mattermost,matrix,nextcloud-talkbluebubbles,zalo,zalouser,nostr,feishu
Pojęcia
agentId: jeden „mózg” (workspace, uwierzytelnianie per agent, magazyn sesji per agent).accountId: jedna instancja konta kanału (np. konto WhatsApp"personal"vs"biz").binding: kieruje wiadomości przychodzące doagentIdwedług(channel, accountId, peer)oraz opcjonalnie identyfikatorów guild/team.- Czaty bezpośrednie zapadają się do
agent:<agentId>:<mainKey>(główna sesja per agent;session.mainKey).
Przykłady platform
Boty Discord per agent
Każde konto bota Discord jest mapowane do unikalnegoaccountId. Przypisz każde konto do agenta i utrzymuj listy dozwolonych per bot.
- Zaproś każdego bota do guild i włącz Message Content Intent.
- Tokeny znajdują się w
channels.discord.accounts.<id>.token(konto domyślne może używaćDISCORD_BOT_TOKEN).
Boty Telegram per agent
- Utwórz jednego bota na agenta przez BotFather i skopiuj każdy token.
- Tokeny znajdują się w
channels.telegram.accounts.<id>.botToken(konto domyślne może używaćTELEGRAM_BOT_TOKEN).
Numery WhatsApp per agent
Podłącz każde konto przed uruchomieniem gateway:~/.openclaw/openclaw.json (JSON5):
Przykład: codzienny czat na WhatsApp + głęboka praca na Telegramie
Podział według kanału: kieruj WhatsApp do szybkiego agenta codziennego, a Telegram do agenta Opus.- Jeśli masz wiele kont dla kanału, dodaj
accountIddo powiązania (na przykład{ channel: "whatsapp", accountId: "personal" }). - Aby skierować pojedynczy DM/grupę do Opus, pozostawiając resztę na agencie chat, dodaj powiązanie
match.peerdla tego peera; dopasowania peer zawsze wygrywają z regułami dla całego kanału.
Przykład: ten sam kanał, jeden peer do Opus
Zachowaj WhatsApp na szybkim agencie, ale kieruj jeden DM do Opus:Agent rodzinny przypisany do grupy WhatsApp
Przypisz dedykowanego agenta rodzinnego do jednej grupy WhatsApp, z bramkowaniem po wzmiankach i bardziej restrykcyjną polityką narzędzi:- Listy allow/deny narzędzi dotyczą narzędzi, a nie Skills. Jeśli Skill musi uruchomić plik binarny, upewnij się, że
execjest dozwolone i plik binarny istnieje w piaskownicy. - Dla bardziej rygorystycznego bramkowania ustaw
agents.list[].groupChat.mentionPatternsi pozostaw włączone listy dozwolonych grup dla kanału.
Piaskownica i konfiguracja narzędzi per agent
Każdy agent może mieć własną piaskownicę i własne ograniczenia narzędzi:setupCommand znajduje się w sandbox.docker i jest uruchamiane raz przy tworzeniu kontenera.
Nadpisania sandbox.docker.* per agent są ignorowane, gdy rozpoznany zakres to "shared".
Korzyści:
- Izolacja bezpieczeństwa: ograniczanie narzędzi dla niezaufanych agentów
- Kontrola zasobów: piaskownica dla wybranych agentów przy pozostawieniu innych na hoście
- Elastyczne polityki: różne uprawnienia per agent
tools.elevated jest globalne i oparte na nadawcy; nie można go konfigurować per agent.
Jeśli potrzebujesz granic per agent, użyj agents.list[].tools, aby zabronić exec.
Do kierowania w grupach użyj agents.list[].groupChat.mentionPatterns, aby wzmianki @ były jednoznacznie mapowane do zamierzonego agenta.
Zobacz Multi-Agent Sandbox & Tools, aby poznać szczegółowe przykłady.
Powiązane
- Channel Routing — jak wiadomości są kierowane do agentów
- Sub-Agents — uruchamianie agentów w tle
- ACP Agents — uruchamianie zewnętrznych harnessów kodowania
- Presence — obecność i dostępność agentów
- Session — izolacja sesji i routing