Aller au contenu

Nœuds de pipeline : intégrés et plugins

Un pipeline de modèle virtuel ou de middleware est un graphe. Chaque nœud lit des valeurs sur ses ports d'entrée et en produit sur ses ports de sortie. Le moteur exécute les nœuds dans l'ordre des liaisons, du nœud generator jusqu'au nœud sink.

Cette page décrit chaque nœud livré avec Xolo : ce qu'il fait, ses ports, ce qu'on configure, et quand s'en servir. Pour écrire un plugin sur mesure, voir le guide de développement.

Un pipeline qui combine la plupart des nœuds décrits ici

La palette de gauche liste les nœuds intégrés puis les plugins chargés. Le panneau de droite configure le nœud sélectionné et rappelle ses ports.

La palette de l'éditeur

Les ports

Un port a un type. L'éditeur n'accepte de relier qu'une sortie et une entrée de même type.

Type Contenu
request La requête de complétion, messages compris
response La réponse du modèle
string Une chaîne, le plus souvent un nom de modèle
number Un nombre, le plus souvent un score entre 0 et 1
boolean Vrai ou faux

Un port d'entrée marqué requis doit être connecté, sinon le bandeau en bas de l'éditeur le signale et le pipeline ne s'enregistre pas. Un port d'entrée non requis peut rester libre. Le nœud applique alors sa valeur de configuration, ou ignore ce port.

Un nœud sans port d'entrée s'exécute au début. C'est le cas de value, model_ref, sample et context.

Chaque nœud intégré accepte un libellé libre, dans le panneau de droite. Quand il est renseigné, la carte l'affiche à la place de son résumé calculé. « modèle selon complexité » sur un select ou « soirée ? » sur un compare disent ce que le nœud décide, là où « > 0,6 » dit seulement comment il est réglé. Sur un trace, le libellé devient aussi le message de l'événement.

Nœuds intégrés

Ils font partie du serveur. Ils n'exigent aucun binaire de plugin et se comportent de la même façon sur toutes les installations. Chacun est décrit dans Nœuds intégrés.

Nœud Rôle
generator et sink Entrée et sortie obligatoires du pipeline
model Appelle un modèle réel ou virtuel
model_ref Émet le nom d'un modèle choisi dans une liste
model_fallback Essaie plusieurs modèles dans l'ordre jusqu'au premier qui répond
value Émet une valeur fixe
compare Compare un nombre à un seuil et émet un booléen
select Choisit une chaîne selon un booléen
math Combine jusqu'à quatre nombres
sample Sélectionne un pourcentage des requêtes
context Expose l'heure, le jour et d'autres faits sur la requête
trace Enregistre des valeurs dans un événement
block Refuse la requête quand un booléen est vrai
note Bloc de texte sur le canevas, sans effet

Plugins livrés par défaut

Les plugins sont des binaires séparés, chargés depuis XOLO_PLUGINS_DIR. L'image Docker officielle les embarque tous. Un plugin absent d'une installation apparaît en erreur dans l'éditeur.

Ceux qui ont leur propre écran de configuration l'ouvrent dans le panneau de droite. Les autres présentent un formulaire généré depuis leur schéma de configuration.

Analyse de la requête

Ces plugins lisent la requête et produisent des mesures. Ils ne modifient rien. Ils sont pensés pour alimenter un routage : leurs sorties vont dans compare, math, select, fuzzy-evaluator ou script-processor.

Plugin Rôle
request-inspector Relève les faits structurels
complexity-scorer Évalue la difficulté de la demande courante
text-classifier Range la demande dans une catégorie sans appeler de modèle
llm-classifier Pose la question à un modèle de l'organisation, via la passerelle
energy-estimator Estime l'énergie d'une inférence
budget-pressure Mesure la part du budget déjà consommée par l'utilisateur
prompt-guard Cherche les tentatives de manipulation de l'assistant sans appeler de modèle

Décision

Ces plugins transforment des mesures en décision quand compare et select ne suffisent plus.

Plugin Rôle
fuzzy-evaluator Applique des règles de logique floue à des nombres
script-processor Exécute un script Tengo avec des ports libres

Transformation de la requête

Plugin Rôle
system-prompt Ajoute un prompt système, ou remplace celui de la requête
pseudonymizer Remplace les données personnelles par des pseudonymes avant l'appel au modèle, puis rétablit les valeurs d'origine dans la réponse
time-restriction Refuse les requêtes hors des plages horaires hebdomadaires configurées, avec un fuseau horaire

Outils et test

Plugin Rôle
mcp-bridge Connecte un serveur MCP et expose ses outils au modèle
dummy-model Remplace le modèle par une réponse forgée

Quatre assemblages types

Le tutoriel de l'agent support gardé assemble plusieurs de ces briques pas à pas, captures d'écran à l'appui.

Politique de refus composée. prompt-guard.risk entre dans compare avec le seuil 0,6, result entre dans block. Le plugin mesure, le graphe décide, et le seuil se lit sur le canevas au lieu d'être enfoui dans la configuration du plugin. Un math en max entre plusieurs signaux, risk et pressure par exemple, refuse dès que l'un d'eux dépasse.

Garde-fou sans blocage. prompt-guard.suspicious va dans select, avec en when_true un model_ref vers un modèle virtuel dépourvu d'outils et en when_false le modèle habituel. Une requête douteuse est servie, mais sans pouvoir agir. Un trace branché sur risk et top_rule garde la trace de ce qui a déclenché.

Routage par capacité. request-inspector.has_vision va dans select, avec un model_ref vision en when_true et le modèle habituel en when_false. La sortie alimente model.model_name.

Routage horaire avec repli. context.hour entre dans compare avec le seuil 19 et l'opérateur gte, select bascule sur le modèle léger le soir, et model_fallback garde un second fournisseur en réserve.

Routage horaire et repli

Canari. sample à 10 % par utilisateur, select entre le nouveau modèle et l'ancien, un trace qui enregistre selected et le nom retenu, une note qui dit quand monter le pourcentage. Après une semaine d'événements, on monte ou on retire le nœud.

Déploiement progressif avec sample, select et trace