Status: integracja z zewnętrznym CLI. Gateway komunikuje się zDocumentation Index
Fetch the complete documentation index at: https://docs.openclaw.ai/llms.txt
Use this file to discover all available pages before exploring further.
signal-cli przez HTTP — albo z natywnym demonem (JSON-RPC + SSE), albo z kontenerem bbernhard/signal-cli-rest-api (REST + WebSocket).
Wymagania wstępne
- OpenClaw zainstalowany na serwerze (poniższy przepływ dla Linuksa przetestowano na Ubuntu 24).
- Jedno z:
signal-clidostępne na hoście (tryb natywny), albo- kontener Docker
bbernhard/signal-cli-rest-api(tryb kontenera).
- Numer telefonu, który może odebrać jednego SMS-a weryfikacyjnego (dla ścieżki rejestracji przez SMS).
- Dostęp do przeglądarki dla captcha Signal (
signalcaptchas.org) podczas rejestracji.
Szybka konfiguracja (dla początkujących)
- Użyj osobnego numeru Signal dla bota (zalecane).
- Zainstaluj
signal-cli(Java jest wymagana, jeśli używasz kompilacji JVM). - Wybierz jedną ścieżkę konfiguracji:
- Ścieżka A (łączenie przez QR):
signal-cli link -n "OpenClaw"i zeskanuj kod w Signal. - Ścieżka B (rejestracja SMS): zarejestruj dedykowany numer z captcha i weryfikacją SMS.
- Ścieżka A (łączenie przez QR):
- Skonfiguruj OpenClaw i uruchom ponownie Gateway.
- Wyślij pierwszą wiadomość DM i zatwierdź parowanie (
openclaw pairing approve signal <CODE>).
| Pole | Opis |
|---|---|
account | Numer telefonu bota w formacie E.164 (+15551234567) |
cliPath | Ścieżka do signal-cli (signal-cli, jeśli jest w PATH) |
dmPolicy | Zasada dostępu do DM (zalecane pairing) |
allowFrom | Numery telefonów lub wartości uuid:<id> dopuszczone do DM |
Co to jest
- Kanał Signal przez
signal-cli(nie osadzony libsignal). - Deterministyczne routowanie: odpowiedzi zawsze wracają do Signal.
- DM współdzielą główną sesję agenta; grupy są izolowane (
agent:<agentId>:signal:group:<groupId>).
Zapisy konfiguracji
Domyślnie Signal może zapisywać aktualizacje konfiguracji wywołane przez/config set|unset (wymaga commands.config: true).
Wyłącz za pomocą:
Model numeru (ważne)
- Gateway łączy się z urządzeniem Signal (kontem
signal-cli). - Jeśli uruchomisz bota na swoim osobistym koncie Signal, będzie ignorować Twoje własne wiadomości (ochrona przed pętlą).
- Dla scenariusza „piszę do bota i on odpowiada” użyj osobnego numeru bota.
Ścieżka konfiguracji A: połącz istniejące konto Signal (QR)
- Zainstaluj
signal-cli(kompilację JVM lub natywną). - Połącz konto bota:
signal-cli link -n "OpenClaw", a następnie zeskanuj QR w Signal.
- Skonfiguruj Signal i uruchom Gateway.
channels.signal.accounts z konfiguracją dla każdego konta i opcjonalnym name. Zobacz gateway/configuration, aby poznać wspólny wzorzec.
Ścieżka konfiguracji B: zarejestruj dedykowany numer bota (SMS, Linux)
Użyj tego, gdy chcesz mieć dedykowany numer bota zamiast łączyć istniejące konto aplikacji Signal.- Uzyskaj numer, który może odbierać SMS-y (lub weryfikację głosową dla telefonów stacjonarnych).
- Użyj dedykowanego numeru bota, aby uniknąć konfliktów konta lub sesji.
- Zainstaluj
signal-clina hoście Gateway:
signal-cli-${VERSION}.tar.gz), najpierw zainstaluj JRE 25+.
Utrzymuj signal-cli w aktualnej wersji; upstream zauważa, że stare wydania mogą przestać działać, gdy zmieniają się API serwera Signal.
- Zarejestruj i zweryfikuj numer:
- Otwórz
https://signalcaptchas.org/registration/generate.html. - Ukończ captcha, skopiuj docelowy link
signalcaptcha://...z „Open Signal”. - Gdy to możliwe, uruchom z tego samego zewnętrznego adresu IP co sesja przeglądarki.
- Natychmiast ponownie uruchom rejestrację (tokeny captcha szybko wygasają):
- Skonfiguruj OpenClaw, uruchom ponownie Gateway i zweryfikuj kanał:
- Sparuj nadawcę DM:
- Wyślij dowolną wiadomość na numer bota.
- Zatwierdź kod na serwerze:
openclaw pairing approve signal <PAIRING_CODE>. - Zapisz numer bota jako kontakt w telefonie, aby uniknąć komunikatu „Unknown contact”.
- README
signal-cli:https://github.com/AsamK/signal-cli - Przepływ captcha:
https://github.com/AsamK/signal-cli/wiki/Registration-with-captcha - Przepływ łączenia:
https://github.com/AsamK/signal-cli/wiki/Linking-other-devices-(Provisioning)
Tryb zewnętrznego demona (httpUrl)
Jeśli chcesz samodzielnie zarządzaćsignal-cli (powolne zimne starty JVM, inicjalizacja kontenera albo współdzielone CPU), uruchom demona osobno i skieruj OpenClaw na niego:
channels.signal.startupTimeoutMs.
Tryb kontenera (bbernhard/signal-cli-rest-api)
Zamiast uruchamiaćsignal-cli natywnie, możesz użyć kontenera Docker bbernhard/signal-cli-rest-api. Opakowuje on signal-cli za API REST i interfejs WebSocket.
Wymagania:
- Kontener musi działać z
MODE=json-rpc, aby odbierać wiadomości w czasie rzeczywistym. - Zarejestruj lub połącz swoje konto Signal wewnątrz kontenera przed podłączeniem OpenClaw.
docker-compose.yml:
apiMode kontroluje, którego protokołu używa OpenClaw:
| Wartość | Zachowanie |
|---|---|
"auto" | (Domyślnie) Sprawdza oba transporty; streaming weryfikuje odbiór przez WebSocket kontenera |
"native" | Wymusza natywny signal-cli (JSON-RPC pod /api/v1/rpc, SSE pod /api/v1/events) |
"container" | Wymusza kontener bbernhard (REST pod /v2/send, WebSocket pod /v1/receive/{account}) |
apiMode ma wartość "auto", OpenClaw buforuje wykryty tryb przez 30 sekund, aby uniknąć powtarzanych prób. Odbiór kontenera jest wybierany do streamingu dopiero po tym, jak /v1/receive/{account} przejdzie aktualizację do WebSocket, co wymaga MODE=json-rpc.
Tryb kontenera obsługuje te same operacje kanału Signal co tryb natywny tam, gdzie kontener udostępnia pasujące API: wysyłanie, odbieranie, załączniki, wskaźniki pisania, potwierdzenia odczytu/wyświetlenia, reakcje, grupy i tekst stylizowany. OpenClaw tłumaczy swoje natywne wywołania RPC Signal na ładunki REST kontenera, w tym identyfikatory grup group.{base64(internal_id)} i text_mode: "styled" dla sformatowanego tekstu.
Uwagi operacyjne:
- Używaj
autoStart: falsew trybie kontenera. OpenClaw nie powinien uruchamiać natywnego demona, gdy wybranoapiMode: "container". - Używaj
MODE=json-rpcdo odbierania.MODE=normalmoże sprawić, że/v1/aboutwygląda na zdrowe, ale/v1/receive/{account}nie przechodzi aktualizacji do WebSocket, więc OpenClaw nie wybierze streamingu odbioru kontenera w trybieauto. - Ustaw
apiMode: "container", gdy wiesz, żehttpUrlwskazuje na API REST bbernhard. UstawapiMode: "native", gdy wiesz, że wskazuje na natywne JSON-RPC/SSEsignal-cli. Użyj"auto", gdy wdrożenie może się różnić. - Pobieranie załączników kontenera respektuje te same limity bajtów multimediów co tryb natywny. Zbyt duże odpowiedzi są odrzucane przed pełnym zbuforowaniem, gdy serwer wysyła
Content-Length, a w przeciwnym razie podczas streamingu.
Kontrola dostępu (DM + grupy)
DM:- Domyślnie:
channels.signal.dmPolicy = "pairing". - Nieznani nadawcy otrzymują kod parowania; wiadomości są ignorowane do czasu zatwierdzenia (kody wygasają po 1 godzinie).
- Zatwierdź przez:
openclaw pairing list signalopenclaw pairing approve signal <CODE>
- Parowanie jest domyślną wymianą tokenu dla DM Signal. Szczegóły: Parowanie
- Nadawcy tylko z UUID (z
sourceUuid) są przechowywani jakouuid:<id>wchannels.signal.allowFrom.
channels.signal.groupPolicy = open | allowlist | disabled.channels.signal.groupAllowFromkontroluje, które grupy lub nadawcy mogą wyzwalać odpowiedzi grupowe, gdy ustawionoallowlist; wpisami mogą być identyfikatory grup Signal (surowe,group:<id>albosignal:group:<id>), numery telefonów nadawców, wartościuuid:<id>albo*.channels.signal.groups["<group-id>" | "*"]może nadpisać zachowanie grupy za pomocąrequireMention,toolsitoolsBySender.- Użyj
channels.signal.accounts.<id>.groupsdla nadpisań dla poszczególnych kont w konfiguracjach z wieloma kontami. - Dodanie grupy Signal do listy dozwolonych przez
groupAllowFromsamo w sobie nie wyłącza bramkowania przez wzmiankę. Konkretnie skonfigurowany wpischannels.signal.groups["<group-id>"]przetwarza każdą wiadomość grupową, chyba że ustawionorequireMention=true. - Uwaga dotycząca działania: jeśli
channels.signalcałkowicie brakuje, środowisko wykonawcze wraca dogroupPolicy="allowlist"dla sprawdzeń grup (nawet jeśli ustawionochannels.defaults.groupPolicy).
Jak to działa (zachowanie)
- Tryb natywny:
signal-clidziała jako demon; Gateway odczytuje zdarzenia przez SSE. - Tryb kontenera: Gateway wysyła przez API REST i odbiera przez WebSocket.
- Wiadomości przychodzące są normalizowane do wspólnej koperty kanału.
- Odpowiedzi zawsze wracają do tego samego numeru lub grupy.
Multimedia + limity
- Tekst wychodzący jest dzielony do
channels.signal.textChunkLimit(domyślnie 4000). - Opcjonalne dzielenie według nowych wierszy: ustaw
channels.signal.chunkMode="newline", aby dzielić po pustych wierszach (granicach akapitów) przed dzieleniem według długości. - Załączniki są obsługiwane (base64 pobierane z
signal-cli). - Załączniki notatek głosowych używają nazwy pliku
signal-clijako zastępczego MIME, gdy brakujecontentType, dzięki czemu transkrypcja audio nadal może klasyfikować notatki głosowe AAC. - Domyślny limit multimediów:
channels.signal.mediaMaxMb(domyślnie 8). - Użyj
channels.signal.ignoreAttachments, aby pominąć pobieranie multimediów. - Kontekst historii grup używa
channels.signal.historyLimit(albochannels.signal.accounts.*.historyLimit), z powrotem domessages.groupChat.historyLimit. Ustaw0, aby wyłączyć (domyślnie 50).
Pisanie + potwierdzenia odczytu
- Wskaźniki pisania: OpenClaw wysyła sygnały pisania przez
signal-cli sendTypingi odświeża je, gdy odpowiedź jest w toku. - Potwierdzenia odczytu: gdy
channels.signal.sendReadReceiptsma wartość true, OpenClaw przekazuje potwierdzenia odczytu dla dozwolonych DM. - Signal-cli nie udostępnia potwierdzeń odczytu dla grup.
Reakcje (narzędzie wiadomości)
- Użyj
message action=reactzchannel=signal. - Cele: nadawca E.164 lub UUID (użyj
uuid:<id>z wyjścia parowania; sam UUID też działa). messageIdto znacznik czasu Signal wiadomości, na którą reagujesz.- Reakcje w grupach wymagają
targetAuthorlubtargetAuthorUuid.
channels.signal.actions.reactions: włącz/wyłącz akcje reakcji (domyślnie true).channels.signal.reactionLevel:off | ack | minimal | extensive.off/ackwyłącza reakcje agenta (reactnarzędzia wiadomości zwróci błąd).minimal/extensivewłącza reakcje agenta i ustawia poziom wskazówek.
- Nadpisania dla konta:
channels.signal.accounts.<id>.actions.reactions,channels.signal.accounts.<id>.reactionLevel.
Cele dostarczania (CLI/cron)
- Wiadomości prywatne:
signal:+15551234567(lub zwykły E.164). - Wiadomości prywatne UUID:
uuid:<id>(lub sam UUID). - Grupy:
signal:group:<groupId>. - Nazwy użytkowników:
username:<name>(jeśli są obsługiwane przez Twoje konto Signal).
Rozwiązywanie problemów
Najpierw uruchom tę sekwencję:- Daemon jest osiągalny, ale brak odpowiedzi: sprawdź ustawienia konta/daemona (
httpUrl,account) i tryb odbierania. - Wiadomości prywatne są ignorowane: nadawca oczekuje na zatwierdzenie parowania.
- Wiadomości grupowe są ignorowane: bramkowanie nadawcy grupy/wzmianki blokuje dostarczanie.
- Błędy walidacji konfiguracji po edycjach: uruchom
openclaw doctor --fix. - Brak Signal w diagnostyce: potwierdź
channels.signal.enabled: true.
Uwagi dotyczące bezpieczeństwa
signal-cliprzechowuje klucze konta lokalnie (zwykle~/.local/share/signal-cli/data/).- Utwórz kopię zapasową stanu konta Signal przed migracją lub przebudową serwera.
- Zachowaj
channels.signal.dmPolicy: "pairing", chyba że jawnie chcesz szerszego dostępu do wiadomości prywatnych. - Weryfikacja SMS jest potrzebna tylko w przepływach rejestracji lub odzyskiwania, ale utrata kontroli nad numerem/kontem może skomplikować ponowną rejestrację.
Odniesienie konfiguracji (Signal)
Pełna konfiguracja: Konfiguracja Opcje dostawcy:channels.signal.enabled: włącz/wyłącz uruchamianie kanału.channels.signal.apiMode:auto | native | container(domyślnie: auto). Zobacz Tryb kontenera.channels.signal.account: E.164 dla konta bota.channels.signal.cliPath: ścieżka dosignal-cli.channels.signal.httpUrl: pełny URL daemona (nadpisuje host/port).channels.signal.httpHost,channels.signal.httpPort: powiązanie daemona (domyślnie 127.0.0.1:8080).channels.signal.autoStart: automatyczne uruchamianie daemona (domyślnie true, jeślihttpUrlnie jest ustawione).channels.signal.startupTimeoutMs: limit czasu oczekiwania na uruchomienie w ms (maks. 120000).channels.signal.receiveMode:on-start | manual.channels.signal.ignoreAttachments: pomiń pobieranie załączników.channels.signal.ignoreStories: ignoruj relacje z daemona.channels.signal.sendReadReceipts: przekazuj potwierdzenia odczytu.channels.signal.dmPolicy:pairing | allowlist | open | disabled(domyślnie: pairing).channels.signal.allowFrom: lista dozwolonych wiadomości prywatnych (E.164 lubuuid:<id>).openwymaga"*". Signal nie ma nazw użytkowników; używaj identyfikatorów telefonu/UUID.channels.signal.groupPolicy:open | allowlist | disabled(domyślnie: allowlist).channels.signal.groupAllowFrom: lista dozwolonych grup; akceptuje identyfikatory grup Signal (surowe,group:<id>lubsignal:group:<id>), numery E.164 nadawców albo wartościuuid:<id>.channels.signal.groups: nadpisania dla grup indeksowane identyfikatorem grupy Signal (lub"*"). Obsługiwane pola:requireMention,tools,toolsBySender.channels.signal.accounts.<id>.groups: wersjachannels.signal.groupsdla konta w konfiguracjach wielokontowych.channels.signal.historyLimit: maksymalna liczba wiadomości grupowych do dołączenia jako kontekst (0 wyłącza).channels.signal.dmHistoryLimit: limit historii wiadomości prywatnych w turach użytkownika. Nadpisania dla użytkownika:channels.signal.dms["<phone_or_uuid>"].historyLimit.channels.signal.textChunkLimit: rozmiar wychodzącego fragmentu (znaki).channels.signal.chunkMode:length(domyślnie) lubnewline, aby dzielić po pustych wierszach (granicach akapitów) przed dzieleniem według długości.channels.signal.mediaMaxMb: limit mediów przychodzących/wychodzących (MB).
agents.list[].groupChat.mentionPatterns(Signal nie obsługuje natywnych wzmianek).messages.groupChat.mentionPatterns(globalny wariant zapasowy).messages.responsePrefix.
Powiązane
- Przegląd kanałów — wszystkie obsługiwane kanały
- Parowanie — uwierzytelnianie wiadomości prywatnych i przepływ parowania
- Grupy — zachowanie czatu grupowego i bramkowanie wzmianek
- Routing kanałów — routing sesji dla wiadomości
- Bezpieczeństwo — model dostępu i utwardzanie