◉CLAUDE LABEN
●2.1.301 — vim の % モーション、VS Code パネルでの LaTeX 数式表示、使用量上限待ちのリトライ監視の上限が入りました(10/15)●2.1.299 — 200K トークン超で約54分放置した会話はアイドル圧縮。MCP の許可ルールは名指ししたサーバーだけに一致します●SONNET 4.5 — Claude API での提供終了は 11/30、残り45日。移行先は Sonnet 5.5●WINDOWS — 日本語の環境でだけフックが黙って壊れる報告があり、文字コードの確認が呼びかけられています●FAST MODE — Opus 5.5 の Fast mode がリサーチプレビューを終え、ベータヘッダーが不要になりました(10/15)●NEW — Cowork に渡したフォルダの先頭に、十行の約束ファイルを置いてみました●2.1.301 — vim の % モーション、VS Code パネルでの LaTeX 数式表示、使用量上限待ちのリトライ監視の上限が入りました(10/15)●2.1.299 — 200K トークン超で約54分放置した会話はアイドル圧縮。MCP の許可ルールは名指ししたサーバーだけに一致します●SONNET 4.5 — Claude API での提供終了は 11/30、残り45日。移行先は Sonnet 5.5●WINDOWS — 日本語の環境でだけフックが黙って壊れる報告があり、文字コードの確認が呼びかけられています●FAST MODE — Opus 5.5 の Fast mode がリサーチプレビューを終え、ベータヘッダーが不要になりました(10/15)●NEW — Cowork に渡したフォルダの先頭に、十行の約束ファイルを置いてみました
記事一覧/API & SDK
⬡ API & SDK/2026-06-20上級

サブエージェントの並列実行で、1つの失敗が全体を巻き込まない設計

複数のサブエージェントを並列に走らせる fan-out / fan-in 構成を、トークン予算・結果コントラクト・部分失敗の扱いまで含めて設計します。1つのブランチが落ちても全体を止めない実装と実測値を共有します。

Claude API128Agent SDK5サブエージェント17並列処理3エラーハンドリング7

✦ プレミアム記事

夜間に4サイト分の記事候補を集める処理を、長いあいだ1サイトずつ順番に回していました。1サイトあたり40秒前後。4本直列で約2分半。動いてはいるのですが、3サイト目の途中でネットワークが切れた日は、そこから先がまるごと巻き添えになって落ちます。私自身、個人開発で4サイトを一人で回している身として、朝のログを開いて「3サイト目で止まっていた」と気づくたびに、設計の素朴さを思い知らされていました。

順番に回す必要は、本当はどこにもありませんでした。サイトごとの候補集めは互いに独立しています。それなら並列に投げて、返ってきたものから受け取り、落ちたものだけ後で拾い直せばいい。いわゆる fan-out / fan-in です。ここでは、その骨格と、見落としやすい予算・結果の固定・部分失敗の三点を、実装に落としていきます。

直列をやめると、何が壊れるか

並列化そのものは難しくありません。難しいのは、並列にした瞬間に表面化する三つの落とし穴です。

ひとつ目は予算です。直列なら「全体で○トークンまで」と素朴に数えられましたが、並列だと複数のブランチが同時にトークンを食います。レート上限にぶつかると、全ブランチが同時に 429 を返し始めます。

ふたつ目は結果の形です。直列なら1件ずつ目視に近い感覚で扱えましたが、並列では返り順がばらつき、1件でも壊れた JSON が混じると集約処理が静かに崩れます。

みっつ目が部分失敗です。これがいちばん効きます。4本中1本が落ちたとき、残り3本の成果まで捨ててしまっては、並列化した意味が薄れます。

fan-out / fan-in の骨格

まずワーカーを1つ定義します。サイト1つを受け取り、候補リストを返す単純な関数です。

import Anthropic from "@anthropic-ai/sdk";
 
const client = new Anthropic({ apiKey: process.env.ANTHROPIC_API_KEY });
 
type Site = { id: string; domain: string; maxTokens: number };
 
async function collectCandidates(site: Site): Promise<string> {
  const res = await client.messages.create({
    model: "claude-sonnet-4-6",
    max_tokens: site.maxTokens,
    system: "あなたは技術ブログの編集者です。JSON配列のみを返してください。",
    messages: [
      { role: "user", content: `${site.domain} 向けの記事候補を5件、JSON配列で。各要素は {title, angle} 。` },
    ],
  });
  const block = res.content.find((b) => b.type === "text");
  return block && block.type === "text" ? block.text : "[]";
}

fan-out 側は、このワーカーを全サイトに対して同時に起動し、Promise.allSettled で待ち合わせます。Promise.all ではなく allSettled を選ぶのが要点です。前者は1本でも reject すると全体を reject しますが、後者は成功と失敗を区別したまま全件返してくれます。

const sites: Site[] = [
  { id: "cl", domain: "claudelab.net", maxTokens: 1024 },
  { id: "gl", domain: "gemilab.net", maxTokens: 1024 },
  { id: "ag", domain: "antigravitylab.net", maxTokens: 1024 },
  { id: "rl", domain: "rorklab.net", maxTokens: 1024 },
];
 
const settled = await Promise.allSettled(
  sites.map((s) => collectCandidates(s))
);

ここまでで「待ち時間が直列の合計から最遅ブランチ1本ぶんに縮む」効果は得られます。ただし、このままでは壊れた応答も成功扱いで通ってしまいます。次の二つでそこを締めます。

✦

ここまでお読みいただきありがとうございます。

この記事の続きを読む

この先には、実装コードやベンチマーク結果など、実務でお役に立てる内容をご用意しています。このサイトは広告を掲載しておらず、サーバーや開発にかかる費用はメンバーの皆様のご支援で成り立っています。もしお役に立てていましたら、ご支援いただけますと大変ありがたいです。

この記事で得られること
✦fan-out / fan-in を Promise.allSettled で組む実装と、ブランチ単位の予算配分の決め方
✦子エージェントが返す形を zod で固定し、壊れた応答を親が安全に弾く結果コントラクト
✦部分失敗を再試行・デッドレター・スキップに振り分ける判定表と、直列比での実測短縮値
Stripe による安全な決済 · いつでもキャンセル可能
✦

この記事を購入する

この先の内容をすべてお読みいただけます。一度のご購入で、いつでも何度でもアクセスできます。このサイトは広告を掲載しておらず、皆さまのご支援がサーバー費用などの運営を支えています。

または
メンバーシップなら全記事が読み放題 →
シェア

お読みいただきありがとうございます

Claude Lab は広告なしで運営しており、サーバー費用などの運営コストはメンバーシップのご支援で賄っています。実装コード・ベンチマーク・本番設計パターンなど、実務でお役立ていただける記事を毎日更新しています。もし読んでよかったと感じていただけましたら、ぜひご覧ください。

  • ✦コピー&ペーストで使える実装コード付き
  • ✦毎日新しい上級ガイドを追加
  • ✦¥580/月 または ¥1,480 の永久アクセス
メンバーシップを見る →

関連記事

⬡ API & SDK2026-04-25
Claude API × Convex でリアクティブな AI アプリを本番構築する — データフロー設計とエージェントパターン
Convex のリアクティブデータベースと Claude API を組み合わせて、本番運用に耐えるチャット・エージェント系アプリを構築する方法をまとめました。スキーマ設計、Action/Mutation/Query の境界、ストリーミング、ツール状態管理、冷え始めの落とし穴まで、開発現場の判断軸を共有します。
⬡ API & SDK2026-10-16
Make から Claude API に 40 行流すと 14 行目で止まる — 429 を待ち時間の計算で避ける
表計算の行を1件ずつ Claude API に渡すノーコード自動化が、途中で 429 になる理由と直し方です。模擬バケットで7通りの間隔を比べ、Sleep の秒数を 60÷上限−応答時間 で決める式と、失敗行を落とさない設定を示します。
⬡ API & SDK2026-10-13
Haiku 5.5 は単価が下がるのに、4.5 換算で約 7.7 万トークンを超えると請求が跳ねます
Haiku 4.5 から 5.5 へ移すと、価格表だけ見れば約 1/10 です。ただし同じ文章が約 30% 多いトークンになり、入力が 10 万を超えた時点で単価が 5 倍になります。境目を 4.5 換算で計算し、実際に動かした出力と、移行時に直す 400 の項目を並べました。