TL;DR

這週我把 Anthropic 2/17 釋出的 Claude Sonnet 4.6 接進我們的自動化工作流(OpenClaw 任務執行器),重點是:可回放、可降級、可復原。本文用實作方式示範:

  1. 如何切換到 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(文件審核、批次改稿)
  • 自動化發布前的內容檢查
  • 需要多段結構輸出的工作(大綱 → 初稿 → 校正)

踩過的坑

  1. 一次塞太多步驟:把 10 個步驟塞進一個 prompt,失敗就全毀。
  2. 缺少落地檔案:沒有中間輸出,重跑成本很高。
  3. 沒有降級:遇到 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 的穩定度讓我們能用更長的任務鏈,但真正讓產線穩定的是:

  • 任務分段
  • 中間輸出可回放
  • 失敗即降級

這三件事才是真正能在實務上跑得動的關鍵。


基於實際專案經驗撰寫。程式碼皆可直接執行。