問題の説明
AI ボットとの長時間の会話中に、以下のようなエラーが発生する場合があります:
[openclaw:gateway] Error: Context length exceeded. Model maximum: 128000 tokens, requested: 135842 tokens.
または自動圧縮の失敗を示すログ:
[openclaw:gateway] Context compaction triggered (usage: 92%)
[openclaw:gateway] Error during context compaction: Model returned empty summary
[openclaw:gateway] Falling back to truncation strategy
もう1つのシナリオはユーザーに表示されるメッセージです:
ボットの応答:申し訳ありません。会話履歴が長すぎるため、処理を続行できません。/reset を送信して会話履歴をクリアしてください。
OpenClaw は各ユーザーの会話コンテキスト(メッセージ履歴とシステムプロンプトを含む)を維持しています。会話が長くなると、トークン数が AI モデルの最大コンテキストウィンドウ制限を超える場合があります。
動作の仕組み
OpenClaw のコンテキスト管理フローは以下のとおりです:
- 各ユーザーメッセージと AI の返信がコンテキストに追加される
- API リクエスト送信前に、OpenClaw が現在のコンテキストのトークン数を計算
- トークン使用率が設定されたしきい値(デフォルト85%)を超えると、自動圧縮がトリガー
- 圧縮プロセスが古い会話履歴を AI モデルに送信して要約を生成
- 圧縮された要約が元の古いメッセージを置き換え、コンテキスト空間を解放
診断手順
現在のユーザーのコンテキスト状態を確認します:
openclaw context list
すべてのアクティブセッションとそのトークン使用状況が表示されます:
Channel User ID Tokens Model Max Usage
telegram 12345678 98500 128000 77%
whatsapp 8612345 125000 128000 98% ⚠️
圧縮ログを確認します:
DEBUG=openclaw:context* openclaw start
設定のコンテキスト管理設定を確認します:
cat ~/.openclaw/openclaw.json | grep -A 20 context
解決策
方法1:自動圧縮設定の調整
~/.openclaw/openclaw.json で圧縮戦略を最適化します:
{
"context": {
"compaction": {
"enabled": true,
"triggerThreshold": 0.75,
"targetUsage": 0.5,
"strategy": "summarize",
"summaryModel": "gpt-4o-mini",
"summaryPrompt": "Please compress the following conversation history into a concise summary, preserving key information and user preferences:",
"maxRetries": 3
}
}
}
主要パラメータの説明:
triggerThreshold:圧縮をトリガーする使用率しきい値。値を下げると圧縮が早期にトリガーされ、エッジケースのオーバーフローを防止targetUsage:圧縮後の目標使用率。0.5に設定すると、圧縮後のコンテキストが容量の50%以下になるsummaryModel:要約生成に使用するモデル。gpt-4o-miniのような低コストモデルを推奨maxRetries:圧縮失敗時のリトライ回数
方法2:コンテキストの手動クリーンアップ
自動圧縮が失敗した場合、特定のユーザーのコンテキストを手動で処理できます:
# 特定ユーザーのコンテキスト詳細を表示
openclaw context show --channel telegram --user 12345678
# 特定ユーザーのコンテキストを手動で圧縮
openclaw context compact --channel telegram --user 12345678
# 特定ユーザーの会話履歴をリセット(すべてのコンテキストをクリア)
openclaw context reset --channel telegram --user 12345678
ユーザーはチャットで直接 /reset コマンドを送信して、自分の会話履歴をクリアすることもできます。
方法3:より大きなコンテキストウィンドウを持つモデルへの切り替え
ユースケースで長時間の連続した会話が必要な場合は、より大きなコンテキストウィンドウを持つモデルの使用を検討してください:
{
"models": {
"default": {
"provider": "anthropic",
"model": "claude-sonnet-4-20250514",
"maxContextTokens": 200000
}
}
}
Claude モデルは 200K トークンのコンテキストウィンドウ、GPT-4o は 128K、Gemini 1.5 Pro は最大 1M をサポートしています。ニーズに合ったモデルを選択してください。
方法4:フォールバック戦略としての切り捨て設定
圧縮が失敗した場合に備えて、システムがクラッシュしないよう切り捨て戦略を設定します:
{
"context": {
"compaction": {
"enabled": true,
"strategy": "summarize",
"fallback": {
"strategy": "truncate",
"keepSystemPrompt": true,
"keepRecentMessages": 10
}
}
}
}
切り捨て戦略はシステムプロンプトと直近の N 件のメッセージを保持し、古いメッセージを完全に破棄します。履歴コンテキストは失われますが、会話を継続できることを保証します。
方法5:個別メッセージ長の制限
ユーザーが過度に長いメッセージを送信してコンテキストが急速に増大することを防ぎます:
{
"context": {
"maxMessageTokens": 4000,
"truncateMessage": true
}
}
maxMessageTokens 制限を超える個別メッセージは切り捨てられ、メッセージが長すぎたことがユーザーに通知されます。
モニタリングと予防
しきい値に達する前に通知を受け取るため、コンテキスト使用量アラートを設定します:
{
"context": {
"alerts": {
"warningThreshold": 0.7,
"criticalThreshold": 0.9,
"webhook": "https://your-webhook-url.com/alerts"
}
}
}
メモリを解放するため、非アクティブなセッションコンテキストを定期的にクリーンアップします:
# 7日以上非アクティブなセッションをクリア
openclaw context cleanup --inactive-days 7
これにより、長期間アイドル状態のセッションがシステムリソースを消費することを防ぎます。