Kanały i routing
OpenClaw kieruje odpowiedzi z powrotem do kanału, z którego przyszła wiadomość. Model nie wybiera kanału; routing jest deterministyczny i kontrolowany przez konfigurację hosta.Kluczowe terminy
- Kanał:
telegram,whatsapp,discord,irc,googlechat,slack,signal,imessage,lineoraz kanały rozszerzeń.webchatto wewnętrzny kanał interfejsu WebChat i nie jest konfigurowalnym kanałem wychodzącym. - AccountId: instancja konta dla danego kanału (gdy jest obsługiwana).
- Opcjonalne domyślne konto kanału:
channels.<channel>.defaultAccountokreśla, które konto jest używane, gdy ścieżka wychodząca nie podajeaccountId.- W konfiguracjach wielokontowych ustaw jawne domyślne konto (
defaultAccountlubaccounts.default), gdy skonfigurowane są co najmniej dwa konta. Bez tego routing zapasowy może wybrać pierwszy znormalizowany identyfikator konta.
- W konfiguracjach wielokontowych ustaw jawne domyślne konto (
- AgentId: izolowany obszar roboczy + magazyn sesji („brain”).
- SessionKey: klucz zasobnika używany do przechowywania kontekstu i kontrolowania współbieżności.
Kształty kluczy sesji (przykłady)
Wiadomości bezpośrednie są zwijane do sesji main agenta:agent:<agentId>:<mainKey>(domyślnie:agent:main:main)
- Grupy:
agent:<agentId>:<channel>:group:<id> - Kanały/pokoje:
agent:<agentId>:<channel>:channel:<id>
- Wątki Slack/Discord dopisują
:thread:<threadId>do klucza bazowego. - Tematy forum Telegram osadzają
:topic:<topicId>w kluczu grupy.
agent:main:telegram:group:-1001234567890:topic:42agent:main:discord:channel:123456:thread:987654
Przypinanie głównej trasy DM
Gdysession.dmScope ma wartość main, wiadomości bezpośrednie mogą współdzielić jedną główną sesję.
Aby zapobiec nadpisaniu lastRoute sesji przez DM od użytkowników niebędących właścicielem,
OpenClaw wywnioskuje przypiętego właściciela z allowFrom, gdy wszystkie poniższe warunki są spełnione:
allowFromma dokładnie jeden wpis bez symboli wieloznacznych.- Wpis można znormalizować do konkretnego identyfikatora nadawcy dla tego kanału.
- Nadawca przychodzącej wiadomości DM nie pasuje do tego przypiętego właściciela.
lastRoute głównej sesji.
Reguły routingu (jak wybierany jest agent)
Routing wybiera jednego agenta dla każdej wiadomości przychodzącej:- Dokładne dopasowanie peera (
bindingszpeer.kind+peer.id). - Dopasowanie peera nadrzędnego (dziedziczenie wątku).
- Dopasowanie guild + roles (Discord) przez
guildId+roles. - Dopasowanie guild (Discord) przez
guildId. - Dopasowanie team (Slack) przez
teamId. - Dopasowanie konta (
accountIdw kanale). - Dopasowanie kanału (dowolne konto w tym kanale,
accountId: "*"). - Domyślny agent (
agents.list[].default, w przeciwnym razie pierwszy wpis listy, a ostateczniemain).
peer, guildId, teamId, roles), wszystkie podane pola muszą pasować, aby to powiązanie miało zastosowanie.
Dopasowany agent określa, który obszar roboczy i magazyn sesji są używane.
Grupy rozgłoszeniowe (uruchamianie wielu agentów)
Grupy rozgłoszeniowe pozwalają uruchomić wielu agentów dla tego samego peera gdy OpenClaw normalnie odpowiedziałby (na przykład w grupach WhatsApp po przejściu bramkowania wzmianki/aktywacji). Konfiguracja:Przegląd konfiguracji
agents.list: nazwane definicje agentów (obszar roboczy, model itd.).bindings: mapuje przychodzące kanały/konta/peerów na agentów.
Przechowywanie sesji
Magazyny sesji znajdują się w katalogu stanu (domyślnie~/.openclaw):
~/.openclaw/agents/<agentId>/sessions/sessions.json- Transkrypty JSONL znajdują się obok magazynu
session.store i szablonowania {agentId}.
Odkrywanie sesji Gateway i ACP skanuje również magazyny agentów oparte na dysku pod domyślnym katalogiem głównym agents/ oraz pod katalogami głównymi session.store opartymi na szablonach. Odkryte magazyny muszą pozostawać w obrębie tego rozwiązanego katalogu głównego agenta i używać zwykłego pliku sessions.json. Dowiązania symboliczne i ścieżki poza katalogiem głównym są ignorowane.
Zachowanie WebChat
WebChat dołącza do wybranego agenta i domyślnie korzysta z głównej sesji agenta. Dzięki temu WebChat pozwala zobaczyć kontekst międzykanałowy tego agenta w jednym miejscu.Kontekst odpowiedzi
Odpowiedzi przychodzące zawierają:ReplyToId,ReplyToBodyiReplyToSender, gdy są dostępne.- Cytowany kontekst jest dołączany do
Bodyjako blok[Replying to ...].