Narzędzia sesji¶
Cel: mały, trudny do niewłaściwego użycia zestaw narzędzi, aby agenci mogli listować sesje, pobierać historię i wysyłać wiadomości do innej sesji.
Nazwy narzędzi¶
sessions_listsessions_historysessions_sendsessions_spawn
Model kluczy¶
- Główny koszyk bezpośredniego czatu to zawsze dosłowny klucz
"main"(rozwiązywany do głównego klucza bieżącego agenta). - Czaty grupowe używają
agent:<agentId>:<channel>:group:<id>lubagent:<agentId>:<channel>:channel:<id>(przekaż pełny klucz). - Zadania cron używają
cron:<job.id>. - Hooki używają
hook:<uuid>, o ile nie ustawiono inaczej. - Sesje węzłów używają
node-<nodeId>, o ile nie ustawiono inaczej.
global i unknown są wartościami zarezerwowanymi i nigdy nie są listowane. Jeśli session.scope = "global", aliasujemy to do main dla wszystkich narzędzi, aby wywołujący nigdy nie widzieli global.
sessions_list¶
Listuje sesje jako tablicę wierszy.
Parametry:
- filtr
kinds?: string[]: dowolny z"main" | "group" | "cron" | "hook" | "node" | "other" limit?: numbermaks. liczba wierszy (domyślnie: domyślna wartość serwera, ograniczana np. do 200)activeMinutes?: numbertylko sesje zaktualizowane w ciągu N minutmessageLimit?: number0 = brak wiadomości (domyślnie 0); >0 = dołącz ostatnie N wiadomości
Zachowanie:
messageLimit > 0pobierachat.historyna sesję i dołącza ostatnie N wiadomości.- Wyniki narzędzi są filtrowane z wyjścia listy; do wiadomości narzędzi użyj
sessions_history. - Przy uruchomieniu w sandboxed sesji agenta narzędzia sesji domyślnie mają widoczność tylko sesji utworzonych (zob. niżej).
Kształt wiersza (JSON):
key: klucz sesji (string)kind:main | group | cron | hook | node | otherchannel:whatsapp | telegram | discord | signal | imessage | webchat | internal | unknowndisplayName(etykieta wyświetlana grupy, jeśli dostępna)updatedAt(ms)sessionIdmodel,contextTokens,totalTokensthinkingLevel,verboseLevel,systemSent,abortedLastRunsendPolicy(nadpisanie sesji, jeśli ustawione)lastChannel,lastTodeliveryContext(znormalizowane{ channel, to, accountId }, gdy dostępne)transcriptPath(ścieżka best‑effort wyprowadzona z katalogu magazynu + sessionId)messages?(tylko gdymessageLimit > 0)
sessions_history¶
Pobiera transkrypt dla jednej sesji.
Parametry:
sessionKey(wymagane; akceptuje klucz sesji lubsessionIdzsessions_list)limit?: numbermaks. liczba wiadomości (ograniczana przez serwer)includeTools?: boolean(domyślnie false)
Zachowanie:
includeTools=falsefiltruje wiadomościrole: "toolResult".- Zwraca tablicę wiadomości w surowym formacie transkryptu.
- Po podaniu
sessionIdOpenClaw rozwiązuje go do odpowiadającego klucza sesji (błąd przy brakujących identyfikatorach).
sessions_send¶
Wysyła wiadomość do innej sesji.
Parametry:
sessionKey(wymagane; akceptuje klucz sesji lubsessionIdzsessions_list)message(wymagane)timeoutSeconds?: number(domyślnie >0; 0 = wyślij i zapomnij)
Zachowanie:
timeoutSeconds = 0: kolejkowanie i zwrot{ runId, status: "accepted" }.timeoutSeconds > 0: oczekiwanie do N sekund na zakończenie, następnie zwrot{ runId, status: "ok", reply }.- Jeśli oczekiwanie przekroczy limit czasu:
{ runId, status: "timeout", error }. Uruchomienie trwa dalej; wywołaj późniejsessions_history. - Jeśli uruchomienie się nie powiedzie:
{ runId, status: "error", error }. - Uruchomienia ogłoszeń po dostarczeniu są anonsowane po zakończeniu uruchomienia głównego i mają charakter best‑effort;
status: "ok"nie gwarantuje, że anons został dostarczony. - Oczekiwanie odbywa się przez gateway
agent.wait(po stronie serwera), więc ponowne połączenia nie przerywają oczekiwania. - Kontekst wiadomości agent‑do‑agenta jest wstrzykiwany dla uruchomienia głównego.
- Po zakończeniu uruchomienia głównego OpenClaw uruchamia pętlę odpowiedzi zwrotnej:
- Runda 2+ naprzemiennie przełącza się między agentem żądającym a docelowym.
- Odpowiedz dokładnie
REPLY_SKIP, aby zatrzymać ping‑pong. - Maksymalna liczba tur to
session.agentToAgent.maxPingPongTurns(0–5, domyślnie 5). - Po zakończeniu pętli OpenClaw uruchamia krok ogłoszenia agent‑do‑agenta (tylko agent docelowy):
- Odpowiedz dokładnie
ANNOUNCE_SKIP, aby pozostać w ciszy. - Każda inna odpowiedź jest wysyłana do kanału docelowego.
- Krok ogłoszenia zawiera oryginalne żądanie + odpowiedź z rundy 1 + najnowszą odpowiedź ping‑pong.
Pole kanału¶
- Dla grup
channelto kanał zapisany we wpisie sesji. - Dla czatów bezpośrednich
channelmapuje się zlastChannel. - Dla cron/hook/node
channeltointernal. - Jeśli brak,
channeltounknown.
Bezpieczeństwo / polityka wysyłania¶
Blokowanie oparte na politykach według kanału/typu czatu (nie według identyfikatora sesji).
{
"session": {
"sendPolicy": {
"rules": [
{
"match": { "channel": "discord", "chatType": "group" },
"action": "deny"
}
],
"default": "allow"
}
}
}
Nadpisanie w czasie działania (na wpis sesji):
sendPolicy: "allow" | "deny"(nieustawione = dziedziczenie konfiguracji)- Ustawialne przez
sessions.patchlub tylko dla właściciela/send on|off|inherit(samodzielna wiadomość).
Punkty egzekwowania:
chat.send/agent(gateway)- logika dostarczania auto‑odpowiedzi
sessions_spawn¶
Uruchamia pod‑agenta w izolowanej sesji i ogłasza wynik z powrotem do kanału czatu żądającego.
Parametry:
task(wymagane)label?(opcjonalne; używane do logów/UI)agentId?(opcjonalne; uruchom pod innym identyfikatorem agenta, jeśli dozwolone)model?(opcjonalne; nadpisuje model pod‑agenta; nieprawidłowe wartości powodują błąd)runTimeoutSeconds?(domyślnie 0; gdy ustawione, przerywa uruchomienie pod‑agenta po N sekundach)cleanup?(delete|keep, domyślniekeep)
Lista dozwolonych:
agents.list[].subagents.allowAgents: lista identyfikatorów agentów dozwolonych przezagentId(["*"], aby dopuścić dowolne). Domyślnie: tylko agent żądający.
Wykrywanie:
- Użyj
agents_list, aby wykryć, które identyfikatory agentów są dozwolone dlasessions_spawn.
Zachowanie:
- Uruchamia nową sesję
agent:<agentId>:subagent:<uuid>zdeliver: false. - Pod‑agenci domyślnie mają pełny zestaw narzędzi z wyjątkiem narzędzi sesji (konfigurowalne przez
tools.subagents.tools). - Pod‑agenci nie mogą wywoływać
sessions_spawn(brak uruchamiania pod‑agent → pod‑agent). - Zawsze nieblokujące: natychmiast zwraca
{ status: "accepted", runId, childSessionKey }. - Po zakończeniu OpenClaw uruchamia krok ogłoszenia pod‑agenta i publikuje wynik w kanale czatu żądającego.
- Odpowiedz dokładnie
ANNOUNCE_SKIPpodczas kroku ogłoszenia, aby pozostać w ciszy. - Odpowiedzi ogłoszeń są normalizowane do
Status/Result/Notes;Statuspochodzi z wyniku wykonania (nie z tekstu modelu). - Sesje pod‑agentów są automatycznie archiwizowane po
agents.defaults.subagents.archiveAfterMinutes(domyślnie: 60). - Odpowiedzi ogłoszeń zawierają wiersz statystyk (czas wykonania, tokeny, sessionKey/sessionId, ścieżkę transkryptu oraz opcjonalny koszt).
Widoczność sesji sandbox¶
Sesje sandbox mogą używać narzędzi sesji, ale domyślnie widzą tylko sesje, które same utworzyły za pomocą sessions_spawn.
Konfiguracja:
{
agents: {
defaults: {
sandbox: {
// default: "spawned"
sessionToolsVisibility: "spawned", // or "all"
},
},
},
}