Session Pruning(會話修剪)
會話修剪在每次 LLM 呼叫之前,從記憶體上下文(in-memory context)中修剪舊的工具結果。它不會重寫磁碟上的會話歷史 (*.jsonl)。
何時執行
- 當啟用
mode: "cache-ttl"且該會話的最後一次 Anthropic 呼叫早於ttl時。 - 僅影響發送給該請求模型的訊息。
- 僅對 Anthropic API 呼叫(及 OpenRouter 的 Anthropic 模型)有效。
- 為了獲得最佳效果,請使
ttl與您的模型cacheControlTtl相匹配。 - 修剪後,TTL 窗口會重置,因此後續請求會保持快取,直到
ttl再次過期。
智慧預設 (Anthropic)
- OAuth 或 setup-token 設定檔:啟用
cache-ttl修剪,並將心跳(heartbeat)設定為1h。 - API Key 設定檔:啟用
cache-ttl修剪,將心跳設定為30m,並在 Anthropic 模型上將預設cacheControlTtl設定為1h。 - 如果您明確設定了這些值,OpenClaw 不會覆寫它們。
改進了什麼(成本 + 快取行為)
- 為何修剪: Anthropic 的提示快取(prompt caching)僅在 TTL 內有效。如果會話在 TTL 之後閒置,下一次請求會重新快取完整提示,除非您先對其進行修剪。
- 什麼變便宜了: 修剪減少了 TTL 過期後第一次請求的 cacheWrite 大小。
- 為何 TTL 重置很重要: 一旦執行修剪,快取窗口就會重置,因此後續請求可以重用新快取的提示,而不是再次重新快取完整歷史。
- 它不會做什麼: 修剪不會增加 token 或「加倍」成本;它只會改變 TTL 後第一次請求中被快取的內容。
哪些內容可以被修剪
- 僅限
toolResult訊息。 - 使用者 + 助手訊息絕不會被修改。
- 最後
keepLastAssistants個助手訊息受到保護;該切斷點之後的工具結果不被修剪。 - 如果沒有足夠的助手訊息來建立切斷點,則跳過修剪。
- 包含圖片區塊 (image blocks) 的工具結果會被跳過(絕不修剪/清除)。
上下文視窗估計
修剪使用估計的上下文視窗(字元數 ≈ token 數 × 4)。視窗大小按以下順序解析:- 模型定義的
contextWindow(來自模型註冊表)。 models.providers.*.models[].contextWindow覆寫值。agents.defaults.contextTokens。- 預設
200000tokens。
模式
cache-ttl
- 僅在最後一次 Anthropic 呼叫早於
ttl(預設5m)時執行修剪。 - 執行時:與之前相同的軟修剪 (soft-trim) + 硬清除 (hard-clear) 行為。
軟修剪 vs 硬清除
- 軟修剪 (Soft-trim):僅針對過大的工具結果。
- 保留頭部 + 尾部,插入
...,並附上原始大小的說明。 - 跳過帶有圖片區塊的結果。
- 保留頭部 + 尾部,插入
- 硬清除 (Hard-clear):將整個工具結果替換為
hardClear.placeholder。
工具選擇
tools.allow/tools.deny支援*通配符。- 拒絕優先。
- 匹配不區分大小寫。
- 空的允許清單 => 允許所有工具。
與其他限制的互動
- 內建工具已經會截斷自己的輸出;會話修剪是一個額外的層級,防止長時間運行的聊天在模型上下文中累積過多工具輸出。
- 壓縮 (Compaction) 是分開的:壓縮會進行摘要並持久化,而修剪是針對每個請求的暫時行為。請參閱 /concepts/compaction。
預設值(啟用時)
ttl:"5m"keepLastAssistants:3softTrimRatio:0.3hardClearRatio:0.5minPrunableToolChars:50000softTrim:{ maxChars: 4000, headChars: 1500, tailChars: 1500 }hardClear:{ enabled: true, placeholder: "[Old tool result content cleared]" }