Technical reference

工作階段管理深入解析

單一 閘道程序端對端管理工作階段狀態。UI(macOS app、網頁版 Control UI、終端介面)會向閘道查詢工作階段清單與權杖計數。在遠端模式下,工作階段檔案位於遠端主機,因此檢查本機 Mac 的檔案不會反映閘道實際使用的內容。

請先閱讀概覽文件:工作階段管理壓縮記憶概覽記憶搜尋工作階段修剪逐字稿整潔度;完整設定參考請見代理程式設定

兩個持久化層

  1. 工作階段資料列(每個代理程式各自使用 SQLite) - 鍵值對應表 sessionKey -> SessionEntry。由閘道擁有的可變執行階段狀態。追蹤中繼資料:目前的工作階段 ID、上次活動時間、切換設定、權杖計數器。
  2. 逐字稿事件(每個代理程式各自使用 SQLite) - 僅附加的樹狀結構(項目具有 id + parentId)。儲存對話、工具呼叫與壓縮摘要;為後續輪次重建模型上下文。壓縮檢查點是已壓縮後繼逐字稿上的中繼資料——新的壓縮不會寫入第二份 .checkpoint.*.jsonl 副本。

較舊的安裝版本可能仍在代理程式的 sessions/ 目錄下保有 sessions.json 檔案。請將這些檔案視為舊版工作階段資料列的移轉輸入,或明確的 離線維護目標。閘道啟動及 openclaw doctor --fix 會自動將 使用中的舊版資料列與逐字稿歷程匯入每個代理程式各自的 SQLite 儲存區。 需要明確的檢查或驗證證據時,請執行 openclaw doctor --session-sqlite inspect --session-sqlite-all-agents,接著依循 Doctor 移轉 流程。如果舊版逐字稿 成品封存後移轉失敗,請使用該流程中的 Doctor 復原模式。 復原會使用移轉資訊清單,只還原受影響且已封存的支援 成品,並在要求時準備經過清理的 GitHub 問題回報,而且不會 讓使用中的執行階段再次讀取 JSONL 檔案。

除非介面需要任意存取歷史記錄,否則閘道歷史記錄讀取器會避免具體化整份逐字稿。第一頁歷史記錄、內嵌聊天歷史記錄、重新啟動復原,以及權杖/用量檢查,都會從 SQLite 進行有界限的尾端讀取。完整逐字稿掃描會透過非同步逐字稿索引進行,並由並行讀取器共用。

磁碟上的位置

每個代理程式在閘道主機上的位置(透過 src/config/sessions.ts 解析):

  • 執行階段工作階段資料列儲存區:~/.openclaw/agents/<agentId>/agent/openclaw-agent.sqlite
  • 執行階段逐字稿資料列:~/.openclaw/agents/<agentId>/agent/openclaw-agent.sqlite
  • 舊版/封存逐字稿成品:~/.openclaw/agents/<agentId>/sessions/
  • 舊版資料列移轉輸入:~/.openclaw/agents/<agentId>/sessions/sessions.json

儲存區維護與磁碟控制

session.maintenance 控制 SQLite 工作階段資料列、SQLite 逐字稿資料列、封存成品與軌跡附屬檔案的自動維護:

預設值 備註
mode "enforce" "warn"(僅回報,不進行變更)
pruneAfter "30d" 過時項目的存留時間上限
maxEntries 500 工作階段項目上限
resetArchiveRetention 保留(無存留時間上限) *.reset.*/*.deleted.* 逐字稿封存的存留時間上限;指定持續時間即會啟用刪除
maxDiskBytes 10gb 每個代理程式的工作階段磁碟預算;false 會停用此限制
highWaterBytes maxDiskBytes 的 80% 預算清理後的目標用量

重設會推進目前的 sessionKey -> sessionId 對應,但保留先前的 SQLite 工作階段、逐字稿、軌跡與搜尋資料列。該歷史記錄仍可使用相同的工作階段鍵搜尋;一般項目與工作階段清單只會顯示新的使用中對應。保留的重設歷史記錄受磁碟預算限制,而不受 resetArchiveRetention 限制,後者只會使封存成品逾期。明確刪除則不同:它會先寫入並驗證壓縮的逐字稿封存(若可使用 zstd,則為 *.jsonl.deleted.<timestamp>.zst),再移除已刪除工作階段的資料列。

maxDiskBytes 的強制執行依據實體位元組:每個代理程式的 SQLite 主檔案、其 -wal 檔案,以及代理程式工作階段目錄中納入計算的檔案。它絕不估算資料列 JSON 大小,也不會從該總數中扣除邏輯資料列大小。

閘道模型執行探測工作階段(鍵符合 agent:*:explicit:model-run-<uuid>)使用獨立且固定的 24h 保留期限。此修剪由壓力觸發:僅在達到工作階段項目維護/上限壓力時執行,且只在全域過時項目清理/上限步驟之前執行。其他明確建立的工作階段不使用此保留期限。

當合併實體用量超過 maxDiskBytes 時,mode: "enforce" 會先回收可建立檢查點的資料庫空間,接著移除最舊的已保留重設/刪除封存。如果用量仍高於 highWaterBytes,它會依 sessions.updated_at 逐一檢查 SQLite 歷史工作階段,從最舊的開始。所謂歷史工作階段,是指其工作階段 ID 未由使用中的工作階段項目、路由目標或已准入/執行中的作業參照。針對每個清理對象,清理程序會先寫入壓縮封存、執行 fsync 並讀回驗證,然後才由寫入交易移除工作階段資料列及其逐字稿、軌跡、活動狀態、索引與 FTS 投影。這也包括含有軌跡事件但沒有逐字稿事件的工作階段。清理程序會在刪除時重新檢查路由、項目與准入參照,在處理每個封存或工作階段清理對象後重新測量實體用量,並在達到 highWaterBytes 時停止。

已提交的寫入與刪除會先進入 WAL。清理程序會為其建立檢查點,讓 WAL 可立即縮小,接著使用增量 vacuum,將符合條件的可用尾端頁面從主檔案歸還;尚無法回收的頁面會留在主檔案中,因此下次實體測量時仍會計入。mode: "warn" 會回報目前超出的實體用量,而不會建立檢查點、寫入封存或刪除資料列。

依需求執行維護:

bash
openclaw sessions cleanup --dry-runopenclaw sessions cleanup --enforce

維護作業會保留群組工作階段及限定於討論串的聊天工作階段等持久外部對話指標,但合成的執行階段項目(排程、掛鉤、心跳偵測、ACP、子代理程式)超過設定的存留時間、數量或磁碟預算後,仍可被移除。隔離的排程執行使用獨立的 cron.sessionRetention 控制項,不受模型執行探測保留期限影響。

一般閘道寫入會經過工作階段存取器,該存取器透過執行階段寫入器路徑,依序處理每個代理程式的 SQLite 變更。執行階段程式碼應優先使用 src/config/sessions/session-accessor.ts 中的存取器輔助函式;舊版 sessions.json 輔助函式是移轉與離線維護工具。閘道可連線時,非試執行的 openclaw sessions cleanupopenclaw agents delete 會將儲存區變更委派給閘道,使清理作業加入同一個寫入器佇列;--store <path> 是針對所選舊版儲存區的明確離線修復路徑,且一律在本機執行(--dry-run 亦同)。maxEntries 清理作業會針對正式環境規模的儲存區分批執行,因此儲存區可能短暫超過設定的上限,直到下一次高水位清理將其縮減。閘道啟動期間,讀取作業絕不會修剪項目或強制執行上限——只有寫入作業或 openclaw sessions cleanup --enforce 才會;後者也會立即套用上限,並修剪未受參照的舊版逐字稿、檢查點與軌跡成品,即使未設定磁碟預算亦然。

OpenClaw 在閘道寫入期間不再自動建立 sessions.json.bak.* 輪替備份。目前的結構描述會拒絕舊版 session.maintenance.rotateBytes 鍵,而 openclaw doctor --fix 會將其從舊設定中移除。

逐字稿變更會針對 SQLite 逐字稿目標使用工作階段寫入佇列:

工作階段寫入鎖定使用固定的正式環境預設值。對應的 OPENCLAW_SESSION_WRITE_LOCK_* 環境變數仍可供 程序層級診斷與緊急覆寫使用。

切換至 SQLite 後降級

執行較舊、以檔案為基礎的 OpenClaw 版本前,請先還原已封存的 舊版逐字稿成品:

bash
openclaw doctor --session-sqlite restore --session-sqlite-all-agents

移轉作業會保留舊版 sessions.json 檔案,以供支援與 復原使用,但已匯入 SQLite 的使用中逐字稿 JSONL 檔案會 重新命名至 session-sqlite-import-archive/。較舊、以檔案為基礎的執行階段會遵循 sessions.json 中的 sessionFile 路徑,因此啟動前 需要還原這些成品。還原作業會使用移轉資訊清單,只移動有記錄且 原始路徑不存在的封存成品,並保留 SQLite 資料庫以供後續復原。

切換至 SQLite 後建立的工作階段僅存在於 SQLite 中,不會出現在 較舊、以檔案為基礎的執行階段中。如果降級後再次升級,請重新執行 Doctor 檢查與驗證流程,讓 OpenClaw 能在匯入前驗證已還原的舊版 成品。

排程工作階段與執行記錄

隔離的排程執行會建立自己的工作階段項目/逐字稿,並使用專屬保留規則:

  • cron.sessionRetention(預設為 "24h")會從儲存區修剪較舊的隔離排程執行工作階段;false 會停用此功能。
  • 執行歷史記錄會為每個排程工作保留最新的 2000 個終止資料列。遺失的資料列仍保有其 24 小時清理期間。

當排程強制建立新的隔離執行工作階段時,它會在寫入新資料列前清理先前的 cron:<jobId> 工作階段項目:它會保留安全的偏好設定(思考/快速/詳細/推理設定、標籤、顯示名稱)以及使用者明確選取的模型/驗證覆寫,但會捨棄環境對話上下文(頻道/群組路由、傳送/佇列原則、權限提升、來源、ACP 執行階段繫結),讓全新的隔離執行不會從較舊的執行作業繼承過時的傳遞設定或執行階段權限。

工作階段鍵(sessionKey

sessionKey 用於識別你所在的對話區間(路由 + 隔離)。標準規則:/concepts/session

模式 範例
主要/直接聊天(每個代理程式) agent:<agentId>:<mainKey>(預設為 main
群組 agent:<agentId>:<channel>:group:<id>
房間/頻道(Discord/Slack) agent:<agentId>:<channel>:channel:<id>...:room:<id>
排程 cron:<job.id>
網路鉤子 hook:<uuid>(除非被覆寫)

工作階段 ID(sessionId

每個 sessionKey 都指向目前的 sessionId(延續對話的 SQLite 逐字稿識別碼)。判斷邏輯位於 src/auto-reply/reply/session.tsinitSessionState() 中。

  • 重設/new/reset)會為該 sessionKey 建立新的 sessionId
  • 預設為不自動重設。目前的 sessionId 會持續使用,而壓縮會將使用中的模型上下文維持在限制範圍內。
  • 每日重設session.reset.mode: "daily")會在跨過設定的本地小時界線(session.reset.atHour,預設為 4)後,於收到下一則訊息時建立新的 sessionId
  • 閒置到期session.reset.mode: "idle" 搭配 session.reset.idleMinutes,或舊版 session.idleMinutes)會在閒置時段過後收到訊息時建立新的 sessionId。若同時設定每日重設與閒置到期,則以先到期者為準。
  • 控制介面重新連線續用會在閘道從操作員介面用戶端收到相符的 sessionId 時,保留目前可見的工作階段,供重新連線後傳送一次訊息。這是一次性訊號;一般的過期傳送仍會建立新的 sessionId
  • 系統事件(心跳偵測、排程喚醒、執行通知、閘道簿記)可能變更工作階段資料列,但絕不會延長每日/閒置重設的新鮮度。重設切換會在建立全新提示詞之前,捨棄上一個工作階段已排入佇列的系統事件通知。
  • 父系分叉原則會在建立討論串或子代理分叉時使用 OpenClaw 的作用中分支。如果該分支過大(超過固定的內部上限,目前為 100K 個權杖),OpenClaw 會讓子項目使用隔離的上下文啟動,而不會失敗或繼承無法使用的歷程記錄。大小計算會自動進行且無法設定;舊版 session.parentForkMaxTokens 設定會由 openclaw doctor --fix 移除。
  • 操作員分叉sessions.create { parentSessionKey, fork: true } 會建立新的工作階段,其逐字記錄從父項目的目前狀態分支而出(使用與產生子代理相同的分叉機制,包括上述大小上限)。父項目有作用中的執行時會拒絕分叉;除非明確傳入模型選擇,否則會繼承父項目的模型選擇,並以全新的權杖計數器將子項目標記為 forkedFromParent

工作階段儲存區結構描述

執行階段儲存區會在每個代理的 SQLite 中保留 SessionEntry 值。其值型別是在 src/config/sessions.ts 中定義的 SessionEntry。主要欄位(非完整清單):

  • sessionId:用來定址 SQLite 逐字記錄資料列的目前逐字記錄 ID
  • sessionStartedAt:目前 sessionId 的開始時間戳記;每日重設的新鮮度會使用此值。舊版資料列可能會從 JSONL 工作階段標頭推導此值。
  • lastInteractionAt:上次真實使用者/頻道互動的時間戳記;閒置重設的新鮮度會使用此值,因此心跳偵測、排程和執行事件不會讓工作階段持續存活。缺少此欄位的舊版資料列會改用復原的工作階段開始時間。
  • updatedAt:上次變更儲存區資料列的時間戳記,用於列出/修剪/簿記,而非每日/閒置新鮮度的依據。
  • archivedAt:選用的封存時間戳記。已封存的工作階段會連同完整逐字記錄留在儲存區中,並從一般的作用中清單中排除。
  • pinnedAt:選用的釘選時間戳記。作用中且已釘選的工作階段會排在未釘選的工作階段之前;封存工作階段會清除其釘選狀態。
  • Codex 討論串互通:兩個欄位都遵循 Codex 討論串管理格式——傳輸中的 archived/pinned 布林值一律從時間戳記推導並由伺服器端加註,符合 Codex threads.archived_at 語意與 camelCase 序列化。OpenClaw 時間戳記使用 Unix 紀元毫秒,而 Codex 使用 Unix 紀元秒,因此橋接器會在 codex 外掛接縫進行轉換。Codex 尚無釘選 API(僅有 thread/archive/thread/unarchive);在此 API 出現前,釘選狀態會保留在 OpenClaw 端,屆時相符的格式可讓繫結的工作階段以機械方式往返同步釘選狀態。
  • Codex 監督只會列出未封存的原生討論串。只有在操作員明確確認沒有其他 Codex 程序擁有某個閘道本機的 idlenotLoaded 活動狀態未知討論串後,才能透過原生 thread/archive 將其封存;外掛會先重新讀取一次程序本機狀態,之後該討論串便會從目錄中消失。此讀取無法證明另一個 App Server 程序未在使用該討論串。OpenClaw 會拒絕封存作用中和錯誤資料列,而且在節點橋接器能擁有完整的串流討論串生命週期之前,無法使用配對節點封存。在原生 Codex 用戶端取消封存後,討論串便能再次出現。
  • lastReadAt / markedUnreadAt:由 sessions.patch { unread } 在伺服器端加註的讀取狀態時間戳記——unread: false 會記錄一次讀取(設定 lastReadAt、清除 markedUnreadAt);unread: true 會將工作階段標示為未讀,直到下次讀取。工作階段資料列會公開推導出的 unread 布林值:明確標示為未讀,或讀取時間早於最新活動。從未標示為已讀的工作階段會維持 unread: false,因此現有安裝項目在升級時不會全部亮起。
  • lastActivityAt:上次完成且視為值得標示未讀之活動的代理執行時間戳記(使用者、頻道和排程執行)。心跳偵測與內部事件回合以及中繼資料修補都不會更新此值;updatedAt 不是活動訊號。
  • sessionFile:為了移轉/封存相容性而保留的舊版標記;作用中執行階段使用 SQLite 身分
  • chatTypedirect | group | room
  • providersubjectroomspacedisplayName:群組/頻道標示中繼資料
  • 切換項目:thinkingLevelverboseLevelreasoningLevelelevatedLevelsendPolicy(各工作階段覆寫)
  • 模型選擇:providerOverridemodelOverrideauthProfileOverride
  • 權杖計數器(盡力而為/取決於提供者):inputTokensoutputTokenstotalTokenscontextTokens
  • compactionCount:此工作階段鍵已完成自動壓縮的次數
  • memoryFlushAt / memoryFlushCompactionCount:上次壓縮前記憶體排清的時間戳記與壓縮次數

閘道是權威來源:工作階段執行期間,閘道可能會重寫或重新載入項目。 對於使用舊版檔案式後端的安裝項目,請使用 openclaw doctor --session-sqlite import --session-sqlite-all-agents 進行移轉,而不要編輯 sessions.json 並期待執行階段持續讀取該檔案。

逐字記錄事件結構

逐字記錄由 OpenClaw 工作階段存取器管理,並透過以身分為基礎的輔助函式公開給執行階段程式碼。事件串流只能附加:

  • 第一個項目:工作階段標頭——type: "session"idcwdtimestamp,以及選用的 parentSession
  • 之後:包含 id + parentId 的項目(樹狀結構)。

值得注意的項目型別:

  • message:使用者/助理/toolResult 訊息
  • custom_message:由擴充功能注入,且_確實會_進入模型上下文的訊息(當 display: true 時會顯示在終端介面中,當 display: false 時則完全隱藏)
  • custom:_不會_進入模型上下文的擴充功能狀態(用於在重新載入之間保存擴充功能狀態)
  • compaction:包含 firstKeptEntryIdtokensBefore 的持久化壓縮摘要
  • branch_summary:瀏覽樹狀分支時的持久化摘要

OpenClaw 刻意不會「修正」逐字記錄;閘道會使用 SessionManager 讀寫它們。

上下文視窗與追蹤的權杖

這是兩個不同的概念:

  1. 模型上下文視窗:每個模型的硬性上限(模型可見的權杖)。其值來自模型目錄,並可透過設定覆寫。
  2. 工作階段儲存區計數器:寫入工作階段資料列的滾動統計資料(用於 /status 和儀表板)。contextTokens 是執行階段估算/回報值——請勿將其視為嚴格保證。

如需更多限制資訊,請參閱:/reference/token-use

壓縮:其作用

壓縮會將較舊的對話摘要為逐字記錄中的持久化 compaction 項目,並保留近期訊息不變。壓縮後,後續回合會看到壓縮摘要,以及 firstKeptEntryId 之後的訊息。壓縮具有持久性,與工作階段修剪不同——請參閱 /concepts/session-pruning

內嵌的 OpenClaw 壓縮預設會繼承工作階段的思考層級。設定 agents.defaults.compaction.thinkingLevel 可讓摘要呼叫使用不同層級;執行階段會依每個具體的壓縮模型或備援模型限制該值。原生 Codex App Server 壓縮會自行管理其壓縮要求,且無法接受個別壓縮的思考覆寫,因此 OpenClaw 會發出警告,並將該設定交由 Codex 處理。

壓縮後重新注入 AGENTS.md 區段仍須透過 agents.defaults.compaction.postCompactionSections 明確選用。外掛可透過 before_prompt_build 新增其他提示詞上下文。

區塊邊界與工具配對

將長篇逐字記錄分割為壓縮區塊時,OpenClaw 會讓助理工具呼叫與其相符的 toolResult 項目保持配對:

  • 如果依權杖比例分割會落在工具呼叫與其結果之間,OpenClaw 會將邊界移至助理工具呼叫訊息,而不會拆散該配對。
  • 如果尾端工具結果區塊原本會使該區塊超出目標,OpenClaw 會保留該待處理工具區塊,並讓未摘要的尾端保持完整。
  • 已中止/錯誤的工具呼叫區塊不會讓待處理的分割維持開啟。

自動壓縮的發生時機

內嵌 OpenClaw 代理有兩個觸發條件:

  1. 溢位復原:模型傳回上下文溢位錯誤(request_too_largecontext length exceededinput exceeds the maximum number of tokensinput token count exceeds the maximum number of input tokensinput is too long for the modelollama error: context length exceeded,以及其他提供者格式的變體)——先壓縮,再重試。當提供者回報嘗試使用的權杖數時,OpenClaw 會將該觀測值轉送至溢位復原壓縮;如果提供者確認溢位但未公開可剖析的數量,OpenClaw 會將略微超出預算的最小合成數量傳給壓縮引擎和診斷功能。如果溢位復原仍然失敗,OpenClaw 會顯示明確指引,並保留目前的工作階段對應,而不會默默切換至全新的工作階段 ID——請重試該訊息、執行 /compact,或執行 /new
  2. 閾值維護:成功完成回合後,當目前上下文超過模型視窗扣除 OpenClaw 為提示詞與下一次模型輸出保留的內建餘裕時。

另有兩項防護措施會在這兩個觸發條件之外執行:

  • 執行前本機壓縮:設定 agents.defaults.compaction.maxActiveTranscriptBytes(位元組數或類似 "20mb" 的字串),即可在作用中逐字稿達到該大小後,於開啟下一次執行前觸發本機壓縮。這是用來控制本機重新開啟成本的大小防護機制,而非原始封存機制——一般的語意壓縮仍會執行,且需要 truncateAfterCompaction,讓壓縮後的摘要成為新的後繼逐字稿。
  • 回合中預先檢查:設定 agents.defaults.compaction.midTurnPrecheck.enabled: true(預設為 false)以新增工具迴圈防護機制。附加工具結果後、下一次呼叫模型前,OpenClaw 會使用與回合開始時相同的執行前預算邏輯,估算提示詞壓力。如果內容已無法容納,防護機制不會就地壓縮——它會發出結構化的回合中預先檢查訊號、停止目前的提示詞提交,並讓外層執行迴圈使用既有的復原路徑(若截斷過大的工具結果已足夠,便進行截斷;否則觸發已設定的壓縮模式並重試)。適用於 defaultsafeguard 兩種壓縮模式,包括由提供者支援的防護壓縮。此機制與 maxActiveTranscriptBytes 無關:位元組大小防護機制會在回合開啟前執行,而回合中預先檢查會在稍後附加新的工具結果後執行。

壓縮設定

json5
{  agents: {    defaults: {      compaction: {        enabled: true,        keepRecentTokens: 20000,      },    },  },}

OpenClaw 會對內嵌執行強制保留內建空間,並根據作用中模型的內容視窗限制其上限,使其無法占用整個提示詞預算。這可避免內容視窗較小的本機模型從第一個權杖開始就進入壓縮,同時為記憶體清除等多回合維護工作保留足夠空間。

手動 /compact 會遵循明確指定的 agents.defaults.compaction.keepRecentTokens,並保留執行階段的近期尾端切割點。如果未明確指定保留預算,手動壓縮會成為硬性檢查點,而重建的內容會從新摘要開始。

啟用 truncateAfterCompaction 時,OpenClaw 會在壓縮後將作用中逐字稿輪替為壓縮後的後繼逐字稿。分支/還原檢查點動作會使用該壓縮後的後繼逐字稿;舊版壓縮前檢查點檔案在仍被參照時依然可讀取。

可插拔壓縮提供者

外掛會透過外掛 API 上的 registerCompactionProvider() 註冊壓縮提供者。當 agents.defaults.compaction.provider 設為已註冊的提供者 ID 時,防護擴充功能會將摘要工作委派給該提供者,而非使用內建的 summarizeInStages 流水線。

  • provider:已註冊壓縮提供者外掛的 ID。若要使用預設的 LLM 摘要,請不要設定。設定 provider 會強制啟用 mode: "safeguard"
  • 提供者會收到與內建路徑相同的壓縮指示和識別碼保留政策,而防護機制在取得提供者輸出後,仍會保留近期回合與分割回合的後綴內容。
  • 內建防護摘要會使用新訊息重新萃煉先前的摘要,而非逐字保留完整的先前摘要。
  • 防護模式預設會啟用摘要品質稽核;設定 qualityGuard.enabled: false 可略過輸出格式錯誤時重試的行為。
  • 如果提供者失敗或傳回空白結果,OpenClaw 會自動退回使用內建 LLM 摘要。呼叫端明確觸發的中止/逾時訊號會重新擲出而不會被隱藏,因此取消操作一律會受到尊重。

來源:src/plugins/compaction-provider.tssrc/agents/agent-hooks/compaction-safeguard.ts

使用者可見介面

  • 任何聊天工作階段中的 /status
  • openclaw status(命令列介面)
  • openclaw sessions / openclaw sessions --json
  • 閘道記錄(pnpm gateway:watchopenclaw logs --follow):embedded run auto-compaction start + complete
  • 詳細模式:🧹 Auto-compaction complete 加上壓縮次數

靜默維護(NO_REPLY

OpenClaw 支援用於背景工作的「靜默」回合,使用者不應看到其中的中間輸出。

  • 助理以完全相符的靜默權杖 NO_REPLY / no_reply 作為輸出開頭,表示「不要向使用者傳送回覆」。OpenClaw 會在傳送層移除/抑制此內容。
  • 完全相符的靜默權杖抑制不區分大小寫:當整個承載內容只有靜默權杖時,NO_REPLYno_reply 都會生效。
  • 2026.1.10 起,如果部分區塊以 NO_REPLY 開頭,OpenClaw 也會抑制草稿/輸入中串流,讓靜默操作不會在回合進行途中洩漏部分輸出。
  • 此功能僅用於真正的背景/不傳送回合,不能當作處理一般可執行使用者要求的捷徑。

壓縮前記憶體清除

自動壓縮發生前,OpenClaw 可以執行一個靜默的代理式回合,將持久狀態寫入磁碟(例如代理工作區中的 memory/YYYY-MM-DD.md),避免壓縮清除關鍵內容。它會監控工作階段的內容用量;一旦超過低於壓縮臨界值的軟性臨界值,就會使用完全相符的靜默權杖 NO_REPLY / no_reply 傳送靜默的「立即寫入記憶」指示,讓使用者不會看到任何內容。

設定(agents.defaults.compaction.memoryFlush),完整參考資料請見 /gateway/config-agents

預設值 備註
enabled true
model 未設定 僅供清除回合使用的確切提供者/模型覆寫,例如 ollama/qwen3:8b
softThresholdTokens 4000 低於壓縮臨界值並會觸發清除的差距
forceFlushTranscriptBytes 未設定(停用) 逐字稿檔案達到此位元組大小(或類似 "2mb" 的字串)時強制執行一次清除,即使權杖計數器已過時;0 會停用

備註:

  • 內建提示詞和系統提示詞包含 NO_REPLY 提示,以抑制傳送。
  • 設定 model 時,清除回合會使用該模型,而不繼承作用中工作階段的備援鏈,因此僅限本機的維護工作失敗時,不會在無提示的情況下退回使用付費對話模型。
  • 每個壓縮週期只會執行一次清除(記錄於工作階段資料列中)。
  • 清除只會在內嵌 OpenClaw 工作階段中執行;命令列介面後端和心跳偵測回合會略過此步驟。
  • 當工作階段工作區為唯讀(workspaceAccess: "ro""none")時,會略過清除。
  • 工作區檔案配置與寫入模式請參閱記憶體

OpenClaw 在擴充功能 API 中公開 session_before_compact 掛鉤,但上述清除邏輯位於閘道端(src/auto-reply/reply/memory-flush.tssrc/auto-reply/reply/agent-runner-memory.ts),而非該掛鉤上。

疑難排解檢查清單

  • 工作階段金鑰錯誤? 請先參閱/concepts/session,並確認 /status 中的 sessionKey
  • 儲存區與逐字稿不相符? 確認閘道主機,以及 openclaw status 中的儲存區路徑。
  • 壓縮過於頻繁? 檢查模型的內容視窗(太小會強制頻繁壓縮)及工具結果膨脹問題(調整工作階段修剪)。
  • 在小型本機模型上,每個提示詞似乎都會溢位? 確認提供者回報的模型內容視窗正確。OpenClaw 只有在知道該視窗大小時,才能限制有效保留空間。
  • 靜默回合發生洩漏? 確認回覆以完全相符的靜默權杖 NO_REPLY 開頭(不區分大小寫),而且你使用的建置版本包含串流抑制修正(2026.1.10+)。

相關內容

Was this useful?
On this page

On this page