Un composant personnalisé encapsule une opération que l’éditeur visuel peut configurer et relier à d’autres nœuds. C’est utile pour une API interne, une transformation métier ou un connecteur absent. Le composant doit rester une petite couche d’adaptation : la logique réutilisable appartient à un module Python testé indépendamment.
Définir un contrat clair
Choisissez un nom, une description et des entrées compréhensibles. Distinguez texte, données structurées, secrets et connexions. Les sorties doivent avoir un type stable pour que le graphe détecte les incompatibilités. Une entrée facultative doit posséder un comportement documenté ; évitez les valeurs implicites qui changent silencieusement le résultat.
Organiser l’implémentation
La classe du composant déclare ses champs et les méthodes associées aux sorties. Validez les entrées avant tout appel externe, transformez les erreurs techniques en messages exploitables et conservez la cause dans les logs. Injectez le client métier plutôt que de mélanger authentification, requête HTTP et formatage dans une longue méthode.
Secrets et effets externes
Ne placez jamais une clé dans le code ou une valeur par défaut. Utilisez le mécanisme de secrets de l’environnement et masquez les valeurs dans les traces. Séparez les composants de lecture et d’écriture. Pour une action irréversible, exigez confirmation, idempotence et autorisation côté service cible ; le graphe visuel n’est pas un contrôle d’accès.
Tester avant l’interface
Testez la logique Python avec entrées normales, vides, invalides et délais réseau. Ajoutez ensuite un petit flow de démonstration qui vérifie les types et l’affichage des erreurs. Épinglez les dépendances et testez le chargement du composant après une mise à jour de Langflow.
FAQ
Peut-on installer n’importe quelle bibliothèque ?
Techniquement selon l’environnement, mais chaque dépendance augmente démarrage, surface d’attaque et conflits de versions.
Où placer la logique métier ?
Dans un module indépendant ; le composant adapte ses entrées et sorties à Langflow.
Comment distribuer un composant ?
Versionnez son code, ses dépendances, un exemple de flow et ses tests avec le projet.
Exemple minimal de composant
Un composant doit déclarer explicitement ses entrées, ses sorties et la méthode exécutée. Voici un composant qui normalise un texte avant de le transmettre au flux :
from langflow.custom import Component
from langflow.io import MultilineInput, Output
from langflow.schema import Data
class NormalizeText(Component):
display_name = "Normalize Text"
description = "Nettoie les espaces sans modifier le sens."
inputs = [MultilineInput(name="text", display_name="Texte", required=True)]
outputs = [Output(name="result", display_name="Résultat", method="normalize")]
def normalize(self) -> Data:
cleaned = " ".join(self.text.split())
self.status = f"{len(cleaned)} caractères"
return Data(data={"text": cleaned})Testez la logique hors de l’interface, avec une entrée vide, Unicode et un texte très long. N’effectuez pas d’appel réseau dans le constructeur. Placez les secrets dans les variables sécurisées de Langflow, ajoutez des délais aux clients externes et retournez des objets typés : cela rend les connexions du graphe compréhensibles et limite les erreurs à l’exécution.