Web interfaces

Czat internetowy

Status: interfejs czatu SwiftUI dla macOS/iOS komunikuje się bezpośrednio z Gateway WebSocket.

Status: interfejs czatu SwiftUI dla macOS/iOS komunikuje się bezpośrednio z Gateway WebSocket.

Czym to jest

  • Natywny interfejs czatu dla Gateway (bez osadzonej przeglądarki i bez lokalnego serwera statycznego).
  • Używa tych samych sesji i reguł routingu co inne kanały.
  • Deterministyczny routing: odpowiedzi zawsze wracają do WebChat.

Szybki start

  1. Uruchom Gateway.
  2. Otwórz interfejs WebChat (aplikację macOS/iOS) albo kartę czatu Control UI.
  3. Upewnij się, że skonfigurowano prawidłową ścieżkę uwierzytelniania Gateway (domyślnie shared-secret, nawet na loopback).

Jak to działa (zachowanie)

  • Interfejs łączy się z Gateway WebSocket i używa chat.history, chat.send oraz chat.inject.
  • chat.history jest ograniczone dla stabilności: Gateway może obcinać długie pola tekstowe, pomijać ciężkie metadane i zastępować zbyt duże wpisy tekstem [chat.history omitted: message too large].
  • Gdy widoczna wiadomość asystenta została obcięta w chat.history, Control UI może otworzyć boczny czytnik i na żądanie pobrać pełny, znormalizowany do wyświetlania wpis przez chat.message.get, bez zwiększania domyślnego ładunku historii.
  • chat.history podąża za aktywną gałęzią transkrypcji dla nowoczesnych plików sesji tylko z dopisywaniem, więc porzucone gałęzie przepisywania i zastąpione kopie promptów nie są renderowane w WebChat.
  • Wpisy Compaction renderują się jako jawny separator skompaktowanej historii. Separator wyjaśnia, że skompaktowana transkrypcja jest zachowana jako punkt kontrolny, i prowadzi do kontrolek punktów kontrolnych sesji, gdzie operatorzy mogą tworzyć gałęzie lub przywracać z tego skompaktowanego widoku, jeśli pozwalają na to ich uprawnienia.
  • Control UI zapamiętuje bazowy sessionId Gateway zwrócony przez chat.history i dołącza go do kolejnych wywołań chat.send, więc ponowne połączenia i odświeżenia strony kontynuują tę samą zapisaną rozmowę, chyba że użytkownik rozpocznie albo zresetuje sesję.
  • Control UI scala zduplikowane zgłoszenia w toku dla tej samej sesji, wiadomości i załączników przed wygenerowaniem nowego identyfikatora uruchomienia chat.send; Gateway nadal deduplikuje powtarzane żądania, które ponownie używają tego samego klucza idempotencji.
  • Pliki startowe przestrzeni roboczej i oczekujące instrukcje BOOTSTRAP.md są dostarczane przez Project Context w prompcie systemowym agenta, a nie kopiowane do wiadomości użytkownika WebChat. Obcięcie bootstrap dodaje tylko zwięzłe powiadomienie odzyskiwania w prompcie systemowym; szczegółowe liczniki i pokrętła konfiguracji pozostają na powierzchniach diagnostycznych.
  • chat.history jest także znormalizowane do wyświetlania: kontekst OpenClaw tylko dla runtime, opakowania przychodzących envelope, wbudowane tagi dyrektyw dostarczania, takie jak [[reply_to_*]] i [[audio_as_voice]], tekstowe ładunki XML wywołań narzędzi (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), a także wyciekłe tokeny sterujące modelu ASCII/pełnej szerokości są usuwane z widocznego tekstu, a wpisy asystenta, których cały widoczny tekst jest wyłącznie dokładnym cichym tokenem NO_REPLY / no_reply, są pomijane.
  • Ładunki odpowiedzi oznaczone flagą rozumowania (isReasoning: true) są wykluczane z treści asystenta w WebChat, tekstu odtwarzania transkrypcji i bloków treści audio, więc ładunki służące wyłącznie myśleniu nie pojawiają się jako widoczne wiadomości asystenta ani odtwarzalne audio.
  • chat.inject dopisuje notatkę asystenta bezpośrednio do transkrypcji i rozgłasza ją do interfejsu (bez uruchomienia agenta).
  • Przerwane uruchomienia mogą zachować częściowe wyjście asystenta widoczne w interfejsie.
  • Gateway utrwala przerwany częściowy tekst asystenta w historii transkrypcji, gdy istnieje zbuforowane wyjście, i oznacza te wpisy metadanymi przerwania.
  • Historia jest zawsze pobierana z Gateway (bez obserwowania lokalnych plików).
  • Jeśli Gateway jest nieosiągalny, WebChat jest tylko do odczytu.

Model transkrypcji i dostarczania

WebChat ma dwie oddzielne ścieżki danych:

  • Plik JSONL sesji jest trwałą transkrypcją modelu/runtime. Dla zwykłych uruchomień agenta osadzony runtime OpenClaw utrwala widoczne dla modelu wiadomości user, assistant i toolResult przez swój menedżer sesji. WebChat nie zapisuje arbitralnej treści dostarczania, statusu ani tekstu pomocniczego do tej transkrypcji.
  • Zdarzenia Gateway ReplyPayload są projekcją dostarczania na żywo. Mogą być normalizowane pod kątem wyświetlania w WebChat/kanale, streamingu bloków, tagów dyrektyw, osadzania mediów, flag TTS/audio i zachowania awaryjnego interfejsu. Same nie są kanonicznym dziennikiem sesji.
  • Harnessy wymagające widocznych odpowiedzi przez tools.message nadal używają WebChat jako wewnętrznego odbiornika odpowiedzi źródłowych dla bieżącego uruchomienia. Bezcellowe message.send z tego aktywnego uruchomienia WebChat jest projektowane do tego samego czatu i odzwierciedlane w transkrypcji sesji; WebChat nie staje się wielokrotnego użytku kanałem wychodzącym i nigdy nie dziedziczy lastChannel.
  • WebChat wstrzykuje wpisy transkrypcji asystenta tylko wtedy, gdy Gateway jest właścicielem wyświetlanej wiadomości poza normalną osadzoną turą agenta: chat.inject, odpowiedzi poleceń niebędące agentem, przerwane częściowe wyjście oraz zarządzane przez WebChat uzupełnienia transkrypcji mediów.
  • chat.history odczytuje zapisaną transkrypcję sesji i stosuje projekcję wyświetlania WebChat. Jeśli tekst asystenta na żywo pojawia się podczas uruchomienia, ale znika po przeładowaniu historii, najpierw sprawdź, czy surowy JSONL zawiera tekst asystenta, potem czy projekcja chat.history go usunęła, a następnie czy optymistyczne scalanie końcówki w Control UI zastąpiło lokalny stan dostarczania utrwaloną migawką.
  • chat.message.get używa tych samych reguł gałęzi transkrypcji i projekcji wyświetlania co chat.history, w tym zakresowania aktywnego agenta, ale celuje w jeden wpis transkrypcji według messageId i zwraca uczciwy powód niedostępności, gdy pełna treść nie może już zostać zwrócona.

Końcowe odpowiedzi zwykłego uruchomienia agenta powinny być trwałe, ponieważ osadzony runtime zapisuje message_end asystenta. Każdy mechanizm awaryjny, który odzwierciedla dostarczony końcowy ładunek w transkrypcji, musi najpierw uniknąć zduplikowania tury asystenta, którą osadzony runtime już zapisał.

Panel narzędzi agentów Control UI

  • Panel Tools w Control UI /agents ma dwa oddzielne widoki:
    • Available Right Now używa tools.effective(sessionKey=...) i pokazuje wyprowadzoną przez serwer projekcję tylko do odczytu bieżącego inwentarza sesji, w tym narzędzia core, Plugin, należące do kanałów oraz już wykryte narzędzia serwera MCP.
    • Tool Configuration używa tools.catalog i pozostaje skupiony na profilach, nadpisaniach oraz semantyce katalogu.
  • Dostępność runtime ma zakres sesji. Przełączanie sesji na tym samym agencie może zmienić listę Available Right Now. Jeśli skonfigurowane serwery MCP nie zostały połączone albo zostały zmienione od ostatniego wykrywania, panel pokazuje powiadomienie zamiast po cichu uruchamiać transporty MCP ze ścieżki odczytu.
  • Edytor konfiguracji nie implikuje dostępności runtime; efektywny dostęp nadal podąża za precedencją zasad (allow/deny, nadpisania per agent oraz provider/kanał).

Użycie zdalne

  • Tryb zdalny tuneluje Gateway WebSocket przez SSH/Tailscale.
  • Nie musisz uruchamiać oddzielnego serwera WebChat.

Odniesienie konfiguracji (WebChat)

Pełna konfiguracja: Konfiguracja

WebChat nie ma utrwalonej sekcji konfiguracji. Gateway używa wbudowanego limitu wyświetlania chat.history; klienci API mogą wysyłać maxChars na żądanie, aby nadpisać go dla pojedynczego wywołania chat.history. Starsza konfiguracja channels.webchat i gateway.webchat została wycofana; uruchom openclaw doctor --fix, aby ją usunąć.

Powiązane opcje globalne:

  • gateway.port, gateway.bind: host/port WebSocket.
  • gateway.auth.mode, gateway.auth.token, gateway.auth.password: uwierzytelnianie WebSocket shared-secret.
  • gateway.auth.allowTailscale: karta czatu Control UI w przeglądarce może używać nagłówków tożsamości Tailscale Serve, gdy są włączone.
  • gateway.auth.mode: "trusted-proxy": uwierzytelnianie przez reverse-proxy dla klientów przeglądarkowych za świadomym tożsamości źródłem proxy niebędącym loopback (zobacz Uwierzytelnianie Trusted Proxy).
  • gateway.remote.url, gateway.remote.token, gateway.remote.password: zdalny cel Gateway.
  • session.*: przechowywanie sesji i domyślne wartości klucza głównego.

Powiązane

Was this useful?
On this page

On this page