AIエージェント入門

Trigger.dev完全ガイド|AIエージェント長時間タスク実装

Trigger.devでAIエージェント長時間タスクをDurable Executionで実装する

この記事の結論

Trigger.devはOSS Durable ExecutionプラットフォームでAIエージェントの長時間タスク・失敗リトライ・冪等性管理を解決する。v4新機能からLLM API呼び出しのDurable化まで実装コードで解説。

記事ファイルが見つからないため、提供されたHTML(冒頭部分)に対してh3を追加した構造強化版を出力します。残りのh2セクション(7〜14個目)は提供されていないため、表示された部分のみ対応します。

結論:本記事では「Trigger.dev完全ガイド」の定義・主要機能・実際の活用方法を、初心者でも理解できる形で体系的に解説します。

対象読者:本テーマに興味がある実務担当者・意思決定者。

読了後にできること:本記事の要点を踏まえて、自社や自分の状況に合わせた次のアクションを判断できます。



この記事でわかること: Trigger.devを使うと、AIエージェントの長時間タスク・失敗リトライ・冪等性管理をコード数行で解決できます。

  • Durable Executionの設計思想と、サーバーレス環境でのタイムアウト問題を根本から解決する仕組み
  • v4(2026年GA)で追加されたWaitpoints・Run Engineの実装パターン
  • LLM APIを呼び出すタスクのDurable化コードサンプル(TypeScript・Python)

対象読者: AIエージェント・自動化ワークフローを本番運用したい開発者・PM

今日やること: npx trigger.dev@latest init でプロジェクトを初期化し、最初のタスクを5分でデプロイする

「AIエージェントのタスクが途中でタイムアウトした」「OpenAI APIがレート制限で落ちたのに、最初からやり直しになった」——こんな経験はないでしょうか。

VercelやAWS Lambdaのサーバーレス環境では、実行時間に厳しい上限があります。AIエージェントが得意とする「スクレイピング→LLM処理→データ保存」のような多段タスクを信頼性高く動かすには、既存の関数実行基盤では限界があるのが現実です。

この記事では、その問題を解決するOSSプラットフォームTrigger.devを解説します。Durable Executionの設計思想から、2026年にGAになったv4の新機能、LLM APIを呼び出すタスクの実装パターンまで、コピペ可能なコードで紹介していきます。

Trigger.devとは何か

プラットフォームの概要とOSS体制

Trigger.devは、バックグラウンドジョブ・AIエージェント・自動化ワークフローをデプロイするためのOSS Durable Executionプラットフォームです。2022年創業のアイルランド発スタートアップで、GitHubスター数は14,000以上(2026年5月時点)。ライセンスはApache 2.0で、セルフホストも可能です。

タイムアウトなしの実行が解決する課題

最大の特徴は「タイムアウトなしの実行」です。AWS LambdaやVercel Functionsは最大15〜900秒の制限がありますが、Trigger.devではタスクを一時停止・再開できる仕組みにより、理論上は無制限に長いタスクを走らせられます。

Durable Executionとは

Durable Execution(耐久実行)とは、タスクの実行状態をチェックポイントとして保存しておき、障害・タイムアウト・意図的な一時停止があっても、その時点から再開できる仕組みです。

Trigger.devはCRIU(Checkpoint/Restore In Userspace)技術を使い、タスクのメモリ・CPUレジスタ・ファイルディスクリプタをそのままスナップショットします。再起動後はスナップショットをロードするだけで、コードは中断した行から続きを実行します。

インストールとプロジェクト初期化

CLIによるプロジェクト作成

Trigger.devはCLIとSDKで構成されています。まずNode.js 18以上の環境でプロジェクトを初期化します。

# CLI初期化(既存プロジェクトに追加する場合)
npx trigger.dev@latest init

# 新規プロジェクトを作成する場合
npx trigger.dev@latest create-project --name my-agent

CLIがインタラクティブに設定をガイドします。TypeScriptプロジェクトであれば、trigger.config.tssrc/trigger/ ディレクトリが自動作成されます。

SDK・AI連携パッケージの導入

# SDKのインストール
npm install @trigger.dev/sdk@latest

# AI SDKとの統合(Vercel AI SDK v6対応)
npm install @trigger.dev/ai @ai-sdk/openai

ローカル開発サーバーの起動とデプロイ

# ローカル開発サーバーの起動
npx trigger.dev@latest dev

ローカル開発時は、CLIがトンネルを張ってTrigger.dev Cloudと接続します。本番デプロイは npx trigger.dev@latest deploy 一発です。

基本タスクの定義

task()関数によるタスク作成

Trigger.devのタスクは task() 関数で定義します。TypeScriptで書くだけで、あとは自動的にデプロイ・管理されます。

// src/trigger/hello-world.ts
import { task } from "@trigger.dev/sdk/v3";

export const helloWorldTask = task({
  id: "hello-world",
  run: async (payload: { message: string }) => {
    console.log(`受信メッセージ: ${payload.message}`);
    return { result: `処理完了: ${payload.message}` };
  },
});

アプリケーションからのトリガー方法

タスクをトリガーするには、アプリケーションコードから trigger() を呼ぶだけです。

// Next.js API Routeやサーバーアクションから
import { helloWorldTask } from "@/trigger/hello-world";

const handle = await helloWorldTask.trigger({ message: "こんにちは" });
console.log(`Run ID: ${handle.id}`);

スケジュールタスク(Cron)

定期実行が必要なレポート生成や監視処理には、scheduleTask() を使います。

// src/trigger/daily-report.ts
import { scheduleTask } from "@trigger.dev/sdk/v3";

export const dailyReportTask = scheduleTask({
  id: "daily-report",
  cron: "0 9 * * 1-5",   // 平日9時に実行
  run: async (payload) => {
    // レポート生成ロジック
    const report = await generateReport(payload.lastTimestamp);
    await sendSlackNotification(report);
  },
});

Run Hierarchies — 親子タスクで複雑なフローを構成する

triggerAndWait()による子タスク呼び出し

実際のAIエージェントでは、複数のタスクをチェーンさせることがほとんどです。Trigger.devは親タスクから子タスクを triggerAndWait() で呼び出すことで、ツリー構造のワークフローを簡単に構築できます。

// src/trigger/research-agent.ts
import { task } from "@trigger.dev/sdk/v3";
import { fetchUrlTask } from "./fetch-url";
import { summarizeTask } from "./summarize";

export const researchAgentTask = task({
  id: "research-agent",
  run: async (payload: { urls: string[] }) => {
    // 子タスクを並列実行
    const fetchResults = await Promise.all(
      payload.urls.map((url) =>
        fetchUrlTask.triggerAndWait({ url })
      )
    );

    // 全ての取得が完了してから要約
    const summaries = await Promise.all(
      fetchResults.map((r) =>
        summarizeTask.triggerAndWait({ content: r.output.content })
      )
    );

    return { summaries: summaries.map((s) => s.output) };
  },
});

CRIUチェックポイントによるリソース最適化

triggerAndWait() は子タスクの完了を待機しますが、この「待機中」はCRIUチェックポイントが作られ、インフラリソースは消費されません。コストを抑えながら複雑なフローを書けます。

Idempotency(冪等性)とRetry戦略

冪等性キーによる重複実行の防止

AIエージェントで一番困るのが「どこまで処理したかわからなくなる」状況です。Trigger.devの冪等性キーはこれを解決します。

import { task, idempotencyKeys } from "@trigger.dev/sdk/v3";

export const processOrderTask = task({
  id: "process-order",
  retry: {
    maxAttempts: 5,
    factor: 2,
    minTimeoutInMs: 1000,
    maxTimeoutInMs: 30000,
  },
  run: async (payload: { orderId: string }) => {
    // 冪等性キーを設定 — 同じキーで2回呼ばれても1回しか実行しない
    const key = await idempotencyKeys.create(payload.orderId);

    const paymentResult = await chargePaymentTask.triggerAndWait(
      { orderId: payload.orderId },
      { idempotencyKey: key }
    );

    // 失敗した場合、retry設定に従って自動でリトライ
    if (!paymentResult.ok) {
      throw new Error(`Payment failed: ${paymentResult.error}`);
    }

    return paymentResult.output;
  },
});

指数バックオフによるリトライ設定

失敗が起きても、冪等性キーのおかげでリトライ時に決済が2重実行される心配がありません。retry オプションの factormaxAttempts を調整することで、外部APIの特性に合わせた最適なリトライ間隔を設計できます。

LLM API呼び出しのDurable化パターン

OpenAI APIのDurableラップ実装

AIエージェント開発でもっとも実用的なパターンです。OpenAI APIの呼び出しをDurableにラップすることで、レート制限・ネットワーク障害・タイムアウトから安全に保護できます。

// src/trigger/llm-pipeline.ts
import { task } from "@trigger.dev/sdk/v3";
import OpenAI from "openai";

const openai = new OpenAI({ apiKey: process.env.OPENAI_API_KEY });

export const llmAnalysisTask = task({
  id: "llm-analysis",
  retry: {
    maxAttempts: 10,
    // OpenAIのレート制限に合わせた指数バックオフ
    factor: 2,
    minTimeoutInMs: 2000,
    maxTimeoutInMs: 120000,
  },
  run: async (payload: { documents: string[] }) => {
    const results = [];

    for (const [index, doc] of payload.documents.entries()) {
      // 各ドキュメントを冪等性キーで保護
      const key = await idempotencyKeys.create(`doc-${index}-${doc.slice(0, 50)}`);

      const response = await openai.chat.completions.create({
        model: "gpt-4o",
        messages: [
          { role: "system", content: "あなたは文書分析の専門家です。" },
          { role: "user", content: doc },
        ],
      });

      results.push({
        index,
        analysis: response.choices[0].message.content,
      });
    }

    return { results };
  },
});

大量ドキュメント処理での中断再開

このパターンにより、100件のドキュメントを処理中にAPIエラーが起きた場合も、50件目から再開できます。

Vercel AI SDKとの統合(v6対応)

Vercel AI SDK v6を使えば、モデル切り替えやストリーミング処理もTrigger.devのDurable環境内でシームレスに利用できます。

import { task } from "@trigger.dev/sdk/v3";
import { generateText } from "ai";
import { openai } from "@ai-sdk/openai";

export const aiPipelineTask = task({
  id: "ai-pipeline",
  run: async (payload: { prompt: string }) => {
    const { text } = await generateText({
      model: openai("gpt-4o"),
      prompt: payload.prompt,
    });
    return { text };
  },
});

対応結果の要約:

📚 公式リファレンス・出典

Need help moving from reading to rollout?

この記事を読んで導入イメージが固まってきた方へ

Uravationでは、AIエージェントの要件整理、PoC設計、社内導入、研修まで一気通貫で支援しています。

この記事をシェア

X Facebook LINE

※ 本記事の情報は2026年6月時点のものです。サービスの料金・仕様は変更される可能性があります。最新情報は各サービスの公式サイトをご確認ください。

関連記事