Référence des node executors
Documentation de chaque type de node executor, sa configuration, ses entrées/sorties et son comportement.
Chaque type de node dans un flow a un executor correspondant dans services/core/src/application/services/executors/. Ce document détaille chacun d'eux.
AgentNodeExecutor
Fichier : agent_node_executor.py
Envoie un prompt à un LLM et retourne la réponse. Supporte le streaming, le tool calling et plusieurs modes d'exécution.
Configuration
| Paramètre | Type | Description |
|---|---|---|
provider | string | Fournisseur LLM (openai, azure, bedrock, watsonx, ollama, vllm) |
model | string | Identifiant du modèle (gpt-4o, claude-3-5-sonnet, etc.) |
system_prompt | string | Instructions système de l'agent |
temperature | float | 0.0–1.0 (0 = déterministe, 1 = créatif) |
max_tokens | int | Longueur max de la réponse |
tools | list | Outils que l'agent peut appeler (function calling) |
streaming | bool | Activer le streaming token par token |
Modes d'exécution
| Mode | Comportement |
|---|---|
| Simple | Un seul appel LLM, retourne la réponse |
| Tool calling | L'agent appelle des outils, reçoit les résultats, puis formule sa réponse |
| ReAct | Boucle raisonnement → action → observation jusqu'à résolution |
| Parallel tools | Plusieurs outils appelés en parallèle |
Entrée/Sortie
- Entrée :
{{ trigger.message }}ou contexte des nodes précédents - Sortie : Texte de la réponse LLM (accessible via
{{ agent_node.output }}) - Métadonnées : Token usage (prompt tokens, completion tokens), durée, modèle utilisé
ConditionExecutor
Fichier : condition_executor.py
Évalue une expression et dirige le flow vers la branche true ou false.
Configuration
| Paramètre | Type | Description |
|---|---|---|
expression | string | Expression à évaluer (ex: {{ score }} > 0.8) |
operator | string | Opérateur de comparaison |
Opérateurs supportés
| Opérateur | Description |
|---|---|
==, != | Égalité / différence |
>, >=, <, <= | Comparaisons numériques |
contains | Contient une sous-chaîne |
not_contains | Ne contient pas |
is_empty, is_not_empty | Vide / non vide |
starts_with, ends_with | Commence/finit par |
Le registre complet des opérateurs est dans operator_registry.py.
LoopContainerExecutor
Fichier : loop_container_executor.py
Itère sur une liste et exécute les nodes enfants pour chaque élément.
Configuration
| Paramètre | Type | Description |
|---|---|---|
items_expression | string | Expression retournant un tableau (ex: {{ documents }}) |
item_variable | string | Nom de la variable pour l'élément courant |
index_variable | string | Nom de la variable pour l'index courant |
Comportement
- Évalue
items_expressionpour obtenir la liste. - Pour chaque élément, définit
item_variableetindex_variable. - Exécute les nodes enfants du conteneur.
- Passe à l'élément suivant.
HTTPRequestExecutor
Fichier : http_request_executor.py
Exécute un appel HTTP vers une API externe.
Configuration
| Paramètre | Type | Description |
|---|---|---|
method | string | GET, POST, PUT, DELETE, PATCH |
url | string | URL cible (supporte les expressions {{ }}) |
headers | object | Headers HTTP (supporte les expressions) |
body | string/object | Corps de la requête |
timeout | int | Timeout en secondes |
auth_type | string | none, bearer, basic, api_key |
Sortie
{
"status_code": 200,
"headers": { "content-type": "application/json" },
"body": { ... }
}Sécurité
- Validation SSRF : les URL privées sont bloquées par défaut (127.0.0.1, 10.x.x.x, etc.).
- Les credentials sont résolus depuis le store de secrets, jamais en clair dans la config du node.
CodeExecutor
Fichier : code_executor.py
Exécute du code Python dans un environnement sandboxé.
Configuration
| Paramètre | Type | Description |
|---|---|---|
code | string | Code Python à exécuter |
timeout | int | Timeout d'exécution en secondes |
Environnement sandbox
- Imports restreints : pas d'accès fichier, réseau ou OS.
- Variables d'entrée disponibles via le contexte d'exécution.
- Le résultat doit être assigné à la variable
result.
# Exemple de code dans le node
data = inputs["agent_output"]
result = {"summary": data[:200], "word_count": len(data.split())}HumanInputExecutor
Fichier : human_input_executor.py
Met l'exécution en pause et attend une saisie humaine.
Configuration
| Paramètre | Type | Description |
|---|---|---|
prompt | string | Message affiché à l'opérateur |
fields | list | Champs du formulaire (si applicable) |
Comportement
- L'exécution passe en état
waiting_for_input. - Un événement SSE
human_input_requiredest émis. - L'opérateur voit la demande dans l'interface.
- Quand l'opérateur répond, l'exécution reprend avec la réponse comme sortie du node.
ParseDocExecutor
Fichier : parse_doc_executor.py
Extrait le texte d'un document (PDF, DOCX, PPTX, HTML).
Configuration
| Paramètre | Type | Description |
|---|---|---|
source | string | Chemin ou URL du document |
Formats supportés
| Format | Bibliothèque |
|---|---|
| PyMuPDF | |
| DOCX | python-docx |
| PPTX | python-pptx |
| HTML | BeautifulSoup4 |
Sortie
Texte brut extrait du document. La mise en page et les images sont perdues.
MergeDocsExecutor
Fichier : merge_docs_executor.py
Fusionne les sorties texte de plusieurs documents en un seul contenu.
SetVariableExecutor
Fichier : set_variable_executor.py
Définit ou met à jour une variable dans le contexte d'exécution.
Configuration
| Paramètre | Type | Description |
|---|---|---|
variable_name | string | Nom de la variable à définir |
value | string | Valeur (supporte les expressions {{ }}) |
DirectMessageExecutor
Fichier : direct_message_executor.py
Envoie un message direct à l'utilisateur sans passer par un agent LLM. Utile pour les messages fixes (accueil, erreur, redirection).
Triggers
ManualTriggerExecutor
Fichier : trigger_manual_executor.py
Point d'entrée pour les exécutions manuelles (test, démo). L'utilisateur fournit un message via l'interface.
TriggerFromChannelExecutor
Fichier : trigger_from_channel_executor.py
Point d'entrée pour les exécutions déclenchées depuis un channel (SDK, Webchat, Slack, etc.). Le message provient du canal externe.
Registre des executors
Le NodeExecutorRegistry (application/services/node_executor_registry.py) maintient le mapping node_type → executor_class. Quand le moteur d'exécution rencontre un node, il consulte ce registre pour obtenir l'executor approprié.
Ajouter un nouveau node executor
- Créer la classe executor dans
application/services/executors/. - Implémenter la méthode
execute()avec la signature standard. - Enregistrer le nouveau type dans le
NodeExecutorRegistry. - Ajouter des tests unitaires et d'intégration.
- Lancer
pnpm generatepour mettre à jour le registre TypeScript côté frontend.
Pour aller plus loin
- Architecture backend — Contexte architectural
- Guide de test — Comment tester les executors