Passer au contenu principal
Utilisez createConditionStep pour prendre des décisions dynamiques. La méthode .conditions() attache un step dont la fonction resolveBranch renvoie soit l’indice d’une branche (mode tuple), soit une clé explicite (mode objet). undefined reprend la séquence linéaire.
import {
  createConditionStep,
  createStep,
  createWorkflow,
} from "@ai_kit/core";

const calculateScore = createStep<{ score: number }, { score: number }>({
  id: "calculate-score",
  handler: ({ input }) => ({ score: Math.max(0, Math.min(1, input.score)) }),
});

const evaluateRisk = createConditionStep<{ score: number }, { score: number }>({
  id: "evaluate-risk",
  resolveBranch: ({ output }) => {
    if (output.score >= 0.8) return "high";
    if (output.score >= 0.5) return "medium";
    if (output.score >= 0.2) return "low";
    return undefined;
  },
});

const handleLow = createStep<{ score: number }, string>({
  id: "handle-low",
  handler: ({ input }) => `LOW:${input.score}`,
});

const handleMedium = createStep<{ score: number }, string>({
  id: "handle-medium",
  handler: ({ input }) => `MEDIUM:${input.score}`,
});

const handleHigh = createStep<{ score: number }, string>({
  id: "handle-high",
  handler: ({ input }) => `HIGH:${input.score}`,
});

export const riskWorkflow = createWorkflow({ id: "risk" })
  .then(calculateScore)
  .conditions(evaluateRisk)
  .then({
    low: handleLow,
    medium: handleMedium,
    high: handleHigh,
  })
  .commit();
Chaque bifurcation apparaît dans les snapshots de run (branchId, nextStepId) et un événement step:branch est émis avant l’étape cible, ce qui facilite l’observabilité.

Variante tuple

createWorkflow({ id: "risk" })
  .then(calculateScore)
  .conditions(
    createConditionStep<{ score: number }, { score: number }>({
      id: "evaluate-risk-index",
      resolveBranch: ({ output }) => (output.score >= 0.5 ? 0 : 1),
    }),
  )
  .then(handleHigh, handleLow)
  .commit();
Choisissez cette forme lorsque l’ordre importe davantage que le nommage (ex. liste d’étapes existantes).

Bonnes pratiques

  • Rendez les règles métier explicites dans resolveBranch pour simplifier la maintenance.
  • Émettez des événements (context.emit) pour documenter les décisions.
  • Combinez .conditions() avec createParallelStep ou createForEachStep pour des pipelines hybrides.