Sessions and memory

セッション管理

OpenClaw は会話を セッション に整理します。各メッセージは、 DM、グループチャット、Cron ジョブなど、送信元に基づいてセッションへルーティングされます。

メッセージのルーティング方法

送信元 動作
ダイレクトメッセージ デフォルトでは共有セッション
グループチャット グループごとに分離
ルーム/チャンネル ルームごとに分離
Cron ジョブ 実行ごとに新しいセッション
Webhook フックごとに分離

DM 分離

デフォルトでは、継続性のためにすべての DM が 1 つのセッションを共有します。これは 単一ユーザー構成では問題ありません。

修正方法:

{
  session: {
    dmScope: "per-channel-peer", // isolate by channel + sender
  },
}

その他のオプション:

  • main (デフォルト) -- すべての DM が 1 つのセッションを共有します。
  • per-peer -- 送信者ごとに分離します (チャンネルをまたいで)。
  • per-channel-peer -- チャンネル + 送信者ごとに分離します (推奨)。
  • per-account-channel-peer -- アカウント + チャンネル + 送信者ごとに分離します。

リンク済みチャンネルをドックする

ドックコマンドを使うと、ユーザーは新しいセッションを開始せずに、現在のダイレクトチャットセッションの返信ルートを 別のリンク済みチャンネルへ移動できます。例、設定、トラブルシューティングについては チャンネルのドッキング を参照してください。

openclaw security audit で構成を検証します。

セッションライフサイクル

セッションは期限切れになるまで再利用されます。

  • 日次リセット (デフォルト) -- Gateway ホストのローカル時刻で午前 4:00 に新しいセッションを開始します。日次の鮮度は、後続のメタデータ書き込みではなく、 現在の sessionId が開始された時刻に基づきます。
  • アイドルリセット (任意) -- 一定期間操作がない場合に新しいセッションを開始します。 session.reset.idleMinutes を設定します。アイドル鮮度は最後の実際の ユーザー/チャンネル操作に基づくため、Heartbeat、Cron、exec システムイベントは セッションを維持しません。
  • 手動リセット -- チャットで /new または /reset と入力します。/new <model> は モデルも切り替えます。

日次リセットとアイドルリセットの両方が設定されている場合、先に期限切れになった方が優先されます。 Heartbeat、Cron、exec、その他のシステムイベントターンはセッションメタデータを書き込む場合がありますが、 それらの書き込みは日次またはアイドルリセットの鮮度を延長しません。リセットによって セッションが切り替わると、古いセッションのキュー済みシステムイベント通知は 破棄されるため、古いバックグラウンド更新が新しいセッションの最初のプロンプトの前に追加されません。

プロバイダー所有のアクティブな CLI セッションを持つセッションは、暗黙の 日次デフォルトでは切られません。これらのセッションをタイマーで期限切れにする必要がある場合は、 /reset を使うか、session.reset を明示的に設定します。

状態の保存場所

すべてのセッション状態は Gateway が所有します。UI クライアントはセッションデータを Gateway に問い合わせます。

  • ストア: ~/.openclaw/agents/<agentId>/sessions/sessions.json
  • トランスクリプト: ~/.openclaw/agents/<agentId>/sessions/<sessionId>.jsonl

sessions.json はライフサイクルのタイムスタンプを個別に保持します。

  • sessionStartedAt: 現在の sessionId が開始された時刻。日次リセットはこれを使用します。
  • lastInteractionAt: アイドル有効期間を延長する最後のユーザー/チャンネル操作。
  • updatedAt: 最後のストア行変更。一覧表示や刈り込みには有用ですが、 日次/アイドルリセットの鮮度については信頼できる情報源ではありません。

sessionStartedAt がない古い行は、利用可能な場合、トランスクリプト JSONL セッションヘッダーから解決されます。古い行に lastInteractionAt もない場合、 アイドル鮮度は後続の管理用書き込みではなく、そのセッション開始時刻にフォールバックします。

セッションメンテナンス

OpenClaw は時間の経過に合わせてセッションストレージを自動的に制限します。デフォルトでは warn モードで実行されます (クリーンアップ対象を報告します)。自動クリーンアップを行うには、 session.maintenance.mode"enforce" に設定します。

{
  session: {
    maintenance: {
      mode: "enforce",
      pruneAfter: "30d",
      maxEntries: 500,
    },
  },
}

本番規模の maxEntries 制限では、Gateway ランタイムの書き込みは小さな高水位バッファを使い、バッチで設定済み上限までクリーンアップします。Gateway 起動中のセッションストア読み取りでは、エントリの刈り込みや上限制限は行いません。これにより、起動ごとや分離された Cron セッションごとにストア全体のクリーンアップを実行することを避けます。openclaw sessions cleanup --enforce は上限を即時に適用します。

メンテナンスは、グループセッションやスレッドスコープのチャットセッションなど、永続的な外部会話ポインターを保持しながら、 合成された Cron、フック、Heartbeat、ACP、サブエージェントのエントリは経年で削除できるようにします。

以前にダイレクトメッセージ分離を使用し、その後 session.dmScopemain に戻した場合は、古い peer キー付き DM 行を openclaw sessions cleanup --dry-run --fix-dm-scope でプレビューしてください。同じフラグを適用すると、 これらの古いダイレクト DM 行は廃止され、トランスクリプトは削除済み アーカイブとして保持されます。

openclaw sessions cleanup --dry-run でプレビューします。

セッションの確認

  • openclaw status -- セッションストアのパスと最近のアクティビティ。
  • openclaw sessions --json -- すべてのセッション (--active <minutes> でフィルター)。
  • チャット内の /status -- コンテキスト使用量、モデル、トグル。
  • /context list -- システムプロンプト内の内容。

関連資料

関連