2026 OPENCLAW
FALLBACK_
CONFIG_
DRIFT.

維運工程師檢視 Agent Gateway 設定與日誌

當你為 OpenClaw 設定主模型+降級鏈,真正的風險往往不是短暫 429,而是fallback 成功後把執行時模型寫回 `openclaw.json`**,讓磁碟上的「主模型」與團隊意圖永遠分道揚鑣。本文整理三元識別(設定漂移/工作階段態漂移/provider 解析分叉)、五步糾偏(停 Gateway→備份三元組→還原 agents 段落→清理陳舊映射→分層重啟探針),並補上遠端 Mac launchd 對齊清單。併讀《429 降級與日誌》《sessions.json/OAuth》《Gateway token LaunchAgent》。

1. 痛點拆解

工作階段為了救急切到備援模型,若持久化邏輯未區分「使用者明確切換」與「自動 fallback」,真源 JSON 會被覆寫;僅寫裸模型 id 未寫限定 provider 時,解析器可能回落到預設上游;sessions.json 若保留舊映射,UI 會呈現幽靈路由;SSH 互動修改若未同步 plist,重啟後再次漂移。

這類問題最棘手之處在於外部可用性指標仍然綠燈:Webhook 回 200、渠道仍送達訊息,但合規標籤與成本模型已悄然換層。若不把「磁碟上的模型欄位雜湊」納入值勤儀表板,值日生很容易把鍋甩給供應商波動,錯失真正的設定完整性缺口。對跨國團隊而言,時區差異會放大這種漂移:某區工程师深夜用手動 jq「救場」,另一區清晨 LaunchAgent 仍以舊 plist 啟動,造成同日內出現兩套真相並存。

因此本文刻意避免「一句話式」修復指南,而是要求備份三元組、結構化 diff、映射清理與分層探針四件事缺一不可;這不是官僚流程,而是把不可逆的上下文損失機率壓到最低。當你把 fallback 視為常態而非例外,就更應該把「寫回」行為放到程式碼審查與灰度策略之下,而不是留在偶遇的 shell 歷史裡。若仍覺得流程過長,請把它與「半夜叫醒三位工程師」的成本對照,通常後者更昂貴。

2. 症狀對照表

填表前請先確認 Control UI、CLI 與自動化任務是否共用同一 Gateway 實例;若存在多實例,請為每一實例各自留存 JSON 指紋,避免把 A 實例的正確性誤植到 B 實例的事故分析裡。

表象優先懷疑避免
磁碟主模型變成備援名稱fallback 寫回 agents.list只 Git revert 不清理映射
單一渠道走錯模型工作階段條目攜帶 runtime provider全域重裝忽略 sessions
doctor 允許清單不符JSON 與 sessions 分叉盲目 npm 升級
遠端必現、本機偶發launchd 環境載入舊檔複製半套 plist

3. 五步糾偏 Runbook

Step 1 停止 Gateway

systemctl/launchctl;確認無半開 WebSocket 仍在寫入。

Step 2 備份三元組

openclaw.jsonsessions.json、相關 jsonl(至少備份鍵集合摘要)。

Step 3 還原意圖段落

對齊 primary/fallbacks/agents.list;禁止只改模型不改 provider。

Step 4 清理映射

刪除未經授權指向備援執行態的鍵並附工單紀錄。

Step 5 分層重啟

openclaw doctor→Gateway→最小探針三回合;串流需記錄首包與最終模型指紋。完成後請將工單連結貼回監控儀表板的註解欄,方便下一次異常關聯到具體變更批次。

jq '.agents.defaults.model' ~/.openclaw/openclaw.json > /tmp/model.before.json # ... 糾偏後 ... jq '.agents.defaults.model' ~/.openclaw/openclaw.json > /tmp/model.after.json diff -u /tmp/model.before.json /tmp/model.after.json || true

4. 決策矩陣

訊號首選次選
渠道可用但模型錯縮允許清單+JSON 糾偏清空全部工作階段(失上下文)
多 persona 共用 Gateway分 persona 凍結變更全域單模型硬覆寫
launchd 復活舊 env校驗 WorkingDirectory 與 JSON 路徑依賴互動 shell export

若你在決策矩陣中選擇「縮小允許清單」,請同步更新內部文件中的模型別名字典成本歸因標籤,否則財務報表仍會把流量算到已停用的高端模型上,形成第二輪「數字漂移」,並讓預算會議陷入無謂爭吵。對於需要嚴格變更核准的金融場景,可加一道人工簽核:任何修改 agents 段落必須附上兩位值班交叉確認的 jq diff 截圖。

另一個實務技巧是把「修復前後的 Gateway PID」與「plist Label」寫進同一工單:多年後回看可以避免「當時到底重啟的是哪個服務」這種無法回答的問題,也能協助新進工程師快速接上脈絡。這些細節看起來冗長,卻是大型 Agent 叢集裡唯一能把責任邊界釘死的手段。

5. 案例速寫(含合規視角)

「供應商逾時→fallback 成功→對話恢復;兩週後稽核發現磁碟 primary 被寫成小模型。」

團隊備份→糾偏→清理映射→重啟後,於 MR 模板加上「禁止 silent fallback 寫回 agents.list」提示;並把事故等級標為設定完整性而非單純可用性,另新增模型欄位雜湊日報以避免無 CR 的漂移。

6. 治理與觀測

JSON diff 應與 Terraform 變更同級審核;結構化日誌應記錄限定路徑的最後成功模型;SIEM 可對「agents.list 雜湊變動但無變更單號」發低噪告警。

遠端 Mac 常駐 Gateway 散熱佳,但 SSH 便利易忘 plist 真源;把 launchd 三步自檢寫進值班手冊。若需要在 macOS 上獲得更可預期的劇本與圖形/多媒體相容性,可租用 MACGPU 遠端節點複用 launchd 模板。

provider 限定路徑方面,請在模板強制「provider+model」二元組,並檢查渠道覆寫是否沿用舊 persona 指標;遠端場景下於重啟前打印 launchctl 環境與 doctor 路徑對照,杜絕「磁碟已對但行程仍舊」的假修復。

7. Provider 解析與限定路徑門檻(避免隱性分叉)

僅填裸模型名時,解析堆疊會拼接預設 provider;若工作階段曾成功使用帶前綴的限定路徑,下一回合就可能出現同名不同路由。請在變更模板強制「provider+model」並用 jq 做欄位齊備檢查。對 Telegram/Web UI/Cron 並存情境,亦需確認渠道覆寫是否沿用舊 persona 指標,避免單一渠道看似復原、其餘渠道仍指向備援。

遠端 Mac 常見缺口是「SSH 內 jq 修改」未觸發 launchd 重新載入 plist;磁碟 JSON 已正確,行程環境卻仍舊。Runbook 要求在重啟 Gateway 前完成plist 與行程環境對齊三步:列印 launchctl 注入環境、對照 openclaw doctor 路徑、再以最小訊息驗證模型指紋。

觀測上建議把「最後成功回合使用的限定模型」打入結構化日誌欄位;SIEM 可對「agents.list 模型欄位雜湊變動但無 CR 編號」發低噪告警。變更節奏亦可拆分實驗/生產通道:實驗允許頻繁替換別名,生產凍結別名僅調整逾時與重試,降低 fallback 成功後的隱性持久化機率。必要時為實驗通道設定較短的資料保留期,以免巨型 jsonl 拖累 Gateway 啟動。

8. MR 數字門檻

糾偏前後各三輪探針並留存日誌指紋;供應商切換必記時間戳與 HTTP 狀態;單週若 ≥2 次「磁碟與意圖不符」事件需暫停 fallback 拓撲變更直至程式路徑稽核;sessions 目錄變更需附 sha256 備份校驗;任何多人協作改 JSON 必須使用鎖檔或變更窗並保留 Git 差異截圖。若組織使用變更管理系統,請把「模型欄位雜湊」與「工單編號」做成必填欄位,空白即拒絕合併。

9. FAQ(值班快速索引版)

只刪 sessions?JSON 仍歪會復發。Docker?對齊 volume 與 HOME。先升級?先糾偏。多人協作?加鎖或變更窗,Git 意圖段落優先。 禁用 fallback?應縮窄而非移除救生筏。需要稽核截圖嗎?建議附上 jq diff 與三輪探針原始日誌片段,以便六個月後仍可回放決策與上下文。如何把 Runbook 嵌進值班輪值?將五步抄進 wiki 首屏並連結到自動化檢查清單;每季度做一次無預警桌面演練,確認備份腳本仍在正確路徑。是否要通知終端使用者?若變更會重置對話上下文,務必提前公告並提供匯出對話的緩衝窗。能否灰度只對部分帳號啟用新 fallback 鏈?可以,但務必在設定檔拆分 persona,並為每條鏈獨立維護 digest 與工單編號,避免灰度與正式共用同一段 agents.list。