Skip to content

壓縮

每個模型都有一個上下文視窗:即其可以處理的最大 token 數量。當對話接近該限制時,OpenClaw 會將較舊的訊息壓縮成摘要,以便聊天能夠繼續。

  1. 較舊的對話輪次會被摘要成一個壓縮條目。
  2. 摘要會儲存在對話記錄中。
  3. 最近的訊息會保持完整。

當 OpenClaw 將歷史記錄分割為壓縮區塊時,它會將助理工具呼叫與其對應的 toolResult 條目保持配對。如果分割點落在工具區塊內,OpenClaw 會移動邊界,使該對保持在一起,並保留當前未摘要的尾部。

完整的對話歷史記錄會保留在磁碟上。壓縮只會改變模型在下一輪所看到的內容。

預設會開啟自動壓縮。當對話接近上下文限制,或當模型返回上下文溢位錯誤時(在這種情況下,OpenClaw 會進行壓縮並重試),它就會執行。

您將會看到:

  • embedded run auto-compaction start / complete 在正常的 Gateway 日誌中。
  • 🧹 Auto-compaction complete 在詳細模式中。
  • /status 顯示 🧹 Compactions: <count>

可識別的溢出特徵

OpenClaw 會從這些提供者錯誤模式中偵測內容溢出:

  • request_too_large
  • context length exceeded
  • input exceeds the maximum number of tokens
  • input token count exceeds the maximum number of input tokens
  • input is too long for the model
  • ollama error: context length exceeded

在任何聊天中輸入 /compact 以強制進行壓縮。新增指示以引導摘要:

/compact Focus on the API design decisions

當設定 agents.defaults.compaction.keepRecentTokens 時,手動壓縮會遵循該 Pi 切割點,並在重建的內容中保留最近的尾部。如果沒有明確的保留預算,手動壓縮會作為硬式檢查點,並僅從新的摘要繼續。

在您的 openclaw.json 中的 agents.defaults.compaction 下設定壓縮。以下列出了最常見的調整選項;完整參考請參閱 會話管理深度解析

預設情況下,壓縮使用代理的主要模型。設定 agents.defaults.compaction.model 以將摘要工作委派給更強大或專門的模型。此覆寫接受任何 provider/model-id 字串:

{
"agents": {
"defaults": {
"compaction": {
"model": "openrouter/anthropic/claude-sonnet-4-6"
}
}
}
}

這也適用於本地模型,例如專門用於摘要的第二個 Ollama 模型:

{
"agents": {
"defaults": {
"compaction": {
"model": "ollama/llama3.1:8b"
}
}
}
}

未設定時,壓縮會從目前啟用的會話模型開始。如果摘要因提供者錯誤而失敗且該錯誤符合模型回退條件,OpenClaw 會透過會話現有的模型回退鏈重試該壓縮嘗試。回退選擇是暫時的,不會寫回會話狀態。明確的 agents.defaults.compaction.model 覆寫會保持精確,不會繼承會話回退鏈。

壓縮摘要預設會保留不透明識別碼 (identifierPolicy: "strict")。使用 identifierPolicy: "off" 覆寫以停用,或使用 identifierPolicy: "custom" 加上 identifierInstructions 進行自訂指引。

當設定 agents.defaults.compaction.maxActiveTranscriptBytes 時,如果作用中的 JSONL 達到該大小,OpenClaw 會在執行前觸發標準的本機壓縮。這對於長時間執行的階段很有用,因為供應商端的內容管理可能會讓模型內容保持健康,而本機文字記錄卻持續增長。它不會分割原始 JSONL 位元組;它會要求標準壓縮管線建立語意摘要。

當啟用 agents.defaults.compaction.truncateAfterCompaction 時,OpenClaw 不會就地重寫現有的文字記錄。它會從壓縮摘要、保留的狀態和未摘要的尾部建立一個新的作用中後續文字記錄,然後將先前的 JSONL 保留為已封存的檢查點來源。 後續文字記錄也會捨棄在短暫重試視窗內抵達的完全重複長使用者輪次,因此通道重試風暴不會在壓縮後被帶入下一個作用中文字記錄。

預壓縮檢查點只有在低於 OpenClaw 的檢查點大小上限時才會被保留;過大的作用中文字記錄仍會壓縮,但 OpenClaw 會跳過大型偵錯快照,而不是讓磁碟使用量加倍。

預設情況下,壓縮會靜默執行。設定 notifyUser 以在壓縮開始和完成時顯示簡短的狀態訊息:

{
agents: {
defaults: {
compaction: {
notifyUser: true,
},
},
},
}

在壓縮之前,OpenClaw 可以執行 靜默記憶體清除 輪次,將持久的筆記儲存到磁碟。當此維護輪次應該使用本機模型而不是作用中的對話模型時,設定 agents.defaults.compaction.memoryFlush.model

{
"agents": {
"defaults": {
"compaction": {
"memoryFlush": {
"model": "ollama/qwen3:8b"
}
}
}
}
}

記憶體清除模型覆寫是精確的,並且不會繼承作用中階段的後援鏈。詳情和設定請參閱 記憶體

外掛程式可以透過外掛程式 API 上的 registerCompactionProvider() 註冊自訂壓縮提供者。當註冊並配置了提供者時,OpenClaw 會將摘要工作委派給它,而不是使用內建的 LLM 管線。

若要使用已註冊的提供者,請在您的設定中設定其 id:

{
"agents": {
"defaults": {
"compaction": {
"provider": "my-provider"
}
}
}
}

設定 provider 會自動強制啟用 mode: "safeguard"。提供者會收到與內建路徑相同的壓縮指令和識別碼保留政策,且 OpenClaw 在提供者輸出後仍會保留最近輪次和分割輪次的後綴內容。

壓縮修剪
作用摘要較早的對話修剪舊的工具結果
是否儲存?是(在工作階段紀錄中)否(僅在記憶體中,每次請求)
範圍整個對話僅限工具結果

工作階段修剪 是一個更輕量的補充機制,它會修剪工具輸出而不進行摘要。

壓縮太頻繁? 模型的上下文視窗可能太小,或是工具輸出可能太大。嘗試啟用 工作階段修剪

壓縮後內容感覺過時? 使用 /compact Focus on <topic> 來引導摘要,或啟用 記憶體排空 以保留筆記。

需要全新的開始? /new 會啟動一個新的工作階段而不進行壓縮。

若需進階設定(保留 Token、識別碼保留、自訂上下文引擎、OpenAI 伺服器端壓縮),請參閱 工作階段管理深度解析

  • 工作階段:工作階段管理與生命週期。
  • 工作階段修剪:修剪工具結果。
  • 上下文:如何為代理輪次建立上下文。
  • 鉤子:壓縮生命週期鉤子(before_compactionafter_compaction)。