仕組み
- 古い会話ターンがコンパクトなエントリに要約されます。
- 要約はセッショントランスクリプトに保存されます。
- 直近のメッセージはそのまま保持されます。
toolResult エントリとペアのまま保持します。分割点がツールブロック内に入る場合、OpenClaw は境界を移動してペアを一緒に保ち、現在の未要約の末尾を保持します。
完全な会話履歴はディスク上に残ります。Compaction が変更するのは、次のターンでモデルに見える内容だけです。
新しい設定では、
agents.defaults.compaction.mode のデフォルトは "safeguard" です(より厳格なガードレール、要約品質監査)。オプトアウトするには、mode: "default" を明示的に設定します。自動 Compaction
自動 Compaction はデフォルトで有効です。セッションがコンテキスト上限に近づいたとき、またはモデルがコンテキストオーバーフローエラーを返したときに実行されます(その場合、OpenClaw は Compaction して再試行します)。 次のように表示されます。- 通常の Gateway ログに
embedded run auto-compaction start/complete。 - 詳細モードに
🧹 Auto-compaction complete。 /statusに🧹 Compactions: <count>。
Compaction の前に、OpenClaw は重要なメモを memory ファイルに保存するようエージェントへ自動的に通知します。これによりコンテキストの損失を防ぎます。
OpenClaw が認識するオーバーフローエラーパターン
OpenClaw が認識するオーバーフローエラーパターン
OpenClaw は、プロバイダー固有の多数のオーバーフローエラー文字列(Anthropic、OpenAI、Bedrock、Gemini、Ollama、OpenRouter など)に一致します。一般的な例:
request_too_largecontext length exceededinput exceeds the maximum number of tokensinput token count exceeds the maximum number of input tokens(Bedrock)input is too long for the modelollama error: context length exceeded
手動 Compaction
任意のチャットで/compact と入力すると、Compaction を強制できます。要約を誘導する指示を追加できます。
agents.defaults.compaction.keepRecentTokens が設定されている場合(デフォルト: 20,000)、手動 Compaction はその切断点を尊重し、再構築されたコンテキスト内に直近の末尾を保持します。明示的な保持予算がない場合、手動 Compaction はハードチェックポイントとして動作し、新しい要約のみから続行します。
設定
openclaw.json の agents.defaults.compaction で Compaction を設定します。最も一般的な調整項目を以下に示します。完全なリファレンスについては、セッション管理の詳細を参照してください。
別のモデルを使う
デフォルトでは、Compaction はエージェントの主要モデルを使用します。agents.defaults.compaction.model を設定すると、より高性能または専用のモデルに要約を委任できます。オーバーライドは、provider/model-id 文字列、または agents.defaults.models で設定された裸のエイリアスを受け付けます。
agents.defaults.compaction.model オーバーライドは厳密にそのまま使われ、セッションのフォールバックチェーンを継承しません。
識別子の保持
Compaction 要約は、デフォルトで不透明な識別子を保持します(identifierPolicy: "strict")。無効にするには identifierPolicy: "off" でオーバーライドし、カスタムガイダンスには identifierPolicy: "custom" と identifierInstructions を使います。
アクティブトランスクリプトのバイトガード
agents.defaults.compaction.maxActiveTranscriptBytes が設定されている場合、アクティブな JSONL がそのサイズに達すると、OpenClaw は実行前に通常のローカル Compaction をトリガーします。これは、プロバイダー側のコンテキスト管理でモデルコンテキストは健全に保たれる一方、ローカルトランスクリプトが増え続ける長時間実行セッションに役立ちます。生の JSONL バイトを分割するのではなく、通常の Compaction パイプラインに意味的な要約の作成を依頼します。
後続トランスクリプト
agents.defaults.compaction.truncateAfterCompaction が有効な場合、OpenClaw は既存のトランスクリプトをその場で書き換えません。Compaction 要約、保持された状態、未要約の末尾から新しいアクティブな後続トランスクリプトを作成し、その後、ブランチ/復元フローをその Compaction 済み後続へ向けるチェックポイントメタデータを記録します。
後続トランスクリプトは、短い再試行ウィンドウ内に届く完全に重複した長いユーザーターンも削除するため、チャンネルの再試行ストームが Compaction 後の次のアクティブトランスクリプトに持ち越されません。
OpenClaw は、新しい Compaction について個別の .checkpoint.*.jsonl コピーをもう書き込みません。既存のレガシーチェックポイントファイルは、参照されている間は引き続き使用でき、通常のセッションクリーンアップによって削除されます。
Compaction 通知
デフォルトでは、Compaction は静かに実行されます。Compaction の開始時と完了時に短いステータスメッセージを表示し、Compaction 前のメモリフラッシュが使い切られても返信は続行される場合に低下通知を表示するには、notifyUser を設定します。
メモリフラッシュ
Compaction の前に、OpenClaw は サイレントメモリフラッシュ ターンを実行して、永続的なメモをディスクに保存できます。この保守ターンでアクティブな会話モデルではなくローカルモデルを使う必要がある場合は、agents.defaults.compaction.memoryFlush.model を設定します。
プラグイン可能な Compaction プロバイダー
Plugins は、Plugin API のregisterCompactionProvider() を通じてカスタム Compaction プロバイダーを登録できます。プロバイダーが登録および設定されている場合、OpenClaw は組み込みの LLM パイプラインではなく、そのプロバイダーに要約を委任します。
登録済みプロバイダーを使うには、設定でその ID を指定します。
provider を設定すると、自動的に mode: "safeguard" が強制されます。プロバイダーは、組み込みパスと同じ Compaction 指示および識別子保持ポリシーを受け取り、OpenClaw はプロバイダー出力後も直近ターンと分割ターンの接尾コンテキストを保持します。
プロバイダーが失敗した場合、または空の結果を返した場合、OpenClaw は組み込みの LLM 要約へフォールバックします。
Compaction とプルーニング
| Compaction | プルーニング | |
|---|---|---|
| 何をするか | 古い会話を要約します | 古いツール結果を削ります |
| 保存されるか | はい(セッショントランスクリプト内) | いいえ(リクエストごとのメモリ内のみ) |
| 範囲 | 会話全体 | ツール結果のみ |
トラブルシューティング
Compaction の頻度が高すぎますか? モデルのコンテキストウィンドウが小さいか、ツール出力が大きい可能性があります。セッションプルーニング を有効にしてみてください。 Compaction 後にコンテキストが古く感じますか?/compact Focus on <topic> を使って要約を誘導するか、メモが残るように メモリフラッシュ を有効にします。
まっさらな状態が必要ですか? /new は Compaction せずに新しいセッションを開始します。
高度な設定(予約トークン、識別子の保持、カスタムコンテキストエンジン、OpenAI サーバー側 Compaction)については、セッション管理の詳細を参照してください。
関連
- セッション: セッション管理とライフサイクル。
- セッションプルーニング: ツール結果の削減。
- コンテキスト: エージェントターン用のコンテキストが構築される仕組み。
- フック: Compaction ライフサイクルフック(
before_compaction,after_compaction)。