# Nœud Classify

Le nœud **Classify** route l'exécution vers l'une de plusieurs branches nommées selon l'entrée. Utilisez-le quand vous avez besoin de branchement multi-voies déterministe piloté par un LLM (ou par des règles simples) — par exemple, trier des tickets de support en `billing`, `technical`, ou `other`.

Chaque catégorie que vous définissez devient une sortie séparée sur le nœud. Câblez chaque sortie vers la branche qui doit gérer cette catégorie.

---

## Fonctionnement

Le runtime prend l'entrée courante (message de chat, payload webhook, ou sortie d'un nœud amont), demande au modèle :

> Classify the user's current intent into exactly one of these categories: `<vos catégories>`. Respond with only the category name, nothing else.

Le nom de la catégorie choisie est écrit dans :

- `last_output` — la chaîne du nom
- `last_output_parsed.classification` — même valeur, structurée
- `ctx.classification` — alias pratique

Le runtime active ensuite la sortie correspondante. Les nœuds connectés à cette sortie s'exécutent ; les autres sont ignorés.

Si vous renseignez **opérateur + valeur** sur une catégorie, elle devient une *règle déterministe* (pas d'appel LLM) — le runtime évalue `input <opérateur> valeur` directement. Utile pour des chemins rapides comme « si l'entrée vaut `refund`, va vers la branche remboursement ».

---

## Configuration

| Champ | Description |
| --- | --- |
| **Catégories** | Liste de catégories. Chacune a un `name` et optionnellement un `operator` + `value` pour le matching déterministe |
| **Exemples** | Exemples few-shot optionnels — paires `{ input, category }` qui guident le modèle |
| **Modèle classifieur** | Surcharge le LLM classifieur par défaut (optionnel) |
| **Source d'entrée** | Où lire l'entrée. Défaut : `input_as_text`. Peut aussi référencer `input.output_text` ou `input.output_parsed.<champ>` depuis l'agent amont |

Chaque catégorie apparaît sur le canvas comme une sortie étiquetée. L'identifiant de la sortie est `category-<id>`.

---

## Configuration assistée

Le panneau de config fait l'essentiel du câblage quand le nœud amont est un **agent JSON** :

- **Entrée auto-sélectionnée** — quand vous déposez un Classify après un agent avec un schéma de sortie JSON, la source d'entrée est pré-réglée sur le premier champ routable de cet agent (`input.output_parsed.<champ>`, en préférant les champs `enum` puis `string`). La pastille d'entrée affiche le champ sélectionné ; cliquez-la pour en choisir un autre.
- **Catégories auto-remplies** — si le champ sélectionné est un `enum` (ou un booléen), les catégories sont pré-créées depuis ses valeurs (ou `true`/`false`), chacune avec une règle déterministe `==`. Vos propres modifications ne sont jamais écrasées.
- **Bouton « Fill from schema »** — apparaît dès que le champ sélectionné a des valeurs connues que vos catégories actuelles ne couvrent pas. Un clic recrée les catégories depuis le schéma.
- **Éditeur de matching replié** — chaque ligne de catégorie n'affiche que son nom ; le matcher opérateur + valeur est replié derrière le chevron. Une pastille de match résume la règle quand elle apporte de l'information (valeur différente du nom, ou opérateur autre que `==`).
- **Suggestions de valeurs** — en éditant un matcher sur un champ `enum`/booléen, les valeurs connues sont proposées au clic plutôt qu'en saisie libre.
- Pour un champ **numérique**, définissez un seuil par catégorie (ex. `> 10`) ; le panneau rappelle de préférer If/Else pour la logique multi-champs complexe.

---

## Exemple de workflow

Une boîte de support trie les emails entrants :

```
Webhook → Classify → ┬─ billing  → Agent (politique remboursement) → End
                     ├─ technical → Agent (RAG ingénierie)          → End
                     └─ other     → Agent (réponse générique)       → End
```

Configuration du nœud Classify :

- **billing** — « Remboursement, facture, paiement, problèmes d'abonnement »
- **technical** — « Bug reports, questions d'intégration, erreurs API »
- **other** — repli pour tout le reste

Le modèle en choisit exactement une ; la branche correspondante s'exécute.

---

## Comportement de repli

Si le modèle renvoie un nom qui ne correspond à aucune catégorie (rare avec des libellés clairs), aucune sortie aval ne s'active et le workflow se termine sur cette branche. Ajoutez une catégorie attrape-tout explicite (par ex. `other`) pour garantir qu'une branche s'exécute toujours.

---

## Conseils

- **Gardez les noms de catégorie courts et signifiants** — un seul mot ou un court groupe nominal marche le mieux.
- **Utilisez des exemples pour les catégories ambiguës** — trois ou quatre paires `{ input, category }` bien choisies améliorent nettement la précision.
- **Ajoutez un repli** — incluez toujours une catégorie `other` pour que les entrées inconnues aient un foyer.
- **Pour des données amont structurées, utilisez `input.output_parsed.<champ>`** comme source d'entrée au lieu du texte brut.
- **Pour un routage entièrement déterministe**, renseignez `operator` et `value` sur chaque catégorie — aucun appel LLM n'est fait.

---

*Source: https://agentbuilder.systalink.sn/docs/node-classify — human documentation.*
*Other language: [/docs-md/en/node-classify.md](/docs-md/en/node-classify.md).*
*Machine-readable index: [/llms.txt](/llms.txt).*
