セッションとメモリ
セッションツール
目標: エージェントがセッションを一覧表示し、履歴を取得し、別のセッションに送信できる、小さく誤用しにくいツールセット。
ツール名
sessions_listsessions_historysessions_sendsessions_spawn
キーモデル
- メインの直接チャットバケットは常にリテラルキー
"main"です(現在のエージェントのメインキーに解決されます)。 - グループチャットは
agent:<agentId>:<channel>:group:<id>またはagent:<agentId>:<channel>:channel:<id>を使用します(完全なキーを渡します)。 - クローンジョブは
cron:<job.id>を使用します。 - フックは明示的に設定されていない限り
hook:<uuid>を使用します。 - ノードセッションは明示的に設定されていない限り
node-<nodeId>を使用します。
global と unknown は予約済みの値であり、一覧表示されることはありません。session.scope = "global" の場合、すべてのツールで main にエイリアスされるため、呼び出し側が global を見ることはありません。
sessions_list
セッションを行の配列として一覧表示します。パラメータ:
kinds?: string[]フィルター:"main" | "group" | "cron" | "hook" | "node" | "other"のいずれかlimit?: number最大行数 (デフォルト: サーバーのデフォルト、例: 200にクランプ)activeMinutes?: numberN分以内に更新されたセッションのみmessageLimit?: number0 = メッセージなし (デフォルト 0); >0 = 最後のN件のメッセージを含める
動作:
messageLimit > 0の場合、セッションごとにchat.historyを取得し、最後のN件のメッセージを含めます。- ツール結果はリスト出力から除外されます。ツールメッセージには
sessions_historyを使用してください。 - サンドボックス化された エージェントセッションで実行する場合、セッションツールはデフォルトで スポーンされたセッションのみの可視性 になります(下記参照)。
行の形状 (JSON):
key: セッションキー (文字列)kind:main | group | cron | hook | node | otherchannel:whatsapp | telegram | discord | signal | imessage | webchat | internal | unknowndisplayName(グループ表示ラベル、利用可能な場合)updatedAt(ミリ秒)sessionIdmodel,contextTokens,totalTokensthinkingLevel,verboseLevel,systemSent,abortedLastRunsendPolicy(セッションで設定されている場合のオーバーライド)lastChannel,lastTodeliveryContext(利用可能な場合の正規化された{ channel, to, accountId })transcriptPath(ストアディレクトリ + sessionId から導出されたベストエフォートのパス)messages?(messageLimit > 0の場合のみ)
sessions_history
1つのセッションのトランスクリプトを取得します。パラメータ:
sessionKey(必須; セッションキーまたはsessions_listからのsessionIdを受け入れます)limit?: number最大メッセージ数 (サーバーでクランプ)includeTools?: boolean(デフォルト false)
動作:
includeTools=falseの場合、role: "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(サーバーサイド) を介して行われるため、再接続しても待機が中断されません。 - エージェント間メッセージコンテキストはプライマリ実行のために注入されます。
- セッション間メッセージは
message.provenance.kind = "inter_session"で永続化されるため、トランスクリプトリーダーはルーティングされたエージェント指示と外部ユーザー入力を区別できます。 - プライマリ実行が完了した後、OpenClaw は 返信ループ を実行します:
- ラウンド2以降は、リクエスタとターゲットエージェントの間で交互に行われます。
- 正確に
REPLY_SKIPと返信すると、ピンポンを停止します。 - 最大ターン数は
session.agentToAgent.maxPingPongTurnsです (0–5, デフォルト 5)。
- ループが終了すると、OpenClaw は エージェント間アナウンスステップ を実行します (ターゲットエージェントのみ):
- 正確に
ANNOUNCE_SKIPと返信すると沈黙を保ちます。 - それ以外の返信はターゲットチャネルに送信されます。
- アナウンスステップには、元のリクエスト + ラウンド1の返信 + 最新のピンポン返信が含まれます。
- 正確に
チャネルフィールド
- グループの場合、
channelはセッションエントリに記録されたチャネルです。 - 直接チャットの場合、
channelはlastChannelからマッピングされます。 - クローン/フック/ノードの場合、
channelはinternalです。 - 欠落している場合、
channelはunknownです。
セキュリティ / 送信ポリシー
チャネル/チャットタイプに基づくポリシーベースのブロック (セッション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?(オプション; サブエージェントモデルをオーバーライド; 無効な値はエラー)thinking?(オプション; サブエージェント実行の思考レベルをオーバーライド)runTimeoutSeconds?(設定されている場合はagents.defaults.subagents.runTimeoutSecondsにデフォルト、それ以外は0; 設定されている場合、N秒後にサブエージェント実行を中止)thread?(デフォルト false; チャネル/プラグインでサポートされている場合、このスポーンに対してスレッドバインドルーティングをリクエスト)mode?(run|session; デフォルトはrun、ただしthread=trueの場合はデフォルトでsession;mode="session"にはthread=trueが必要)cleanup?(delete|keep, デフォルトkeep)sandbox?(inherit|require, デフォルトinherit;requireはターゲット子ランタイムがサンドボックス化されていない限りスポーンを拒否)attachments?(オプションのインラインファイル配列; サブエージェントランタイムのみ、ACPは拒否)。各エントリ:{ name, content, encoding?: "utf8" | "base64", mimeType? }。ファイルは子ワークスペースの.openclaw/attachments/<uuid>/に具体化されます。ファイルごとにsha256を含むレシートを返します。attachAs?(オプション; 将来のマウント実装用に予約された{ mountPath? }ヒント)
許可リスト:
agents.list[].subagents.allowAgents:agentIdを介して許可されるエージェントIDのリスト (["*"]で任意を許可)。デフォルト: リクエスタエージェントのみ。- サンドボックス継承ガード: リクエスタセッションがサンドボックス化されている場合、
sessions_spawnはサンドボックス化されていないターゲットを拒否します。
探索:
agents_listを使用して、sessions_spawnで許可されているエージェントIDを発見します。
動作:
deliver: falseで新しいagent:<agentId>:subagent:<uuid>セッションを開始します。- サブエージェントはデフォルトで セッションツールを除く 完全なツールセットを使用します (
tools.subagents.toolsで設定可能)。 - サブエージェントは
sessions_spawnを呼び出すことができません (サブエージェント → サブエージェントのスポーンは不可)。 - 常に非ブロッキング: 直ちに
{ status: "accepted", runId, childSessionKey }を返します。 thread=trueの場合、チャネルプラグインは配信/ルーティングをスレッドターゲットにバインドできます (Discord サポートはsession.threadBindings.*およびchannels.discord.threadBindings.*で制御されます)。- 完了後、OpenClaw はサブエージェント アナウンスステップ を実行し、結果をリクエスタのチャットチャネルに投稿します。
- アシスタントの最終返信が空の場合、サブエージェント履歴からの最新の
toolResultがResultとして含まれます。
- アシスタントの最終返信が空の場合、サブエージェント履歴からの最新の
- アナウンスステップ中に正確に
ANNOUNCE_SKIPと返信すると沈黙を保ちます。 - アナウンス返信は
Status/Result/Notesに正規化されます。Statusはランタイム結果から来ます (モデルテキストではありません)。 - サブエージェントセッションは
agents.defaults.subagents.archiveAfterMinutes(デフォルト: 60) 後に自動アーカイブされます。 - アナウンス返信には統計行 (ランタイム、トークン、sessionKey/sessionId、トランスクリプトパス、オプションのコスト) が含まれます。
サンドボックスセッション可視性
セッションツールは、セッション間アクセスを減らすためにスコープを設定できます。デフォルト動作:
tools.sessions.visibilityはデフォルトでtree(現在のセッション + スポーンされたサブエージェントセッション) です。- サンドボックス化されたセッションの場合、
agents.defaults.sandbox.sessionToolsVisibilityで可視性を強制的にクランプできます。
設定:
{
tools: {
sessions: {
// "self" | "tree" | "agent" | "all"
// デフォルト: "tree"
visibility: "tree",
},
},
agents: {
defaults: {
sandbox: {
// デフォルト: "spawned"
sessionToolsVisibility: "spawned", // または "all"
},
},
},
}
注記:
self: 現在のセッションキーのみ。tree: 現在のセッション + 現在のセッションによってスポーンされたセッション。agent: 現在のエージェントIDに属する任意のセッション。all: 任意のセッション (エージェント間アクセスには依然としてtools.agentToAgentが必要)。- セッションがサンドボックス化されていて
sessionToolsVisibility="spawned"の場合、tools.sessions.visibility="all"を設定しても、OpenClaw は可視性をtreeにクランプします。