> ## Documentation Index
> Fetch the complete documentation index at: https://ai.aidalinfo.fr/llms.txt
> Use this file to discover all available pages before exploring further.

# Branches conditionnelles

> Bifurquer dynamiquement l’exécution d’un workflow.

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.

```ts theme={null}
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

```ts theme={null}
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.
