Skip to content

roadmap: per-model 門檻(各 model 桶設不同 MAX / MIN_GAP / FANOUT_WIDE_MIN) #23

Description

@kiki830621

觀察

pacing-guard 的計數已經 per-model 分桶(model_bucket 過濾,hooks/pacing-guard.py:649)——Opus / Sonnet 5 / Sonnet 4.x / Haiku 各數各的、連發互不相剋。但門檻是單一值套用到所有桶

  • max_in_window = file_override_int(..., "CLAUDE_HOT_LIMIT_MAX", 3)pacing-guard.py:553)—— 一個 3 套到每個桶。
  • _MIN_GAP_FANOUT_WIDE_MIN 同理,皆單一值。

3 是保守的 burst-pacing 起始值,不是任何 model 的實測 acceleration limit。真實 rate limit 各 model 不同(官方文檔:rate limits are per-model),所以「同一個門檻套所有桶」是簡化。

需求

讓門檻可以按 model 桶分別設定,例如 Opus 桶用一個 MAX、Sonnet 5 桶用另一個。

設計選項(待定)

  1. per-bucket envCLAUDE_HOT_LIMIT_MAX_OPUS_4 / _MAX_SONNET_5 …(bucket key 對齊 model_bucket() 輸出 <family>-<major>)。簡單但 env 名稱爆炸。
  2. per-bucket 檔案旗標<data_dir>/max-override.<bucket>(如 max-override.opus-4),fallback 到 max-override → env → default。與既有 file_override_int 檔案機制一致、mid-session 生效。傾向這個
  3. JSON map<data_dir>/thresholds.json{"opus-4": {"max": 3}, "sonnet-5": {"max": 6}})。最靈活但要 parse + schema。

三者都必須保留「未指定桶 → fallback 到全域單一值」的向後相容。

⚠️ Gating:先有校準資料再實作

這功能 gated 在觀測校準資料上。 目前跑 MAX=999 觀測模式(~/.claude/settings.json),正是為了量各 model 的真實節流點。per-model 門檻是「知道每個 model 實際上限之後」才填得進去的東西——現在做好機制,也沒有 calibrated 的值可放。而且 burst guard 本質是防「加速度暴衝」,per-model 計數已分開;門檻要不要也分 model、差多少,取決於各 model 真實 acceleration limit 的差異——這恰好是觀測資料要回答的問題。

建議順序:先讓觀測模式收足各 model 桶的撞牆/趨勢資料(trips-raw.jsonl / calibration-log.md / rate-state.jsonl 已按 model 記錄)→ 分析各 model 桶的實際 acceleration 邊界 → 若差異顯著,才用選項 2 實作 per-bucket 門檻並填入 calibrated 值。

相關

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions