Status: externe CLI-Integration. Gateway spricht über HTTP mitDocumentation 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 - entweder nativer Daemon (JSON-RPC + SSE) oder bbernhard/signal-cli-rest-api-Container (REST + WebSocket).
Voraussetzungen
- OpenClaw ist auf Ihrem Server installiert (Linux-Ablauf unten auf Ubuntu 24 getestet).
- Eines von:
signal-cliist auf dem Host verfügbar (nativer Modus), oderbbernhard/signal-cli-rest-api-Docker-Container (Container-Modus).
- Eine Telefonnummer, die eine Verifizierungs-SMS empfangen kann (für den SMS-Registrierungspfad).
- Browserzugriff für Signal-Captcha (
signalcaptchas.org) während der Registrierung.
Schnelleinrichtung (Einsteiger)
- Verwenden Sie eine separate Signal-Nummer für den Bot (empfohlen).
- Installieren Sie
signal-cli(Java erforderlich, wenn Sie den JVM-Build verwenden). - Wählen Sie einen Einrichtungspfad:
- Pfad A (QR-Verknüpfung):
signal-cli link -n "OpenClaw"und mit Signal scannen. - Pfad B (SMS-Registrierung): Registrieren Sie eine dedizierte Nummer mit Captcha + SMS-Verifizierung.
- Pfad A (QR-Verknüpfung):
- Konfigurieren Sie OpenClaw und starten Sie den Gateway neu.
- Senden Sie die erste DM und genehmigen Sie die Kopplung (
openclaw pairing approve signal <CODE>).
| Feld | Beschreibung |
|---|---|
account | Bot-Telefonnummer im E.164-Format (+15551234567) |
cliPath | Pfad zu signal-cli (signal-cli, wenn in PATH) |
dmPolicy | Zugriffsrichtlinie für DMs (pairing empfohlen) |
allowFrom | Telefonnummern oder uuid:<id>-Werte, die DMs senden dürfen |
Was es ist
- Signal-Kanal über
signal-cli(keine eingebettete libsignal). - Deterministisches Routing: Antworten gehen immer zurück an Signal.
- DMs teilen die Hauptsitzung des Agenten; Gruppen sind isoliert (
agent:<agentId>:signal:group:<groupId>).
Konfigurationsschreibvorgänge
Standardmäßig darf Signal Konfigurationsupdates schreiben, die durch/config set|unset ausgelöst werden (erfordert commands.config: true).
Deaktivieren mit:
Das Nummernmodell (wichtig)
- Der Gateway verbindet sich mit einem Signal-Gerät (dem
signal-cli-Konto). - Wenn Sie den Bot auf Ihrem persönlichen Signal-Konto ausführen, ignoriert er Ihre eigenen Nachrichten (Schleifenschutz).
- Für „Ich schreibe dem Bot und er antwortet“ verwenden Sie eine separate Bot-Nummer.
Einrichtungspfad A: vorhandenes Signal-Konto verknüpfen (QR)
- Installieren Sie
signal-cli(JVM- oder nativer Build). - Verknüpfen Sie ein Bot-Konto:
signal-cli link -n "OpenClaw"und scannen Sie anschließend den QR-Code in Signal.
- Konfigurieren Sie Signal und starten Sie den Gateway.
channels.signal.accounts mit kontospezifischer Konfiguration und optionalem name. Das gemeinsame Muster finden Sie unter gateway/configuration.
Einrichtungspfad B: dedizierte Bot-Nummer registrieren (SMS, Linux)
Verwenden Sie dies, wenn Sie eine dedizierte Bot-Nummer möchten, statt ein vorhandenes Signal-App-Konto zu verknüpfen.- Besorgen Sie sich eine Nummer, die SMS empfangen kann (oder Sprachverifizierung für Festnetznummern).
- Verwenden Sie eine dedizierte Bot-Nummer, um Konto-/Sitzungskonflikte zu vermeiden.
- Installieren Sie
signal-cliauf dem Gateway-Host:
signal-cli-${VERSION}.tar.gz) verwenden, installieren Sie zuerst JRE 25+.
Halten Sie signal-cli aktuell; Upstream weist darauf hin, dass alte Versionen ausfallen können, wenn sich Signal-Server-APIs ändern.
- Registrieren und verifizieren Sie die Nummer:
- Öffnen Sie
https://signalcaptchas.org/registration/generate.html. - Schließen Sie das Captcha ab und kopieren Sie das
signalcaptcha://...-Linkziel aus „Open Signal“. - Führen Sie den Vorgang möglichst von derselben externen IP-Adresse wie die Browsersitzung aus.
- Führen Sie die Registrierung sofort erneut aus (Captcha-Token laufen schnell ab):
- Konfigurieren Sie OpenClaw, starten Sie den Gateway neu und verifizieren Sie den Kanal:
- Koppeln Sie Ihren DM-Absender:
- Senden Sie eine beliebige Nachricht an die Bot-Nummer.
- Genehmigen Sie den Code auf dem Server:
openclaw pairing approve signal <PAIRING_CODE>. - Speichern Sie die Bot-Nummer auf Ihrem Telefon als Kontakt, um „Unknown contact“ zu vermeiden.
signal-cliREADME:https://github.com/AsamK/signal-cli- Captcha-Ablauf:
https://github.com/AsamK/signal-cli/wiki/Registration-with-captcha - Verknüpfungsablauf:
https://github.com/AsamK/signal-cli/wiki/Linking-other-devices-(Provisioning)
Externer Daemon-Modus (httpUrl)
Wenn Siesignal-cli selbst verwalten möchten (langsame JVM-Kaltstarts, Container-Initialisierung oder gemeinsam genutzte CPUs), führen Sie den Daemon separat aus und verweisen Sie OpenClaw darauf:
channels.signal.startupTimeoutMs fest.
Container-Modus (bbernhard/signal-cli-rest-api)
Stattsignal-cli nativ auszuführen, können Sie den Docker-Container bbernhard/signal-cli-rest-api verwenden. Dieser kapselt signal-cli hinter einer REST-API und WebSocket-Schnittstelle.
Anforderungen:
- Der Container muss mit
MODE=json-rpcausgeführt werden, um Nachrichten in Echtzeit zu empfangen. - Registrieren oder verknüpfen Sie Ihr Signal-Konto im Container, bevor Sie OpenClaw verbinden.
docker-compose.yml-Dienst:
apiMode steuert, welches Protokoll OpenClaw verwendet:
| Wert | Verhalten |
|---|---|
"auto" | (Standard) Prüft beide Transporte; Streaming validiert Container-WebSocket-Empfang |
"native" | Erzwingt natives signal-cli (JSON-RPC unter /api/v1/rpc, SSE unter /api/v1/events) |
"container" | Erzwingt bbernhard-Container (REST unter /v2/send, WebSocket unter /v1/receive/{account}) |
apiMode "auto" ist, speichert OpenClaw den erkannten Modus 30 Sekunden lang zwischen, um wiederholte Prüfungen zu vermeiden. Container-Empfang wird für Streaming nur ausgewählt, nachdem /v1/receive/{account} auf WebSocket aktualisiert wurde, was MODE=json-rpc erfordert.
Der Container-Modus unterstützt dieselben Signal-Kanaloperationen wie der native Modus, sofern der Container entsprechende APIs bereitstellt: Senden, Empfangen, Anhänge, Tippindikatoren, Lese-/Gesehen-Bestätigungen, Reaktionen, Gruppen und formatierter Text. OpenClaw übersetzt seine nativen Signal-RPC-Aufrufe in die REST-Payloads des Containers, einschließlich group.{base64(internal_id)}-Gruppen-IDs und text_mode: "styled" für formatierten Text.
Betriebshinweise:
- Verwenden Sie
autoStart: falsemit dem Container-Modus. OpenClaw sollte keinen nativen Daemon starten, wennapiMode: "container"ausgewählt ist. - Verwenden Sie
MODE=json-rpcfür den Empfang.MODE=normalkann/v1/aboutgesund erscheinen lassen, aber/v1/receive/{account}führt kein WebSocket-Upgrade durch, sodass OpenClaw im Modusautokein Container-Empfangsstreaming auswählt. - Legen Sie
apiMode: "container"fest, wenn Sie wissen, dasshttpUrlauf bbernhards REST-API verweist. Legen SieapiMode: "native"fest, wenn Sie wissen, dass es auf nativessignal-cliJSON-RPC/SSE verweist. Verwenden Sie"auto", wenn die Bereitstellung variieren kann. - Container-Anhangsdownloads beachten dieselben Medien-Byte-Limits wie der native Modus. Überdimensionierte Antworten werden verworfen, bevor sie vollständig gepuffert werden, wenn der Server
Content-Lengthsendet, andernfalls während des Streamings.
Zugriffskontrolle (DMs + Gruppen)
DMs:- Standard:
channels.signal.dmPolicy = "pairing". - Unbekannte Absender erhalten einen Kopplungscode; Nachrichten werden ignoriert, bis sie genehmigt wurden (Codes laufen nach 1 Stunde ab).
- Genehmigen über:
openclaw pairing list signalopenclaw pairing approve signal <CODE>
- Kopplung ist der standardmäßige Token-Austausch für Signal-DMs. Details: Kopplung
- Nur-UUID-Absender (aus
sourceUuid) werden alsuuid:<id>inchannels.signal.allowFromgespeichert.
channels.signal.groupPolicy = open | allowlist | disabled.channels.signal.groupAllowFromsteuert, welche Gruppen oder Absender Gruppenantworten auslösen können, wennallowlistfestgelegt ist; Einträge können Signal-Gruppen-IDs (roh,group:<id>odersignal:group:<id>), Absendertelefonnummern,uuid:<id>-Werte oder*sein.channels.signal.groups["<group-id>" | "*"]kann Gruppenverhalten mitrequireMention,toolsundtoolsBySenderüberschreiben.- Verwenden Sie
channels.signal.accounts.<id>.groupsfür kontospezifische Überschreibungen in Mehrkonto-Einrichtungen. - Das Zulassen einer Signal-Gruppe über
groupAllowFromdeaktiviert Mention-Gating nicht automatisch. Ein spezifisch konfigurierter Eintragchannels.signal.groups["<group-id>"]verarbeitet jede Gruppennachricht, sofern nichtrequireMention=truefestgelegt ist. - Laufzeithinweis: Wenn
channels.signalvollständig fehlt, fällt die Laufzeit für Gruppenprüfungen aufgroupPolicy="allowlist"zurück (selbst wennchannels.defaults.groupPolicygesetzt ist).
Funktionsweise (Verhalten)
- Nativer Modus:
signal-cliläuft als Daemon; der Gateway liest Ereignisse über SSE. - Container-Modus: Der Gateway sendet über die REST-API und empfängt über WebSocket.
- Eingehende Nachrichten werden in den gemeinsamen Kanal-Umschlag normalisiert.
- Antworten werden immer an dieselbe Nummer oder Gruppe zurückgeroutet.
Medien + Limits
- Ausgehender Text wird auf
channels.signal.textChunkLimitaufgeteilt (Standard 4000). - Optionale Zeilenumbruch-Aufteilung: Setzen Sie
channels.signal.chunkMode="newline", um vor der Längenaufteilung an Leerzeilen (Absatzgrenzen) zu teilen. - Anhänge werden unterstützt (base64 von
signal-cliabgerufen). - Sprachnotiz-Anhänge verwenden den
signal-cli-Dateinamen als MIME-Fallback, wenncontentTypefehlt, sodass Audiotranskription AAC-Sprachnotizen weiterhin klassifizieren kann. - Standard-Medienobergrenze:
channels.signal.mediaMaxMb(Standard 8). - Verwenden Sie
channels.signal.ignoreAttachments, um das Herunterladen von Medien zu überspringen. - Der Gruppenverlaufs-Kontext verwendet
channels.signal.historyLimit(oderchannels.signal.accounts.*.historyLimit) und fällt aufmessages.groupChat.historyLimitzurück. Setzen Sie0, um ihn zu deaktivieren (Standard 50).
Tippindikatoren + Lesebestätigungen
- Tippindikatoren: OpenClaw sendet Tippsignale über
signal-cli sendTypingund aktualisiert sie, während eine Antwort läuft. - Lesebestätigungen: Wenn
channels.signal.sendReadReceiptstrue ist, leitet OpenClaw Lesebestätigungen für erlaubte DMs weiter. - Signal-cli stellt keine Lesebestätigungen für Gruppen bereit.
Reaktionen (Nachrichtentool)
- Verwenden Sie
message action=reactmitchannel=signal. - Ziele: Absender-E.164 oder UUID (verwenden Sie
uuid:<id>aus der Kopplungsausgabe; eine bloße UUID funktioniert ebenfalls). messageIdist der Signal-Zeitstempel der Nachricht, auf die Sie reagieren.- Gruppenreaktionen erfordern
targetAuthorodertargetAuthorUuid.
channels.signal.actions.reactions: Reaktionsaktionen aktivieren/deaktivieren (Standard: true).channels.signal.reactionLevel:off | ack | minimal | extensive.off/ackdeaktiviert Agentenreaktionen (das Nachrichtenwerkzeugreactgibt einen Fehler zurück).minimal/extensiveaktiviert Agentenreaktionen und legt die Anleitungsebene fest.
- Überschreibungen pro Konto:
channels.signal.accounts.<id>.actions.reactions,channels.signal.accounts.<id>.reactionLevel.
Zustellungsziele (CLI/Cron)
- Direktnachrichten:
signal:+15551234567(oder einfache E.164). - UUID-Direktnachrichten:
uuid:<id>(oder bloße UUID). - Gruppen:
signal:group:<groupId>. - Benutzernamen:
username:<name>(falls von Ihrem Signal-Konto unterstützt).
Fehlerbehebung
Führen Sie zuerst diese Leiter aus:- Daemon erreichbar, aber keine Antworten: Prüfen Sie Konto-/Daemon-Einstellungen (
httpUrl,account) und Empfangsmodus. - Direktnachrichten ignoriert: Absender wartet auf Kopplungsgenehmigung.
- Gruppennachrichten ignoriert: Gruppensender-/Erwähnungs-Gating blockiert die Zustellung.
- Konfigurationsvalidierungsfehler nach Bearbeitungen: Führen Sie
openclaw doctor --fixaus. - Signal fehlt in der Diagnose: Bestätigen Sie
channels.signal.enabled: true.
Sicherheitshinweise
signal-clispeichert Kontoschlüssel lokal (typischerweise~/.local/share/signal-cli/data/).- Sichern Sie den Signal-Kontostatus vor einer Servermigration oder einem Neuaufbau.
- Behalten Sie
channels.signal.dmPolicy: "pairing"bei, sofern Sie nicht ausdrücklich breiteren Zugriff auf Direktnachrichten wünschen. - SMS-Verifizierung ist nur für Registrierungs- oder Wiederherstellungsabläufe erforderlich, aber der Verlust der Kontrolle über die Nummer/das Konto kann eine erneute Registrierung erschweren.
Konfigurationsreferenz (Signal)
Vollständige Konfiguration: Konfiguration Provider-Optionen:channels.signal.enabled: Kanalstart aktivieren/deaktivieren.channels.signal.apiMode:auto | native | container(Standard: auto). Siehe Container-Modus.channels.signal.account: E.164 für das Bot-Konto.channels.signal.cliPath: Pfad zusignal-cli.channels.signal.httpUrl: vollständige Daemon-URL (überschreibt Host/Port).channels.signal.httpHost,channels.signal.httpPort: Daemon-Bindung (Standard 127.0.0.1:8080).channels.signal.autoStart: Daemon automatisch starten (Standard true, wennhttpUrlnicht gesetzt ist).channels.signal.startupTimeoutMs: Startwartezeitüberschreitung in ms (Obergrenze 120000).channels.signal.receiveMode:on-start | manual.channels.signal.ignoreAttachments: Anhangsdownloads überspringen.channels.signal.ignoreStories: Storys vom Daemon ignorieren.channels.signal.sendReadReceipts: Lesebestätigungen weiterleiten.channels.signal.dmPolicy:pairing | allowlist | open | disabled(Standard: pairing).channels.signal.allowFrom: Zulassungsliste für Direktnachrichten (E.164 oderuuid:<id>).openerfordert"*". Signal hat keine Benutzernamen; verwenden Sie Telefon-/UUID-IDs.channels.signal.groupPolicy:open | allowlist | disabled(Standard: allowlist).channels.signal.groupAllowFrom: Gruppenzulassungsliste; akzeptiert Signal-Gruppen-IDs (roh,group:<id>odersignal:group:<id>), E.164-Nummern von Absendern oderuuid:<id>-Werte.channels.signal.groups: Überschreibungen pro Gruppe, verschlüsselt nach Signal-Gruppen-ID (oder"*"). Unterstützte Felder:requireMention,tools,toolsBySender.channels.signal.accounts.<id>.groups: kontospezifische Version vonchannels.signal.groupsfür Mehrkonten-Setups.channels.signal.historyLimit: maximale Anzahl von Gruppennachrichten, die als Kontext einbezogen werden (0 deaktiviert dies).channels.signal.dmHistoryLimit: Verlaufslimit für Direktnachrichten in Benutzer-Turns. Überschreibungen pro Benutzer:channels.signal.dms["<phone_or_uuid>"].historyLimit.channels.signal.textChunkLimit: ausgehende Chunk-Größe (Zeichen).channels.signal.chunkMode:length(Standard) odernewline, um vor dem Chunking nach Länge an Leerzeilen (Absatzgrenzen) zu teilen.channels.signal.mediaMaxMb: Obergrenze für eingehende/ausgehende Medien (MB).
agents.list[].groupChat.mentionPatterns(Signal unterstützt keine nativen Erwähnungen).messages.groupChat.mentionPatterns(globaler Fallback).messages.responsePrefix.
Verwandt
- Kanalübersicht — alle unterstützten Kanäle
- Kopplung — Authentifizierung für Direktnachrichten und Kopplungsablauf
- Gruppen — Gruppenchat-Verhalten und Erwähnungs-Gating
- Kanalrouting — Sitzungsrouting für Nachrichten
- Sicherheit — Zugriffsmodell und Härtung