セッションツール

目標:エージェントがセッションを一覧表示し、履歴を取得し、別のセッションに送信できるように、小さく誤用しにくいツールセットを提供します。

ツール名

  • sessions_list
  • sessions_history
  • sessions_send
  • sessions_spawn

キーモデル

  • メインの直接チャットバケットは常にリテラルキー"main"(現在のエージェントのメインキーに解決)。
  • グループチャットはagent:<agentId>:<channel>:group:<id>またはagent:<agentId>:<channel>:channel:<id>を使用(完全なキーを渡す)。
  • Cronジョブはcron:<job.id>を使用。
  • フックは明示的に設定されていない限りhook:<uuid>を使用。
  • ノードセッションは明示的に設定されていない限りnode-<nodeId>を使用。

globalunknownは予約値であり、一覧表示されません。session.scope = "global"の場合、すべてのツールでmainにエイリアスするため、呼び出し側はglobalを見ることはありません。

sessions_list

セッションを行の配列として一覧表示します。

パラメータ:

  • kinds?: string[] フィルタ:"main" | "group" | "cron" | "hook" | "node" | "other"のいずれか
  • limit?: number 最大行数(デフォルト:サーバーデフォルト、例:200でクランプ)
  • activeMinutes?: number N分以内に更新されたセッションのみ
  • messageLimit?: number 0 = メッセージなし(デフォルト0); >0 = 最後のNメッセージを含む

動作:

  • messageLimit > 0はセッションごとにchat.historyを取得し、最後のNメッセージを含めます。
  • ツール結果はリスト出力でフィルタリングされます。ツールメッセージにはsessions_historyを使用してください。
  • サンドボックス化されたエージェントセッションで実行する場合、セッションツールはデフォルトでスポーンのみの可視性になります(以下を参照)。

行の形状(JSON):

  • key: セッションキー(文字列)
  • kind: main | group | cron | hook | node | other
  • channel: whatsapp | telegram | discord | signal | imessage | webchat | internal | unknown
  • displayName(グループ表示ラベル、利用可能な場合)
  • updatedAt(ミリ秒)
  • sessionId
  • modelcontextTokenstotalTokens
  • thinkingLevelverboseLevelsystemSentabortedLastRun
  • sendPolicy(設定されている場合のセッションオーバーライド)
  • lastChannellastTo
  • deliveryContext(利用可能な場合の正規化された{ channel, to, accountId }
  • transcriptPath(ストアディレクトリ + sessionIdから導出されたベストエフォートパス)
  • messages?messageLimit > 0の場合のみ)

sessions_history

1つのセッションのトランスクリプトを取得します。

パラメータ:

  • sessionKey(必須。セッションキーまたはsessions_listからのsessionIdを受け入れます)
  • limit?: number 最大メッセージ数(サーバーでクランプ)
  • includeTools?: boolean(デフォルトfalse)

動作:

  • includeTools=falserole: "toolResult"メッセージをフィルタリングします。
  • 生のトランスクリプト形式でメッセージ配列を返します。
  • sessionIdが指定された場合、OpenClawはそれを対応するセッションキーに解決します(IDが見つからない場合はエラー)。

sessions_send

別のセッションにメッセージを送信します。

パラメータ:

  • sessionKey(必須。セッションキーまたはsessions_listからのsessionIdを受け入れます)
  • message(必須)
  • timeoutSeconds?: number(デフォルト>0; 0 = ファイア・アンド・フォーゲット)

動作:

  • timeoutSeconds = 0:エンキューして{ runId, status: "accepted" }を返します。
  • timeoutSeconds > 0:最大N秒間完了を待機し、{ runId, status: "ok", reply }を返します。
  • 待機がタイムアウトした場合:{ runId, status: "timeout", error }。実行は継続。後でsessions_historyを呼び出します。
  • 実行が失敗した場合:{ runId, status: "error", error }
  • アナウンス配信はプライマリ実行が完了した後に実行され、ベストエフォートです。status: "ok"はアナウンスが配信されたことを保証しません。
  • ゲートウェイagent.wait(サーバー側)経由で待機するため、再接続しても待機がドロップされません。
  • エージェント間メッセージコンテキストはプライマリ実行のために注入されます。
  • プライマリ実行が完了した後、OpenClawは返信ループを実行します:
    • ラウンド2+はリクエスタとターゲットエージェントの間で交互に行われます。
    • ピンポンを停止するには、正確にREPLY_SKIPと返信します。
    • 最大ターン数はsession.agentToAgent.maxPingPongTurns(0〜5、デフォルト5)。
  • ループが終了すると、OpenClawはエージェント間アナウンスステップを実行します(ターゲットエージェントのみ):
    • 静かにするには、正確にANNOUNCE_SKIPと返信します。
    • その他の返信はターゲットチャネルに送信されます。
    • アナウンスステップには、元のリクエスト + ラウンド1の返信 + 最新のピンポン返信が含まれます。

チャネルフィールド

  • グループの場合、channelはセッションエントリに記録されたチャネルです。
  • 直接チャットの場合、channellastChannelからマッピングされます。
  • cron/hook/nodeの場合、channelinternalです。
  • 欠落している場合、channelunknownです。

セキュリティ / 送信ポリシー

チャネル/チャットタイプによるポリシーベースのブロッキング(セッションIDごとではない)。

{
  "session": {
    "sendPolicy": {
      "rules": [
        {
          "match": { "channel": "discord", "chatType": "group" },
          "action": "deny"
        }
      ],
      "default": "allow"
    }
  }
}

ランタイムオーバーライド(セッションエントリごと):

  • sendPolicy: "allow" | "deny"(未設定 = 設定を継承)
  • sessions.patchまたは所有者のみの/send on|off|inherit(スタンドアロンメッセージ)で設定可能。

適用ポイント:

  • chat.send / agent(ゲートウェイ)
  • 自動返信配信ロジック

sessions_spawn

分離されたセッションでサブエージェント実行をスポーンし、結果をリクエスタチャットチャネルにアナウンスします。

パラメータ:

  • task(必須)
  • label?(オプション。ログ/UIに使用)
  • agentId?(オプション。許可されている場合、別のエージェントIDの下でスポーン)
  • model?(オプション。サブエージェントモデルをオーバーライド。無効な値はエラー)
  • runTimeoutSeconds?(デフォルト0。設定されている場合、N秒後にサブエージェント実行を中止)
  • cleanup?delete|keep、デフォルトkeep

許可リスト:

  • agents.list[].subagents.allowAgentsagentId経由で許可されるエージェントIDのリスト(すべてを許可する場合は["*"])。デフォルト:リクエスタエージェントのみ。

発見:

  • agents_listを使用して、sessions_spawnで許可されているエージェントIDを発見します。

動作:

  • deliver: falseで新しいagent:<agentId>:subagent:<uuid>セッションを開始します。
  • サブエージェントはデフォルトで完全なツールセットからセッションツールを除いたものtools.subagents.toolsで設定可能)。
  • サブエージェントはsessions_spawnを呼び出すことは許可されていません(サブエージェント→サブエージェントのスポーンはなし)。
  • 常に非ブロッキング:即座に{ status: "accepted", runId, childSessionKey }を返します。
  • 完了後、OpenClawはサブエージェントアナウンスステップを実行し、結果をリクエスタチャットチャネルに投稿します。
  • アナウンスステップ中に正確にANNOUNCE_SKIPと返信すると静かになります。
  • アナウンス返信はStatus/Result/Notesに正規化されます。Statusはランタイム結果から取得されます(モデルテキストではありません)。
  • サブエージェントセッションはagents.defaults.subagents.archiveAfterMinutes(デフォルト:60)後に自動アーカイブされます。
  • アナウンス返信には統計行(ランタイム、トークン、sessionKey/sessionId、トランスクリプトパス、オプションのコスト)が含まれます。

サンドボックスセッションの可視性

サンドボックス化されたセッションはセッションツールを使用できますが、デフォルトではsessions_spawn経由でスポーンしたセッションのみが表示されます。

設定:

{
  agents: {
    defaults: {
      sandbox: {
        // デフォルト: "spawned"
        sessionToolsVisibility: "spawned" // または "all"
      }
    }
  }
}