
1. OpenClaw 長會話上下文溢出context_length_exceeded 報錯到底怎么來的如果你用 OpenClaw 跑過稍微長一點的會話尤其是那種帶一堆工具調(diào)用、還掛了幾個 Skill 的場景大概率見過下面這幾種報錯Error: context_length_exceeded Error: maximum context length is 32768 tokens, but input is 41230 tokens Error: model crashed / model reload第一次看到的時候我也懵明明對話才幾十輪怎么 token 就爆了。后來把/context detail打開一看才明白真正吃 token 的根本不是聊天記錄而是工具 schema、Skill 列表、workspace 文件注入這些東西。它們平時看不見但每次請求都會重新拼進 prompt 里。OpenClaw 的 Context 控制機制核心就是三條線contextWindow 定硬上限、compaction 壓縮歷史、contextPruning 裁剪緩存。這篇就圍繞這三條線把配置片段和驗證動作都寫清楚你在本地能直接復(fù)現(xiàn)。先說清楚 Context 是什么。OpenClaw 本質(zhì)上是每次請求重新構(gòu)建一個完整 prompt這個 prompt 包含System prompt系統(tǒng)提示詞Conversation history對話歷史Tool calls tool results工具調(diào)用和返回Attachments / transcripts附件、轉(zhuǎn)錄Compaction summaries 和 pruning artifacts壓縮摘要、裁剪產(chǎn)物Provider 的隱藏 wrapper不可見但計入注意最后一條很多 provider 會在請求里塞一些你看不到的包裝內(nèi)容它們照樣占 token。所以 Context ≠ memorymemory 是磁盤上的東西可以重新加載Context 是這一次請求實際發(fā)出去的全部內(nèi)容。適合誰看這篇本地跑 OpenClaw、接了 LM Studio / Ollama 這類本地推理服務(wù)、或者用云端模型但會話一長就崩的人。下面所有配置都基于openclaw.json路徑和字段名跟官方文檔保持一致。2. TaoToken 前置準(zhǔn)備給 OpenClaw 配一個穩(wěn)定的模型入口在動 Context 配置之前得先保證模型入口是通的。我本地測試的時候模型側(cè)用的是 TaoToken 的 API原因是它的 Base URL 和 OpenAI 兼容格式一致OpenClaw 里api: openai-completions直接就能對接不用改協(xié)議。你需要準(zhǔn)備三樣?xùn)|西Base URL、API Key、Model ID。這三件套在 OpenClaw 的 provider 配置里缺一不可。Base URL 填https://taotoken.net/api注意這里不加任何 UTM 參數(shù)就是純 API 地址。API Key 去控制臺生成路徑是 API Keys 管理頁生成后復(fù)制出來別截圖存微信直接貼進配置文件。Model ID 這塊要注意OpenClaw 的models[].id必須和 provider 側(cè)實際可用的模型名一致寫錯了會在請求階段直接 404 或者 model not found。你可以先在 模型對話頁 里手動發(fā)一條消息確認(rèn)模型能正常返回再去配 OpenClaw。如果你打算長期跑編碼類 Agent 任務(wù)會話輪次多、工具調(diào)用密集建議直接上 Coding Plan額度模型對長會話更友好不會跑一半因為配額問題中斷導(dǎo)致 compaction 做到一半失敗。配好之后OpenClaw 的 provider 段落大概長這樣先別急著加 compaction我們一步步來{ models: { mode: merge, providers: { taotoken: { baseUrl: https://taotoken.net/api, apiKey: YOUR_TAOTOKEN_API_KEY, api: openai-completions, models: [ { id: YOUR_MODEL_ID, name: TaoToken Model, contextWindow: 128000, maxTokens: 4096 } ] } } } }這里contextWindow先填 128000 是假設(shè)你用的模型支持這個長度。但如果你本地是 LM Studio 或者 Ollama實際 KV Cache 只開了 8k這里填 128000 就會直接崩下一節(jié)詳細(xì)說這個坑。3. openclaw.json 可復(fù)制配置contextWindow、compaction、contextPruning 三件套這一節(jié)是核心直接給可復(fù)制的配置片段。先說清楚 OpenClaw 能做什么、不能做什么避免你抱錯期望。OpenClaw不能精確控制 prompt 拼接不能只保留最近 n 條消息也不能指定只發(fā)送部分歷史。因為 Context 構(gòu)建是在 Gateway runtime 內(nèi)部完成的不是簡單 config 能干預(yù)的。OpenClaw能做的是間接控制限制 contextWindow、限制 contextTokens 總預(yù)算、觸發(fā) compaction 壓縮、用 contextPruning 刪緩存。這四件事組合起來就能把上下文控制在安全范圍內(nèi)。3.1 contextWindow硬上限必須和推理服務(wù)對齊models.providers.*.models[].contextWindow這個參數(shù)本質(zhì)是告訴 OpenClaw這個模型最多能吃多少 token。關(guān)鍵點它必須小于等于模型實際支持的最大上下文長度。本地推理最容易踩的坑就在這。比如你在 LM Studio 里加載模型時n_ctx設(shè)的是 8192但openclaw.json里contextWindow寫了 128000OpenClaw 就會按 128000 去拼 prompt結(jié)果發(fā)過去直接超出后端 KV Cache模型崩潰或者 reload。所以第一步永遠(yuǎn)是確認(rèn)后端實際上下文大小然后把這個值填進contextWindow。contextWindow: 8192如果你用的是云端模型比如通過 TaoToken 接入的模型就填模型官方標(biāo)稱的上下文長度比如 128000 或 200000。填之前去 接入文檔 確認(rèn)一下當(dāng)前模型的上下文規(guī)格別憑記憶填。3.2 contextTokensAgent 層的軟預(yù)算agents.defaults.contextTokens是 Agent 輸入上下文的總預(yù)算。它和 contextWindow 的區(qū)別是contextWindow 是模型能力上限contextTokens 是你主動設(shè)的安全線。建議設(shè)成 contextWindow 的 75% 到 85%。為什么留這么多因為系統(tǒng)提示詞、工具 schema、Skill 列表這些隱形內(nèi)容也要占空間你按 100% 設(shè)實際請求一拼就超。contextTokens: 6000上面這個 6000 是配合 8192 的 contextWindow 用的留了約 27% 的緩沖。如果你 contextWindow 是 128000contextTokens 可以設(shè) 100000 左右。超過 contextTokens 會觸發(fā) compaction 或 pruning所以它本質(zhì)是提前剎車不是減少內(nèi)容。3.3 compaction壓縮歷史防止無限增長agents.defaults.compaction是主動管理機制。核心參數(shù)是reserveTokensFloor定義觸發(fā)壓縮的剩余空間閾值。當(dāng)上下文剩余空間小于這個值時自動把舊對話總結(jié)成摘要條目釋放空間。compaction: { reserveTokensFloor: 2000, memoryFlush: { enabled: true, softThresholdTokens: 12000, systemPrompt: Session context is filling up. Please archive important information to memory files., prompt: Write key information to memory/YYYY-MM-DD.md; reply with NO_REPLY if nothing to store. } }工作機制是這樣的上下文增長 → 剩余空間到softThresholdTokens→ 觸發(fā) memoryFlush模型把關(guān)鍵信息寫進 memory 文件 → 繼續(xù)增長 → 剩余空間到reserveTokensFloor→ 觸發(fā) compaction壓縮舊對話 → 空間釋放。注意softThresholdTokens必須大于reserveTokensFloor一般高出 10000 左右。上面例子里 soft 是 12000floor 是 2000差 10000符合建議。reserveTokensFloor建議設(shè)成 contextTokens 的 15% 到 20%或者至少保留 2000 到 4000 token。設(shè)太小會導(dǎo)致壓縮操作本身沒空間執(zhí)行出現(xiàn)壓縮失敗 → 崩潰的循環(huán)。3.4 contextPruning裁剪工具緩存contextPruning用來刪除 tool results 或大輸出緩存不影響核心對話歷史。配置很簡單contextPruning: { mode: cache-ttl, ttl: 30m }mode: cache-ttl表示按 TTL 過期清理ttl: 30m是 30 分鐘。工具返回的大塊內(nèi)容比如讀了一個大文件、跑了一次長命令30 分鐘后就從上下文里清掉但對話歷史保留。3.5 bootstrapMaxChars控制文件注入大小agents.defaults.bootstrapMaxChars默認(rèn) 20000 字符控制 workspace 文件注入時的截斷閾值。OpenClaw 默認(rèn)會注入這些文件如果存在AGENTS.md、SOUL.md、TOOLS.md、IDENTITY.md、USER.md、HEARTBEAT.md、BOOTSTRAP.md僅首次運行。這些文件如果寫得很大注入時就會吃掉大量 token。用/context命令能看到原始大小 vs 注入大小以及是否發(fā)生截斷。bootstrapMaxChars: 20000如果你發(fā)現(xiàn) workspace 文件注入占比很高要么精簡文件內(nèi)容要么調(diào)小這個值。3.6 完整配置示例把上面幾塊拼起來一個帶三層防護的openclaw.json大概是這樣{ models: { mode: merge, providers: { taotoken: { baseUrl: https://taotoken.net/api, apiKey: YOUR_TAOTOKEN_API_KEY, api: openai-completions, models: [ { id: YOUR_MODEL_ID, name: TaoToken Model, contextWindow: 128000, maxTokens: 4096 } ] } } }, agents: { defaults: { model: { primary: taotoken/YOUR_MODEL_ID }, workspace: ~/.openclaw/workspace, contextTokens: 100000, bootstrapMaxChars: 20000, compaction: { reserveTokensFloor: 16000, memoryFlush: { enabled: true, softThresholdTokens: 26000, systemPrompt: Session context is filling up. Please archive important information to memory files., prompt: Write key information to memory/YYYY-MM-DD.md; reply with NO_REPLY if nothing to store. } }, contextPruning: { mode: cache-ttl, ttl: 30m }, subagents: { maxConcurrent: 2, model: taotoken/YOUR_MODEL_ID } } }, session: { maintenance: { mode: warn, pruneAfter: 30d, maxEntries: 500 } } }注意session.maintenance.mode從enforce改成warnpruneAfter從 7d 放寬到 30d。原因是磁盤上的會話文件清理交給 compaction 處理更合理過早刪文件反而丟歷史。4. 驗證請求與成功結(jié)果用 /context 和 /usage 確認(rèn)機制生效配置寫完不算完得驗證。OpenClaw 提供了幾個診斷命令我平時用這幾個/status # 當(dāng)前上下文占用 /context list # 誰在占空間 /context detail # 精細(xì)分析分解最大的工具 schema /usage tokens # 正常回復(fù)后附加每次回復(fù)的 token 使用量推薦流程是/context list找最大項然后針對性優(yōu)化。4.1 觀察窗口占用先跑/status看當(dāng)前上下文占了多少。然后跑/context list它會列出各個來源的占用比如 system prompt、conversation、tool schemas、skills、workspace files。我第一次跑的時候發(fā)現(xiàn) tool schemas 占了將近 40%比我預(yù)想的高很多。因為每個工具的 JSON schema 都要發(fā)給模型工具越多這塊越大。4.2 觸發(fā)壓縮閾值想驗證 compaction 是否生效可以故意把contextTokens設(shè)小一點比如設(shè)成 3000然后連續(xù)對話幾輪觀察是否觸發(fā)壓縮。觸發(fā)時你會看到類似日志[compaction] reserve tokens below floor, starting compaction [compaction] summarized 12 messages into 1 summary entry [memoryFlush] archived key info to memory/2025-01-15.md如果沒看到檢查reserveTokensFloor是不是設(shè)得比實際剩余空間還小那樣永遠(yuǎn)不會觸發(fā)。4.3 裁剪前后行為對比驗證 contextPruning可以跑一個返回大輸出的工具比如讀一個大文件然后等 TTL 過期上面配的是 30m測試時可以臨時改成 1m再跑/context list看 tool results 那塊是不是變小了。對比前后兩次/context detail的輸出能明顯看到大輸出緩存被清掉但對話歷史還在。4.4 成功結(jié)果長什么樣配置正確、機制生效的情況下長會話跑下來應(yīng)該是這樣/status顯示的占用穩(wěn)定在 contextTokens 以下不會無限增長觸發(fā) compaction 后占用明顯下降對話能繼續(xù)不再出現(xiàn) context_length_exceeded 報錯模型不會因為上下文超限崩潰或 reload如果這幾點都滿足說明三層防護都起作用了。5. 本篇常見錯排查401、local proxy failed、reading choices、OAuth配置過程中最容易撞的幾個報錯逐個說。5.1 401 UnauthorizedError: 401 Unauthorized這個基本就是 API Key 問題。檢查apiKey字段是不是填對了有沒有多余空格是不是復(fù)制的時候漏了字符。如果用的是 TaoToken去 API Keys 頁 重新生成一個貼進去再試。還有一種情況是 Base URL 寫錯了比如多加了斜杠或者少了/v1。TaoToken 的 Base URL 是https://taotoken.net/apiOpenClaw 會自動補全路徑別自己加/v1。5.2 local proxy failedError: local proxy failed這個通常出現(xiàn)在本地推理服務(wù)沒啟動或者端口不對。檢查baseUrl里的端口比如http://127.0.0.1:1234/v1確認(rèn) LM Studio 或 Ollama 確實在 1234 端口監(jiān)聽。如果本地服務(wù)正常但 OpenClaw 還是報這個檢查是不是防火墻攔了本地回環(huán)請求。5.3 reading choices 報錯Error: reading choices這個一般是 provider 返回的響應(yīng)格式和 OpenClaw 預(yù)期的不一致。常見原因是api字段填錯了比如填了openai-completions但實際服務(wù)返回的是另一種格式。確認(rèn)api字段和 provider 實際協(xié)議匹配。TaoToken 用openai-completions就行。5.4 OAuth 相關(guān)報錯Error: OAuth token expired Error: OAuth flow failed如果你用的是需要 OAuth 的 providertoken 過期會報這個。重新走一遍授權(quán)流程或者換成 API Key 方式接入。5.5 上下文還是溢出如果配置都對了還是溢出按這個優(yōu)先級排查先看/context detail找最大的項如果是 tool schemas 占大頭減少工具數(shù)量或者禁用不用的工具如果是 workspace 文件注入占大頭精簡文件或調(diào)小bootstrapMaxChars確認(rèn) compaction 真的觸發(fā)了看日志有沒有[compaction]輸出確認(rèn)contextWindow和后端實際上下文一致這是最常見的坑優(yōu)化優(yōu)先級建議減少 Tool schemas → 控制 workspace 文件注入 → 開啟 compaction → 設(shè)置合適的 contextWindow 和 contextTokens → 最后才是 pruning。6. 把 Context 控制跑通之后幾個實用技巧配置跑通之后有幾個我平時用的技巧。第一/context detail要養(yǎng)成習(xí)慣定期跑。工具 schema 的占用會隨著你裝新工具變化隔一段時間看一眼能提前發(fā)現(xiàn)膨脹。第二compaction 的reserveTokensFloor別設(shè)太小。我試過設(shè) 500結(jié)果壓縮操作本身沒空間執(zhí)行直接崩。后來改成 contextTokens 的 15%穩(wěn)定多了。第三memoryFlush 的softThresholdTokens和reserveTokensFloor的差值保持在 10000 左右。差值太小memory 還沒寫完就觸發(fā)壓縮差值太大memory 寫入太早浪費空間。第四本地推理的contextWindow一定要和后端n_ctx對齊。這個坑我踩過不止一次癥狀是模型跑著跑著突然 reload日志里啥也沒有就是上下文超了后端 KV Cache。第五如果你要長期跑 Agent 任務(wù)會話輪次多建議用 Coding Plan避免跑到一半配額不夠compaction 做到一半中斷反而丟歷史。最后所有配置改完記得重啟 OpenClaw Gatewayopenclaw.json不是熱加載的。重啟后先跑/status確認(rèn)配置生效再開始長會話測試。