初心者向け概要 (2 分)
OpenClaw は自分のメッセージングアカウント上に「常駐」します。独立した WhatsApp ボットユーザーはありません。あなたがグループに参加していれば、OpenClaw はそのグループを参照し、そこで応答できます。 デフォルトの動作:- グループは制限されます (
groupPolicy: "allowlist")。グループ送信者は許可リストに入るまでブロックされます。 - グループでメンションゲートを無効にしない限り、返信にはメンションが必要です。
- 最終返信テキストは自動的にルームへ投稿されます (
visibleReplies: "automatic")。
要約
- DM アクセスは
*.allowFromで制御されます。 - グループアクセスは
*.groupPolicy+ 許可リスト (*.groups,*.groupAllowFrom) で制御されます。 - 返信の起動はメンションゲート (
requireMention,/activation) で制御されます。
可視返信
通常のグループ/チャンネルリクエストでは、OpenClaw のデフォルトはmessages.groupChat.visibleReplies: "automatic" です。最終アシスタントテキストは、可視返信としてルームに投稿されます。
共有ルームで、エージェントが message(action=send) を呼び出して発話タイミングを決められるようにする場合は、messages.groupChat.visibleReplies: "message_tool" を使用します。これはツールを確実に使えるモデル (たとえば GPT 5.5) で最も効果的です。モデルがツールを使い忘れて実質的な最終テキストを返した場合、OpenClaw はそれをルームへ投稿せず非公開のまま保持します。
ツールのみの配信に確実に従わないモデルやランタイムには "automatic" を使用します。通常の最終テキストはルームへ直接投稿され、エージェントは最終テキストに同梱できないファイル、画像、その他の添付ファイルについては引き続き message(action=send) を呼び出せます。
アクティブなツールポリシーでメッセージツールが利用できない場合、OpenClaw はレスポンスを黙って抑制するのではなく、自動可視返信にフォールバックします。openclaw doctor はこの不一致について警告します。
ダイレクトチャットやその他のソースイベントでは、messages.visibleReplies: "message_tool" が同じツールのみの動作をグローバルに適用します。messages.groupChat.visibleReplies は、グループ/チャンネルルーム向けのより具体的な上書きとして残ります。内部 WebChat の直接ターンは、Pi と Codex が同じ可視返信契約を受け取れるように、デフォルトで自動の最終返信配信になります。
ツールのみモードは、ほとんどの潜伏モードのターンでモデルに NO_REPLY と答えさせる古いパターンを置き換えます。ツールのみモードでは、プロンプトは NO_REPLY 契約を定義しません。可視の動作を何もしないことは、単にメッセージツールを呼び出さないことを意味します。
Plugin が所有する会話バインディングは例外です。Plugin がスレッドをバインドして受信ターンを引き受けると、その Plugin が返す返信が可視のバインディングレスポンスになります。message(action=send) は不要です。その返信は Plugin ランタイムの出力であり、非公開のモデル最終テキストではありません。
入力インジケーターは、直接のグループリクエストでは引き続き送信されます。アンビエントの常時オンルームイベントは、有効な場合でも、エージェントがメッセージツールを呼び出さない限り厳密かつ静かに保たれます。
セッションはデフォルトで冗長なツール/進捗サマリーを抑制します。デバッグ中に現在のセッションで表示するには /verbose on (または /verbose full) を使用し、最終返信のみの動作に戻すには /verbose off を使用します。冗長状態はセッション単位で、ダイレクトチャット、グループ、チャンネル、フォーラムトピックで同じように動作します。
メンションされていない常時オンのグループ雑談をユーザーリクエストではなく静かなルームコンテキストとして送信するには、アンビエントルームイベントを使用します。
unmentionedInbound: "user_request" です。メンションされたメッセージ、コマンド、中止リクエスト、DM はユーザーリクエストのままです。
グループ/チャンネルリクエストで可視出力がメッセージツールを通ることを必須にするには:
messages 設定変更を取り込みます。再起動が必要なのは、設定リロードが無効 (gateway.reload.mode: "off") の場合だけです。
コマンドターンは visibleReplies: "message_tool" を迂回し、常に可視で返信します。ネイティブスラッシュコマンド (Discord、Telegram、およびネイティブコマンド対応のその他のサーフェス) と承認済みテキスト /... コマンドは、どちらもレスポンスをソースチャットへ投稿します。グループ内の未承認テキスト /... ターンはメッセージツールのみのままです。通常のチャットターンは設定されたデフォルトに従います。
コンテキストの可視性と許可リスト
グループの安全性には 2 つの異なる制御が関係します。- 起動の承認: 誰がエージェントを起動できるか (
groupPolicy,groups,groupAllowFrom, チャンネル固有の許可リスト)。 - コンテキストの可視性: どの補足コンテキストをモデルに注入するか (返信/引用テキスト、スレッド履歴、転送メタデータ)。
contextVisibility を設定します。
| モード | 動作 |
|---|---|
"all" (デフォルト) | 受信した補足コンテキストをそのまま保持します。 |
"allowlist" | 許可リストに入った送信者からの履歴/スレッド/引用/転送コンテキストのみ注入します。 |
"allowlist_quote" | allowlist に加えて、任意の送信者から明示的に引用/返信されたメッセージを保持します。 |
channels.<channel>.contextVisibility)、アカウント単位 (channels.<channel>.accounts.<accountId>.contextVisibility)、またはグローバル (channels.defaults.contextVisibility) に設定します。補足コンテキストを取得するチャンネル (Discord、Feishu、iMessage、Matrix、Microsoft Teams、Signal、Slack、Telegram、WhatsApp) は、受信コンテキストを構築するときにこのポリシーを適用します。不明なポリシーの組み合わせはフェイルクローズし、コンテキストを省略します。
| 目的 | 設定内容 |
|---|---|
| すべてのグループを許可するが @メンション時のみ返信 | groups: { "*": { requireMention: true } } |
| すべてのグループ返信を無効化 | groupPolicy: "disabled" |
| 特定のグループのみ | groups: { "<group-id>": { ... } } ("*" キーなし) |
| グループ内であなただけが起動できる | groupPolicy: "allowlist", groupAllowFrom: ["+1555..."] |
| 信頼済み送信者セットをチャンネル間で再利用 | groupAllowFrom: ["accessGroup:operators"] |
セッションキー
- グループセッションは
agent:<agentId>:<channel>:group:<id>セッションキーを使用します (ルーム/チャンネルはagent:<agentId>:<channel>:channel:<id>を使用します)。 - Telegram フォーラムトピックは、各トピックが独自のセッションを持つように、グループ ID に
:topic:<threadId>を追加します。 - ダイレクトチャットはメインセッションを使用します (または
session.dmScopeが設定されている場合は送信者ごとのセッション)。 - Heartbeat は設定された Heartbeat セッションで実行されます (デフォルト: エージェントのメインセッション)。グループセッションは独自の Heartbeat を実行しません。
パターン: 個人 DM + 公開グループ (単一エージェント)
はい。「個人」トラフィックが DM で、「公開」トラフィックが グループ なら、これはうまく機能します。 理由: 単一エージェントモードでは、DM は通常 メイン セッションキー (agent:main:main) に入り、グループは常に 非メイン セッションキー (agent:main:<channel>:group:<id>) を使用します。mode: "non-main" でサンドボックス化を有効にすると、それらのグループセッションは設定されたサンドボックスバックエンドで実行され、メイン DM セッションはホスト上に残ります。バックエンドを選ばない場合、Docker がデフォルトです。
これにより、1 つのエージェント「頭脳」(共有ワークスペース + メモリ) で、2 つの実行姿勢を持てます。
- DM: フルツール (ホスト)
- グループ: サンドボックス + 制限付きツール
本当に分離されたワークスペース/ペルソナ (「個人」と「公開」が決して混ざってはならない) が必要な場合は、2 つ目のエージェント + バインディングを使用してください。マルチエージェントルーティングを参照してください。
- DM はホスト上、グループはサンドボックス化
- グループには許可リストに入ったフォルダーだけを見せる
- 設定キーとデフォルト: Gateway 設定
- ツールがブロックされる理由のデバッグ: サンドボックス vs ツールポリシー vs 昇格
- バインドマウントの詳細: サンドボックス化
表示ラベル
- UI ラベルは、利用可能な場合
displayNameを使用し、<channel>:<token>としてフォーマットされます。 #roomはルーム/チャンネル用に予約されています。グループチャットはg-<slug>(小文字、スペース ->-、#@+._-は保持) を使用します。非常に長い不透明な ID は、完全なルート ID を UI に漏らす代わりに、安定したトークンへ短縮されます。
グループポリシー
チャンネルごとにグループ/ルームメッセージの処理方法を制御します:| ポリシー | 動作 |
|---|---|
"open" | グループは許可リストをバイパスします。メンションゲーティングは引き続き適用されます。 |
"disabled" | すべてのグループメッセージを完全にブロックします。 |
"allowlist" | 設定された許可リストに一致するグループ/ルームのみを許可します。 |
チャンネル別の注記
チャンネル別の注記
groupPolicyはメンションゲーティング(@メンションを要求するもの)とは別です。- WhatsApp/Telegram/Signal/iMessage/Microsoft Teams/Zalo:
groupAllowFromを使用します(フォールバック: 明示的なallowFrom)。 - Signal:
groupAllowFromは、受信した Signal グループ ID または送信者の電話番号/UUID のいずれにも一致できます。 - DM ペアリング承認(
*-allowFromストアエントリ)は DM アクセスにのみ適用されます。グループ送信者の承認は、グループ許可リストに対して明示的なままです。 - Discord: 許可リストは
channels.discord.guilds.<id>.channelsを使用します。 - Slack: 許可リストは
channels.slack.channelsを使用します。 - Matrix: 許可リストは
channels.matrix.groupsを使用します。ルーム ID(!room:server)またはエイリアス(#alias:server)を使用します。ルーム名キーはchannels.matrix.dangerouslyAllowNameMatching: trueの場合にのみ一致し、解決できないエントリはランタイムで無視されます。送信者を制限するにはchannels.matrix.groupAllowFromを使用します。ルーム単位のusers許可リストもサポートされています。 - グループ DM は別個に制御されます(
channels.discord.dm.*、channels.slack.dm.*:groupEnabled、groupChannels)。 - Telegram: 送信者許可リストは数値ユーザー ID のみを受け入れます(
"123456789"。telegram:/tg:プレフィックスは大文字小文字を区別せずに削除されます)。@usernameエントリはランタイムで一致せず、警告をログに記録します。セットアップは@usernameを ID に解決します。負のチャット ID は送信者許可リストではなくchannels.telegram.groupsに属します。 - デフォルトは
groupPolicy: "allowlist"です。グループ許可リストが空の場合、グループメッセージはブロックされます。 - ランタイムの安全性: プロバイダーブロックが完全に欠落している場合(
channels.<provider>が存在しない場合)、グループポリシーはchannels.defaults.groupPolicyを継承する代わりにallowlistにフェイルクローズし、Gateway はアカウントごとに一度だけフォールバックをログに記録します。
メンションゲーティング(デフォルト)
グループメッセージは、グループごとに上書きされない限りメンションを要求します。デフォルトはサブシステムごとに*.groups."*" の下にあります。
チャンネルが返信メタデータを公開している場合、ボットメッセージへの返信は暗黙のメンションとして扱われます。引用メタデータを公開しているチャンネルでは、ボットメッセージの引用もメンションとして扱われることがあります。現在の組み込みケース: Discord、Microsoft Teams、QQBot、Slack、Telegram、WhatsApp、Zalo personal。
設定済みメンションパターンのスコープ指定
設定済みのmentionPatterns は正規表現のフォールバックトリガーです。プラットフォームがネイティブのボットメンションを公開しない場合、または openclaw: のようなプレーンテキストをメンションとして扱う必要がある場合に使用します。ネイティブのプラットフォームメンションは別です。Discord、Slack、Telegram、Matrix、または別のチャンネルが、そのメッセージでボットが明示的にメンションされたことを証明できる場合、設定済みの正規表現パターンが拒否される場所でも、そのネイティブメンションは引き続きトリガーします。
デフォルトでは、設定済みメンションパターンは、チャンネルがプロバイダーと会話の情報をメンション検出に渡すすべての場所で適用されます。広範なパターンがすべてのグループでエージェントを起動しないようにするには、channels.<channel>.mentionPatterns を使ってチャンネルごとにスコープを指定します。
正規表現メンションパターンをチャンネルでデフォルト無効にし、特定のルームだけ allowIn で有効にする場合は、mode: "deny" を使用します。
denyIn によって無効にする場合は、デフォルトの mode: "allow" を使用します(または mode を省略します)。
| フィールド | 効果 |
|---|---|
mode: "allow" | 会話 ID が denyIn に含まれていない限り、正規表現メンションパターンは有効です。これがデフォルトです。 |
mode: "deny" | 会話 ID が allowIn に含まれていない限り、正規表現メンションパターンは無効です。 |
allowIn | 拒否モードで正規表現メンションパターンが有効になる会話 ID。 |
denyIn | 正規表現メンションパターンが無効になる会話 ID。同じ ID が両方に含まれる場合、denyIn が allowIn より優先されます。 |
| チャンネル | allowIn / denyIn で使用される ID |
|---|---|
| Discord | Discord チャンネル ID。 |
| Matrix | Matrix ルーム ID。 |
| Slack | Slack チャンネル ID。 |
| Telegram | グループチャット ID、またはフォーラムトピック用の chatId:topic:threadId。 |
123@g.us などの WhatsApp 会話 ID。 |
channels.<channel>.accounts.<accountId>.mentionPatterns の下に設定できます。アカウントポリシーは、そのアカウントに対してトップレベルのチャンネルポリシーより優先されます。
メンションゲーティングの注記
メンションゲーティングの注記
mentionPatternsは大文字小文字を区別しない安全な正規表現パターンです。無効なパターンと安全でないネストされた繰り返し形式は無視されます(警告付き)。- パターンの優先順位:
agents.list[].groupChat.mentionPatterns(複数のエージェントがグループを共有する場合に便利)がmessages.groupChat.mentionPatternsを上書きします。どちらも設定されていない場合、パターンはエージェントの識別名/絵文字から派生します。 - メンションゲーティングは、メンション検出が可能な場合(ネイティブメンションまたは
mentionPatternsが設定されている場合)にのみ強制されます。 - グループまたは送信者を許可リストに登録しても、メンションゲーティングは無効になりません。すべてのメッセージでトリガーする必要がある場合は、そのグループの
requireMentionをfalseに設定します。 - 自動グループチャットプロンプトコンテキストは、解決済みのサイレント返信指示を毎ターン運びます。ワークスペースファイルで
NO_REPLYの仕組みを重複させないでください。 - 自動サイレント返信が許可されているグループでは、クリーンな空のモデルターンまたは推論のみのモデルターンを、
NO_REPLYと同等のサイレントとして扱います。ダイレクトチャットはNO_REPLYガイダンスを受け取らず、メッセージツールのみのグループ返信はmessage(action=send)を呼び出さないことで静かなままになります。 - 常時オンの周辺グループ会話は、デフォルトでユーザーリクエストのセマンティクスを使用します。静かなコンテキストとして送信するには、代わりに
messages.groupChat.unmentionedInbound: "room_event"を設定します。セットアップ例については 周辺ルームイベント を参照してください。 - ルームイベントは偽のユーザーリクエストとして保存されず、メッセージツールを使わないルームイベントからの非公開アシスタントテキストはチャット履歴として再生されません。
- Discord のデフォルトは
channels.discord.guilds."*"にあります(ギルド/チャンネルごとに上書き可能)。 - グループ履歴コンテキストはチャンネル間で一様にラップされます。メンションゲート付きグループは保留中のスキップ済みメッセージを保持します。常時オンのグループも、チャンネルがサポートしている場合は最近処理されたルームメッセージを保持することがあります。グローバルデフォルトには
messages.groupChat.historyLimitを使用し、上書きにはchannels.<channel>.historyLimit(またはchannels.<channel>.accounts.*.historyLimit)を使用します。無効にするには0を設定します。
グループ/チャンネルのツール制限(任意)
一部のチャンネル設定では、特定のグループ/ルーム/チャンネル内で利用可能なツールを制限できます。tools: グループ全体のツールを許可/拒否します(allow、alsoAllow、deny。拒否が優先)。toolsBySender: グループ内の送信者ごとの上書き。明示的なキープレフィックスを使用します:channel:<channelId>:<senderId>、id:<senderId>、e164:<phone>、username:<handle>、name:<displayName>、および"*"ワイルドカード。チャンネル ID は正規の OpenClaw チャンネル ID を使用します。teamsなどのエイリアスはmsteamsに正規化されます。従来のプレフィックスなしキーも引き続き受け入れられますが、id:としてのみ照合され、非推奨警告をログに記録します。
例(Telegram):
グループ/チャンネルのツール制限は、グローバル/エージェントのツールポリシーに加えて適用されます(拒否は引き続き優先されます)。一部のチャンネルでは、ルーム/チャンネルに異なるネストを使用します(例: Discord
guilds.*.channels.*、Slack channels.*、Microsoft Teams teams.*.channels.*)。グループ許可リスト
channels.whatsapp.groups、channels.telegram.groups、または channels.imessage.groups が設定されている場合、キーはグループ許可リストとして機能します。デフォルトのメンション動作を設定したまますべてのグループを許可するには、"*" を使用します。
一般的な意図 (コピーして貼り付け):
- すべてのグループ返信を無効化
- 特定のグループのみ許可 (WhatsApp)
- すべてのグループを許可するがメンションを必須にする
- 所有者のみのトリガー (WhatsApp)
有効化 (所有者のみ)
グループ所有者は、単独のメッセージでグループごとの有効化を切り替えられます:/activation mention/activation always
/activation はコアの所有者制限付きコマンドで、グループチャットにのみ適用されます。所有者とは、送信者がチャンネルの allowFrom / commands.ownerAllowFrom と一致することを意味します (許可リストが設定されていない場合、アカウント自身の ID が所有者として扱われます)。保存されたモードは、それを参照するチャンネル (Google Chat、QQBot、Telegram、WhatsApp) でそのグループの requireMention を上書きし、グループのシステムプロンプトのイントロはすべての場所で有効なモードを反映します。
コンテキストフィールド
グループの受信ペイロードは次を設定します:ChatType=groupGroupSubject(既知の場合)GroupMembers(既知の場合)WasMentioned(メンションゲートの結果)- Telegram フォーラムトピックには
MessageThreadIdとIsForumも含まれます。
/activation の変更後) にグループのイントロが含まれます。これは、モデルに人間のように応答し、空行を最小限にし、通常のチャット間隔に従い、リテラルの \n シーケンスを入力しないよう促します。Telegram 以外のグループでは Markdown テーブルも非推奨です。Telegram のリッチテキストガイダンスは Telegram チャンネルプロンプトから来ます。チャンネル由来のグループ名と参加者ラベルは、インラインのシステム指示ではなく、フェンス付きの信頼されていないメタデータとしてレンダリングされます。
iMessage 固有事項
- ルーティングまたは許可リスト設定では
chat_id:<id>を優先してください。 - チャットの一覧表示:
imsg chats --limit 20。 - グループ返信は常に同じ
chat_idに返されます。