Tools
工具迴圈偵測
OpenClaw 有兩道協同運作的防護機制,用於處理重複的工具呼叫模式:
- 循環偵測 (
tools.loopDetection.enabled) — 預設停用。監看滾動的工具呼叫歷史,尋找重複模式與未知工具重試。 - Compaction 後防護 (
tools.loopDetection.postCompactionGuard) — 預設啟用,除非tools.loopDetection.enabled明確為false。每次 Compaction 重試後會啟動,並在 agent 於視窗內發出相同的(tool, args, result)三元組時中止執行。
兩者都在同一個 tools.loopDetection 區塊下設定,但只要主開關未明確關閉,Compaction 後防護就會執行。設定 tools.loopDetection.enabled: false 可同時靜音這兩個介面。
為什麼需要這個機制
- 偵測沒有進展的重複序列。
- 偵測高頻率、無結果的循環(相同工具、相同輸入、重複錯誤)。
- 偵測已知輪詢工具的特定重複呼叫模式。
- 防止內容溢位、接著 Compaction、再進入相同循環的週期無限執行。
設定區塊
全域預設值,列出所有文件化欄位:
{
tools: {
loopDetection: {
enabled: false, // master switch for the rolling-history detectors
historySize: 30,
warningThreshold: 10,
criticalThreshold: 20,
unknownToolThreshold: 10,
globalCircuitBreakerThreshold: 30,
detectors: {
genericRepeat: true,
knownPollNoProgress: true,
pingPong: true,
},
postCompactionGuard: {
windowSize: 3, // armed after compaction-retry; runs unless enabled is explicitly false
},
},
},
}
每個 agent 的覆寫設定(選用):
{
agents: {
list: [
{
id: "safe-runner",
tools: {
loopDetection: {
enabled: true,
warningThreshold: 8,
criticalThreshold: 16,
},
},
},
],
},
}
欄位行為
| 欄位 | 預設值 | 作用 |
|---|---|---|
enabled |
false |
滾動歷史偵測器的主開關。設定為 false 也會停用 Compaction 後防護。 |
historySize |
30 |
保留用於分析的近期工具呼叫數量。 |
warningThreshold |
10 |
模式被分類為僅警告前的門檻。 |
criticalThreshold |
20 |
封鎖重複循環模式的門檻。 |
unknownToolThreshold |
10 |
在這麼多次未命中後,封鎖對同一個不可用工具的重複呼叫。 |
globalCircuitBreakerThreshold |
30 |
跨所有偵測器的全域無進展斷路器門檻。 |
detectors.genericRepeat |
true |
偵測相同工具加相同參數的重複模式。 |
detectors.knownPollNoProgress |
true |
偵測沒有狀態變化的已知類輪詢模式。 |
detectors.pingPong |
true |
偵測交替往返的模式。 |
postCompactionGuard.windowSize |
3 |
Compaction 後工具呼叫的數量;防護會在此期間保持啟動,也是會中止執行的相同三元組計數。 |
對於 exec,無進展檢查會比較穩定的命令結果,並忽略容易變動的執行階段中繼資料,例如持續時間、PID、工作階段 ID 和工作目錄。當可取得執行 ID 時,近期工具呼叫歷史只會在該次執行內評估,因此排程的 Heartbeat 週期和新的執行不會繼承先前執行留下的過期循環計數。
建議設定
- 對較小型模型,設定
enabled: true並保留預設門檻。旗艦模型通常不需要滾動歷史偵測,可將主開關維持為false,同時仍受益於 Compaction 後防護。 - 保持門檻順序為
warningThreshold < criticalThreshold < globalCircuitBreakerThreshold。 - 如果發生誤判:
- 提高
warningThreshold和/或criticalThreshold。 - 視需要提高
globalCircuitBreakerThreshold。 - 只停用造成問題的特定偵測器(
detectors.<name>: false)。 - 降低
historySize,讓歷史內容判斷較不嚴格。
- 提高
- 若要停用所有機制(包含 Compaction 後防護),請明確設定
tools.loopDetection.enabled: false。
Compaction 後防護
當執行器在內容溢位後完成一次 Compaction 重試時,會啟動一個短視窗防護,監看接下來幾次工具呼叫。如果 agent 在視窗內多次發出相同的 (toolName, argsHash, resultHash) 三元組,防護會判定 Compaction 未打破循環,並以 compaction_loop_persisted 錯誤中止執行。
此防護受主 tools.loopDetection.enabled 旗標控管,但有一個差異:它在旗標未設定或為 true 時會保持啟用,只有在旗標明確為 false 時才停用。這是刻意設計。此防護用來脫離否則會消耗無上限 token 的 Compaction 循環,因此沒有設定的使用者仍會取得保護。
{
tools: {
loopDetection: {
// master switch; set false to disable the guard along with the rolling detectors
enabled: true,
postCompactionGuard: {
windowSize: 3, // default
},
},
},
}
- 較低的
windowSize較嚴格(中止前允許的嘗試次數較少)。 - 較高的
windowSize會給 agent 更多復原嘗試。 - 當結果正在改變時,防護絕不會中止;只有在整個視窗中結果逐位元組相同時才會中止。
- 它刻意保持狹窄:只會在 Compaction 重試後的立即階段觸發。
記錄與預期行為
偵測到循環時,OpenClaw 會回報循環事件,並根據嚴重程度抑制或封鎖下一個工具週期。這可保護使用者免於失控的 token 花費和鎖死,同時保留正常工具存取。
- 警告會先出現。
- 當模式持續超過警告門檻時,接著會進行抑制。
- 重大門檻會封鎖下一個工具週期,並在執行記錄中顯示清楚的循環偵測原因。
- Compaction 後防護會發出
compaction_loop_persisted錯誤,並包含出問題的工具名稱與相同呼叫計數。