這篇給想「把 Claude 用在實際流程」的人:我做了一個很小的選模器,讓同一條 pipeline 可以依任務自動切換 Opus/Sonnet/Haiku。

先講結論

你不需要每次都手動挑模型。把 Models API 拉進來做一層「任務分類 + 模型規則」,就能同時拿到 成本可控速度合理品質也不爛 的折衷。Opus 很強,但不是每一個任務都值得付這個價。

背景 / 為什麼需要這個

我在跑 ClawdBot 的時候,最常遇到兩種任務:

  1. 「高風險」:程式碼 review、合規條款、結構化輸出
  2. 「高頻率」:內容摘要、日常整理、批次轉檔

如果兩種都用 Opus,成本爆;都用 Haiku,品質爆。程式要亂沒有極限 但錢包不行。這時候「動態選模」就很有價值:讓模型用在該用的地方。

實作步驟(我做的最小可用版本)

Step 1:先把 Models API 拉進來

我用的是 Node 20 + fetch,純 API 呼叫就能拿到可用模型、上下文大小、價格等資訊。

# Node >= 20
node -v
// scripts/list-models.mjs
const resp = await fetch('https://api.anthropic.com/v1/models', {
  headers: {
    'x-api-key': process.env.ANTHROPIC_API_KEY,
    'anthropic-version': '2023-06-01'
  }
});
 
const data = await resp.json();
console.log(data.models.map(m => ({
  id: m.id,
  maxInput: m.max_input_tokens,
  maxOutput: m.max_output_tokens
})));

為什麼要先抓這個? 因為 Claude 4.6 這一代開始,Opus/Sonnet 都有 1M context,Haiku 只有 200k。只靠記憶很容易寫錯,讓「大文件任務」意外跑去 Haiku。

Step 2:做一個超陽春的任務分類器

我沒有引入 fancy classifier,就用一個規則表。先能運作,再慢慢改。

// scripts/select-model.ts
type Task = {
  kind: 'code-review' | 'summarize' | 'batch' | 'long-context' | 'tool-run';
  risk: 'high' | 'medium' | 'low';
  expectedTokens?: number;
};
 
export function selectModel(task: Task) {
  if (task.kind === 'long-context' || (task.expectedTokens ?? 0) > 200_000) {
    return 'claude-opus-4-6';
  }
 
  if (task.risk === 'high' || task.kind === 'code-review') {
    return 'claude-opus-4-6';
  }
 
  if (task.kind === 'batch') {
    return 'claude-haiku-4-5';
  }
 
  return 'claude-sonnet-4-6';
}

這段規則超土,但它有三個好處:

  • 可預測:你知道模型為什麼被選到
  • 可修正:任務跑歪了,改一條規則就好
  • 可解釋:寫到 log,回頭追問題很快

Step 3:把選模器塞進你的呼叫流程

我用 @anthropic-ai/sdk,重點是把模型從固定字串改成 selectModel() 的回傳值。

npm i @anthropic-ai/sdk
import Anthropic from '@anthropic-ai/sdk';
import { selectModel } from './select-model';
 
const client = new Anthropic({ apiKey: process.env.ANTHROPIC_API_KEY! });
 
async function runTask(task: Task, prompt: string) {
  const model = selectModel(task);
 
  const msg = await client.messages.create({
    model,
    max_tokens: task.risk === 'high' ? 4096 : 2048,
    messages: [{ role: 'user', content: prompt }]
  });
 
  return { model, output: msg.content[0].text };
}

在 ClawdBot 這邊,我加了一個 log:

[router] kind=code-review risk=high -> claude-opus-4-6

這個 log 讓我日後做成本分析時很方便。

Step 4:加一個「模型上下文守門員」

最常踩到的坑是:你以為任務只有 30k token,結果塞到 280k,Haiku 直接爆。 我做的最小守門員是:

function ensureContext(task: Task) {
  if ((task.expectedTokens ?? 0) > 200_000) {
    task.kind = 'long-context';
    task.risk = 'high';
  }
  return task;
}

不完美,但能避開最蠢的錯。

實際成果

  • 高風險任務:全部落在 Opus,輸出品質穩定
  • 日常任務:跑 Sonnet,成本降但品質不會掉太多
  • 批次任務:跑 Haiku,速度快,成本最低

我沒有用很 fancy 的數據表,因為這只是第一版 PoC。你把 log 留起來,過一週就能開始算成本差異。

踩坑紀錄(真的會踩)

  1. 模型別名會變:不要硬寫 claude-opus-latest,用明確版本 claude-opus-4-6,避免默默升級造成回歸
  2. 上下文估錯最致命:如果你沒有 token 計算器,至少用字數 * 2 的粗估,避免任務爆掉
  3. 批次任務最適合 Haiku,但 Haiku 沒有 adaptive thinking,遇到複雜推理就會開始胡扯

下一步我想做的

  • 把選模規則改成「可配置」的 JSON,讓不同 pipeline 共用
  • 加上「任務結果品質評分」,讓 routing 不是只靠規則,還能自動學

延伸閱讀

  • Anthropic Models Overview(官方)
  • Claude 4.6 發布公告(Opus/Sonnet)

基於實際工作流程的 PoC 撰寫。程式碼可直接改成你自己的 router。