Signal (signal-cli)
状態: 外部CLI統合。ゲートウェイはHTTP JSON-RPC + SSE経由で signal-cli と通信します。
クイックセットアップ (初心者向け)
- ボット用に別のSignal番号を使用 (推奨)。
- signal-cli をインストール (Java必須)。
- ボットデバイスをリンクしてデーモンを起動:
- signal-cli link -n "OpenClaw"
- OpenClawを設定してゲートウェイを起動。
最小限の設定:
{
channels: {
signal: {
enabled: true,
account: "+15551234567",
cliPath: "signal-cli",
dmPolicy: "pairing",
allowFrom: ["+15557654321"]
}
}
}
概要
- signal-cli 経由のSignalチャネル (libsignal埋め込みではない)。
- 決定論的ルーティング: 返信は常にSignalに戻ります。
- DMはエージェントのメインセッションを共有。グループは分離 (agent:<agentId>:signal:group:<groupId>)。
設定の書き込み
デフォルトでは、Signalは /config set|unset によってトリガーされる設定更新を許可されています (commands.config: true が必要)。
無効にするには:
{
channels: { signal: { configWrites: false } }
}
番号モデル (重要)
- ゲートウェイはSignalデバイス (signal-cli アカウント) に接続します。
- 個人のSignalアカウントでボットを実行する場合、自分のメッセージは無視されます (ループ保護)。
- 「ボットにテキストを送ると返信する」には、別のボット番号を使用してください。
セットアップ (高速パス)
- signal-cli をインストール (Java必須)。
- ボットアカウントをリンク:
- signal-cli link -n "OpenClaw" してSignalでQRをスキャン。
- Signalを設定してゲートウェイを起動。
例:
{
channels: {
signal: {
enabled: true,
account: "+15551234567",
cliPath: "signal-cli",
dmPolicy: "pairing",
allowFrom: ["+15557654321"]
}
}
}
マルチアカウントサポート: アカウントごとの設定とオプションの name で channels.signal.accounts を使用。共有パターンについては gateway/configuration を参照。
外部デーモンモード (httpUrl)
signal-cli を自分で管理したい場合 (JVMコールドスタートが遅い、コンテナ初期化、または共有CPU)、デーモンを別に実行してOpenClawを指定:
{
channels: {
signal: {
httpUrl: "http://127.0.0.1:8080",
autoStart: false
}
}
}
これにより、OpenClaw内の自動起動と起動待機がスキップされます。自動起動時の起動が遅い場合は、channels.signal.startupTimeoutMs を設定してください。
アクセス制御 (DM + グループ)
DM:
- デフォルト: channels.signal.dmPolicy = "pairing"。
- 未知の送信者はペアリングコードを受け取り、承認されるまでメッセージは無視されます (コードは1時間後に期限切れ)。
- 承認方法:
- openclaw pairing list signal
- openclaw pairing approve signal <CODE>
- ペアリングはSignal DMのデフォルトトークン交換です。詳細: Pairing
- UUIDのみの送信者 (sourceUuid から) は uuid:<id> として channels.signal.allowFrom に保存されます。
グループ:
- channels.signal.groupPolicy = open | allowlist | disabled。
- allowlist が設定されている場合、channels.signal.groupAllowFrom はグループでトリガーできる人を制御します。
仕組み (動作)
- signal-cli はデーモンとして実行。ゲートウェイはSSE経由でイベントを読み取ります。
- インバウンドメッセージは共有チャネルエンベロープに正規化されます。
- 返信は常に同じ番号またはグループにルーティングされます。
メディア + 制限
- アウトバウンドテキストは channels.signal.textChunkLimit にチャンク化 (デフォルト4000)。
- オプションの改行チャンク化: channels.signal.chunkMode="newline" を設定して空白行 (段落境界) で分割してから長さチャンク化。
- 添付ファイル対応 (signal-cli からbase64取得)。
- デフォルトメディアキャップ: channels.signal.mediaMaxMb (デフォルト8)。
- メディアのダウンロードをスキップするには channels.signal.ignoreAttachments を使用。
- グループ履歴コンテキストは channels.signal.historyLimit (または channels.signal.accounts.*.historyLimit) を使用し、messages.groupChat.historyLimit にフォールバック。無効にするには 0 を設定 (デフォルト50)。
タイピング + 既読レシート
- タイピングインジケーター: OpenClawは signal-cli sendTyping 経由でタイピング信号を送信し、返信実行中に更新します。
- 既読レシート: channels.signal.sendReadReceipts がtrueの場合、OpenClawは許可されたDMの既読レシートを転送します。
- Signal-cliはグループの既読レシートを公開しません。
リアクション (メッセージツール)
- channel=signal で message action=react を使用。
- ターゲット: 送信者のE.164またはUUID (ペアリング出力から uuid:<id> を使用。生のUUIDも動作)。
- messageId はリアクションするメッセージのSignalタイムスタンプです。
- グループリアクションには targetAuthor または targetAuthorUuid が必要。
例:
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=✅
設定:
- channels.signal.actions.reactions: リアクションアクションを有効/無効化 (デフォルトtrue)。
- channels.signal.reactionLevel: off | ack | minimal | extensive。
- off/ack はエージェントリアクションを無効化 (メッセージツール react はエラー)。
- minimal/extensive はエージェントリアクションを有効化し、ガイダンスレベルを設定。
- アカウントごとのオーバーライド: channels.signal.accounts.<id>.actions.reactions、channels.signal.accounts.<id>.reactionLevel。
配信ターゲット (CLI/cron)
- DM: signal:+15551234567 (または単純なE.164)。
- UUID DM: uuid:<id> (または生のUUID)。
- グループ: signal:group:<groupId>。
- ユーザー名: username:<name> (Signalアカウントでサポートされている場合)。
設定リファレンス (Signal)
完全な設定: Configuration
プロバイダーオプション:
- channels.signal.enabled: チャネル起動を有効/無効化。
- channels.signal.account: ボットアカウントのE.164。
- channels.signal.cliPath: signal-cli へのパス。
- channels.signal.httpUrl: 完全なデーモンURL (ホスト/ポートを上書き)。
- channels.signal.httpHost、channels.signal.httpPort: デーモンバインド (デフォルト 127.0.0.1:8080)。
- channels.signal.autoStart: デーモンを自動起動 (httpUrl が未設定の場合デフォルトtrue)。
- channels.signal.startupTimeoutMs: 起動待機タイムアウト (ms) (最大120000)。
- channels.signal.receiveMode: on-start | manual。
- channels.signal.ignoreAttachments: 添付ファイルのダウンロードをスキップ。
- channels.signal.ignoreStories: デーモンからのストーリーを無視。
- channels.signal.sendReadReceipts: 既読レシートを転送。
- channels.signal.dmPolicy: pairing | allowlist | open | disabled (デフォルト: pairing)。
- channels.signal.allowFrom: DM許可リスト (E.164または uuid:<id>)。open には "*" が必要。Signalにはユーザー名がありません。電話/UUID IDを使用。
- channels.signal.groupPolicy: open | allowlist | disabled (デフォルト: allowlist)。
- channels.signal.groupAllowFrom: グループ送信者許可リスト。
- channels.signal.historyLimit: コンテキストに含める最大グループメッセージ数 (0で無効化)。
- channels.signal.dmHistoryLimit: ユーザーターンでのDM履歴制限。ユーザーごとのオーバーライド: channels.signal.dms["<phone_or_uuid>"].historyLimit。
- channels.signal.textChunkLimit: アウトバウンドチャンクサイズ (文字数)。
- channels.signal.chunkMode: length (デフォルト) または newline で空白行 (段落境界) で分割してから長さチャンク化。
- channels.signal.mediaMaxMb: インバウンド/アウトバウンドメディアキャップ (MB)。
関連グローバルオプション:
- agents.list[].groupChat.mentionPatterns (Signalはネイティブメンションをサポートしません)。
- messages.groupChat.mentionPatterns (グローバルフォールバック)。
- messages.responsePrefix。