Signal (signal-cli)
Status: externe CLI-Integration. Das Gateway kommuniziert mit signal-cli über HTTP JSON-RPC + SSE.
Schnelleinrichtung (Anfänger)
- Nutzen Sie eine eigene Signal-Nummer für den Bot (empfohlen).
- Installieren Sie
signal-cli(Java erforderlich). - Verknüpfen Sie das Bot-Gerät und starten Sie den Daemon:
signal-cli link -n "OpenClaw"
- Konfigurieren Sie OpenClaw und starten Sie das Gateway.
Minimale Konfiguration:
{
channels: {
signal: {
enabled: true,
account: "+15551234567",
cliPath: "signal-cli",
dmPolicy: "pairing",
allowFrom: ["+15557654321"]
}
}
}Ziele
- Signal-Kanal über
signal-cli(keine eingebettete libsignal). - Deterministisches Routing: Antworten gehen immer zurück zu Signal.
- DMs teilen die Hauptsitzung des Agenten; Gruppen sind isoliert (
agent:<agentId>:signal:group:<groupId>).
Konfig schreibt
Standardmäßig darf Signal Konfigurationsaktualisierungen schreiben, die durch /config set|unset ausgelöst werden (erfordert commands.config: true). Deaktivieren mit:
{
channels: { signal: { configWrites: false } }
}Das Nummernmodell (wichtig)
- Das Gateway verbindet sich mit einem Signal-Gerät (dem
signal-cli-Konto). - Wenn Sie den Bot auf Ihrem persönlichen Signal-Konto betreiben, werden Ihre eigenen Nachrichten ignoriert (Schleifenschutz).
- Für „Ich schreibe dem Bot und er antwortet“ nutzen Sie eine eigene Bot-Nummer.
Einrichtung (schneller Weg)
- Installieren Sie
signal-cli(Java erforderlich). - Bot-Konto verknüpfen:
signal-cli link -n "OpenClaw", dann QR in Signal scannen.
- Signal konfigurieren und Gateway starten.
Beispiel:
{
channels: {
signal: {
enabled: true,
account: "+15551234567",
cliPath: "signal-cli",
dmPolicy: "pairing",
allowFrom: ["+15557654321"]
}
}
}Mehrkonten-Unterstützung: nutzen Sie channels.signal.accounts mit Konfiguration pro Konto und optionalem name. Siehe gateway/configuration für das gemeinsame Muster.
Externer Daemon-Modus (httpUrl)
Wenn Sie signal-cli selbst verwalten möchten (langsame JVM-Kaltstarts, Container-Init oder geteilte CPUs), starten Sie den Daemon separat und richten Sie OpenClaw darauf:
{
channels: {
signal: {
httpUrl: "http://127.0.0.1:8080",
autoStart: false
}
}
}Damit entfällt Auto-Spawn und die Startwartezeit innerhalb von OpenClaw. Bei langsamen Starts beim Auto-Spawn setzen Sie channels.signal.startupTimeoutMs.
Zugriffskontrolle (DMs + Gruppen)
DMs:
- Standard:
channels.signal.dmPolicy = "pairing". - Unbekannte Absender erhalten einen Kopplungscode; Nachrichten werden ignoriert, bis sie freigegeben sind (Codes laufen nach 1 Stunde ab).
- Freigabe über:
openclaw pairing list signalopenclaw pairing approve signal <CODE>
- Pairing ist der Standard-Token-Austausch für Signal-DMs. Details: Pairing
- Nur-UUID-Absender (von
sourceUuid) werden alsuuid:<id>inchannels.signal.allowFromgespeichert.
Gruppen:
channels.signal.groupPolicy = open | allowlist | disabled.channels.signal.groupAllowFromsteuert, wer in Gruppen auslösen kann, wennallowlistgesetzt ist.
Wie es funktioniert (Verhalten)
signal-cliläuft als Daemon; das Gateway liest Events über SSE.- Eingehende Nachrichten werden in das gemeinsame Kanal-Envelope normalisiert.
- Antworten werden immer an dieselbe Nummer oder Gruppe zurückgeleitet.
Medien + Limits
- Ausgehender Text wird auf
channels.signal.textChunkLimit(Standard 4000) gechunkt. - Optionale Zeilenumbruch-Chunking: setzen Sie
channels.signal.chunkMode="newline", um vor Längen-Chunking an Leerzeilen (Absatzgrenzen) zu teilen. - Anhänge werden unterstützt (Base64 von
signal-cliabgerufen). - Standard-Medien-Limit:
channels.signal.mediaMaxMb(Standard 8). - Nutzen Sie
channels.signal.ignoreAttachments, um Mediendownloads zu überspringen. - Gruppen-Kontexthistorie nutzt
channels.signal.historyLimit(oderchannels.signal.accounts.*.historyLimit), Fallback aufmessages.groupChat.historyLimit. Setzen Sie0zum Deaktivieren (Standard 50).
Tippen + Lesebestätigungen
- Tipp-Indikatoren: OpenClaw sendet Tipp-Signale ü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 zugelassene DMs weiter. - Signal-cli bietet keine Lesebestätigungen für Gruppen.
Reaktionen (Message-Tool)
- Nutzen Sie
message action=reactmitchannel=signal. - Ziele: Absender E.164 oder UUID (nutzen Sie
uuid:<id>aus der Pairing-Ausgabe; bloße UUID funktioniert ebenfalls). messageIdist der Signal-Timestamp der Nachricht, auf die Sie reagieren.- Gruppen-Reaktionen erfordern
targetAuthorodertargetAuthorUuid.
Beispiele:
message action=react channel=signal target=uuid:123e4567-e89b-12d3-a456-426614174000 messageId=1737630212345 emoji=🔥
message action=react channel=signal target=+15551234567 messageId=1737630212345 emoji=🔥 remove=true
message action=react channel=signal target=signal:group:<groupId> targetAuthor=uuid:<sender-uuid> messageId=1737630212345 emoji=✅Konfiguration:
-
channels.signal.actions.reactions: Reaktionsaktionen aktivieren/deaktivieren (Standard true). -
channels.signal.reactionLevel:off | ack | minimal | extensive.off/ackdeaktiviert Agent-Reaktionen (Message-Toolreactliefert Fehler).minimal/extensiveaktiviert Agent-Reaktionen und setzt die Anleitungsstufe.
-
Pro-Konto-Overrides:
channels.signal.accounts.<id>.actions.reactions,channels.signal.accounts.<id>.reactionLevel.
Zustellziele (CLI/Cron)
- DMs:
signal:+15551234567(oder reine E.164). - UUID-DMs:
uuid:<id>(oder bloße UUID). - Gruppen:
signal:group:<groupId>. - Benutzernamen:
username:<name>(falls von Ihrem Signal-Konto unterstützt).
Konfigurationsreferenz (Signal)
Vollständige Konfiguration: Konfiguration. Provider-Optionen:
channels.signal.enabled: Kanalstart aktivieren/deaktivieren.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-Bind (Standard 127.0.0.1:8080).channels.signal.autoStart: Daemon automatisch starten (Standard true, wennhttpUrlnicht gesetzt).channels.signal.startupTimeoutMs: Start-Warte-Timeout in ms (max 120000).channels.signal.receiveMode:on-start | manual.channels.signal.ignoreAttachments: Anhangs-Downloads überspringen.channels.signal.ignoreStories: Stories vom Daemon ignorieren.channels.signal.sendReadReceipts: Lesebestätigungen weiterleiten.channels.signal.dmPolicy:pairing | allowlist | open | disabled(Standard: pairing).channels.signal.allowFrom: DM-Zulassen-Liste (E.164 oderuuid:<id>).openerfordert"*". Signal hat keine Benutzernamen; nutzen Sie Telefon-/UUID-IDs.channels.signal.groupPolicy:open | allowlist | disabled(Standard: allowlist).channels.signal.groupAllowFrom: Gruppen-Absender-Zulassen-Liste.channels.signal.historyLimit: maximale Gruppennachrichten als Kontext (0 deaktiviert).channels.signal.dmHistoryLimit: DM-Historie-Limit in Benutzer-Turns. Pro-Benutzer-Overrides:channels.signal.dms["<phone_or_uuid>"].historyLimit.channels.signal.textChunkLimit: ausgehende Chunk-Größe (Zeichen).channels.signal.chunkMode:length(Standard) odernewlinezum Teilen an Leerzeilen (Absatzgrenzen) vor Längen-Chunking.channels.signal.mediaMaxMb: eingehendes/ausgehendes Medien-Limit (MB).
Verwandte globale Optionen:
agents.list[].groupChat.mentionPatterns(Signal unterstützt keine nativen Erwähnungen).messages.groupChat.mentionPatterns(globaler Fallback).messages.responsePrefix.