這篇給想「把 Claude 用在實際流程」的人:我做了一個很小的選模器,讓同一條 pipeline 可以依任務自動切換 Opus/Sonnet/Haiku。
先講結論
你不需要每次都手動挑模型。把 Models API 拉進來做一層「任務分類 + 模型規則」,就能同時拿到 成本可控、速度合理、品質也不爛 的折衷。Opus 很強,但不是每一個任務都值得付這個價。
背景 / 為什麼需要這個
我在跑 ClawdBot 的時候,最常遇到兩種任務:
- 「高風險」:程式碼 review、合規條款、結構化輸出
- 「高頻率」:內容摘要、日常整理、批次轉檔
如果兩種都用 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/sdkimport 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 留起來,過一週就能開始算成本差異。
踩坑紀錄(真的會踩)
- 模型別名會變:不要硬寫
claude-opus-latest,用明確版本claude-opus-4-6,避免默默升級造成回歸 - 上下文估錯最致命:如果你沒有 token 計算器,至少用字數 * 2 的粗估,避免任務爆掉
- 批次任務最適合 Haiku,但 Haiku 沒有 adaptive thinking,遇到複雜推理就會開始胡扯
下一步我想做的
- 把選模規則改成「可配置」的 JSON,讓不同 pipeline 共用
- 加上「任務結果品質評分」,讓 routing 不是只靠規則,還能自動學
延伸閱讀
- Anthropic Models Overview(官方)
- Claude 4.6 發布公告(Opus/Sonnet)
基於實際工作流程的 PoC 撰寫。程式碼可直接改成你自己的 router。