續(xù)跑失效的排查之道)
最近社區(qū)里關(guān)于 Claude Code 使用體驗(yàn)的討論里Fable 5.1 被提到的頻率很高。不少人在吐槽速率限制設(shè)置太荒謬自動(dòng)續(xù)跑功能形同虛設(shè)。我看了一圈相關(guān)討論再結(jié)合自己平時(shí)跑長(zhǎng)任務(wù)的經(jīng)驗(yàn)基本可以判斷這不是某個(gè)工具的單一 bug而是 Claude Code 工作流里兩個(gè)老問(wèn)題的集中爆發(fā)——第一限流機(jī)制本身很復(fù)雜第二自動(dòng)續(xù)跑依賴的狀態(tài)管理沒(méi)有被第三方工具認(rèn)真對(duì)待。這篇文章不替任何人洗地只從實(shí)際使用角度拆一下問(wèn)題出在哪遇到這種情況怎么排查能不能換一種更穩(wěn)的用法。1. 為什么 Fable 5.1 的限流吐槽會(huì)集中在“荒謬”這兩個(gè)字上很多用戶看到“速率限制”四個(gè)字第一反應(yīng)是“官方又搞限制了”。實(shí)際用下來(lái)你會(huì)發(fā)現(xiàn)限制本身可能并不離譜離譜的是你根本不知道自己什么時(shí)候、因?yàn)槭裁幢幌蘖?。Claude Code 這類工具在跑一個(gè)任務(wù)時(shí)不是只發(fā)一次請(qǐng)求。讀文件發(fā)一次寫代碼發(fā)一次執(zhí)行命令發(fā)一次看到結(jié)果后再繼續(xù)發(fā)一次。一次看似簡(jiǎn)單的“幫我修改這個(gè)模塊”背后可能是十幾次甚至幾十次模型調(diào)用。有些請(qǐng)求還會(huì)并行發(fā)出比如同時(shí)讀取多個(gè)文件或者在自動(dòng)修復(fù)時(shí)重試多次。這樣一來(lái)限流不是被單次操作觸發(fā)的而是被一段時(shí)間內(nèi)的總請(qǐng)求量觸發(fā)的。賬號(hào)等級(jí)越低每分鐘能用的 token 額度越低越容易在長(zhǎng)任務(wù)中段撞上限制。很多人在 Fable 5.1 里看到任務(wù)跑到一半突然停止第一反應(yīng)是工具壞了實(shí)際是請(qǐng)求量超出了賬號(hào)當(dāng)前允許的速率。1.1 速率限制不是一道簡(jiǎn)單的閾值Claude Code 的限流通常不是一刀切。它可能同時(shí)考慮每分鐘請(qǐng)求次數(shù)和每分鐘 token 消耗量。也就是說(shuō)你發(fā) 10 條很短的請(qǐng)求可能沒(méi)事但發(fā) 2 條很長(zhǎng)的請(qǐng)求反而會(huì)撞上限制。所以有時(shí)候不是請(qǐng)求次數(shù)太多而是單次請(qǐng)求太長(zhǎng)。這個(gè)判斷會(huì)影響你調(diào)參的方向。如果長(zhǎng)任務(wù)頻繁中斷先看任務(wù)里有沒(méi)有超長(zhǎng)文檔輸入。如果有先把文本切段分多次處理而不是一次性丟給模型。如果任務(wù)本身是大量短請(qǐng)求比如批量修改文件那就要控制并發(fā)和請(qǐng)求間隔。很多用戶對(duì)限流的另一個(gè)不滿是提示不友好。有的只顯示 Request failed有的顯示 Rate limit exceeded但沒(méi)有告訴你要等多久。沒(méi)有 Retry-After 信息用戶就只能反復(fù)重試。反復(fù)重試又會(huì)產(chǎn)生新請(qǐng)求新請(qǐng)求又繼續(xù)觸發(fā)限流。這是一個(gè)惡性循環(huán)。限流本身其實(shí)是成本控制手段。云端服務(wù)需要管理峰值負(fù)載如果不做速率限制少數(shù)幾個(gè)批量任務(wù)就能把資源占滿。把它當(dāng)成資源預(yù)算來(lái)管理比單純吐槽更有用。1.2 第三方前端最容易放大限流問(wèn)題Fable 5.1 這類工具把底層請(qǐng)求包裝得很干凈用戶看不到每次模型調(diào)用的頻率和并發(fā)。為了體驗(yàn)流暢可能會(huì)在后臺(tái)做并行請(qǐng)求、自動(dòng)重試、預(yù)加載上下文等操作。短任務(wù)沒(méi)感覺(jué)但任務(wù)變長(zhǎng)后請(qǐng)求量會(huì)成倍增加。更麻煩的是很多工具會(huì)把“自動(dòng)續(xù)跑”實(shí)現(xiàn)成“失敗后重新發(fā)起整個(gè)任務(wù)”等于把原本已經(jīng)觸發(fā)限流的請(qǐng)求又疊了一層。我見(jiàn)過(guò)最快的翻車路徑是這樣一個(gè)批量任務(wù)開了默認(rèn)并發(fā)遇到一次 429 后工具自動(dòng)重試重試又帶著之前所有上下文重新請(qǐng)求結(jié)果所有任務(wù)一起等限流窗口日志里全是報(bào)錯(cuò)。遇到限流吐槽我一般先問(wèn)三個(gè)問(wèn)題賬號(hào)是什么檔位跑了多久日志里是哪類錯(cuò)誤如果日志里有 429 或 Rate limit exceeded直接看限流如果日志里是超時(shí)或連接中斷再懷疑工具問(wèn)題。把這三個(gè)問(wèn)題搞清楚就不會(huì)把鍋全扣到 Fable 上。從實(shí)操角度看用第三方工具跑長(zhǎng)任務(wù)最該做的第一件事不是調(diào)模型參數(shù)而是打開日志級(jí)別。Fable 5.1 如果沒(méi)有詳細(xì)日志就看看輸出目錄里有沒(méi)有 .log 文件。日志里如果出現(xiàn)多個(gè) 429說(shuō)明需要把請(qǐng)求頻率降下來(lái)如果只有任務(wù)卡住但沒(méi)有任何報(bào)錯(cuò)可能是上下文過(guò)長(zhǎng)也可能是工具在等待某個(gè)沒(méi)有返回的進(jìn)程。這兩種情況的處理方式完全不同。2. 裝好 Claude Code 之前先把這三個(gè)環(huán)境問(wèn)題解決在討論限流和續(xù)跑失效之前先確認(rèn) Claude Code 本身裝沒(méi)裝好。很多“續(xù)跑失效”根本不是功能問(wèn)題而是環(huán)境問(wèn)題。2.1 Windows 下識(shí)別不了 claude 命令怎么排查很多教程直接說(shuō)安裝 Claude Code 后在終端輸入 claude 就能開始。Windows 用戶執(zhí)行后可能得到這樣的報(bào)錯(cuò)claude : 無(wú)法將“claude”項(xiàng)識(shí)別為 cmdlet、函數(shù)、腳本文件或可運(yùn)行程序的名稱。這個(gè)報(bào)錯(cuò)不一定是安裝失敗更多是可執(zhí)行文件沒(méi)有加入 PATH或者安裝后終端沒(méi)刷新。排查順序建議這樣來(lái)。先運(yùn)行node -v確認(rèn) Node.js 已經(jīng)安裝。Claude Code 的常見(jiàn)安裝方式依賴 Node/npm 環(huán)境如果 Node 沒(méi)裝或者版本太老后面的全局安裝就不會(huì)真正落地。Node 沒(méi)問(wèn)題的話再查看全局包目錄確認(rèn) claude 可執(zhí)行文件是否存在。如果文件存在但命令不識(shí)別把該目錄加入系統(tǒng) PATH然后重開終端。如果文件不存在回到安裝步驟重新執(zhí)行安裝命令注意看安裝過(guò)程有沒(méi)有權(quán)限報(bào)錯(cuò)。Windows 下還有一種情況是 PowerShell 執(zhí)行策略限制導(dǎo)致腳本不能運(yùn)行。如果你不是通過(guò)官方包管理器安裝而是用了某些腳本方式要留意這一步。在 VSCode 里如果改完 PATH 還不行重啟 VSCode 而不是只開新終端。VSCode 的集成終端會(huì)繼承編輯器啟動(dòng)時(shí)的環(huán)境變量舊進(jìn)程不刷新新路徑不生效。2.2 VSCode 里配置 Claude Code 的推薦順序在 VSCode 中使用 Claude Code不一定要裝插件。最常見(jiàn)做法是在項(xiàng)目根目錄打開集成終端直接運(yùn)行 claude。第一次運(yùn)行需要登錄或配置 API Key。如果希望 Claude Code 讀取當(dāng)前項(xiàng)目上下文需要在授權(quán)窗口確認(rèn)允許讀取文件目錄。這里最容易忽略的是 API Key 的存放位置。不要寫進(jìn)項(xiàng)目代碼里建議放到用戶級(jí)環(huán)境變量或者放到項(xiàng)目根目錄的 .env 文件并確保 .gitignore 忽略它。Windows 上可以用setx ANTHROPIC_API_KEY 你的key設(shè)置但設(shè)置后要重開終端才會(huì)生效。macOS/Linux 上可以寫入 shell 配置文件。配置完成之后怎么驗(yàn)證運(yùn)行claude --version或者在交互式會(huì)話里發(fā)一個(gè)極短請(qǐng)求。如果正常得到回復(fù)說(shuō)明安裝和 API 鏈路都通了。如果 prompt 階段就報(bào)鑒權(quán)失敗先查 API Key不要查限流。很多時(shí)候用戶以為的“自動(dòng)續(xù)跑失效”其實(shí)連開始都沒(méi)有開始。終端里 claude 命令根本不存在或者 API Key 沒(méi)識(shí)別到進(jìn)去就報(bào)錯(cuò)。這時(shí)候談續(xù)跑沒(méi)有意義先把最基礎(chǔ)的通路打通。3. 任務(wù)從單條變成多步后速率限制才會(huì)真正成為瓶頸單條短任務(wù)很少出問(wèn)題長(zhǎng)任務(wù)或批量任務(wù)一出問(wèn)題大家就特別困惑。這背后的機(jī)制其實(shí)不難理解。3.1 單條短任務(wù)為什么很少觸發(fā)限流如果只是讓 Claude 寫一個(gè)函數(shù)輸入一段 prompt一次請(qǐng)求就結(jié)束了。單次請(qǐng)求的 token 消耗有限即便觸發(fā)限制也會(huì)很快恢復(fù)。所以新手會(huì)覺(jué)得 Claude Code 很流暢。一旦任務(wù)變成多步執(zhí)行情況就變了。比如讓 Claude Code 自動(dòng)完成“讀取項(xiàng)目配置文件、修改兩個(gè)模塊、執(zhí)行測(cè)試、根據(jù)報(bào)錯(cuò)修復(fù)”每一步都可能調(diào)用一次模型。如果某個(gè)步驟失敗工具又自動(dòng)重試請(qǐng)求量還會(huì)繼續(xù)增加。你以為只發(fā)了一次指令實(shí)際上后端可能已經(jīng)產(chǎn)生了十幾次調(diào)用。這個(gè)現(xiàn)象可以用來(lái)做判斷如果單條短任務(wù)正常批量或長(zhǎng)任務(wù)報(bào)限流說(shuō)明不是賬號(hào)被封而是瞬時(shí)請(qǐng)求量過(guò)大。解決方案不是找工具的問(wèn)題而是調(diào)整任務(wù)粒度。3.2 批量任務(wù)和自動(dòng)重試是限流重災(zāi)區(qū)批量任務(wù)為什么容易觸發(fā)限流因?yàn)槊總€(gè)文件、每個(gè)步驟都可能調(diào)用一次模型。比如你有 20 個(gè)文件需要重構(gòu)每個(gè)文件還要讀、改、驗(yàn)證實(shí)際請(qǐng)求次數(shù)可能是 60 到 100 次。如果 Fable 5.1 默認(rèn)并發(fā)數(shù)為 3同一時(shí)間就有 3 路請(qǐng)求在消耗配額。再加上沒(méi)有退避策略一次失敗立刻重試重試本身又增加請(qǐng)求量最后所有任務(wù)全部卡死。這不是模型能力問(wèn)題是客戶端請(qǐng)求調(diào)度問(wèn)題。我的做法是跑批量任務(wù)前先看賬號(hào)檔位和剩余額度。把并發(fā)數(shù)調(diào)到 1 或 2任務(wù)之間加間隔。如果日志出現(xiàn) 429 或 Rate limit exceeded不要立刻點(diǎn)擊重試先停 3 到 5 分鐘。如果工具支持設(shè)定重試次數(shù)把重試次數(shù)設(shè)成 0 或 1避免雪崩。你也可以用一個(gè)非常簡(jiǎn)單的 shell 循環(huán)來(lái)替代復(fù)雜前端for task in task1 task2 task3; do claude -p 處理 $task 并將結(jié)果保存到結(jié)果文件 output/$task.md sleep 5 done這只是示意具體命令參數(shù)以你當(dāng)前版本為準(zhǔn)。核心思路是單線程、間隔請(qǐng)求、結(jié)果落盤。這比依賴圖形界面的自動(dòng)重試可靠得多。還有一個(gè)細(xì)節(jié)容易被忽略日志里如果出現(xiàn)多個(gè) 429說(shuō)明需要降低頻率如果日志里只有任務(wù)卡住但沒(méi)有任何報(bào)錯(cuò)可能是上下文過(guò)長(zhǎng)也可能是工具在等待某個(gè)沒(méi)有返回的進(jìn)程。先區(qū)分清楚再?zèng)Q定是調(diào)并發(fā)還是調(diào)輸入長(zhǎng)度。4. 自動(dòng)續(xù)跑失效先查這四個(gè)狀態(tài)再下結(jié)論自動(dòng)續(xù)跑失效很多人第一反應(yīng)是“工具 bug”。實(shí)際上續(xù)跑要成功至少需要四個(gè)條件同時(shí)滿足。4.1 會(huì)話、輸出目錄、斷點(diǎn)、版本各有什么影響第一會(huì)話上下文還在。如果客戶端重啟后沒(méi)有保存 session id或者保存了但已經(jīng)過(guò)期續(xù)跑就變成了“從零開始”。第二輸出目錄和臨時(shí)文件可寫。有些任務(wù)會(huì)在中途生成臨時(shí)文件如果上次中斷后文件被占用或沒(méi)有清理續(xù)跑會(huì)直接失敗報(bào)錯(cuò)還不一定清楚。第三任務(wù)是否保存了斷點(diǎn)。真正的續(xù)跑不是再次重發(fā)整個(gè)任務(wù)而是能從上次完成的位置繼續(xù)。如果工具只是把同一個(gè) prompt 重新發(fā)一遍那叫重試不叫續(xù)跑。第四客戶端版本和授權(quán)狀態(tài)是否匹配。Fable 5.1 如果更新后配置文件不兼容或者 API Key 過(guò)期也會(huì)表現(xiàn)為“續(xù)跑失效”。所以排查順序是先看日志再看輸出文件最后改參數(shù)。不要一上來(lái)就重裝工具。我見(jiàn)過(guò)一個(gè)很典型的例子任務(wù)中斷后用戶點(diǎn)了 Fable 的續(xù)跑按鈕結(jié)果又從頭開始跑最后生成了和上次一模一樣的錯(cuò)誤。原因就是工具沒(méi)有保存斷點(diǎn)所謂的續(xù)跑只是把原始 prompt 重新發(fā)了一次。這不是續(xù)跑功能“失效”而是壓根沒(méi)有實(shí)現(xiàn)真正意義上的續(xù)跑。4.2 手動(dòng)恢復(fù)一次任務(wù)的有效姿勢(shì)如果自動(dòng)續(xù)跑已經(jīng)失效最快的恢復(fù)方式是手動(dòng)續(xù)跑。打開任務(wù)日志找到中斷前最后一步完成的內(nèi)容把該內(nèi)容作為上下文的一部分讓模型繼續(xù)處理未完成部分。如果你之前的任務(wù)已經(jīng)把每一小步的結(jié)果落盤這一步會(huì)非常快。如果沒(méi)有落盤就只能翻日志工作量大很多。所以我一直建議跑長(zhǎng)任務(wù)前先設(shè)計(jì)好“可恢復(fù)性”。怎么設(shè)計(jì)把任務(wù)拆成多個(gè)獨(dú)立步驟每步一個(gè)輸入、一個(gè)輸出。步驟之間不依賴上一個(gè)步驟的隱式狀態(tài)。每一步結(jié)束后把結(jié)果寫進(jìn)文本文件。輸出文件名別用task_result.md這種固定名多輪跑會(huì)互相覆蓋。建議用task1.md、task2.md或者帶時(shí)間戳的目錄。這樣失敗后能快速定位。注意自動(dòng)續(xù)跑不是萬(wàn)能。工具版本升級(jí)、配置變化、臨時(shí)文件被清理都會(huì)讓續(xù)跑失效。提前把中間結(jié)果落盤比依賴任何客戶端都可靠。如果 Fable 5.1 更新后出現(xiàn)配置不兼容可以先把配置目錄備份然后讓工具重新生成默認(rèn)配置再對(duì)比差異。不要直接刪除配置因?yàn)槟悴恢览锩嬗袥](méi)有會(huì)話歷史和自定義端點(diǎn)信息。5. 不想整天被限流打斷也可以試試 cc switch 加 OllamaClaude Code 默認(rèn)訪問(wèn)云端 API因此限流、賬號(hào)額度、網(wǎng)絡(luò)波動(dòng)都會(huì)影響任務(wù)。如果你有 Ollama 這類本地模型運(yùn)行環(huán)境并且任務(wù)不依賴頂尖模型能力可以考慮換一條本地模型路徑。5.1 本地模型為什么能避開 API 速率限制通過(guò)配置切換工具或者環(huán)境變量把 Claude Code 的模型端點(diǎn)指向本地服務(wù)請(qǐng)求就不經(jīng)過(guò)云端 API自然不存在云端速率限制。cc switch 是社區(qū)里比較常見(jiàn)的配置切換工具用來(lái)管理不同端點(diǎn)和模型配置。用它切到 Ollama 之后你可以先用一個(gè)本地模型跑通流程確認(rèn)任務(wù)編排、文件讀寫、日志輸出這些環(huán)節(jié)沒(méi)問(wèn)題再切回官方模型做最終生成。這個(gè)思路的核心是把限流從關(guān)鍵路徑上挪開而不是繞過(guò)限制。對(duì)于流程驗(yàn)證、格式轉(zhuǎn)換、簡(jiǎn)單代碼補(bǔ)全這類任務(wù)本地模型完全夠用。而且本地運(yùn)行不消耗 API 額度可以放心試錯(cuò)。如果你只是學(xué)安裝、練習(xí)命令本地模型加 Ollama 的成本低不心疼。但要注意Ollama 拉模型的時(shí)候會(huì)占用磁盤和內(nèi)存低配置機(jī)器不要一上來(lái)就拉一個(gè)幾十 GB 的大模型。先選一個(gè)小參數(shù)模型跑通再根據(jù)效果換更大的。5.2 本地模型解決限流但別忽略三個(gè)邊界第一能力差距。Claude Code 很多高級(jí)操作比如自動(dòng)修改多個(gè)文件、根據(jù)報(bào)錯(cuò)自糾依賴模型對(duì)復(fù)雜指令的遵循能力。本地小參數(shù)模型可能會(huì)漏掉條件、改錯(cuò)文件、不按格式輸出。第二上下文窗口。本地模型可用上下文長(zhǎng)度通常有限長(zhǎng)任務(wù)容易截?cái)唷H绻粋€(gè)任務(wù)需要反復(fù)讀取多個(gè)文件內(nèi)容本地模型可能記不住。第三工具調(diào)用兼容性。Claude Code 和外部模型的接口格式不一定完全一致即使通過(guò) cc switch 這類工具把端點(diǎn)指過(guò)去也可能出現(xiàn)返回格式解析失敗。所以本地模型只建議作為測(cè)試和兜底路徑。想完全替代 Claude 做生產(chǎn)級(jí)代碼任務(wù)目前還不現(xiàn)實(shí)除非任務(wù)足夠簡(jiǎn)單。如果你用 Fable 5.1 這類前端還要先確認(rèn)它是否支持自定義端點(diǎn)。不支持的話就直接用官方 API 更省心。很多續(xù)跑問(wèn)題在本地模型環(huán)境下會(huì)更難排查因?yàn)槟P头祷芈?、解析失敗、工具調(diào)用格式錯(cuò)誤混在一起分不清是哪一層的鍋。6. 我建議的日常使用節(jié)奏小步跑、落盤、退避重試6.1 先跑單條再跑批量我一般會(huì)先把一條最小樣例跑通確認(rèn)輸入、輸出、日志都正常。能跑通之后再處理批量。不要第一次就丟 50 個(gè)文件進(jìn)去也不要一上來(lái)就開最大并發(fā)。這個(gè)順序看起來(lái)慢實(shí)際最穩(wěn)。長(zhǎng)任務(wù)中斷后如果單條樣例正常就能排除環(huán)境和安裝因素集中看限流和續(xù)跑。具體一點(diǎn)準(zhǔn)備一個(gè)小樣本集比如 3 個(gè)典型文件。先跑單文件確認(rèn)結(jié)果沒(méi)問(wèn)題再把 3 個(gè)文件跑完看整體耗時(shí)和是否報(bào)錯(cuò)。都正常后再跑完整批量。每一步之間都檢查輸出文件是否生成、格式是否正確。這個(gè)習(xí)慣能省掉大量排查時(shí)間。6.2 用一個(gè)簡(jiǎn)單表格判斷當(dāng)前狀態(tài)是否正??梢越⒁粋€(gè)判斷標(biāo)準(zhǔn)先看現(xiàn)象再判斷原因最后執(zhí)行操作?,F(xiàn)象大概率原因建議操作單條短任務(wù)正常批量任務(wù)中途停止瞬時(shí)請(qǐng)求量超過(guò)速率限制降低并發(fā)、增加間隔、查看日志429 / Rate limit exceeded觸發(fā) API 限流停止重試等 3-5 分鐘再繼續(xù)續(xù)跑后結(jié)果和上次一樣沒(méi)有斷點(diǎn)只是重新發(fā)起整個(gè)任務(wù)手動(dòng)補(bǔ)跑設(shè)計(jì)可恢復(fù)步驟claude 命令不存在PATH 未配置或安裝失敗檢查 Node 和全局包加入 PATH請(qǐng)求返回鑒權(quán)失敗API Key 缺失或過(guò)期檢查環(huán)境變量和賬號(hào)狀態(tài)輸出內(nèi)容為空輸入格式問(wèn)題或模型解析失敗檢查文件編碼和 prompt 格式這張表不用背出問(wèn)題時(shí)對(duì)著看就行。核心原則是先判斷問(wèn)題發(fā)生在哪一層再動(dòng)手改。6.3 長(zhǎng)期使用前先整理日志和輸出目錄長(zhǎng)期使用 Claude Code建議提前把日志、輸出、臨時(shí)文件分開。每個(gè)日期一個(gè)目錄每個(gè)任務(wù)一個(gè)編號(hào)日志統(tǒng)一記錄請(qǐng)求狀態(tài)和失敗原因。這樣在排查自動(dòng)續(xù)跑失效時(shí)不是靠記憶而是直接看記錄。還可以設(shè)置簡(jiǎn)單的退避重試腳本避免無(wú)限重試。遇到限流先停隔幾分鐘再跑比硬頂有效得多。如果任務(wù)非常重要定期把中間結(jié)果提交到 git 或備份目錄。這聽(tīng)起來(lái)很基礎(chǔ)但確實(shí)比任何自動(dòng)續(xù)跑功能都可靠。工具可能更新、可能抽風(fēng)、可能配置丟失但你自己落盤的數(shù)據(jù)不會(huì)丟。我個(gè)人更建議先把單任務(wù)跑穩(wěn)再把批量任務(wù)拆開最后才考慮要不要上第三方前端。Claude Code 本身挺好用但限流和恢復(fù)邏輯需要你用工程化方式配合。工具鏈越長(zhǎng)越要盯住日志、輸出目錄和任務(wù)粒度。遇到 Fable 5.1 這類工具的“荒謬”問(wèn)題先別急著下結(jié)論把請(qǐng)求節(jié)奏和落盤邏輯管好很多問(wèn)題能少一大半。