Zarządzanie sesjami
OpenClaw traktuje jedną sesję czatu bezpośredniego na agenta jako podstawową. Czat bezpośredni jest scalany doagent:<agentId>:<mainKey> (domyślnie main), natomiast czaty grupowe/kanałowe otrzymują własne klucze. session.mainKey jest respektowane.
Użyj session.dmScope, aby kontrolować, jak grupowane są wiadomości bezpośrednie:
main(domyślnie): wszystkie DM-y współdzielą główną sesję dla zachowania ciągłości.per-peer: izolacja według identyfikatora nadawcy w kanałach.per-channel-peer: izolacja według kanału + nadawcy (zalecane dla skrzynek wieloużytkownikowych).per-account-channel-peer: izolacja według konta + kanału + nadawcy (zalecane dla skrzynek wielokontowych). Użyjsession.identityLinks, aby mapować identyfikatory peerów z prefiksem dostawcy do tożsamości kanonicznej, tak aby ta sama osoba współdzieliła sesję DM między kanałami przy użyciuper-peer,per-channel-peerlubper-account-channel-peer.
Tryb bezpiecznych DM (zalecany dla konfiguracji wieloużytkownikowych)
Ostrzeżenie bezpieczeństwa: Jeśli agent może odbierać DM-y od wielu osób, zdecydowanie należy rozważyć włączenie trybu bezpiecznych DM. Bez niego wszyscy użytkownicy współdzielą ten sam kontekst rozmowy, co może prowadzić do ujawnienia prywatnych informacji między użytkownikami.Przykład problemu przy ustawieniach domyślnych:
- Alicja (
<SENDER_A>) pisze do agenta w prywatnej sprawie (na przykład wizyta lekarska) - Bob (
<SENDER_B>) pisze do agenta z pytaniem „O czym rozmawialiśmy?” - Ponieważ oba DM-y współdzielą tę samą sesję, model może odpowiedzieć Bobowi, wykorzystując wcześniejszy kontekst Alicji.
dmScope, aby izolować sesje na użytkownika:
- Masz zatwierdzanie parowania dla więcej niż jednego nadawcy
- Używasz listy dozwolonych DM z wieloma wpisami
- Ustawiasz
dmPolicy: "open" - Wiele numerów telefonów lub kont może pisać do agenta
- Domyślnie obowiązuje
dmScope: "main"dla ciągłości (wszystkie DM-y współdzielą główną sesję). To jest w porządku dla konfiguracji jednoosobowych. - Dla skrzynek wielokontowych w tym samym kanale preferuj
per-account-channel-peer. - Jeśli ta sama osoba kontaktuje się z Tobą w wielu kanałach, użyj
session.identityLinks, aby scalić jej sesje DM w jedną tożsamość kanoniczną. - Ustawienia DM możesz zweryfikować poleceniem
openclaw security audit(zobacz security).
Gateway jest źródłem prawdy
Cały stan sesji jest własnością gateway (głównego OpenClaw). Klienci UI (aplikacja macOS, WebChat itp.) muszą odpytywać gateway o listy sesji i liczniki tokenów zamiast czytać pliki lokalne.- W trybie zdalnym magazyn sesji, który ma znaczenie, znajduje się na zdalnym hoście gateway, a nie na Twoim Macu.
- Liczniki tokenów wyświetlane w UI pochodzą z pól magazynu gateway (
inputTokens,outputTokens,totalTokens,contextTokens). Klienci nie parsują transkryptów JSONL, aby „korygować” sumy.
Gdzie znajduje się stan
- Na hoście gateway:
- Plik magazynu:
~/.openclaw/agents/<agentId>/sessions/sessions.json(na agenta).
- Plik magazynu:
- Transkrypty:
~/.openclaw/agents/<agentId>/sessions/<SessionId>.jsonl(sesje tematów Telegram używają.../<SessionId>-topic-<threadId>.jsonl). - Magazyn jest mapą
sessionKey -> { sessionId, updatedAt, ... }. Usuwanie wpisów jest bezpieczne; są odtwarzane na żądanie. - Wpisy grupowe mogą zawierać
displayName,channel,subject,roomispacedo etykietowania sesji w UI. - Wpisy sesji zawierają metadane
origin(etykieta + wskazówki routingu), aby UI mogły wyjaśnić pochodzenie sesji. - OpenClaw nie odczytuje starszych folderów sesji Pi/Tau.
Przycinanie sesji
OpenClaw domyślnie usuwa stare wyniki narzędzi z kontekstu w pamięci tuż przed wywołaniami LLM. To nie przepisuje historii JSONL. Zobacz /concepts/session-pruning.Wstępne opróżnianie pamięci przed kompaktacją
Gdy sesja zbliża się do automatycznej kompaktacji, OpenClaw może wykonać ciche opróżnienie pamięci — turę, która przypomina modelowi o zapisaniu trwałych notatek na dysku. Uruchamia się to tylko wtedy, gdy obszar roboczy jest zapisywalny. Zobacz Memory oraz Compaction.Mapowanie transportów → klucze sesji
- Czaty bezpośrednie stosują
session.dmScope(domyślniemain).main:agent:<agentId>:<mainKey>(ciągłość między urządzeniami/kanałami).- Wiele numerów telefonów i kanałów może mapować się do tego samego głównego klucza agenta; działają one jako transporty do jednej rozmowy.
per-peer:agent:<agentId>:dm:<peerId>.per-channel-peer:agent:<agentId>:<channel>:dm:<peerId>.per-account-channel-peer:agent:<agentId>:<channel>:<accountId>:dm:<peerId>(accountId domyślniedefault).- Jeśli
session.identityLinkspasuje do identyfikatora peera z prefiksem dostawcy (na przykładtelegram:123), klucz kanoniczny zastępuje<peerId>, dzięki czemu ta sama osoba współdzieli sesję między kanałami.
- Czaty grupowe izolują stan:
agent:<agentId>:<channel>:group:<id>(pokoje/kanały używająagent:<agentId>:<channel>:channel:<id>).- Tematy forów Telegram dodają
:topic:<threadId>do identyfikatora grupy dla izolacji. - Starsze klucze
group:<id>są nadal rozpoznawane na potrzeby migracji.
- Tematy forów Telegram dodają
- Konteksty przychodzące mogą nadal używać
group:<id>; kanał jest wnioskowany zProvideri normalizowany do kanonicznej postaciagent:<agentId>:<channel>:group:<id>. - Inne źródła:
- Zadania cron:
cron:<job.id> - Webhooki:
hook:<uuid>(o ile nie ustawiono jawnie przez hook) - Uruchomienia węzłów:
node-<nodeId>
- Zadania cron:
Cykl życia
- Polityka resetu: sesje są ponownie używane do czasu wygaśnięcia, a wygaśnięcie jest oceniane przy następnym komunikacie przychodzącym.
- Dzienny reset: domyślnie 4:00 czasu lokalnego na hoście gateway. Sesja jest przestarzała, gdy jej ostatnia aktualizacja jest wcześniejsza niż najnowszy czas dziennego resetu.
- Reset bezczynności (opcjonalny):
idleMinutesdodaje przesuwne okno bezczynności. Gdy skonfigurowane są zarówno reset dzienny, jak i bezczynności, wcześniejszy z nich wymusza nową sesję. - Starszy tryb tylko-bezczynność: jeśli ustawisz
session.idleMinutesbez żadnej konfiguracjisession.reset/resetByType, OpenClaw pozostaje w trybie tylko-bezczynności dla zgodności wstecznej. - Nadpisania dla poszczególnych typów (opcjonalne):
resetByTypepozwala nadpisać politykę dla sesjidirect,groupithread(thread = wątki w Slack/Discord, tematy w Telegramie, wątki w Matrix, jeśli są udostępniane przez konektor). - Nadpisania per-kanał (opcjonalne):
resetByChannelnadpisuje politykę resetu dla kanału (dotyczy wszystkich typów sesji dla tego kanału i ma pierwszeństwo nadreset/resetByType). - Wyzwalacze resetu: dokładne
/newlub/reset(plus wszelkie dodatki wresetTriggers) rozpoczynają nowy identyfikator sesji i przekazują resztę wiadomości dalej./new <model>akceptuje alias modelu,provider/modellub nazwę dostawcy (dopasowanie rozmyte), aby ustawić model nowej sesji. Jeśli/newlub/resetzostanie wysłane samodzielnie, OpenClaw uruchamia krótką turę powitalną „hello”, aby potwierdzić reset. - Reset ręczny: usuń konkretne klucze z magazynu lub usuń transkrypt JSONL; następna wiadomość je odtworzy.
- Izolowane zadania cron zawsze tworzą nowy
sessionIdna uruchomienie (bez ponownego użycia bezczynności).
Polityka wysyłania (opcjonalna)
Blokuj dostarczanie dla określonych typów sesji bez wypisywania pojedynczych identyfikatorów./send on→ zezwól dla tej sesji/send off→ odmów dla tej sesji/send inherit→ wyczyść nadpisanie i użyj reguł konfiguracji Wyślij je jako samodzielne wiadomości, aby zostały zarejestrowane.
Konfiguracja (opcjonalny przykład zmiany nazwy)
Inspekcja
openclaw status— pokazuje ścieżkę magazynu i ostatnie sesje.openclaw sessions --json— zrzuca każdy wpis (filtruj za pomocą--active <minutes>).openclaw gateway call sessions.list --params '{}'— pobiera sesje z działającego gateway (użyj--url/--tokendo zdalnego dostępu do gateway).- Wyślij
/statusjako samodzielną wiadomość na czacie, aby sprawdzić, czy agent jest osiągalny, ile kontekstu sesji jest używane, bieżące przełączniki myślenia/trybu szczegółowego oraz kiedy ostatnio odświeżono poświadczenia WhatsApp web (pomaga wykryć potrzebę ponownego powiązania). - Wyślij
/context listlub/context detail, aby zobaczyć, co znajduje się w prompcie systemowym i wstrzykniętych plikach obszaru roboczego (oraz największych kontrybutorów kontekstu). - Wyślij
/stopjako samodzielną wiadomość, aby przerwać bieżące uruchomienie, wyczyścić kolejkę dalszych działań dla tej sesji i zatrzymać wszystkie uruchomienia podagentów z niej zainicjowane (odpowiedź zawiera liczbę zatrzymanych). - Wyślij
/compact(opcjonalne instrukcje) jako samodzielną wiadomość, aby podsumować starszy kontekst i zwolnić miejsce w oknie. Zobacz /concepts/compaction. - Transkrypty JSONL można otworzyć bezpośrednio, aby przejrzeć pełne tury.
Wskazówki
- Zachowaj klucz główny dedykowany ruchowi 1:1; pozwól grupom zachować własne klucze.
- Przy automatyzacji porządkowania usuwaj pojedyncze klucze zamiast całego magazynu, aby zachować kontekst w innych miejscach.
Metadane pochodzenia sesji
Każdy wpis sesji rejestruje (w miarę możliwości) swoje pochodzenie worigin:
label: etykieta czytelna dla człowieka (rozwiązana z etykiety rozmowy + tematu grupy/kanału)provider: znormalizowany identyfikator kanału (w tym rozszerzenia)from/to: surowe identyfikatory routingu z koperty przychodzącejaccountId: identyfikator konta dostawcy (gdy wiele kont)threadId: identyfikator wątku/tematu, gdy kanał to obsługuje Pola pochodzenia są wypełniane dla wiadomości bezpośrednich, kanałów i grup. Jeśli konektor aktualizuje wyłącznie routing dostarczania (na przykład, aby utrzymać świeżość głównej sesji DM), nadal powinien dostarczyć kontekst przychodzący, aby sesja zachowała swoje metadane wyjaśniające. Rozszerzenia mogą to zrobić, wysyłającConversationLabel,GroupSubject,GroupChannel,GroupSpaceiSenderNamew kontekście przychodzącym oraz wywołującrecordSessionMetaFromInbound(lub przekazując ten sam kontekst doupdateLastRoute).