Claude Fable 5 從 6 月 9 日發表到現在,從發表到現在經歷了不少波折。先是上線三天就被美國政府禁用,接著在 7 月 1 日復活後,「什麼時候要開始收費」這件事又被反覆延期了三次,最後在 7 月 20 日才正式定案。

除了計費方案的混亂,開發者在實際使用中還會碰到兩個問題:安全分類器把正常請求誤判並退回 Opus 4.8,以及長對話中的 compact 壓縮導致上下文遺失。這篇把這些事情整理在一起,從時間線、降級判斷、到 compact 問題的處理建議,一次講完。

Fable 5 的發表細節與定價可以看之前寫的 Fable 5 發表整理,下架始末在 下架事件,復活後的安全機制與政府合作框架則在 Fable 5 復活 那篇。

完整時間線

從發表到計費方案定案,Fable 5 的存取權變動了至少七次。

日期事件
6 月 9 日Fable 5 與 Mythos 5 正式發表,Pro、Max、Team、Enterprise 訂閱用戶可免費使用
6 月 12 日美國商務部發出出口管制令,Anthropic 全面停用 Fable 5 與 Mythos 5
6 月 30 日商務部解除出口管制
7 月 1 日Fable 5 全球重新上線,附帶改良版安全分類器。訂閱內免費使用延續至 7 月 7 日,Fable 5 用量佔每週額度上限的 50%
7 月 7 日原定截止日。當天深夜宣布延至 7 月 12 日
7 月 13 日7 月 12 日截止後數小時,再度宣布延至 7 月 19 日
7 月 17 日系統異常:Fable 5 突然要求 usage credits,status.claude.com 確認為非計畫中的故障,約一小時內修復
7 月 18 日Anthropic 公布最終方案
7 月 20 日新方案正式生效:Max 與 Team Premium 永久保留 Fable 5,Pro 與 Team Standard 改為 usage credits

三次延期都是透過 @claudeai 的 X 帳號宣布,沒有正式的部落格文章。7 月 13 日第二次延期的貼文在幾小時內突破一千萬次瀏覽,可以看出社群對這件事的關注程度。

目前的使用方案

7 月 20 日之後,Fable 5 的存取方式依方案而異:

方案Fable 5 存取方式
Max訂閱內包含,用量佔每週額度上限的 50%。超過後需使用 usage credits
Team Premium 席位同 Max
Pro僅限 usage credits(附贈一次性 $100 credit)
Team Standard 席位同 Pro
Enterprise Premium 席位同 Max
Enterprise Standard 席位需啟用 usage credits
API按 token 計費:input $10 / output $50 每 1M tokens

50% 的意思是:假設 Max 方案每週有 200 個使用額度,其中最多 100 個可以用在 Fable 5 上。Fable 5 消耗額度的速度比其他模型快(因為 thinking 永遠開啟,token 用量更高),所以實際可用的對話數會比用 Opus 4.8 或 Sonnet 5 時少。

對 Pro 用戶來說,$100 的一次性 credit 聽起來不少,但以 output $50 / 1M tokens 的價格,中等規模的程式碼遷移任務(生成約 200 萬 output tokens)就能把 credit 用完。考慮要不要升級 Max 時,先評估自己的 Fable 5 用量再決定。

安全分類器與 Opus 降級

Fable 5 復活後加裝的安全分類器是目前使用上常遇到的問題。分類器會掃描送進模型的所有內容(包含 system prompt、對話歷史、上傳的檔案、搜尋結果),觸發時請求會被退回 Opus 4.8 處理。

分類器主要針對四類內容:

  • 攻擊性網路安全:exploit 開發、惡意軟體、攻擊工具相關
  • 生物與生命科學:實驗方法、分子機制相關
  • 推理萃取(reasoning extraction):試圖取得模型的內部推理過程
  • 前沿 LLM 開發:分散式訓練基礎設施等

Anthropic 也指出,這套分類器的 safety margin 設得比之前的版本都大。好處是針對引發出口管制的那個特定 jailbreak 技術,擋掉了超過 99% 的案例,代價是正常的程式碼也會被誤判。根據 Anthropic 的數據,不到 5% 的 Fable 5 session 會觸發分類器。但從開發者社群回報的案例來看,以下這些明顯無害的工作也曾被標記:

  • Rust syscall 的 PR review
  • AWS Bedrock 彈性設計的架構討論
  • Django 專案中包含 AES-256-GCM 加密的程式碼
  • macOS 應用程式的螢幕與麥克風錄製功能
  • 基礎設施管理與 PDF 處理任務

securityvulnerableunsafehookkill、failover、circuit breaker 這些在日常開發中很常見的詞,都可能觸發分類器。

如何判斷請求是否被退回 Opus

判斷方式取決於使用的介面。

claude.ai 網頁版

網頁版的處理比較直接:被分類器攔截時,畫面上會顯示通知橫幅,回應也會標註實際使用的模型名稱。切換後 model picker 會停留在 Opus 4.8,後續對話會繼續用 Opus,除非手動切回 Fable 5。

API

API 端需要主動檢查幾個欄位。被分類器攔截的請求會回傳正常的 HTTP 200,但內容跟預期不同:

response.model 是比較直接的判斷依據。正常情況下會是 claude-fable-5,被退回時會變成 claude-opus-4-8

stop_reason 會是 "refusal"(如果沒有設定自動 fallback 的話)。stop_details 物件會帶有分類類別(cyberbioreasoning_extractionfrontier_llm、或 null),但 stop_details 不一定有值,判斷時應該以 stop_reason 為主。

分類器可能在兩個時間點觸發:

  • 輸出前觸發content 陣列為空,不計費
  • 輸出中途觸發:已產生的部分輸出會計費,但應該丟棄不要當作完整回應使用

建議在每次呼叫後都先檢查 stop_reason,再讀取 content

response = client.messages.create(
    model="claude-fable-5",
    max_tokens=4096,
    messages=[{"role": "user", "content": "..."}]
)

if response.stop_reason == "refusal":
    # 被分類器攔截,content 可能為空或不完整
    print(f"被退回:{response.stop_details}")
else:
    # 正常回應
    print(response.content[0].text)

# 確認實際回應的模型
print(f"實際模型:{response.model}")

Claude Code

Claude Code 在模型切換時會顯示提示訊息。如果沒有注意到提示,以下幾個徵兆可以幫助判斷是否被降級了:

  • 延遲明顯增加(可能是原本的 2–4 倍)
  • 回應格式與預期不同(例如要求 JSON 卻回傳散文)
  • 語氣變得過度保守(出現 “I want to make sure I understand…” 這類措辭)
  • 回應長度大幅縮短

碰到這種情況,重啟 Claude Code session 可以清除「黏性降級」的狀態。在 session 內使用 /model 指令切回 Fable 5 不一定有效,開新 session 比較可靠。

被降級後的處理方式

對 claude.ai 使用者來說,處理方式比較單純:從 model picker 手動切回 Fable 5,或是編輯前一則訊息後重試。如果覺得是誤判,可以透過介面上的回饋功能回報。

API 開發者有幾種方式可以自動處理 fallback,依建議順序排列:

Server-side fallbacks(推薦)

在 Claude API 和 Claude Platform on AWS 上可用。只需要一次 API 呼叫,被分類器攔截時,API 會自動用 Opus 4.8 重新處理同一個請求:

response = client.beta.messages.create(
    model="claude-fable-5",
    max_tokens=4096,
    betas=["server-side-fallback-2026-06-01"],
    fallbacks=[{"model": "claude-opus-4-8"}],
    messages=[{"role": "user", "content": "..."}]
)

# 檢查是否有 fallback 發生
fallback_ran = any(
    entry.type == "fallback_message"
    for entry in response.usage.iterations or []
)

if fallback_ran and response.stop_reason != "refusal":
    print(f"由 {response.model} 回應(fallback)")
else:
    print(f"由 {response.model} 回應")

fallback 的計費會自動套用 credit 機制。退回 Opus 4.8 的那次呼叫,input tokens 按 cache-read 費率計算(約 $0.50 / 1M tokens),output tokens 按 Opus 4.8 標準費率 $25 / 1M tokens,比直接用 Fable 5 便宜許多。

Client-side middleware

在 Amazon Bedrock、Vertex AI、Microsoft Foundry 等不支援 server-side fallback 的平台上,可以用 SDK 內建的 middleware:

from anthropic import Anthropic, BetaFallbackState, BetaRefusalFallbackMiddleware

# 建立帶有 fallback middleware 的 client
client = Anthropic(
    middleware=[
        BetaRefusalFallbackMiddleware([{"model": "claude-opus-4-8"}])
    ]
)

# 每個對話建立一個 state 物件,用來追蹤 fallback 狀態
state = BetaFallbackState()
with state:
    response = client.beta.messages.create(
        model="claude-fable-5",
        max_tokens=4096,
        messages=messages
    )

BetaFallbackState 的作用是讓 fallback 的「黏性路由」能運作——一旦某個對話被退回 Opus,後續的請求會自動直接送到 Opus,避免每次都被分類器攔截一遍。每個對話要用獨立的 state 物件,不同對話之間不要共用。

手動重試搭配 fallback credit

如果不使用上面兩種機制,也可以自己偵測 stop_reason: "refusal" 後手動重試。搭配 fallback-credit-2026-06-01 beta header,被拒絕的請求會回傳一個 fallback_credit_token,在重試時帶上這個 token,原本已經 cache 的 prompt 部分會按 cache-read 費率計算,不用重新付 cache-write 的費用。

token 有效期限是 5 分鐘,重試時的請求內容必須跟原始請求完全一致(包含 thinking blocks,不需要也不應該自己移除)。

減少誤判的做法

雖然分類器的判斷不在使用者端的控制範圍內,但有幾個做法可以降低被誤判的機率:

  • 在 system prompt 中明確標示意圖:例如「這是一個 systems engineering 專案」而非讓分類器自己判斷程式碼的性質
  • 縮小 Claude Code session 的範圍:避免在同一個 session 中處理太多不同類型的任務
  • 不同任務之間重啟 session:特別是在涉及安全相關詞彙的任務之後
  • 合法的安全研究:可以申請 Anthropic 的 Cyber Verification Program

Compact 壓縮問題

Compaction 是 Anthropic 提供的對話壓縮功能(目前仍在 beta),會在對話接近 context window 上限時,自動將較早的對話內容摘要化以騰出空間。這個功能不是 Fable 5 獨有的,Opus 4.8、4.7、4.6、Sonnet 5 和 Sonnet 4.6 都支援,但 Fable 5 的使用者特別常碰到相關問題。

Compaction 的運作方式

API 層面,啟用 compaction 需要 beta header compact-2026-01-12,並在請求中設定 context_management

response = client.beta.messages.create(
    betas=["compact-2026-01-12"],
    model="claude-fable-5",
    max_tokens=4096,
    messages=messages,
    context_management={
        "edits": [{
            "type": "compact_20260112",
            "trigger": {
                "type": "input_tokens",
                "value": 150000  # 預設值,最低 50000
            }
        }]
    }
)

觸發壓縮後,回應中會多出一個 compaction block,包含對話摘要。後續請求必須把這個 block 原封不動地傳回去,API 會自動忽略 compaction block 之前的所有內容。

壓縮本身是額外的一次 sampling 迭代,會產生費用。usage.iterations 裡會有一筆 type: "compaction" 的紀錄,top-level 的 usage 不包含壓縮的 token 數,計算總費用時需要把 iterations 裡所有項目加總。

開發者回報的問題

Claude Code 使用者反映的 compact 問題主要集中在幾個方面:

壓縮後上下文遺失:這是開發者較常回報的問題。壓縮會把長對話濃縮成一段摘要,但關鍵細節經常在過程中丟失,像是檔案命名慣例、先前的架構決策、微妙的限制條件都可能消失。有使用者回報 150K token 的架構討論被壓成一句「We discussed the codebase architecture and identified key patterns」。

CLAUDE.md 指令遺失:Claude Code 使用者特別在意的問題。壓縮後 CLAUDE.md 裡的專案指令可能被摘要掉,Claude 會回到預設行為,不再遵循之前的偏好設定。GitHub 上有多個相關的 bug report(#31409、#10006、#24460)。

過早觸發壓縮:有使用者發現在 context window 只用到 48% 時就觸發了壓縮,遠低於預期的閾值。可能的原因是壓縮過程本身使用的 summarization 模型有自己的 context 上限,當對話內容超過該模型能處理的範圍時就會失敗。

Auto-compact 行為不如預期:部分使用者反映即使設定關閉 auto-compact,系統仍然會在一定的 context 用量時強制壓縮。也有相反的情況,context 用滿 100% 時 auto-compact 沒有觸發,Claude Code 直接停止回應。

建議做法

  • 主動壓縮比被動好:與其等到 context 接近上限才被自動壓縮,不如在 context 使用量到 60% 左右時,在 Claude Code 中用 /compact 主動觸發,並附上自訂的壓縮指示告訴它哪些資訊要保留
  • 重要決策寫入檔案:不要只依賴對話記憶來保存關鍵資訊。架構決策、命名慣例、先前的設計選擇,都應該寫進專案的文件中(例如 CLAUDE.md),這樣即使對話被壓縮,模型還是可以從檔案中讀取
  • API 層面設定合理的 trigger 值:預設的 150,000 tokens 對大多數場景夠用,如果對話特別長或需要保留更多上下文,可以調高 trigger 值。最低可以設到 50,000
  • 善用 pause_after_compaction:設為 true 時,壓縮後會暫停並回傳 stop_reason: "compaction",讓應用程式有機會在繼續對話前做額外處理(例如注入重要的上下文提醒)
  • 自訂壓縮指示:透過 instructions 參數告訴壓縮模型要重點保留哪些資訊,例如 "Focus on preserving code snippets, variable names, file paths, and technical decisions."

參考資料


Sponsored Links