agents.list[].groupChat.mentionPatterns は現在、Telegram、Discord、Slack、iMessage でも使われています。このページでは WhatsApp 固有の挙動に絞って説明します。マルチエージェント構成では、エージェントごとに agents.list[].groupChat.mentionPatterns を設定してください。グローバルなフォールバックとして messages.groupChat.mentionPatterns も利用できます。
実装済みの機能 (2025-12-03)
- 起動モード:
mention(デフォルト) またはalwaysを使えます。mentionでは、実際の WhatsApp の @メンション (mentionedJids)、正規表現パターン、または本文内のボットの E.164 番号のいずれかが必要です。alwaysではすべてのメッセージでエージェントを起動しますが、意味のある応答ができる場合にのみ返信し、それ以外はサイレントトークンNO_REPLYを返します。既定値はchannels.whatsapp.groupsで設定でき、/activationでグループごとに上書きできます。channels.whatsapp.groupsを設定した場合は、グループ allowlist としても機能します。すべてのグループを許可するには"*"を含めてください。 - グループポリシー:
channels.whatsapp.groupPolicyでグループメッセージを受け付けるかどうかを制御します (open|disabled|allowlist)。allowlistではchannels.whatsapp.groupAllowFromを使い、未設定時は明示的なchannels.whatsapp.allowFromへフォールバックします。デフォルトはallowlistで、送信者を追加するまでブロックされます。 - グループごとのセッション: セッションキーは
agent:<agentId>:whatsapp:group:<jid>の形式になります。そのため、/verbose onや/think highのようなコマンドを単独メッセージで送ると、そのグループだけに適用されます。個人 DM の状態には影響しません。ハートビートはグループスレッドでは実行されません。 - コンテキスト注入: 実行をトリガーしなかった保留中のグループメッセージだけが、
[Chat messages since your last reply - for context]の下に付加されます (デフォルトは 50 件)。トリガーになったメッセージは[Current message - respond to this]の下に入ります。すでにセッションへ取り込まれたメッセージは再注入されません。 - 送信者表示: すべてのグループバッチの末尾には
[from: Sender Name (+E164)]が付き、Pi が誰の発言か把握できるようになっています。 - エフェメラル / 1 回表示メッセージ: テキストやメンションを抽出する前にアンラップするため、その中のメンションでもトリガーできます。
- グループ用システムプロンプト: グループセッションの最初のターン、および
/activationでモードが変わるたびに、You are replying inside the WhatsApp group "<subject>". Group members: Alice (+44...), Bob (+43...), … Activation: trigger-only … Address the specific sender noted in the message context.のような短い説明をシステムプロンプトへ注入します。メタデータが取れない場合でも、グループチャットであることはエージェントへ伝えられます。
設定例 (WhatsApp)
~/.openclaw/openclaw.json に groupChat ブロックを追加すると、WhatsApp が本文中の見た目上の @ を取り除いた場合でも、表示名によるメンションを検出できます。
- 正規表現は大文字小文字を区別しません。
@openclawのような表示名メンションと、+や空白の有無にかかわらず生の番号を拾えるようにしています。 - 誰かが連絡先をタップした場合、WhatsApp は通常
mentionedJids経由で正規のメンションを送るため、番号フォールバックは必須ではありません。ただし、安全策としては有用です。
起動コマンド (オーナーのみ)
グループチャットで次のコマンドを使います。/activation mention/activation always
channels.whatsapp.allowFrom、未設定の場合はボット自身の E.164) だけです。グループで /status を単独メッセージとして送ると、現在の起動モードを確認できます。
使い方
- OpenClaw を実行している WhatsApp アカウントをグループへ追加します。
@openclaw ...と送るか、番号を本文に含めます。groupPolicy: "open"にしていない限り、トリガーできるのは allowlist に登録された送信者だけです。- エージェントのプロンプトには最近のグループコンテキストと末尾の
[from: ...]マーカーが入るため、誰に向けた返信か判断できます。 - セッション単位の指示 (
/verbose on、/think high、/new、/reset、/compact) は、そのグループのセッションにだけ適用されます。反映させるには単独メッセージで送ってください。個人 DM セッションは独立したままです。
テスト / 検証
- 手動スモークテスト:
- グループで
@openclawメンションを送り、送信者名を参照した返信が返ることを確認します。 - 2 回目のメンションを送り、履歴ブロックが含まれ、次のターンで消えることを確認します。
- グループで
- ゲートウェイログを
--verbose付きで確認し、from: <groupJid>と[from: ...]のサフィックスが入ったinbound web messageエントリを確認します。
注意点
- ハートビートはノイズの多いブロードキャストを避けるため、グループでは意図的に無効化されています。
- エコー抑制は結合済みのバッチ文字列に対して働きます。メンションなしで同じテキストを 2 回送ると、返信は最初の 1 回だけになることがあります。
- セッションストアには
agent:<agentId>:whatsapp:group:<jid>という形式でエントリが保存されます (デフォルトの保存先は~/.openclaw/agents/<agentId>/sessions/sessions.json)。エントリがない場合は、そのグループでまだ実行が発生していないことを意味します。 - グループでのタイピングインジケーターは
agents.defaults.typingModeに従います。デフォルトは、未メンション時にmessageです。