セッションとメモリ
セッション管理
OpenClawは、エージェントごとの1つのダイレクトチャットセッションをプライマリとして扱います。ダイレクトチャットは agent:: (デフォルトは main) に統合され、グループ/チャンネルチャットはそれぞれ独自のキーを持ちます。session.mainKey が尊重されます。ダイレクトメッセージのグループ化方法を制御す るには session.dmScope を使用します:
main(デフォルト): すべてのDMが継続性のためにメインセッションを共有します。per-peer: チャンネルをまたいで送信者IDごとに分離します。per-channel-peer: チャンネル + 送信者ごとに分離します (マルチユーザーインボックスに推奨)。per-account-channel-peer: アカウント + チャンネル + 送信者ごとに分離します (マルチアカウントインボックスに推奨)。per-peer、per-channel-peer、per-account-channel-peerを使用する際に、同じ人物がチャンネルをまたいでDMセッションを共有できるようにするには、session.identityLinksを使用してプロバイダー接頭辞付きのピアIDを正規のIDにマッピングします。
セキュアDMモード (マルチユーザー設定に推奨)
セキュリティ警告: あなたのエージェントが複数の人からDMを受信できる場合、セキュアDMモードを有効にすることを強く検討すべきです。これがないと、すべてのユーザーが同じ会話コンテキストを共有し、ユーザー間でプライベートな情報が漏洩する可能性があります。
デフォルト設定での問題例:
- アリス (
<SENDER_A>) があなたのエージェントにプライベートな話題 (例えば、医療予約) についてメッセージを送ります。 - ボブ (
<SENDER_B>) があなたのエージェントに「私たちは何について話していましたか?」と尋ねます。 - 両方のDMが同じセッションを共有しているため、モデルはアリスの以前のコンテキストを使ってボブに回答する可能性があります。
解決策: dmScope を設定して、ユーザーごとにセッションを分離します:
// ~/.openclaw/openclaw.json
{
session: {
// セキュアDMモード: DMコンテキストをチャンネル + 送信者ごとに分離。
dmScope: "per-channel-peer",
},
}
これを有効にするべき状況:
- 複数の送信者に対してペアリング承認がある場合
- 複数のエントリを持つDM許可リスト を使用している場合
dmPolicy: "open"を設定している場合- 複数の電話番号やアカウントがあなたのエージェントにメッセージを送れる場合
注意点:
- デフォルトは継続性のため
dmScope: "main"です (すべてのDMがメインセッションを共有)。これはシングルユーザー設定では問題ありません。 - ローカルCLIオンボーディングでは、未設定時にデフォルトで
session.dmScope: "per-channel-peer"を書き込みます (既存の明示的な値は保持されます)。 - 同じチャンネル上のマルチアカウントインボックスの場合は、
per-account-channel-peerを優先します。 - 同じ人物が複数のチャンネルであなたに連絡する場合は、
session.identityLinksを使用して彼らのDMセッションを1つの正規IDに統合します。 - DM設定は
openclaw security auditで確認できます (セキュリティ を参照)。
ゲートウェイが信頼できる情報源
すべてのセッション状態はゲートウェイ (「マスター」OpenClaw) によって所有されています。UIクライアント (macOSアプリ、WebChatなど) は、ローカルファイルを読み取る代わりに、セッションリストやトークンカウントをゲートウェイに問い合わせる必要があります。
- リモートモードでは、重要なセッションストアはリモートゲートウェイホスト上にあり、あなたのMac上にはありません。
- UIに表示されるトークンカウントは、ゲートウェイのストアフィールド (
inputTokens、outputTokens、totalTokens、contextTokens) から取得されます。クライアントはJSONLトランスクリプトを解析して合計を「修正」することはありません。
状態の保存場所
- ゲートウェイホスト上:
- ストアファイル:
~/.openclaw/agents//sessions/sessions.json(エージェントごと)。
- ストアファイル:
- トランスクリプト:
~/.openclaw/agents//sessions/.jsonl(Telegramトピックセッションは.../-topic-.jsonlを使用)。 - ストアは
sessionKey -> { sessionId, updatedAt, ... }のマップです。エントリを削除しても安全です。必要に応じて再作成されます。 - グループエントリには、UIでセッションにラベルを付けるための
displayName、channel、subject、room、spaceが含まれる場合があります。 - セッションエントリには、UIがセッションの出所を説明できるようにするための
originメタデータ (ラベル + ルーティングヒント) が含まれます。 - OpenClawはレガシーなPi/Tauセッションフ ォルダを読み取りません。
メンテナンス
OpenClawはセッションストアメンテナンスを適用し、sessions.json とトランスクリプトアーティファクトが時間の経過とともに制限されるようにします。
デフォルト
session.maintenance.mode:warnsession.maintenance.pruneAfter:30dsession.maintenance.maxEntries:500session.maintenance.rotateBytes:10mbsession.maintenance.resetArchiveRetention: デフォルトはpruneAfter(30d)session.maintenance.maxDiskBytes: 未設定 (無効)session.maintenance.highWaterBytes: 予算管理が有効な場合、デフォルトはmaxDiskBytesの80%
仕組み
メンテナンスはセッションストア書き込み中に実行され、openclaw sessions cleanup でオンデマンドでトリガーすることもできます。
mode: "warn": 削除される内容を報告しますが、エントリ/トランスクリプトを変更しません。mode: "enforce": 以下の順序でクリーンアップを適用します:pruneAfterより古い古いエントリを剪定- エントリ数を
maxEntriesに制限 (最も古いものから) - 参照されなくなった削除済みエントリのトランスクリプトファイルをアーカイブ
- 保持ポリシーに従って古い
*.deleted.および*.reset.アーカイブを削除 sessions.jsonがrotateBytesを超えた場合にローテートmaxDiskBytesが設定されている場合、ディスク予算をhighWaterBytesに向けて強制 (最も古いアーティファクトから、次に最も古いセッション)
大規模ストアのパフォーマンスに関する注意点
大規模なセッションストアは、高ボリューム設定では一般的です。メンテナンス作業は書き込みパスの作業であるため、非常に大規模なストアは書き込み遅延を増加させる可能性があります。コストを最も増加させる要因:
- 非常に高い
session.maintenance.maxEntries値 - 古いエントリを保持する長い
pruneAfterウィンドウ ~/.openclaw/agents//sessions/内の多数のトランスク リプト/アーカイブアーティファクト- 合理的な剪定/上限制限なしにディスク予算 (
maxDiskBytes) を有効にする
対処法:
- 本番環境では
mode: "enforce"を使用して、成長が自動的に制限されるようにする - 時間制限とカウント制限の両方 (
pruneAfter+maxEntries) を設定する (片方だけではない) - 大規模なデプロイメントでは、厳格な上限のために
maxDiskBytes+highWaterBytesを設定する highWaterBytesをmaxDiskBytesよりも有意に低く保つ (デフォルトは80%)- 設定変更後、強制実行前に予測される影響を確認するために
openclaw sessions cleanup --dry-run --jsonを実行する - 頻繁にアクティブなセッションの場合は、手動クリーンアップ実行時に
--active-keyを渡す
カスタマイズ例
保守的な強制ポリシーを使用:
{
session: {
maintenance: {
mode: "enforce",
pruneAfter: "45d",
maxEntries: 800,
rotateBytes: "20mb",
resetArchiveRetention: "14d",
},
},
}
セッションディレクトリの厳格なディスク予算を有効化:
{
session: {
maintenance: {
mode: "enforce",
maxDiskBytes: "1gb",
highWaterBytes: "800mb",
},
},
}
大規模インストール向けに調整 (例):
{
session: {
maintenance: {
mode: "enforce",
pruneAfter: "14d",
maxEntries: 2000,
rotateBytes: "25mb",
maxDiskBytes: "2gb",
highWaterBytes: "1.6gb",
},
},
}
CLIからメンテナンスをプレビューまたは強制実行:
openclaw sessions cleanup --dry-run
openclaw sessions cleanup --enforce
セッション剪定
OpenClawはデフォルトで、LLM呼び出しの直前にメモリ内コンテキストから古いツール結果を削除します。これはJSONL履歴を書き換えません。/concepts/session-pruning を参照。
事前圧縮メモリフラッシュ
セッションが自動圧縮に近づくと、OpenClawはモデルに永続的なメモをディスクに書き込むよう促すサイレントメモリフラッシュターンを実行できます。これはワークスペースが書き込み可能な場合にのみ実行されます。メモリ と 圧縮 を参照。