Workflow Inngest
Inngest est une plateforme destinée aux développeurs qui permet de créer et d'exécuter des workflows en arrière-plan sans gérer d'infrastructure.
Pour consulter un exemple complet intégrant des fonctionnalités avancées de contrôle de flux, reportez-vous à l'exemple de workflow Inngest.
Fonctionnement d'Inngest avec MastraLien direct vers Fonctionnement d'Inngest avec Mastra
Inngest et Mastra s'intègrent en faisant correspondre leurs modèles de workflow : Inngest organise la logique en fonctions composées d'étapes, et les workflows Mastra définis avec createWorkflow() et createStep() s'adaptent directement à cette structure. Chaque workflow Mastra devient une fonction Inngest dotée d'un identifiant unique, tandis que chaque étape du workflow correspond à une étape Inngest.
La fonction serve() relie les deux systèmes en enregistrant les workflows Mastra comme fonctions Inngest et en configurant les gestionnaires d'événements nécessaires à leur exécution et à leur suivi.
Lorsqu'un événement déclenche un workflow, Inngest l'exécute étape par étape et mémorise chaque résultat. En cas de nouvelle tentative ou de reprise, Inngest ignore les étapes déjà terminées en s'appuyant sur les résultats enregistrés. Les primitives de contrôle de flux de Mastra, comme les boucles, les conditions et les workflows imbriqués, correspondent au même modèle de fonctions et d'étapes Inngest, tout en préservant la composition, les branchements et la suspension.
Le suivi en temps réel, la suspension et la reprise, ainsi que l'observabilité au niveau des étapes sont assurés par le système de publication-abonnement et le tableau de bord d'Inngest. À mesure que chaque étape s'exécute, son état et sa sortie sont suivis à l'aide du stockage Mastra et peuvent être repris si nécessaire.
ConfigurationLien direct vers Configuration
Installez les packages requis :
- npm
- pnpm
- Yarn
- Bun
npm install @mastra/inngest@latest inngest
pnpm add @mastra/inngest@latest inngest
yarn add @mastra/inngest@latest inngest
bun add @mastra/inngest@latest inngest
Nécessite inngest@^4 et Inngest Dev Server v1.18.0 ou une version ultérieure. Le temps réel est intégré au SDK à partir de la v4 ; @inngest/realtime et realtimeMiddleware ne sont donc plus utilisés.
Créer un workflow InngestLien direct vers Créer un workflow Inngest
Ce guide explique comment créer un workflow avec Inngest et Mastra à travers une application de compteur qui incrémente une valeur jusqu'à ce qu'elle atteigne 10.
Initialiser InngestLien direct vers Initialiser Inngest
Initialisez l'intégration Inngest afin d'obtenir des fonctions auxiliaires de workflow compatibles avec Mastra. Les fonctions createWorkflow() et createStep() servent à créer des objets de workflow et d'étape compatibles avec Mastra et Inngest.
En développement :
import { Inngest } from 'inngest'
export const inngest = new Inngest({
id: 'mastra',
baseUrl: 'http://localhost:8288',
isDev: true,
})
En production :
import { Inngest } from 'inngest'
export const inngest = new Inngest({
id: 'mastra',
})
Choisir le mode développement ou cloud avec INNGEST_DEVLien direct vers selecting-dev-or-cloud-mode-with-inngest_dev
Le SDK Inngest fonctionne dans l'un des deux modes suivants : développement ou cloud. Depuis la v4, le SDK utilise le mode cloud par défaut et nécessite INNGEST_EVENT_KEY et INNGEST_SIGNING_KEY. Dans les exemples ci-dessus, le mode est défini dans le code avec isDev: true. Vous pouvez également définir la variable d'environnement INNGEST_DEV afin d'utiliser le même code client dans tous les environnements :
INNGEST_DEV=1: force le mode développement. Le SDK communique avec un Inngest Dev Server local et désactive la vérification des signatures.INNGEST_DEV=0: force le mode cloud. Le SDK communique avec Inngest Cloud et nécessite des clés d'événement et de signature.INNGEST_DEV=<url>: force le mode développement et dirige le SDK vers le Dev Server à l'adresse<url>, par exemplehttp://localhost:8288.- Non définie : utilise le mode cloud par défaut.
Lorsque INNGEST_DEV est définie, vous pouvez supprimer isDev et baseUrl du client :
import { Inngest } from 'inngest'
export const inngest = new Inngest({
id: 'mastra',
})
Ne définissez pas INNGEST_DEV en production. Cette variable désactive la vérification des signatures, indispensable pour recevoir en toute sécurité les événements d'Inngest Cloud.
L'option isDev de new Inngest() prévaut sur INNGEST_DEV lorsque les deux sont définies.
Créer des étapesLien direct vers Créer des étapes
Définissez les différentes étapes qui composeront votre workflow :
import { z } from 'zod'
import { inngest } from '../inngest'
import { init } from '@mastra/inngest'
// Initialize Inngest with Mastra, pointing to your local Inngest server
const { createWorkflow, createStep } = init(inngest)
// Step: Increment the counter value
const incrementStep = createStep({
id: 'increment',
inputSchema: z.object({
value: z.number(),
}),
outputSchema: z.object({
value: z.number(),
}),
execute: async ({ inputData }) => {
return { value: inputData.value + 1 }
},
})
Créer le workflowLien direct vers Créer le workflow
Composez les étapes au sein d'un workflow à l'aide du modèle de boucle dountil. La fonction createWorkflow() crée sur le serveur Inngest une fonction qui peut être invoquée.
// workflow that is registered as a function on inngest server
const workflow = createWorkflow({
id: 'increment-workflow',
inputSchema: z.object({
value: z.number(),
}),
outputSchema: z.object({
value: z.number(),
}),
}).then(incrementStep)
workflow.commit()
export { workflow as incrementWorkflow }
Configurer l'instance MastraLien direct vers Configurer l'instance Mastra
Enregistrez le workflow auprès de Mastra et configurez le point de terminaison de l'API Inngest :
import { Mastra } from '@mastra/core'
import { serve } from '@mastra/inngest'
import { incrementWorkflow } from './workflows'
import { inngest } from './inngest'
import { PinoLogger } from '@mastra/loggers'
export const mastra = new Mastra({
workflows: { incrementWorkflow },
server: {
host: '0.0.0.0',
apiRoutes: [
{
path: '/inngest/api',
method: 'ALL',
createHandler: async ({ mastra }) => {
return serve({ mastra, inngest })
},
},
],
},
logger: new PinoLogger({ name: 'Mastra', level: 'info' }),
})
Le chemin est /inngest/api, et non /api/inngest. Mastra réserve le préfixe /api aux routes intégrées (agents, workflows, memory). Les chemins apiRoutes personnalisés qui commencent par l'apiPrefix du serveur (/api par défaut) provoquent une erreur au démarrage. Consultez #15743 pour plus de contexte, ou passez directement à la section Utiliser un apiPrefix personnalisé si vous devez conserver /api/inngest.
Exécuter des workflowsLien direct vers Exécuter des workflows
Exécuter localementLien direct vers Exécuter localement
-
Exécutez
npx mastra devpour démarrer le serveur Mastra localement sur le port 4111 -
Démarrez Inngest Dev Server. Dans un nouveau terminal, exécutez :
npx inngest-cli@latest dev -u http://localhost:4111/inngest/apiremarqueL'URL qui suit
-uindique au serveur de développement Inngest où trouver votre point de terminaison Mastra/inngest/api -
Ouvrez le tableau de bord Inngest à l'adresse http://localhost:8288, puis accédez à la section Apps de la barre latérale pour vérifier que votre workflow Mastra est enregistré
-
Dans Functions, ouvrez votre workflow. Sélectionnez Invoke et fournissez l'entrée suivante :
{"data": {"inputData": {"value": 5}}} -
Suivez l'exécution du workflow dans l'onglet Runs pour consulter sa progression étape par étape
Exécuter en productionLien direct vers Exécuter en production
Avant de commencer, assurez-vous de disposer des éléments suivants :
- Un compte Vercel et la CLI Vercel installée (
npm i -g vercel) - Un compte Inngest
- Un token Vercel
-
Définissez votre token Vercel dans votre environnement :
.envexport VERCEL_TOKEN=your_vercel_token -
Ajoutez
VercelDeployerà l'instance Mastrasrc/mastra/index.tsimport { VercelDeployer } from '@mastra/deployer-vercel'export const mastra = new Mastra({deployer: new VercelDeployer({teamSlug: 'your_team_slug',projectName: 'your_project_name',// you can get your vercel token from the vercel dashboard by clicking on the user icon in the top right corner// and then clicking on "Account Settings" and then clicking on "Tokens" on the left sidebar.token: process.env.VERCEL_TOKEN,}),}) -
Compilez l'instance Mastra
npx mastra build -
Déployez sur Vercel
cd .mastra/outputvercel loginvercel --prod -
Synchronisez l'application avec le tableau de bord Inngest en sélectionnant Sync new app with Vercel, puis en suivant les instructions
attentionLa convention de découverte automatique d'Inngest suppose le chemin
/api/inngest. Comme ce guide utilise/inngest/api, définissez le champ URL de l'application Inngest sur l'origine de votre déploiement suivie de/inngest/api(par exemplehttps://your-app.vercel.app/inngest/api). Si vous conservez la valeur par défaut, le tableau de bord Inngest ne trouvera pas les fonctions de votre application. -
Dans Functions, ouvrez
workflow.increment-workflow. Sélectionnez All actions > Invoke et fournissez l'entrée suivante :{"data": {"inputData": {"value": 5}}} -
Suivez l'exécution dans l'onglet Runs pour consulter sa progression étape par étape
Ajouter des fonctions Inngest personnaliséesLien direct vers Ajouter des fonctions Inngest personnalisées
Vous pouvez servir des fonctions Inngest supplémentaires aux côtés de vos workflows Mastra à l'aide du paramètre facultatif functions de serve().
Créer des fonctions personnaliséesLien direct vers Créer des fonctions personnalisées
Commencez par créer vos fonctions Inngest personnalisées :
import { inngest } from '../inngest'
// Define custom Inngest functions
export const customEmailFunction = inngest.createFunction(
{ id: 'send-welcome-email' },
{ event: 'user/registered' },
async ({ event }) => {
// Custom email logic here
console.log(`Sending welcome email to ${event.data.email}`)
return { status: 'email_sent' }
},
)
export const customWebhookFunction = inngest.createFunction(
{ id: 'process-webhook' },
{ event: 'webhook/received' },
async ({ event }) => {
// Custom webhook processing
console.log(`Processing webhook: ${event.data.type}`)
return { processed: true }
},
)
Servir des fonctions personnalisées avec les workflowsLien direct vers Servir des fonctions personnalisées avec les workflows
Mettez à jour votre configuration Mastra afin d'importer et d'inclure les fonctions personnalisées. Les lignes mises en évidence montrent les ajouts :
import { Mastra } from '@mastra/core'
import { serve } from '@mastra/inngest'
import { incrementWorkflow } from './workflows'
import { inngest } from './inngest'
import { customEmailFunction, customWebhookFunction } from './inngest/custom-functions'
import { PinoLogger } from '@mastra/loggers'
export const mastra = new Mastra({
workflows: { incrementWorkflow },
server: {
host: '0.0.0.0',
apiRoutes: [
{
path: '/inngest/api',
method: 'ALL',
createHandler: async ({ mastra }) => {
return serve({
mastra,
inngest,
functions: [customEmailFunction, customWebhookFunction],
})
},
},
],
},
logger: new PinoLogger({ name: 'Mastra', level: 'info' }),
})
Enregistrement des fonctionsLien direct vers Enregistrement des fonctions
Lorsque vous incluez des fonctions personnalisées :
- Les workflows Mastra sont automatiquement convertis en fonctions Inngest avec des ID tels que
workflow.${workflowId} - Les fonctions personnalisées conservent les ID qui leur ont été attribués (par exemple,
send-welcome-email,process-webhook) - Toutes les fonctions sont servies ensemble sur le même point de terminaison
/inngest/api
Vous pouvez ainsi associer l'orchestration des workflows de Mastra à vos fonctions Inngest existantes.
Utiliser d'autres frameworksLien direct vers Utiliser d'autres frameworks
La fonction serve utilise Hono en interne par défaut. Si vous utilisez un autre framework web, comme Express, Fastify ou Koa, employez la fonction de fabrique createServe avec l'adaptateur Inngest approprié.
ExpressLien direct vers Express
import express from 'express'
import { createServe } from '@mastra/inngest'
import { serve as expressAdapter } from 'inngest/express'
import { mastra, inngest } from './mastra'
const app = express()
// Body parsing middleware required for Inngest
app.use(express.json())
const handler = createServe(expressAdapter)({ mastra, inngest })
app.use('/inngest/api', handler)
app.listen(3000)
FastifyLien direct vers Fastify
import Fastify from 'fastify'
import { createServe } from '@mastra/inngest'
import { serve as fastifyAdapter } from 'inngest/fastify'
import { mastra, inngest } from './mastra'
const fastify = Fastify()
// JSON parsing is handled by Fastify's default content-type parser
const handler = createServe(fastifyAdapter)({ mastra, inngest })
fastify.route({
method: ['GET', 'POST', 'PUT'],
url: '/inngest/api',
handler,
})
fastify.listen({ port: 3000 })
KoaLien direct vers Koa
import Koa from 'koa'
import Router from '@koa/router'
import bodyParser from 'koa-bodyparser'
import { createServe } from '@mastra/inngest'
import { serve as koaAdapter } from 'inngest/koa'
import { mastra, inngest } from './mastra'
const app = new Koa()
const router = new Router()
// Body parsing middleware required for Inngest
app.use(bodyParser())
const handler = createServe(koaAdapter)({ mastra, inngest })
router.all('/inngest/api', handler)
app.use(router.routes())
app.use(router.allowedMethods())
app.listen(3000)
Next.jsLien direct vers Next.js
import { createServe } from '@mastra/inngest'
import { serve as nextAdapter } from 'inngest/next'
import { mastra, inngest } from '@/mastra'
const handler = createServe(nextAdapter)({ mastra, inngest })
export { handler as GET, handler as POST, handler as PUT }
Adaptateurs disponiblesLien direct vers Adaptateurs disponibles
La fonction createServe fonctionne avec tous les adaptateurs Inngest. Consultez la documentation Inngest sur serve pour obtenir la liste complète des adaptateurs disponibles, notamment AWS Lambda, Cloudflare Workers et bien d'autres.
Exécuter en tant que worker ConnectLien direct vers Exécuter en tant que worker Connect
serve() expose un point de terminaison HTTP appelé par Inngest. À la place, connect() peut ouvrir une connexion sortante de longue durée entre votre worker et Inngest ; le worker n'a alors pas besoin d'un point de terminaison accessible publiquement. Utilisez cette approche pour les processus worker de longue durée exécutés dans des environnements tels que Kubernetes, Docker, ECS, Fly.io ou Render.
Inngest Connect est en bêta publique. Les environnements d'exécution serverless tels que Vercel et AWS Lambda ne prennent pas en charge les workers Connect.
Quand utiliser connect() plutôt que serve()Lien direct vers when-to-use-connect-instead-of-serve
- Le processus worker s'exécute dans un réseau privé qui n'autorise que les connexions sortantes.
- Vous souhaitez séparer l'exécution intensive des workflows du processus qui sert le trafic HTTP destiné aux utilisateurs.
- Vous souhaitez ajuster le nombre de workers indépendamment du serveur HTTP Mastra, avec des limites de concurrence propres à chaque worker.
Utilisez les mêmes définitions de workflows Mastra avec serve() ou connect(). Le comportement de collecte est identique pour les workflows standard, les workflows imbriqués, les workflows cron et les fonctions Inngest supplémentaires.
PrérequisLien direct vers Prérequis
inngest@^4- Node.js
22.13.0ou version ultérieure - Un processus de longue durée pour le worker
ConfigurationLien direct vers Configuration
Exécutez le serveur Mastra et le worker Connect dans deux processus distincts. Dans cette configuration, le serveur Mastra n'a pas besoin d'exposer /inngest/api :
import { Mastra } from '@mastra/core'
import { incrementWorkflow } from './workflows'
import { PinoLogger } from '@mastra/loggers'
export const mastra = new Mastra({
workflows: { incrementWorkflow },
logger: new PinoLogger({ name: 'Mastra', level: 'info' }),
})
import { connect } from '@mastra/inngest/connect'
import { mastra } from './mastra'
import { inngest } from './mastra/inngest'
await connect({
mastra,
inngest,
instanceId: process.env.INNGEST_CONNECT_INSTANCE_ID,
maxWorkerConcurrency: Number(process.env.INNGEST_CONNECT_MAX_WORKER_CONCURRENCY ?? 10),
})
Pendant le développement local, démarrez le worker avec INNGEST_DEV=1 node --import tsx src/worker.ts. Inngest Dev Server découvre le worker par l'intermédiaire de la connexion sortante ; l'option -u n'est donc pas nécessaire.
En production, définissez INNGEST_EVENT_KEY et INNGEST_SIGNING_KEY. Définissez appVersion sur le client Inngest avec un identifiant de déploiement, tel qu'un SHA de commit ou un tag d'image, afin qu'Inngest puisse gérer les déploiements progressifs.
Lorsque vous faites migrer une application de production existante de serve() vers connect(), testez le worker avec une application Inngest distincte avant de rediriger le trafic.
OptionsLien direct vers Options
connect() accepte les mêmes options que la fonction connect d'Inngest, ainsi que des champs propres à Mastra. Voici les plus courants :
mastra: instance Mastra dont les workflows doivent être exposés.inngest: client Inngest. Utilisez le même client que celui que vous transmettriez àserve().functions: tableau facultatif de fonctions Inngest supplémentaires à enregistrer aux côtés des workflows Mastra.instanceId: identifiant stable du worker, affiché dans le tableau de bord Inngest. Par défaut, il correspond au nom d'hôte de la machine.maxWorkerConcurrency: nombre maximal d'étapes exécutées simultanément par le worker. La valeur par défaut est illimitée.registerOptions: options transmises à Inngest lors de l'enregistrement de l'application (par exemplesigningKey). Lorsqu'un champ est défini à la fois ici et au niveau supérieur,registerOptionsprévaut. Ce comportement correspond à celui deserve().
connect() renvoie l'objet WorkerConnection d'Inngest. Le SDK Inngest gère SIGINT et SIGTERM par défaut. Conservez la connexion renvoyée et appelez .close() uniquement si votre worker nécessite un contrôle personnalisé de l'arrêt.
Si l'instance Mastra ne contient aucun InngestWorkflow et qu'aucune functions supplémentaire n'est fournie, connect() consigne un avertissement, car le worker resterait sinon connecté sans rien à exécuter. Enregistrez au moins un workflow dans Mastra ou transmettez functions: [...].
Utiliser un apiPrefix personnaliséLien direct vers using-a-custom-apiprefix
Si vous devez conserver /api/inngest (par exemple pour respecter la convention de découverte automatique d'Inngest sans modifier l'URL du tableau de bord), définissez server.apiPrefix afin de déplacer les routes intégrées de Mastra :
import { Mastra } from '@mastra/core'
import { serve } from '@mastra/inngest'
import { inngest } from './inngest'
export const mastra = new Mastra({
server: {
apiPrefix: '/_mastra',
apiRoutes: [
{
path: '/api/inngest',
method: 'ALL',
createHandler: async ({ mastra }) => serve({ mastra, inngest }),
},
],
},
})
Les routes intégrées de Mastra sont désormais accessibles sous /_mastra/agents, /_mastra/workflows, etc., ce qui libère le chemin /api/inngest pour votre route personnalisée.
La configuration d'authentification par défaut protège /api/* et considère /api et /api/auth/* comme publics. Lorsque vous modifiez apiPrefix, ces valeurs par défaut ne correspondent plus et les routes intégrées sortent du modèle protégé. Mettez à jour server.auth.protected et server.auth.public pour référencer le nouveau préfixe, ainsi que tout code client (notamment MastraClient et son apiPrefix) qui accède à /api/*.
Contrôle de fluxLien direct vers Contrôle de flux
Les workflows Inngest prennent en charge des fonctionnalités de contrôle de flux, notamment les limites de concurrence, la limitation du débit, le throttling, le debounce et la mise en file d'attente prioritaire. Ces options sont configurées dans l'appel à createWorkflow() et facilitent la gestion de l'exécution des workflows à grande échelle.
ConcurrenceLien direct vers Concurrence
Contrôlez le nombre d'instances de workflow pouvant s'exécuter simultanément :
const workflow = createWorkflow({
id: 'user-processing-workflow',
inputSchema: z.object({ userId: z.string() }),
outputSchema: z.object({ result: z.string() }),
steps: [processUserStep],
// Limit to 10 concurrent executions, scoped by user ID
concurrency: {
limit: 10,
key: 'event.data.userId',
},
})
Limitation du débitLien direct vers Limitation du débit
Limitez le nombre d'exécutions du workflow sur une période donnée :
const workflow = createWorkflow({
id: 'api-sync-workflow',
inputSchema: z.object({ endpoint: z.string() }),
outputSchema: z.object({ status: z.string() }),
steps: [apiSyncStep],
// Maximum 1000 executions per hour
rateLimit: {
period: '1h',
limit: 1000,
},
})
ThrottlingLien direct vers Throttling
Imposez un intervalle minimal entre les exécutions du workflow :
const workflow = createWorkflow({
id: 'email-notification-workflow',
inputSchema: z.object({ organizationId: z.string(), message: z.string() }),
outputSchema: z.object({ sent: z.boolean() }),
steps: [sendEmailStep],
// Only one execution per 10 seconds per organization
throttle: {
period: '10s',
limit: 1,
key: 'event.data.organizationId',
},
})
DebounceLien direct vers Debounce
Retardez l'exécution jusqu'à ce qu'aucun nouvel événement n'arrive pendant une période donnée :
const workflow = createWorkflow({
id: 'search-index-workflow',
inputSchema: z.object({ documentId: z.string() }),
outputSchema: z.object({ indexed: z.boolean() }),
steps: [indexDocumentStep],
// Wait 5 seconds of no updates before indexing
debounce: {
period: '5s',
key: 'event.data.documentId',
},
})
PrioritéLien direct vers Priorité
Définissez la priorité d'exécution des workflows :
const workflow = createWorkflow({
id: 'order-processing-workflow',
inputSchema: z.object({
orderId: z.string(),
priority: z.number().optional(),
}),
outputSchema: z.object({ processed: z.boolean() }),
steps: [processOrderStep],
// Higher priority orders execute first
priority: {
run: 'event.data.priority ?? 50',
},
})
Combiner les options de contrôle de fluxLien direct vers Combiner les options de contrôle de flux
Plusieurs options de contrôle de flux peuvent être combinées dans un même workflow :
const workflow = createWorkflow({
id: 'comprehensive-workflow',
inputSchema: z.object({
userId: z.string(),
organizationId: z.string(),
priority: z.number().optional(),
}),
outputSchema: z.object({ result: z.string() }),
steps: [comprehensiveStep],
concurrency: {
limit: 5,
key: 'event.data.userId',
},
rateLimit: {
period: '1m',
limit: 100,
},
throttle: {
period: '10s',
limit: 1,
key: 'event.data.organizationId',
},
priority: {
run: 'event.data.priority ?? 0',
},
})
Toutes les options de contrôle de flux sont facultatives. Si elles ne sont pas indiquées, les workflows s'exécutent selon le comportement par défaut d'Inngest. Pour en savoir plus, consultez la documentation d'Inngest sur le contrôle de flux.
Planification cronLien direct vers Planification cron
Utilisez des expressions cron pour déclencher des workflows Inngest selon une planification. Les cas d'utilisation courants comprennent les rapports quotidiens, les synchronisations de données horaires et les tâches de maintenance.
Planification cron de baseLien direct vers Planification cron de base
Configurez l'exécution planifiée d'un workflow en ajoutant une propriété cron :
const workflow = createWorkflow({
id: 'daily-report-workflow',
inputSchema: z.object({ reportType: z.string() }),
outputSchema: z.object({ generated: z.boolean() }),
steps: [generateReportStep],
// Run daily at midnight
cron: '0 0 * * *',
})
Format de la planification cronLien direct vers Format de la planification cron
La propriété cron accepte les expressions cron standard au format suivant : minute hour day month dayOfWeek
- minute : 0-59
- hour : 0-23
- day : 1-31
- month : 1-12 ou JAN-DEC
- dayOfWeek : 0-6 (dimanche = 0) ou SUN-SAT
Modèles cron courants :
// Every 15 minutes
cron: '*/15 * * * *'
// Every hour at minute 0
cron: '0 * * * *'
// Every 6 hours
cron: '0 */6 * * *'
// Daily at midnight
cron: '0 0 * * *'
// Daily at 9 AM
cron: '0 9 * * *'
// Every weekday at 9 AM
cron: '0 9 * * 1-5'
// First day of every month at midnight
cron: '0 0 1 * *'
// Every Monday at 8 AM
cron: '0 8 * * 1'
Fournir des données d'entrée aux exécutions planifiéesLien direct vers Fournir des données d'entrée aux exécutions planifiées
Vous pouvez fournir des données d'entrée statiques qui seront utilisées à chaque exécution planifiée :
const workflow = createWorkflow({
id: 'scheduled-data-sync',
inputSchema: z.object({
source: z.string(),
destination: z.string(),
}),
outputSchema: z.object({ synced: z.boolean() }),
steps: [syncDataStep],
cron: '0 */6 * * *', // Every 6 hours
// Input data provided to each scheduled run
inputData: {
source: 'production-db',
destination: 'analytics-warehouse',
},
})
Fournir un état initial aux exécutions planifiéesLien direct vers Fournir un état initial aux exécutions planifiées
Vous pouvez également définir un état initial pour les exécutions planifiées du workflow :
const workflow = createWorkflow({
id: 'scheduled-aggregation',
inputSchema: z.object({ date: z.string() }),
outputSchema: z.object({ aggregated: z.boolean() }),
stateSchema: z.object({
processedCount: z.number(),
lastProcessedDate: z.string(),
}),
steps: [aggregateDataStep],
cron: '0 0 * * *', // Daily at midnight
inputData: {
date: new Date().toISOString().split('T')[0], // Today's date
},
initialState: {
processedCount: 0,
lastProcessedDate: '',
},
})
Combiner cron et le contrôle de fluxLien direct vers Combiner cron et le contrôle de flux
La planification cron peut être combinée avec des options de contrôle de flux :
const workflow = createWorkflow({
id: 'scheduled-api-sync',
inputSchema: z.object({ endpoint: z.string() }),
outputSchema: z.object({ synced: z.boolean() }),
steps: [syncApiStep],
cron: '*/30 * * * *', // Every 30 minutes
inputData: {
endpoint: 'https://api.example.com/data',
},
// Limit concurrent executions even for scheduled runs
concurrency: {
limit: 5,
},
// Rate limit scheduled executions
rateLimit: {
period: '1h',
limit: 100,
},
})
Fonctionnement des fonctions cronLien direct vers Fonctionnement des fonctions cron
Lorsque vous configurez un workflow avec une propriété cron :
- Une fonction Inngest distincte est automatiquement créée avec l'ID
workflow.${workflowId}.cron - Cette fonction est enregistrée auprès d'Inngest et se déclenche selon la planification indiquée
- Chaque exécution planifiée crée une nouvelle exécution de workflow avec les valeurs
inputDataetinitialStatefournies - La fonction cron et la fonction principale du workflow sont toutes deux servies lorsque vous appelez
serve()
Vous pouvez suivre les exécutions planifiées dans les sections Functions et Runs du tableau de bord Inngest. La fonction cron apparaît comme une fonction distincte aux côtés de la fonction principale de votre workflow.
Pour en savoir plus sur la planification cron, consultez la documentation d'Inngest sur cron.