CLAUDE LABEN
VERSION — 8月10日に v2.1.227 が出ていました。新機能はなく、プラン判定と CI まわりの不具合修正が中心ですAUTO — 8月14日の既定化まで残り2日です。Pro・Max・Team で Claude Code の auto モードが既定で有効になりますCI — claude-code-action で allowed_non_write_users を指定すると GitHub ホストランナー上の Bash が全て失敗していた問題が直りましたBILLING — 期限切れトークンで開始したセッションが加入プランを取り違え、Max 利用者に使用クレジットの有効化を促していた不具合も解消していますSUNSET — 旧 Workbench と実験的プロンプトツール API の廃止は8月17日で、残り5日ですPRICE — Sonnet 5 のプロモ価格 $2/$10 per Mtok は8月31日までで、9月1日から $3/$15 per Mtok になりますVERSION — 8月10日に v2.1.227 が出ていました。新機能はなく、プラン判定と CI まわりの不具合修正が中心ですAUTO — 8月14日の既定化まで残り2日です。Pro・Max・Team で Claude Code の auto モードが既定で有効になりますCI — claude-code-action で allowed_non_write_users を指定すると GitHub ホストランナー上の Bash が全て失敗していた問題が直りましたBILLING — 期限切れトークンで開始したセッションが加入プランを取り違え、Max 利用者に使用クレジットの有効化を促していた不具合も解消していますSUNSET — 旧 Workbench と実験的プロンプトツール API の廃止は8月17日で、残り5日ですPRICE — Sonnet 5 のプロモ価格 $2/$10 per Mtok は8月31日までで、9月1日から $3/$15 per Mtok になります
記事一覧/API & SDK
API & SDK/2026-06-20上級

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

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

Claude API116Agent SDK5サブエージェント13並列処理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-07-02
Message Batches に2万件投げたら41件だけ静かに欠けていたとき — 部分失敗を照合して再投入する運用メモ
Message Batches API の processing_status: ended は全件成功を意味しません。errored・expired が結果に静かに混ざる仕組みと、custom_id 台帳で欠落を照合し二重処理なく再投入する実装を、実運用の計測値とともに整理します。
API & SDK2026-06-30
ツール出力が大きすぎてコンテキストを溶かす問題 — カーソルで小分けに返すページング設計
一覧系のツールが数百件をそのまま返すと、エージェントのコンテキストは一回の呼び出しで溶けます。カーソルベースのページングでツール出力を小分けに返し、トークン予算を守る設計を実装コード付きで解説します。
API & SDK2026-06-27
自己修復ループに「諦める条件」を設計する — エラーを4分類して再試行予算を割り当てる
LLMの自己修復ループは「直し続ければいつか通る」という前提で組むと破綻します。エラーを4つのクラスに分類し、クラスごとに再試行予算を割り当てて諦める条件を明示する設計を、動くTypeScriptの分類器実装、コスト天井の置き方、構造化した試行ログ、フォールバックの段構えとともに解説します。
📚RECOMMENDED BOOKS
大規模言語モデル入門
山田育矢
LLM開発
生成AIプロンプトエンジニアリング入門
我妻幸長
プロンプト
Claude CodeによるAI駆動開発入門
平川知秀
AI駆動開発
※ アフィリエイトリンクを含みます
もっと見る →