◉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-04-28上級

Claude API × Inngest で耐障害性のある AI ワークフローを本番運用する — リトライ・冪等性・人間承認を組み込んだ実装ガイド

Claude API と Inngest を組み合わせて、リトライ・冪等性・人間承認・ファンアウトを TypeScript の動くコードで実装します。Next.js / Vercel / Cloudflare Workers に乗せられる軽量な耐障害ワークフローの設計指針です。

claude-api83inngestdurable-executionworkflow26production87anthropic-api3

✦ プレミアム記事

「動かしっぱなしの AI バッチが、ある日突然真夜中に止まっていた」— Claude API を本番に投入してしばらく経つと、ほぼ全員がこの壁にぶつかります。私自身、4 サイト分のブログを Claude API で自動生成・更新する仕組みを運用していますが、最初の数ヶ月は「サーバーレス関数のタイムアウト」「Anthropic 側の一時的な 529」「ツール呼び出し中の API ダウン」といった事故で何度も冷や汗をかきました。

その経験から得た結論は、プロダクションの AI ワークフローには『途中から再開できる仕組み』が必要だということです。リトライを try/catch で書く、ジョブテーブルを自前で設計する、タイムアウトをキューで分割する——どれも一度はやりましたが、コードがすぐに爆発します。

ここではTypeScript ファーストの耐障害ワークフローエンジン Inngest を使って、Claude API を呼ぶ AI ワークフローを本番品質に引き上げる設計と実装を、動くコードとともに解説します。Next.js や Cloudflare Workers にそのまま乗るので、別サーバーや別インフラを増やす必要がありません。

なお Python 主体の重厚なワークフローエンジンが好みであれば、Claude Agent SDK × Temporal.io で耐障害性のある長期実行AIワークフローを構築する をご覧ください。本記事はそれよりも軽量で、TypeScript の Web 開発者が「いつものスタックのまま」始められる構成に振り切っています。

なぜ「ただの Promise ループ」では本番に出せないのか

Claude API でエージェントを書くとき、最初は誰もが次のような形にたどり着きます。

// よくある最初の実装(本番に出すと壊れる)
async function runAgent(userInput: string) {
  const messages = [{ role: "user", content: userInput }];
  while (true) {
    const res = await anthropic.messages.create({
      model: "claude-sonnet-4-6",
      max_tokens: 1024,
      tools,
      messages,
    });
    messages.push({ role: "assistant", content: res.content });
    if (res.stop_reason === "end_turn") return res;
    if (res.stop_reason === "tool_use") {
      const toolResult = await runTool(res); // ← ここで外部APIを叩く
      messages.push({ role: "user", content: toolResult });
    }
  }
}

テストの一発実行なら問題なく動きます。ところがこのコードを本番に出すと、次のような症状が必ず出てきます。

  • タイムアウト: Vercel の Serverless Function は最大 5 分、Cloudflare Workers は CPU 時間 30 秒。3 ターン以上の Tool Use で簡単に超えます。
  • 二重実行による二重課金: タイムアウト後にユーザーがリトライしたら、Stripe の請求 API を 2 回叩きました——という事故が起きます。
  • どこまで進んだか分からない: ログを掘り返しても、messages 配列のどの時点で落ちたかが特定できません。
  • 人間承認を挟みづらい: 「危険な操作だけ承認してから実行したい」となった瞬間、コードが破綻します。

これらは個別に直せる問題ではなく、「長く走る処理を、途中でクラッシュしても安全に再開できる」という設計が必要です。私は最初、Redis でチェックポイントを書いて、PostgreSQL にジョブテーブルを作って、自前で再開ロジックを書きました。が、そのうち「これはワークフローエンジンを自作している」と気づきました。

Inngest を 5 分で理解する

Inngest は TypeScript/JavaScript ファーストの耐障害ワークフローエンジンです。Temporal と同じ「Durable Execution」の考え方を持ちながら、開発体験は Next.js の API ルート一つで完結する軽さを持ちます。

押さえるべき概念は 4 つだけです。

  • Function: イベントを受けて走る関数。inngest.createFunction() で定義します。
  • Step: Function の中で「ここまで進んだら結果をキャッシュしてほしい」と Inngest に伝える単位。step.run() で囲んだコードは、再実行時に既に成功していればスキップされます。
  • Event: Function を起動するトリガー。inngest.send({ name, data }) で発火します。
  • Sleep / WaitForEvent: 関数が「待つ」ためのプリミティブ。step.sleep() や step.waitForEvent() を使うと、関数自体は終了し、後で Inngest が起こしてくれます。

ここでの肝は Step の境界が再開ポイントになる ことです。step.run() の中身が成功すると結果が永続化され、関数全体が落ちても次の実行ではその step はスキップされます。これが「途中から続行できる」を実現します。

✦

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

この記事の続きを読む

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

この記事で得られること
✦Claude API を本番で叩いていて『途中で止まる・タイムアウトする・リトライで二重課金される』に悩んでいた人が、Inngest の step.run で安全に復旧できるワークフローを今日から TypeScript で組めるようになります
✦AI エージェントのループをイベント駆動で分割し、リトライポリシー・冪等性キー・人間承認ゲート・ファンアウトを動くコードで習得できます
✦Temporal や独自ジョブキューを抱え込まず、Vercel / Cloudflare Workers 上にそのまま乗る軽量な耐障害ワークフローを手に入れられます
Stripe による安全な決済 · いつでもキャンセル可能
✦

この記事を購入する

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

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

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

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

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

関連記事

⬡ API & SDK2026-05-26
Claude API の構造化レスポンスを本番で安定させる — tool_use と JSON Schema、多層検証の実装メモ
Claude API の応答を JSON で受け取る実装は数行で書けますが、本番運用では「形は正しいが意味が壊れている」レスポンスにどう備えるかが分かれ目になります。tool_use・JSON Schema・ドメイン検証を組み合わせた多層パイプラインを、壁紙アプリの分類処理での実体験を交えて整理しました。
⬡ API & SDK2026-05-22
Claude API の tool_result could not be submitted が再発しないための回復ハンドラ設計
Claude API でエージェントを長時間動かしていると、ある日突然 'tool_result could not be submitted' が連発し始めることがあります。再試行しても直らない、ストリーミング途中で死ぬ、そして次のセッションでもまた出る — 常時稼働のエージェント基盤で実際に踏み抜いた4種類の原因と、TypeScript で書いた回復ハンドラの実装を整理しました。
⬡ API & SDK2026-05-19
Claude API のチャット履歴を階層サマライズする:3 段階圧縮でトークンを 70 % 削減した設計
壁紙アプリのインアプリ AI チャットで増え続ける履歴トークンを抑えるため、直近ターン・中期エピソード・長期エンティティの 3 層に分けて圧縮する設計を、TypeScript の動くコードと 7 週間の運用データつきで記録しました。月額 API 費用を $480 から $145 まで下げています。