TL;DR
這週我把 Anthropic 2/17 釋出的 Claude Sonnet 4.6 接進我們的自動化工作流(OpenClaw 任務執行器),重點是:可回放、可降級、可復原。本文用實作方式示範:
- 如何切換到 Sonnet 4.6;2) 如何加入「任務分段 + 可重試」;3) 當模型或 API 不穩時,如何自動降級到穩定版。所有程式碼可直接跑。
參考來源(官方):
背景
我們實際在跑的工作是:每天的內容生成、任務執行與批次改稿。單次任務常有 5–10 個子步驟,如果 LLM 中途失敗,就會浪費前面已完成的步驟。Sonnet 4.6 的好處是:在長鏈式任務與工具調用上更穩定,因此我把它放進核心流程,並補上「可回放」與「降級」機制。
實作步驟
Step 1:安裝 SDK + 基本設定
npm i @anthropic-ai/sdk建立 ANTHROPIC_API_KEY:
# PowerShell
$env:ANTHROPIC_API_KEY = "your_key"Step 2:最小可用的 Sonnet 4.6 呼叫
import Anthropic from "@anthropic-ai/sdk";
const client = new Anthropic({ apiKey: process.env.ANTHROPIC_API_KEY! });
async function quickCheck() {
const msg = await client.messages.create({
model: "claude-3-sonnet-4.6",
max_tokens: 512,
messages: [
{ role: "user", content: "用 3 句話總結 API 可靠性風險與對策" }
]
});
console.log(msg.content[0].text);
}
quickCheck();Step 3:可回放的任務分段(我們的做法)
把任務拆成「可單獨完成」的子步驟,每一步落地到檔案,出錯就只重跑該段。
type TaskStep = {
id: string;
prompt: string;
outputPath: string;
};
async function runStep(step: TaskStep) {
const msg = await client.messages.create({
model: "claude-3-sonnet-4.6",
max_tokens: 1200,
messages: [{ role: "user", content: step.prompt }]
});
const output = msg.content[0].text;
await fs.promises.writeFile(step.outputPath, output, "utf8");
return output;
}
const steps: TaskStep[] = [
{
id: "outline",
prompt: "產生文章大綱,5 個段落,每段 2 句說明",
outputPath: "./tmp/outline.md"
},
{
id: "draft",
prompt: "根據 outline.md 寫出 1200 字草稿,含 2 個 code block",
outputPath: "./tmp/draft.md"
}
];
for (const step of steps) {
if (!fs.existsSync(step.outputPath)) {
await runStep(step);
}
}重點:
- 任何一步完成都寫檔,斷線時可以直接接續。
- 這種模式搭配 Sonnet 4.6 的長鏈任務,穩定度顯著提高。
Step 4:可降級模型策略(避免 API 或模型不穩)
如果回傳 5xx 或超時,就自動降級到「上一版穩定模型」或縮短 max_tokens。
const MODEL_PRIMARY = "claude-3-sonnet-4.6";
const MODEL_FALLBACK = "claude-3-sonnet-4.5";
async function safeCall(prompt: string) {
try {
return await client.messages.create({
model: MODEL_PRIMARY,
max_tokens: 1200,
messages: [{ role: "user", content: prompt }]
});
} catch (err) {
console.error("primary failed, fallback...");
return await client.messages.create({
model: MODEL_FALLBACK,
max_tokens: 800,
messages: [{ role: "user", content: prompt }]
});
}
}這個降級機制,實際在我們的內容產線很關鍵——寧可降級也不要整個流程中斷。
實際成果
- Sonnet 4.6 在「批次文章擴寫」與「多步驟任務」中表現更穩。
- 搭配可回放步驟設計,即使中途失敗也不會整體重跑。
你可以把這套模式直接套在:
- 任務型 Agent(文件審核、批次改稿)
- 自動化發布前的內容檢查
- 需要多段結構輸出的工作(大綱 → 初稿 → 校正)
踩過的坑
- 一次塞太多步驟:把 10 個步驟塞進一個 prompt,失敗就全毀。
- 缺少落地檔案:沒有中間輸出,重跑成本很高。
- 沒有降級:遇到 API 抖動時,整個 pipeline 停住。
完整程式碼(最小可用版)
import fs from "fs";
import Anthropic from "@anthropic-ai/sdk";
const client = new Anthropic({ apiKey: process.env.ANTHROPIC_API_KEY! });
const MODEL_PRIMARY = "claude-3-sonnet-4.6";
const MODEL_FALLBACK = "claude-3-sonnet-4.5";
async function safeCall(prompt: string, max_tokens = 1200) {
try {
return await client.messages.create({
model: MODEL_PRIMARY,
max_tokens,
messages: [{ role: "user", content: prompt }]
});
} catch {
return await client.messages.create({
model: MODEL_FALLBACK,
max_tokens: Math.min(800, max_tokens),
messages: [{ role: "user", content: prompt }]
});
}
}
async function runStep(id: string, prompt: string) {
const path = `./tmp/${id}.md`;
if (fs.existsSync(path)) return fs.readFileSync(path, "utf8");
const msg = await safeCall(prompt);
const output = msg.content[0].text;
fs.writeFileSync(path, output, "utf8");
return output;
}
async function main() {
const outline = await runStep(
"outline",
"產生文章大綱,5 個段落,每段 2 句說明"
);
await runStep(
"draft",
`根據以下大綱寫出 1200 字草稿,含 2 個 code block:\n\n${outline}`
);
console.log("done");
}
main();結論
這次重點不是「模型變強」,而是把它放進可運行的流程。Sonnet 4.6 的穩定度讓我們能用更長的任務鏈,但真正讓產線穩定的是:
- 任務分段
- 中間輸出可回放
- 失敗即降級
這三件事才是真正能在實務上跑得動的關鍵。
基於實際專案經驗撰寫。程式碼皆可直接執行。