OpenClawSkills
GitHub
Canales • 5 min de lectura

Signal

Integración Signal vía signal-cli (JSON-RPC + SSE): configuración, setup y modelo de números.

Estado: Integración con CLI externo. El Gateway se comunica con signal-cli vía HTTP JSON-RPC + SSE.

Tutorial.step

Configuración Rápida para Principiantes

1. Recomendamos usar un <strong>número de Signal separado</strong> como número del bot.

2. Instala <code>signal-cli</code> (requiere Java).

3. Vincula dispositivo del bot e inicia demonio:

- <code>signal-cli link -n "OpenClaw"</code>

4. Configura OpenClaw e inicia el gateway.

Configuración mínima:

Json5
{
  channels: {
    signal: {
      enabled: true,
      account: "+15551234567",
      cliPath: "signal-cli",
      dmPolicy: "pairing",
      allowFrom: ["+15557654321"],
    },
  },
}
Tutorial.step

Qué Es

- Conecta a Signal vía <code>signal-cli</code> (no libsignal embebido).

- Enrutamiento determinista: las respuestas siempre van de vuelta a Signal.

- DMs usan la sesión principal del agente; chats de grupo se aíslan como '<code>'agent:'<agentId>':signal:group:'<groupId>''</code>'.

Tutorial.step

Escrituras de Config

Por defecto, permite que Signal escriba actualizaciones disparadas por <code>/config set|unset</code> de vuelta al archivo de config (requiere <code>commands.config: true</code>).

Deshabilitar:

Json5
{
  channels: { signal: { configWrites: false } },
}
Tutorial.step

Modelo de Números (Importante)

- El Gateway conecta a un <strong>dispositivo Signal</strong> (i.e., la cuenta logueada por <code>signal-cli</code>).

- Si ejecutas el bot con <strong>tu cuenta personal de Signal</strong>, ignorará mensajes que envíes para evitar loops.

- Si quieres "envío un mensaje al bot, y el bot me responde", por favor usa un <strong>número de bot separado</strong>.

Tutorial.step

Setup (Camino Rápido)

1. Instala <code>signal-cli</code> (requiere Java).

2. Vincula cuenta del bot:

- <code>signal-cli link -n "OpenClaw"</code> luego escanea código QR en Signal

3. Configura e inicia el gateway.

Multi-cuenta: usa '<code>'channels.signal.accounts'</code>' para configurar cada cuenta (opcional '<code>'name'</code>'). Para estructura compartida, ver '<a href="/gateway/configuration#telegramaccounts--discordaccounts--slackaccounts--signalaccounts--imessageaccounts">'/gateway/configuration'</a>'.

Tutorial.step

Modo Demonio Externo (httpUrl)

Si quieres gestionar <code>signal-cli</code> tú mismo (para evitar cold start de JVM, inicialización de contenedor, o overhead de inicio en CPU compartida), puedes ejecutar el demonio separadamente y dejar que OpenClaw se conecte a él:

Json5
{
  channels: {
    signal: {
      httpUrl: "http://127.0.0.1:8080",
      autoStart: false,
    },
  },
}

Esto omite el pull-up automático y la espera de inicio del lado de OpenClaw. Si el inicio es muy lento durante el pull-up automático, puedes ajustar <code>channels.signal.startupTimeoutMs</code>.

Tutorial.step

Control de Acceso (DM + Chat de Grupo)

DM:

- Predeterminado: <code>channels.signal.dmPolicy = "pairing"</code>.

- Remitentes desconocidos reciben un código de emparejamiento, y los mensajes no se procesan hasta ser aprobados (expira en 1 hora).

- Aprobar:

- <code>openclaw pairing list signal</code>

- '<code>'openclaw pairing approve signal '<CODE>''</code>'

- Emparejamiento es el intercambio de token predeterminado para DMs de Signal. Ver '<a href="/start/pairing">'Emparejamiento'</a>'.

- Si el remitente solo tiene UUID (de '<code>'sourceUuid'</code>'), se almacenará en '<code>'channels.signal.allowFrom'</code>' como '<code>'uuid:'<id>''</code>'.

Chat de grupo:

- <code>channels.signal.groupPolicy = open | allowlist | disabled</code>.

- <code>channels.signal.groupAllowFrom</code> controla qué remitentes pueden disparar cuando es <code>allowlist</code>.

Tutorial.step

Cómo Funciona (Comportamiento)

- <code>signal-cli</code> corre como demonio; el gateway lee eventos vía SSE.

- Los mensajes entrantes se normalizan a un sobre de canal común.

ChannelsSignalPage.step08.p3

Tutorial.step

Media and Limits

- Outbound text is split by <code>channels.signal.textChunkLimit</code> (default 4000).

- Optional priority split by blank lines: <code>channels.signal.chunkMode="newline"</code>.

- Supports attachments (provided by <code>signal-cli</code> as base64).

- Default media limit: <code>channels.signal.mediaMaxMb</code> (default 8MB).

- <code>channels.signal.ignoreAttachments</code> can skip media download.

- Group history context: <code>channels.signal.historyLimit</code> (or <code>channels.signal.accounts.*.historyLimit</code>), fallback <code>messages.groupChat.historyLimit</code>. Set to <code>0</code> to disable (default 50).

Tutorial.step

Typing and Read Receipts

- <strong>Typing</strong>: OpenClaw sends typing signals via <code>signal-cli sendTyping</code> and refreshes during reply execution.

- <strong>Read receipts</strong>: When <code>channels.signal.sendReadReceipts</code> is true, OpenClaw forwards read receipts for allowed DMs.

- signal-cli does not support group chat read receipts.

Tutorial.step

Reactions (Message Tool)

- Use message tool: <code>message action=react channel=signal</code>.

- Target can be E.164 or UUID (get '<code>'uuid:'<id>''</code>' from pairing output; bare UUID also works).

- <code>messageId</code> is the Signal timestamp of the message you want to react to.

- Group chat reactions need <code>targetAuthor</code> or <code>targetAuthorUuid</code>.

Examples:

Terminal
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=✅

Config switches:

- <code>channels.signal.actions.reactions</code>: whether to enable reactions (default true).

- <code>channels.signal.reactionLevel</code>: <code>off | ack | minimal | extensive</code>

- <code>off</code>/<code>ack</code> disables agent reactions (message tool <code>react</code> will error)

- <code>minimal</code>/<code>extensive</code> enables agent reactions and sets guidance strength

- Per-account override: '<code>'channels.signal.accounts.'<id>'.actions.reactions'</code>', '<code>'channels.signal.accounts.'<id>'.reactionLevel'</code>'

Tutorial.step

Delivery Target (CLI/cron)

- DM: <code>signal:+15551234567</code> (or directly write E.164)

- UUID DM: '<code>'uuid:'<id>''</code>' (or bare UUID)

- Group chat: '<code>'signal:group:'<groupId>''</code>'

- Username: '<code>'username:'<name>''</code>' (if your Signal account supports it)

Tutorial.step

Referencia de Configuración de Signal

Para referencia completa de configuración, ver '<a href="/gateway/configuration">'Configuración'</a>'.

Opciones de canal:

- <code>channels.signal.enabled</code>

- <code>channels.signal.account</code> (E.164 de la cuenta bot)

- <code>channels.signal.cliPath</code>

- <code>channels.signal.httpUrl</code> (URL del daemon)

- <code>channels.signal.httpHost</code>, <code>channels.signal.httpPort</code> (predeterminado 127.0.0.1:8080)

- <code>channels.signal.autoStart</code> (predeterminado true cuando httpUrl no está establecido)

- <code>channels.signal.startupTimeoutMs</code> (espera de inicio, máx 120000)

- <code>channels.signal.receiveMode</code> (<code>on-start | manual</code>)

- <code>channels.signal.ignoreAttachments</code>

- <code>channels.signal.ignoreStories</code>

- <code>channels.signal.sendReadReceipts</code>

- <code>channels.signal.dmPolicy</code> (<code>pairing | allowlist | open | disabled</code>, predeterminado pairing)

- '<code>'channels.signal.allowFrom'</code>' (lista permitida DM: E.164 o '<code>'uuid:'<id>''</code>'; open necesita '<code>'"*"'</code>')

- <code>channels.signal.groupPolicy</code> (predeterminado allowlist)

- <code>channels.signal.groupAllowFrom</code>

- <code>channels.signal.historyLimit</code> (0 para deshabilitar)

- '<code>'channels.signal.dmHistoryLimit'</code>' (límite de historial DM, por turnos de usuario; sobrescribir por usuario '<code>'channels.signal.dms["'<phone_or_uuid>'"].historyLimit'</code>')

- <code>channels.signal.textChunkLimit</code>

- <code>channels.signal.chunkMode</code>

- <code>channels.signal.mediaMaxMb</code>

Opciones globales relacionadas:

- <code>agents.list[].groupChat.mentionPatterns</code> (Signal no tiene menciones nativas)

- <code>messages.groupChat.mentionPatterns</code>

- <code>messages.responsePrefix</code>