Status: externe CLI-integratie. Gateway communiceert metDocumentation Index
Fetch the complete documentation index at: https://docs2.openclaw.ai/llms.txt
Use this file to discover all available pages before exploring further.
signal-cli via HTTP — ofwel een native daemon (JSON-RPC + SSE), ofwel de bbernhard/signal-cli-rest-api-container (REST + WebSocket).
Vereisten
- OpenClaw geïnstalleerd op je server (Linux-flow hieronder getest op Ubuntu 24).
- Een van:
signal-clibeschikbaar op de host (native modus), ofbbernhard/signal-cli-rest-apiDocker-container (containermodus).
- Een telefoonnummer dat één verificatie-sms kan ontvangen (voor het registratiepad via sms).
- Browsertoegang voor Signal-captcha (
signalcaptchas.org) tijdens registratie.
Snelle setup (beginner)
- Gebruik een apart Signal-nummer voor de bot (aanbevolen).
- Installeer
signal-cli(Java is vereist als je de JVM-build gebruikt). - Kies één setup-pad:
- Pad A (QR-koppeling):
signal-cli link -n "OpenClaw"en scan met Signal. - Pad B (sms-registratie): registreer een dedicated nummer met captcha + sms-verificatie.
- Pad A (QR-koppeling):
- Configureer OpenClaw en herstart de Gateway.
- Stuur een eerste DM en keur koppelen goed (
openclaw pairing approve signal <CODE>).
| Veld | Beschrijving |
|---|---|
account | Bottelefoonnummer in E.164-indeling (+15551234567) |
cliPath | Pad naar signal-cli (signal-cli als het op PATH staat) |
dmPolicy | DM-toegangsbeleid (pairing aanbevolen) |
allowFrom | Telefoonnummers of uuid:<id>-waarden die mogen DM’en |
Wat het is
- Signal-kanaal via
signal-cli(geen ingebedde libsignal). - Deterministische routering: antwoorden gaan altijd terug naar Signal.
- DM’s delen de hoofdsessie van de agent; groepen zijn geïsoleerd (
agent:<agentId>:signal:group:<groupId>).
Configuratieschrijfacties
Standaard mag Signal configuratie-updates schrijven die worden geactiveerd door/config set|unset (vereist commands.config: true).
Uitschakelen met:
Het nummermodel (belangrijk)
- De Gateway maakt verbinding met een Signal-apparaat (het
signal-cli-account). - Als je de bot op je persoonlijke Signal-account draait, negeert hij je eigen berichten (lusbescherming).
- Gebruik een apart botnummer voor “ik stuur de bot een bericht en hij antwoordt”.
Setuppad A: bestaand Signal-account koppelen (QR)
- Installeer
signal-cli(JVM- of native build). - Koppel een botaccount:
signal-cli link -n "OpenClaw"en scan daarna de QR in Signal.
- Configureer Signal en start de Gateway.
channels.signal.accounts met configuratie per account en optionele name. Zie gateway/configuration voor het gedeelde patroon.
Setuppad B: dedicated botnummer registreren (sms, Linux)
Gebruik dit wanneer je een dedicated botnummer wilt in plaats van een bestaand Signal-appaccount te koppelen.- Neem een nummer dat sms kan ontvangen (of spraakverificatie voor vaste lijnen).
- Gebruik een dedicated botnummer om account- en sessieconflicten te voorkomen.
- Installeer
signal-cliop de Gateway-host:
signal-cli-${VERSION}.tar.gz) gebruikt, installeer dan eerst JRE 25+.
Houd signal-cli bijgewerkt; upstream vermeldt dat oude releases kunnen breken wanneer Signal-server-API’s veranderen.
- Registreer en verifieer het nummer:
- Open
https://signalcaptchas.org/registration/generate.html. - Rond captcha af, kopieer het
signalcaptcha://...-linkdoel van “Open Signal”. - Voer dit waar mogelijk uit vanaf hetzelfde externe IP als de browsersessie.
- Voer registratie direct opnieuw uit (captcha-tokens verlopen snel):
- Configureer OpenClaw, herstart de Gateway, verifieer het kanaal:
- Koppel je DM-afzender:
- Stuur een willekeurig bericht naar het botnummer.
- Keur de code goed op de server:
openclaw pairing approve signal <PAIRING_CODE>. - Sla het botnummer op als contact op je telefoon om “Onbekend contact” te vermijden.
signal-cliREADME:https://github.com/AsamK/signal-cli- Captcha-flow:
https://github.com/AsamK/signal-cli/wiki/Registration-with-captcha - Koppelflow:
https://github.com/AsamK/signal-cli/wiki/Linking-other-devices-(Provisioning)
Externe daemonmodus (httpUrl)
Als jesignal-cli zelf wilt beheren (trage JVM-koude starts, containerinitialisatie of gedeelde CPU’s), voer je de daemon apart uit en wijs je OpenClaw ernaar:
channels.signal.startupTimeoutMs in.
Containermodus (bbernhard/signal-cli-rest-api)
In plaats vansignal-cli native te draaien, kun je de bbernhard/signal-cli-rest-api Docker-container gebruiken. Deze plaatst signal-cli achter een REST API- en WebSocket-interface.
Vereisten:
- De container moet draaien met
MODE=json-rpcvoor realtime berichtontvangst. - Registreer of koppel je Signal-account binnen de container voordat je OpenClaw verbindt.
docker-compose.yml-service:
apiMode bepaalt welk protocol OpenClaw gebruikt:
| Waarde | Gedrag |
|---|---|
"auto" | (Standaard) Probet beide transports; streaming valideert container-WebSocket-ontvangst |
"native" | Forceer native signal-cli (JSON-RPC op /api/v1/rpc, SSE op /api/v1/events) |
"container" | Forceer bbernhard-container (REST op /v2/send, WebSocket op /v1/receive/{account}) |
apiMode "auto" is, cachet OpenClaw de gedetecteerde modus 30 seconden om herhaalde probes te vermijden. Containerontvangst wordt alleen geselecteerd voor streaming nadat /v1/receive/{account} naar WebSocket upgradet, waarvoor MODE=json-rpc vereist is.
Containermodus ondersteunt dezelfde Signal-kanaalbewerkingen als native modus waar de container overeenkomende API’s aanbiedt: verzenden, ontvangen, bijlagen, typindicatoren, lees-/bekeken-bewijzen, reacties, groepen en gestileerde tekst. OpenClaw vertaalt zijn native Signal-RPC-aanroepen naar de REST-payloads van de container, inclusief group.{base64(internal_id)}-groeps-ID’s en text_mode: "styled" voor opgemaakte tekst.
Operationele opmerkingen:
- Gebruik
autoStart: falsemet containermodus. OpenClaw hoort geen native daemon te starten wanneerapiMode: "container"is geselecteerd. - Gebruik
MODE=json-rpcvoor ontvangst.MODE=normalkan/v1/aboutgezond laten lijken, maar/v1/receive/{account}voert geen WebSocket-upgrade uit, dus OpenClaw selecteert geen containerontvangststreaming inauto-modus. - Stel
apiMode: "container"in wanneer je weet dat dehttpUrlnaar de REST API van bbernhard wijst. StelapiMode: "native"in wanneer je weet dat deze naar nativesignal-cliJSON-RPC/SSE wijst. Gebruik"auto"wanneer de deployment kan variëren. - Containerbijlagedownloads respecteren dezelfde mediabytelimieten als native modus. Te grote responses worden geweigerd voordat ze volledig worden gebufferd wanneer de server
Content-Lengthverzendt, en anders tijdens streaming.
Toegangsbeheer (DM’s + groepen)
DM’s:- Standaard:
channels.signal.dmPolicy = "pairing". - Onbekende afzenders ontvangen een koppelcode; berichten worden genegeerd totdat ze zijn goedgekeurd (codes verlopen na 1 uur).
- Goedkeuren via:
openclaw pairing list signalopenclaw pairing approve signal <CODE>
- Koppelen is de standaard tokenuitwisseling voor Signal-DM’s. Details: Koppelen
- Afzenders met alleen UUID (van
sourceUuid) worden opgeslagen alsuuid:<id>inchannels.signal.allowFrom.
channels.signal.groupPolicy = open | allowlist | disabled.channels.signal.groupAllowFrombepaalt welke groepen of afzenders groepsantwoorden kunnen triggeren wanneerallowlistis ingesteld; vermeldingen kunnen Signal-groeps-ID’s zijn (raw,group:<id>ofsignal:group:<id>), telefoonnummers van afzenders,uuid:<id>-waarden of*.channels.signal.groups["<group-id>" | "*"]kan groepsgedrag overschrijven metrequireMention,toolsentoolsBySender.- Gebruik
channels.signal.accounts.<id>.groupsvoor overrides per account in setups met meerdere accounts. - Het toestaan van een Signal-groep via
groupAllowFromschakelt mention-gating niet op zichzelf uit. Een specifiek geconfigureerdechannels.signal.groups["<group-id>"]-vermelding verwerkt elk groepsbericht tenzijrequireMention=trueis ingesteld. - Runtime-opmerking: als
channels.signalvolledig ontbreekt, valt runtime terug opgroupPolicy="allowlist"voor groepscontroles (zelfs alschannels.defaults.groupPolicyis ingesteld).
Hoe het werkt (gedrag)
- Native modus:
signal-clidraait als daemon; de Gateway leest events via SSE. - Containermodus: de Gateway verzendt via REST API en ontvangt via WebSocket.
- Inkomende berichten worden genormaliseerd naar de gedeelde kanaalenvelop.
- Antwoorden worden altijd teruggerouteerd naar hetzelfde nummer of dezelfde groep.
Media + limieten
- Uitgaande tekst wordt opgedeeld tot
channels.signal.textChunkLimit(standaard 4000). - Optioneel opdelen op nieuwe regels: stel
channels.signal.chunkMode="newline"in om te splitsen op lege regels (alinea-grenzen) vóór opdelen op lengte. - Bijlagen ondersteund (base64 opgehaald uit
signal-cli). - Voice-note-bijlagen gebruiken de
signal-cli-bestandsnaam als MIME-fallback wanneercontentTypeontbreekt, zodat audiotranscriptie AAC-spraakmemo’s nog steeds kan classificeren. - Standaard medialimiet:
channels.signal.mediaMaxMb(standaard 8). - Gebruik
channels.signal.ignoreAttachmentsom het downloaden van media over te slaan. - Groepsgeschiedeniscontext gebruikt
channels.signal.historyLimit(ofchannels.signal.accounts.*.historyLimit) en valt terug opmessages.groupChat.historyLimit. Stel in op0om uit te schakelen (standaard 50).
Typen + leesbewijzen
- Typindicatoren: OpenClaw verzendt typsignalen via
signal-cli sendTypingen vernieuwt ze terwijl een antwoord loopt. - Leesbewijzen: wanneer
channels.signal.sendReadReceiptstrue is, stuurt OpenClaw leesbewijzen door voor toegestane DM’s. - Signal-cli geeft geen leesbewijzen voor groepen bloot.
Reacties (berichttool)
- Gebruik
message action=reactmetchannel=signal. - Doelen: afzender-E.164 of UUID (gebruik
uuid:<id>uit de koppelingsuitvoer; een kale UUID werkt ook). messageIdis de Signal-tijdstempel voor het bericht waarop je reageert.- Groepsreacties vereisen
targetAuthoroftargetAuthorUuid.
channels.signal.actions.reactions: schakel reactie-acties in/uit (standaard true).channels.signal.reactionLevel:off | ack | minimal | extensive.off/ackschakelt agentreacties uit (berichttoolreactgeeft een foutmelding).minimal/extensiveschakelt agentreacties in en stelt het begeleidingsniveau in.
- Overrides per account:
channels.signal.accounts.<id>.actions.reactions,channels.signal.accounts.<id>.reactionLevel.
Bezorgdoelen (CLI/Cron)
- DM’s:
signal:+15551234567(of gewone E.164). - UUID-DM’s:
uuid:<id>(of kale UUID). - Groepen:
signal:group:<groupId>. - Gebruikersnamen:
username:<name>(als dit door je Signal-account wordt ondersteund).
Probleemoplossing
Voer eerst deze ladder uit:- Daemon bereikbaar maar geen antwoorden: controleer account-/daemoninstellingen (
httpUrl,account) en ontvangstmodus. - DM’s genegeerd: afzender wacht op koppelingsgoedkeuring.
- Groepsberichten genegeerd: groepsafzender-/vermeldingspoort blokkeert bezorging.
- Configuratievalidatiefouten na bewerkingen: voer
openclaw doctor --fixuit. - Signal ontbreekt in diagnostiek: bevestig
channels.signal.enabled: true.
Beveiligingsnotities
signal-clislaat accountsleutels lokaal op (meestal~/.local/share/signal-cli/data/).- Maak een back-up van de Signal-accountstatus vóór servermigratie of herbouw.
- Houd
channels.signal.dmPolicy: "pairing"aan, tenzij je expliciet bredere DM-toegang wilt. - Sms-verificatie is alleen nodig voor registratie- of herstelstromen, maar controleverlies over het nummer/account kan herregistratie bemoeilijken.
Configuratiereferentie (Signal)
Volledige configuratie: Configuratie Provideropties:channels.signal.enabled: schakel kanaalopstart in/uit.channels.signal.apiMode:auto | native | container(standaard: auto). Zie Containermodus.channels.signal.account: E.164 voor het botaccount.channels.signal.cliPath: pad naarsignal-cli.channels.signal.httpUrl: volledige daemon-URL (overschrijft host/poort).channels.signal.httpHost,channels.signal.httpPort: daemonbinding (standaard 127.0.0.1:8080).channels.signal.autoStart: daemon automatisch starten (standaard true alshttpUrlniet is ingesteld).channels.signal.startupTimeoutMs: wachttime-out bij opstarten in ms (limiet 120000).channels.signal.receiveMode:on-start | manual.channels.signal.ignoreAttachments: downloads van bijlagen overslaan.channels.signal.ignoreStories: verhalen van de daemon negeren.channels.signal.sendReadReceipts: leesbewijzen doorsturen.channels.signal.dmPolicy:pairing | allowlist | open | disabled(standaard: pairing).channels.signal.allowFrom: DM-toegestane lijst (E.164 ofuuid:<id>).openvereist"*". Signal heeft geen gebruikersnamen; gebruik telefoon-/UUID-id’s.channels.signal.groupPolicy:open | allowlist | disabled(standaard: allowlist).channels.signal.groupAllowFrom: toegestane lijst voor groepen; accepteert Signal-groeps-ID’s (onbewerkt,group:<id>ofsignal:group:<id>), E.164-nummers van afzenders ofuuid:<id>-waarden.channels.signal.groups: overrides per groep, gesleuteld op Signal-groeps-ID (of"*"). Ondersteunde velden:requireMention,tools,toolsBySender.channels.signal.accounts.<id>.groups: accountversie vanchannels.signal.groupsvoor setups met meerdere accounts.channels.signal.historyLimit: maximaal aantal groepsberichten dat als context wordt opgenomen (0 schakelt uit).channels.signal.dmHistoryLimit: DM-geschiedenislimiet in gebruikersbeurten. Overrides per gebruiker:channels.signal.dms["<phone_or_uuid>"].historyLimit.channels.signal.textChunkLimit: uitgaande blokgrootte (tekens).channels.signal.chunkMode:length(standaard) ofnewlineom op lege regels (alineagrenzen) te splitsen vóór splitsing op lengte.channels.signal.mediaMaxMb: limiet voor inkomende/uitgaande media (MB).
agents.list[].groupChat.mentionPatterns(Signal ondersteunt geen native vermeldingen).messages.groupChat.mentionPatterns(globale fallback).messages.responsePrefix.
Gerelateerd
- Kanalenoverzicht — alle ondersteunde kanalen
- Koppelen — DM-authenticatie en koppelingsflow
- Groepen — groepschatgedrag en vermeldingspoort
- Kanaalroutering — sessieroutering voor berichten
- Beveiliging — toegangsmodel en verharding