設定

グループメッセージ

目標: ClawdをWhatsAppグループに参加させ、pingされた時だけ起動し、そのスレッドを個人DMセッションとは別に維持します。注: agents.list[].groupChat.mentionPatterns は現在、Telegram/Discord/Slack/iMessageでも使用されています。このドキュメントはWhatsApp固有の動作に焦点を当てています。マルチエージェント設定では、エージェントごとに agents.list[].groupChat.mentionPatterns を設定します(または、グローバルなフォールバックとして messages.groupChat.mentionPatterns を使用します)。

実装済みの機能 (2025-12-03)

  • 起動モード: mention (デフォルト) または alwaysmention はping(実際のWhatsAppの@メンション(mentionedJids経由)、正規表現パターン、またはテキスト内の任意の場所にあるボットのE.164番号)を必要とします。always はすべてのメッセージでエージェントを起動しますが、意味のある価値を追加できる場合にのみ返信し、それ以外の場合はサイレントトークン NO_REPLY を返します。デフォルトは設定(channels.whatsapp.groups)で設定でき、グループごとに /activation コマンドで上書きできます。channels.whatsapp.groups が設定されている場合、それはグループ許可リストとしても機能します(すべてを許可するには "*" を含めます)。
  • グループポリシー: channels.whatsapp.groupPolicy はグループメッセージを受け入れるかどうかを制御します(open|disabled|allowlist)。allowlistchannels.whatsapp.groupAllowFrom を使用します(フォールバック: 明示的な channels.whatsapp.allowFrom)。デフォルトは allowlist です(送信者を追加するまでブロックされます)。
  • グループごとのセッション: セッションキーは agent:<agentId>:whatsapp:group:<jid> のようになります。そのため、/verbose on/think high などのコマンド(スタンドアロンメッセージとして送信)はそのグループにスコープされます。個人DMの状態は影響を受けません。グループスレッドではハートビートはスキップされます。
  • コンテキスト注入: 保留中の グループメッセージ(デフォルト50件)で、実行をトリガーしなかったものは、[前回の返信以降のチャットメッセージ - コンテキスト用] の下にプレフィックスとして追加され、トリガーとなった行は [現在のメッセージ - これに返信してください] の下に追加されます。セッションに既にあるメッセージは再注入されません。
  • 送信者の表示: すべてのグループバッチの末尾に [from: 送信者名 (+E164)] が追加されるようになりました。これによりPiは誰が話しているかを認識できます。
  • エフェメラル/一度だけ表示: テキスト/メンションを抽出する前にこれらを展開するため、内部にあるpingもトリガーします。
  • グループシステムプロンプト: グループセッションの最初のターン(および /activation でモードが変更されるたび)に、システムプロンプトに短い説明を注入します。例: あなたはWhatsAppグループ「<件名>」内で返信しています。グループメンバー: Alice (+44...), Bob (+43...), … 起動: trigger-only … メッセージコンテキストに記載されている特定の送信者に宛てて返信してください。 メタデータが利用できない場合でも、エージェントにそれがグループチャットであることを伝えます。

設定例 (WhatsApp)

~/.openclaw/openclaw.jsongroupChat ブロックを追加します。これにより、WhatsAppがテキスト本文内の視覚的な @ を取り除いても、表示名によるpingが機能します:

{
  channels: {
    whatsapp: {
      groups: {
        "*": { requireMention: true },
      },
    },
  },
  agents: {
    list: [
      {
        id: "main",
        groupChat: {
          historyLimit: 50,
          mentionPatterns: ["@?openclaw", "\\+?15555550123"],
        },
      },
    ],
  },
}

注記:

  • 正規表現は大文字小文字を区別しません。これらは @openclaw のような表示名のpingや、+/スペースの有無に関わらない生の番号をカバーします。
  • WhatsAppは、誰かが連絡先をタップしたときに、標準的なメンションを mentionedJids 経由で送信するため、番号フォールバックはほとんど必要ありませんが、有用な安全策です。

起動コマンド (所有者のみ)

グループチャットコマンドを使用します:

  • /activation mention
  • /activation always

所有者番号(channels.whatsapp.allowFrom から、または設定されていない場合はボット自身のE.164)のみがこれを変更できます。グループ内でスタンドアロンメッセージとして /status を送信すると、現在の起動モードを確認できます。

使用方法

  1. WhatsAppアカウント(OpenClawを実行しているもの)をグループに追加します。
  2. @openclaw … と言います(または番号を含めます)。groupPolicy: "open" を設定しない限り、許可リストに登録された送信者のみが起動できます。
  3. エージェントのプロンプトには、最近のグループコンテキストと末尾の [from: …] マーカーが含まれ、適切な人物に返信できるようになります。
  4. セッションレベルのディレクティブ(/verbose on/think high/new または /reset/compact)はそのグループのセッションにのみ適用されます。これらを登録するには、スタンドアロンメッセージとして送信してください。個人DMセッションは独立したままです。

テスト / 検証

  • 手動での簡易テスト:
    • グループ内で @openclaw pingを送信し、送信者名を参照した返信があることを確認します。
    • 2回目のpingを送信し、履歴ブロックが含まれ、次のターンでクリアされることを確認します。
  • ゲートウェイログ(--verbose で実行)をチェックして、from: <groupJid>[from: …] サフィックスを示す inbound web message エントリを確認します。

既知の考慮事項

  • ハートビートは、騒々しいブロードキャストを避けるために、グループでは意図的にスキップされます。
  • エコー抑制は結合されたバッチ文字列を使用します。メンションなしで同じテキストを2回送信した場合、最初のものだけが応答を受け取ります。
  • セッションストアエントリは、セッションストア(デフォルトでは ~/.openclaw/agents/<agentId>/sessions/sessions.json)に agent:<agentId>:whatsapp:group:<jid> として表示されます。エントリがないのは、グループがまだ実行をトリガーしていないことを意味します。
  • グループ内の入力インジケーターは agents.defaults.typingMode に従います(デフォルト: メンションされていない場合は message)。

ペアリンググループ