WhatsApp(Web チャンネル)
ステータス: WhatsApp Web(Baileys)経由で本番運用可能です。Gateway がリンク済みセッションを管理します。インストール(必要時)
- オンボーディング(
openclaw onboard)とopenclaw channels add --channel whatsappでは、初めて WhatsApp plugin を選択したときにインストールを促します。 openclaw channels login --channel whatsappでも、plugin がまだ存在しない場合は インストールフローが提供されます。- 開発チャンネル + git checkout: デフォルトでローカル plugin パスを使用します。
- Stable/Beta: デフォルトで npm package
@openclaw/whatsappを使用します。
Pairing
不明な送信者に対するデフォルトの DM policy は pairing です。
Channel troubleshooting
チャンネル横断の診断と修復プレイブック。
Gateway configuration
チャンネル設定パターンと例の完全版。
クイックセットアップ
可能であれば、OpenClaw は WhatsApp を別番号で運用することを推奨します。(チャンネル metadata とセットアップフローはその構成向けに最適化されていますが、個人番号での構成にも対応しています。)
デプロイパターン
専用番号(推奨)
専用番号(推奨)
これは最もすっきりした運用モードです:
- OpenClaw 用に分離された WhatsApp identity
- より明確な DM allowlist とルーティング境界
- self-chat の混乱が起きる可能性が低い
個人番号でのフォールバック
個人番号でのフォールバック
オンボーディングは個人番号モードをサポートしており、self-chat に適したベースラインを書き込みます:
dmPolicy: "allowlist"allowFromにあなたの個人番号が含まれるselfChatMode: true
allowFrom に基づいて動作します。WhatsApp Web 専用のチャンネルスコープ
WhatsApp Web 専用のチャンネルスコープ
現在の OpenClaw チャンネルアーキテクチャでは、このメッセージングプラットフォームチャンネルは WhatsApp Web ベース(
Baileys)です。組み込みの chat-channel registry には、別個の Twilio WhatsApp メッセージングチャンネルはありません。ランタイムモデル
- Gateway が WhatsApp socket と再接続ループを管理します。
- 外向き送信には、対象アカウントに対するアクティブな WhatsApp listener が必要です。
- ステータスチャットとブロードキャストチャットは無視されます(
@status,@broadcast)。 - ダイレクトチャットは DM session ルール(
session.dmScope)を使用します。デフォルトのmainでは DM は agent の main session に集約されます。 - グループセッションは分離されます(
agent:<agentId>:whatsapp:group:<jid>)。 - WhatsApp Web transport は Gateway host 上の標準 proxy 環境変数(
HTTPS_PROXY,HTTP_PROXY,NO_PROXY/ 小文字版)を尊重します。チャンネル固有の WhatsApp proxy 設定よりも host レベルの proxy 設定を推奨します。
アクセス制御と有効化
- DM policy
- グループポリシー + allowlist
- Mention + /activation
channels.whatsapp.dmPolicy はダイレクトチャットへのアクセスを制御します:pairing(デフォルト)allowlistopen(allowFromに"*"を含める必要があります)disabled
allowFrom は E.164 形式の番号を受け付けます(内部で正規化されます)。マルチアカウント上書き: channels.whatsapp.accounts.<id>.dmPolicy(および allowFrom)は、そのアカウントに対してチャンネルレベルのデフォルトより優先されます。ランタイム動作の詳細:- pairing はチャンネル allow-store に永続化され、設定済みの
allowFromとマージされます - allowlist が設定されていない場合、リンク済みの self 番号はデフォルトで許可されます
- 外向きの
fromMeDM は自動 pairing されません
個人番号と self-chat の動作
リンク済み self 番号がallowFrom にも存在する場合、WhatsApp の self-chat 保護が有効になります:
- self-chat ターンでは既読通知をスキップします
- 本来なら自分自身を ping してしまう mention-JID 自動トリガー動作を無視します
messages.responsePrefixが未設定の場合、self-chat 返信のデフォルトは[{identity.name}]または[openclaw]になります
メッセージ正規化とコンテキスト
受信 envelope + reply コンテキスト
受信 envelope + reply コンテキスト
受信した WhatsApp メッセージは共有の受信 envelope でラップされます。引用 reply が存在する場合、コンテキストは次の形式で追加されます:Reply metadata フィールドも利用可能な場合は設定されます(
ReplyToId, ReplyToBody, ReplyToSender, sender JID/E.164)。media placeholder と位置情報/連絡先の抽出
media placeholder と位置情報/連絡先の抽出
media のみの受信メッセージは、次のような placeholder で正規化されます:
<media:image><media:video><media:audio><media:document><media:sticker>
保留中のグループ履歴注入
保留中のグループ履歴注入
グループでは、未処理メッセージをバッファし、bot が最終的にトリガーされたときにコンテキストとして注入できます。
- デフォルト上限:
50 - 設定:
channels.whatsapp.historyLimit - フォールバック:
messages.groupChat.historyLimit 0で無効化
[Chat messages since your last reply - for context][Current message - respond to this]
既読通知
既読通知
既読通知は、受理された受信 WhatsApp メッセージに対してデフォルトで有効です。グローバルに無効化するには:アカウントごとの上書き:self-chat ターンでは、グローバルに有効でも既読通知はスキップされます。
配信、chunking、media
テキスト chunking
テキスト chunking
- デフォルトの chunk 上限:
channels.whatsapp.textChunkLimit = 4000 channels.whatsapp.chunkMode = "length" | "newline"newlineモードは段落区切り(空行)を優先し、その後、長さ安全な chunking にフォールバックします
外向き media の動作
外向き media の動作
- image、video、audio(PTT voice-note)、document payload をサポートします
audio/oggは voice-note 互換性のためaudio/ogg; codecs=opusに書き換えられます- アニメーション GIF 再生は video 送信時の
gifPlayback: trueでサポートされます - 複数 media の reply payload を送信する場合、caption は最初の media item に適用されます
- media source は HTTP(S)、
file://、またはローカルパスが使用できます
media サイズ制限とフォールバック動作
media サイズ制限とフォールバック動作
- 受信 media 保存上限:
channels.whatsapp.mediaMaxMb(デフォルト50) - 外向き media 送信上限:
channels.whatsapp.mediaMaxMb(デフォルト50) - アカウントごとの上書きは
channels.whatsapp.accounts.<accountId>.mediaMaxMbを使用します - image は制限に収まるよう自動最適化されます(リサイズ/品質スイープ)
- media 送信失敗時、最初の item のフォールバックは、応答を黙って落とす代わりにテキスト警告を送信します
Reaction level
channels.whatsapp.reactionLevel は、agent が WhatsApp で emoji reaction をどの程度広く使うかを制御します:
| Level | Ack reaction | agent 開始 reaction | 説明 |
|---|---|---|---|
"off" | いいえ | いいえ | reaction をまったく使用しません |
"ack" | はい | いいえ | Ack reaction のみ(返信前受領) |
"minimal" | はい | はい(保守的) | Ack + 保守的ガイダンスでの agent reaction |
"extensive" | はい | はい(推奨) | Ack + 推奨ガイダンスでの agent reaction |
"minimal"。
アカウントごとの上書きは channels.whatsapp.accounts.<id>.reactionLevel を使用します。
Acknowledgment reaction
WhatsApp はchannels.whatsapp.ackReaction により、受信時に即時の ack reaction をサポートします。
Ack reaction は reactionLevel によって制御され、reactionLevel が "off" の場合は抑制されます。
- 受信が受理された直後に送信されます(返信前)
- 失敗はログに記録されますが、通常の返信配信は妨げません
- グループモード
mentionsは mention によってトリガーされたターンで reaction します。グループ activation のalwaysはこのチェックのバイパスとして機能します - WhatsApp は
channels.whatsapp.ackReactionを使用します(レガシーのmessages.ackReactionはここでは使われません)
マルチアカウントと認証情報
アカウント選択とデフォルト
アカウント選択とデフォルト
- account id は
channels.whatsapp.accountsから取得されます - デフォルトアカウント選択:
defaultが存在すればそれ、なければ最初に設定された account id(ソート済み) - account id は参照用に内部で正規化されます
認証情報パスとレガシー互換性
認証情報パスとレガシー互換性
- 現在の auth パス:
~/.openclaw/credentials/whatsapp/<accountId>/creds.json - バックアップファイル:
creds.json.bak ~/.openclaw/credentials/内のレガシーなデフォルト auth も、デフォルトアカウントフロー向けに引き続き認識/移行されます
ログアウト動作
ログアウト動作
openclaw channels logout --channel whatsapp [--account <id>] は、そのアカウントの WhatsApp auth 状態をクリアします。レガシー auth ディレクトリでは、oauth.json は保持され、Baileys auth ファイルは削除されます。Tools、actions、および config 書き込み
- agent tool サポートには WhatsApp reaction action(
react)が含まれます。 - Action ゲート:
channels.whatsapp.actions.reactionschannels.whatsapp.actions.polls
- チャンネル起点の config 書き込みはデフォルトで有効です(
channels.whatsapp.configWrites=falseで無効化)。
トラブルシューティング
未リンク(QR が必要)
未リンク(QR が必要)
症状: チャンネル status が未リンクと表示されます。対処:
リンク済みだが切断される / 再接続ループ
リンク済みだが切断される / 再接続ループ
症状: アカウントはリンク済みだが、切断または再接続試行が繰り返されます。対処:必要に応じて、
channels login で再リンクしてください。送信時にアクティブな listener がない
送信時にアクティブな listener がない
対象アカウントに対してアクティブな Gateway listener が存在しない場合、外向き送信は即座に失敗します。Gateway が起動していて、アカウントがリンク済みであることを確認してください。
グループメッセージが想定外に無視される
グループメッセージが想定外に無視される
次の順序で確認してください:
groupPolicygroupAllowFrom/allowFromgroupsallowlist エントリ- mention 制御(
requireMention+ mention pattern) openclaw.json(JSON5)内の重複キー: 後のエントリが前のものを上書きするため、各スコープではgroupPolicyを 1 つだけにしてください
Bun ランタイム警告
Bun ランタイム警告
WhatsApp Gateway ランタイムは Node を使用する必要があります。Bun は、安定した WhatsApp/Telegram Gateway 運用とは互換性がないとして扱われます。
System prompt
WhatsApp は、グループチャットとダイレクトチャット向けに、Telegram スタイルの system prompt をgroups マップと direct マップ経由でサポートしています。
グループメッセージの解決階層:
まず有効な groups マップが決まります。アカウントが独自の groups を定義している場合、それはルートの groups マップを完全に置き換えます(deep merge なし)。その後、prompt の検索は、その結果得られた単一マップに対して行われます:
- グループ固有の system prompt(
groups["<groupId>"].systemPrompt): 特定のグループエントリがsystemPromptを定義している場合に使用されます。 - グループ wildcard system prompt(
groups["*"].systemPrompt): 特定のグループエントリが存在しないか、systemPromptを定義していない場合に使用されます。
direct マップが決まります。アカウントが独自の direct を定義している場合、それはルートの direct マップを完全に置き換えます(deep merge なし)。その後、prompt の検索は、その結果得られた単一マップに対して行われます:
- ダイレクト固有の system prompt(
direct["<peerId>"].systemPrompt): 特定の peer エントリがsystemPromptを定義している場合に使用されます。 - ダイレクト wildcard system prompt(
direct["*"].systemPrompt): 特定の peer エントリが存在しないか、systemPromptを定義していない場合に使用されます。
dms は引き続き軽量な DM ごとの履歴上書きバケット(dms.<id>.historyLimit)です。prompt の上書きは direct の下に置かれます。
Telegram のマルチアカウント動作との違い: Telegram では、ある bot が所属していないグループのメッセージを受信するのを防ぐため、マルチアカウント構成では、独自の groups を定義していないアカウントも含めて、ルート groups はすべてのアカウントで意図的に抑制されます。WhatsApp ではこのガードは適用されません。ルート groups とルート direct は、設定されているアカウント数にかかわらず、アカウントレベルの上書きを定義していないアカウントに常に継承されます。マルチアカウントの WhatsApp 構成でアカウントごとのグループまたはダイレクト prompt が必要な場合は、ルートレベルのデフォルトに依存せず、各アカウントの下で完全なマップを明示的に定義してください。
重要な動作:
channels.whatsapp.groupsは、グループごとの config マップであると同時に、チャットレベルのグループ allowlist でもあります。ルートまたはアカウントスコープのいずれでも、groups["*"]はそのスコープに対して「すべてのグループを受け入れる」ことを意味します。- wildcard グループ
systemPromptは、そのスコープですでにすべてのグループを受け入れたい場合にのみ追加してください。引き続き固定のグループ ID のみを対象にしたい場合は、prompt のデフォルトとしてgroups["*"]を使用しないでください。代わりに、明示的に allowlist した各グループエントリに prompt を繰り返し設定してください。 - グループ受け入れと送信者認可は別のチェックです。
groups["*"]はグループ処理に到達できるグループの集合を広げますが、それ自体でそれらのグループ内のすべての送信者を認可するわけではありません。送信者アクセスは、引き続きchannels.whatsapp.groupPolicyとchannels.whatsapp.groupAllowFromによって個別に制御されます。 channels.whatsapp.directには DM に対して同じ副作用はありません。direct["*"]は、DM がdmPolicyとallowFromまたは pairing-store ルールによってすでに受け入れられた後にのみ、デフォルトのダイレクトチャット config を提供します。
設定リファレンスへのポインタ
主なリファレンス: 重要度の高い WhatsApp フィールド:- アクセス:
dmPolicy,allowFrom,groupPolicy,groupAllowFrom,groups - 配信:
textChunkLimit,chunkMode,mediaMaxMb,sendReadReceipts,ackReaction,reactionLevel - マルチアカウント:
accounts.<id>.enabled,accounts.<id>.authDir, アカウントレベルの上書き - 運用:
configWrites,debounceMs,web.enabled,web.heartbeatSeconds,web.reconnect.* - セッション動作:
session.dmScope,historyLimit,dmHistoryLimit,dms.<id>.historyLimit - prompt:
groups.<id>.systemPrompt,groups["*"].systemPrompt,direct.<id>.systemPrompt,direct["*"].systemPrompt