trigger-dev-tasks

Utilisez cette compétence lors de la rédaction, de la conception ou de l'optimisation des tâches et workflows en arrière-plan de Trigger.dev. Cela inclut la création de tâches asynchrones fiables, la mise en œuvre d'IA…

npx skills add https://github.com/triggerdotdev/trigger.dev --skill trigger-dev-tasks

Trigger.dev Task Expert

You are an expert Trigger.dev developer specializing in building production-grade background job systems. Tasks deployed to Trigger.dev run in Node.js 21+ and use the @trigger.dev/sdk package.

Critical Rules

  1. Always use @trigger.dev/sdk - Never use @trigger.dev/sdk/v3 or deprecated client.defineJob pattern
  2. Never use node-fetch - Use the built-in fetch function
  3. Export all tasks - Every task must be exported, including subtasks
  4. Never wrap wait/trigger calls in Promise.all - triggerAndWait, batchTriggerAndWait, and wait.* calls cannot be wrapped in Promise.all or Promise.allSettled

Basic Task Pattern

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

export const processData = task({
  id: "process-data",
  retry: {
    maxAttempts: 10,
    factor: 1.8,
    minTimeoutInMs: 500,
    maxTimeoutInMs: 30_000,
  },
  run: async (payload: { userId: string; data: any[] }) => {
    console.log(`Processing ${payload.data.length} items`);
    return { processed: payload.data.length };
  },
});

Schema Task (with validation)

import { schemaTask } from "@trigger.dev/sdk";
import { z } from "zod";

export const validatedTask = schemaTask({
  id: "validated-task",
  schema: z.object({
    name: z.string(),
    email: z.string().email(),
  }),
  run: async (payload) => {
    // Payload is automatically validated and typed
    return { message: `Hello ${payload.name}` };
  },
});

Triggering Tasks

From Backend Code (type-only import to prevent dependency leakage)

import { tasks } from "@trigger.dev/sdk";
import type { processData } from "./trigger/tasks";

const handle = await tasks.trigger<typeof processData>("process-data", {
  userId: "123",
  data: [{ id: 1 }],
});

From Inside Tasks

export const parentTask = task({
  id: "parent-task",
  run: async (payload) => {
    // Trigger and wait - returns Result object, NOT direct output
    const result = await childTask.triggerAndWait({ data: "value" });
    if (result.ok) {
      console.log("Output:", result.output);
    } else {
      console.error("Failed:", result.error);
    }

    // Or unwrap directly (throws on error)
    const output = await childTask.triggerAndWait({ data: "value" }).unwrap();
  },
});

Idempotency (Critical for Retries)

Always use idempotency keys when triggering tasks from inside other tasks:

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

export const paymentTask = task({
  id: "process-payment",
  run: async (payload: { orderId: string }) => {
    // Scoped to current run - survives retries
    const key = await idempotencyKeys.create(`payment-${payload.orderId}`);

    await chargeCustomer.trigger(payload, {
      idempotencyKey: key,
      idempotencyKeyTTL: "24h",
    });
  },
});

Trigger Options

await myTask.trigger(payload, {
  delay: "1h",           // Delay execution
  ttl: "10m",            // Cancel if not started within TTL
  idempotencyKey: key,
  queue: "my-queue",
  machine: "large-1x",   // micro, small-1x, small-2x, medium-1x, medium-2x, large-1x, large-2x
  maxAttempts: 3,
  tags: ["user_123"],    // Max 10 tags
  debounce: {            // Consolidate rapid triggers
    key: "unique-key",
    delay: "5s",
    mode: "trailing",    // "leading" (default) or "trailing"
  },
});

Debouncing

Consolidate multiple triggers into a single execution:

// Rapid triggers with same key = single execution
await myTask.trigger({ userId: "123" }, {
  debounce: {
    key: "user-123-update",
    delay: "5s",
  },
});

// Trailing mode: use payload from LAST trigger
await myTask.trigger({ data: "latest" }, {
  debounce: {
    key: "my-key",
    delay: "10s",
    mode: "trailing",
  },
});

Use cases: user activity updates, webhook deduplication, search indexing, notification batching.

Batch Triggering

Up to 1,000 items per batch, 3MB per payload:

const results = await myTask.batchTriggerAndWait([
  { payload: { userId: "1" } },
  { payload: { userId: "2" } },
]);

for (const result of results) {
  if (result.ok) console.log(result.output);
}

Machine Presets

PresetvCPUMemory
micro0.250.25GB
small-1x0.50.5GB
small-2x11GB
medium-1x12GB
medium-2x24GB
large-1x48GB
large-2x816GB

Design Principles

  1. Break complex workflows into subtasks that can be independently retried and made idempotent
  2. Don't over-complicate - Sometimes Promise.allSettled inside a single task is better than many subtasks (each task has dedicated process and is charged by millisecond)
  3. Always configure retries - Set appropriate maxAttempts based on the operation
  4. Use idempotency keys - Especially for payment/critical operations
  5. Group related subtasks - Keep subtasks only used by one parent in the same file, don't export them
  6. Use logger - Log at key execution points with logger.info(), logger.error(), etc.

Reference Documentation

For detailed documentation on specific topics, read these files:

  • basic-tasks.md - Task basics, triggering, waits
  • advanced-tasks.md - Tags, queues, concurrency, metadata, error handling
  • scheduled-tasks.md - Cron schedules, declarative and imperative
  • realtime.md - Real-time subscriptions, streams, React hooks
  • config.md - trigger.config.ts, build extensions (Prisma, Playwright, FFmpeg, etc.)

Plus de skills de triggerdotdev

agents
triggerdotdev
Modèles d'agents IA avec Trigger.dev - orchestration, parallélisation, routage, évaluateur-optimiseur et intervention humaine. À utiliser lors de la création de tâches basées sur LLM…
config
triggerdotdev
Configurer les projets Trigger.dev avec trigger.config.ts. Utiliser lors de la configuration d'extensions de build pour Prisma, Playwright, FFmpeg, Python ou de la personnalisation du déploiement…
realtime
triggerdotdev
Abonnez-vous aux exécutions de tâches Trigger.dev en temps réel depuis le frontend et le backend. Utilisez-le pour créer des indicateurs de progression, des tableaux de bord en direct, des réponses en streaming AI/LLM,…
setup
triggerdotdev
Configurer Trigger.dev dans votre projet. À utiliser lors de l'ajout initial de Trigger.dev, de la création de trigger.config.ts, ou de l'initialisation du répertoire trigger.
tasks
triggerdotdev
Construisez des agents IA, des workflows et des tâches d'arrière-plan durables avec Trigger.dev. À utiliser lors de la création de tâches, du déclenchement de jobs, de la gestion des tentatives, de la planification de tâches cron, ou…
trigger-agents
triggerdotdev
Modèles d'agents IA avec Trigger.dev - orchestration, parallélisation, routage, évaluateur-optimiseur, et intervention humaine. À utiliser lors de la création de tâches propulsées par LLM…
trigger-chat-agent-advanced
triggerdotdev
Capacités avancées et opérationnelles de chat.agent pour Trigger.dev, chargées à la demande. Chargez ceci lorsque vous travaillez sur la primitive Sessions brute (sessions /…
staff-engineering-skills-cardinality
triggerdotdev
Détecter et prévenir les pièges de cardinalité dans le code système. Utiliser lors de l'écriture de code qui itère sur des collections, stocke des éléments en mémoire, crée des entités par…