Retour au catalogue
Season 54 15 Épisodes 50 min 2026

Langflow

v1.8 — Édition 2026. Un cours audio technique complet sur la création d'applications d'IA avec Langflow 1.8, passant du prototypage visuel au déploiement backend en production.

Orchestration LLM Prototypage visuel Frameworks AI/ML
Langflow
Lecture en cours
Click play to start
0:00
0:00
1
Le paradigme Langflow
Cet épisode aborde l'identité fondamentale du framework et la manière dont son interface visuelle se traduit en exécution backend. Les auditeurs apprendront comment la logique de l'application est structurée sous forme de Directed Acyclic Graph, permettant des transitions fluides du prototypage rapide aux API de production.
3m 31s
2
Architecture des composants et types de données
Cet épisode couvre l'anatomie d'un composant, y compris les ports d'entrée et de sortie, ainsi que les types de données fondamentaux comme Data et Message. Les auditeurs apprendront comment le typage strict et les couleurs des ports dictent le flux d'informations à travers le graphe.
3m 41s
3
S'interfacer avec le graphe
Cet épisode couvre les composants Chat Input et Chat Output, ainsi que la structure interne des objets Message. Les auditeurs apprendront comment les métadonnées, telles que les identifiants de session et les horodatages, sont intégrées aux messages pour suivre le contexte conversationnel.
3m 15s
4
L'abstraction du Language Model
Cet épisode couvre le composant central Language Model et les configurations globales des fournisseurs. Les auditeurs apprendront à abstraire les connexions LLM et à modifier dynamiquement le comportement des ports de sortie pour les intégrations en aval.
3m 30s
5
Moteurs d'exécution intelligents
Cet épisode couvre le composant Agent et son rôle en tant que moteur de raisonnement autonome. Les auditeurs apprendront comment les capacités de mémoire intégrées permettent une prise de décision dynamique au-delà des simples prompts statiques.
3m 26s
6
Équiper les agents avec le Tool Mode
Cet épisode couvre la mécanique du Tool Mode, qui convertit des composants inertes en fonctions d'agent actionnables. Les auditeurs apprendront à configurer les descriptions d'outils pour guider parfaitement la prise de décision de l'agent.
3m 01s
7
Compositions multi-agents
Cet épisode couvre la stratégie architecturale consistant à imbriquer des sous-flux et à utiliser des agents secondaires comme outils. Les auditeurs apprendront à construire des systèmes multi-agents hiérarchiques pour le routage de tâches complexes.
3m 21s
8
Le client Model Context Protocol
Cet épisode couvre le composant MCP Tools et sa capacité à connecter des outils de serveurs externes directement à vos agents. Les auditeurs apprendront comment le Model Context Protocol remplace les wrappers REST API standards pour le contexte de l'agent.
3m 20s
9
Exposer des flux en tant que serveurs MCP
Cet épisode explique comment transformer vos projets Langflow en outils MCP universels pour des clients externes. Les auditeurs apprendront à configurer des transports HTTP streamables et à concevoir des descriptions d'outils robustes pour les IDE distants.
2m 50s
10
Gestion de l'état et des sessions
Cet épisode couvre la persistance de la mémoire et l'isolation stricte des sessions à travers les échanges de chat. Les auditeurs apprendront à différencier la mémoire de l'Agent du composant Message History pour un suivi robuste et linéaire des conversations.
3m 31s
11
Ancrer le LLM avec des Vector Stores
Cet épisode couvre les meilleures pratiques architecturales pour construire des pipelines de Retrieval Augmented Generation. Les auditeurs apprendront à découpler l'ingestion asynchrone de données de la recherche sémantique en temps réel.
3m 26s
12
Étendre le moteur via Python
Cet épisode couvre la création fondamentale de composants Python personnalisés au sein du framework. Les auditeurs apprendront comment des annotations strictes au niveau des classes mappent la logique du code interne aux nœuds visuels de l'interface utilisateur.
3m 08s
13
Hooks de composants avancés et exécution
Cet épisode couvre le cycle de vie du moteur d'exécution interne et les techniques avancées de partage d'état. Les auditeurs apprendront à surcharger les hooks de configuration et à utiliser des dictionnaires de contexte pour la persistance d'états complexes.
3m 49s
14
L'API Langflow et les ajustements dynamiques
Cet épisode couvre l'exécution programmatique de graphes via la REST API. Les auditeurs apprendront à utiliser l'Input Schema pour injecter des surcharges de paramètres à l'exécution sans altérer le flux sous-jacent.
3m 14s
15
Conteneurisation en production
Cet épisode couvre la transition du développement visuel aux déploiements en production headless. Les auditeurs apprendront à construire des Dockerfiles, à verrouiller les dépendances et à monter des composants personnalisés de manière sécurisée.
3m 22s

Épisodes

1

Le paradigme Langflow

3m 31s

Cet épisode aborde l'identité fondamentale du framework et la manière dont son interface visuelle se traduit en exécution backend. Les auditeurs apprendront comment la logique de l'application est structurée sous forme de Directed Acyclic Graph, permettant des transitions fluides du prototypage rapide aux API de production.

Télécharger
Salut, c'est Alex de DEV STORIES DOT EU. Langflow, épisode 1 sur 15. Prototyper une application d'IA implique généralement de créer rapidement une maquette visuelle, de prouver que l'idée fonctionne, puis de jeter toute cette UI pour écrire le vrai backend de production de zéro. Tu perds des jours à traduire des concepts visuels en code serveur. Cet épisode aborde le paradigme Langflow, un concept qui élimine complètement cette étape de traduction. Langflow est un framework conçu pour créer des applications d'IA. Comme tu interagis avec lui principalement via un canvas où tu fais du drag and drop de composants, c'est très facile de le confondre avec un simple outil d'UI ou un jouet low-code. C'est une idée reçue. Fais bien attention à cette distinction. Langflow est un framework backend Python complet. L'interface visuelle n'est qu'une fenêtre sur l'architecture Python sous-jacente. Chaque composant visuel que tu places sur le canvas correspond directement à une classe Python, et le graphe que tu dessines se traduit directement en logique d'API backend. Dans Langflow, les applications que tu crées s'appellent des flows. Quand tu ouvres le workspace, tu construis en fait un graphe acyclique orienté, ou DAG. Tu commences par ajouter des nodes sur le canvas. Chaque node représente un bloc de fonctionnalité distinct, comme un text parser, un data loader ou un module de processing. Tu dessines ensuite des lignes pour connecter les output handles d'un node aux input handles d'un autre. Ces lignes ne sont pas juste là pour faire joli. Elles dictent la dépendance d'exécution de toute ton application. Si tu connectes l'output d'un node document loader à l'input d'un node de processing, le moteur sous-jacent lit ça comme une règle de dépendance stricte. Il sait qu'il doit d'abord exécuter le document loader, attendre le résultat, puis transmettre cette data en aval. La data circule strictement dans une seule direction à travers le graphe, ce qui garantit un chemin prévisible et traçable depuis ton user input jusqu'à la réponse finale. Le framework gère le type checking entre ces handles connectés, pour s'assurer que l'output d'un node est bien compatible avec l'input du suivant avant même que l'exécution ne commence. Imagine que tu construises un flow de prototypage pour un outil basique de question-réponse. Dans le workspace, tu connectes un node de text input à un node de processing, puis tu routes ça vers un node d'output. Tu testes ça directement dans le navigateur, en ajustant les paramètres jusqu'à ce que les réponses te semblent correctes. Dans un workflow traditionnel, l'étape suivante, c'est de donner un document de spécifications à un ingénieur backend pour qu'il réécrive cette logique en Python. Dans le paradigme Langflow, tu sautes complètement cette étape. Dès l'instant où ton flow visuel fonctionne, c'est déjà une API fonctionnelle. Tu envoies simplement une requête à l'endpoint run intégré, avec l'identifiant de ton flow et tes variables d'input. Le framework traverse le graphe exactement comme tu l'as conçu, en exécutant chaque classe Python dans le bon ordre, et te renvoie la réponse. Tu passes d'un prototype visuel à un backend Python en service sans écrire une seule ligne de code de configuration serveur. L'essence même de Langflow, c'est que la carte visuelle que tu dessines pour comprendre ton application est exactement la même structure que le serveur utilise pour l'exécuter. Si tu trouves ces épisodes utiles et que tu veux soutenir l'émission, tu peux chercher DevStoriesEU sur Patreon. Merci pour ton écoute, et bon code à tous !
2

Architecture des composants et types de données

3m 41s

Cet épisode couvre l'anatomie d'un composant, y compris les ports d'entrée et de sortie, ainsi que les types de données fondamentaux comme Data et Message. Les auditeurs apprendront comment le typage strict et les couleurs des ports dictent le flux d'informations à travers le graphe.

Télécharger
Salut, c'est Alex de DEV STORIES DOT EU. Langflow, épisode 2 sur 15. Tu connectes deux nodes ensemble, tu lances ton pipeline, et absolument rien ne se passe. La connexion a l'air bonne, mais l'exécution plante ou renvoie une erreur cryptique. Le problème vient généralement de la façon dont la data circule entre les blocs, ce qui nous amène à l'architecture des composants et aux types de données. On pense souvent que les composants Langflow s'échangent des payloads JSON en vrac, comme une web API standard. Ce n'est pas le cas. Chaque composant dans Langflow est l'exécution d'une classe Python distincte et strictement typée. Un composant contient un state interne, des ports d'input et des ports d'output. La data circule strictement via ces ports définis, et ces ports exigent des objets Langflow spécifiques. Tu peux repérer ces types de données grâce aux couleurs des ports. Chaque port sur un composant a une couleur spécifique qui correspond au type de data qu'il accepte ou qu'il renvoie. Si tu connectes un port d'output à un port d'input et que les couleurs correspondent, la data circule sans problème. Si les couleurs ne correspondent pas, tu essaies de faire passer de la data incompatible. Le composant en aval ne pourra pas parser l'objet entrant, et le flow va planter. Pour construire des pipelines fiables, tu dois comprendre les trois objets de data principaux qui transitent par ces connexions. Le premier, c'est le type Message. Un objet Message est utilisé pour la data conversationnelle. Il transporte le contenu texte réel avec des informations de routage, plus précisément le rôle, qui indique au système si le texte vient d'un utilisateur, d'un prompt système ou d'un modèle d'IA. Le deuxième type principal, c'est l'objet Data. Un objet Data fonctionne comme un wrapper pour les informations non structurées. Il contient du texte ainsi qu'un dictionnaire de metadata. Quand tu récupères des documents depuis une base de données vectorielle, que tu scrapes une page web, ou que tu lis un fichier texte, cette information voyage à travers ton flow sous la forme d'un objet Data structuré, et non comme une raw string. Le dictionnaire de metadata te permet de faire passer des URL sources ou des timestamps avec le texte sans casser la logique de traitement en aval. Le troisième type, c'est l'objet DataFrame. On l'utilise pour la data tabulaire en deux dimensions. Il se comporte un peu comme un DataFrame Pandas, ce qui en fait le type requis quand tu fais passer des fichiers CSV parsés ou des lignes et des colonnes structurées entre des composants analytiques. Comme les ports sont strictement typés, tu vas souvent rencontrer des situations où tu as un type de data, mais le composant suivant en demande un autre. Prends le scénario où tu récupères une raw string depuis un bloc d'exécution Python basique, et que tu dois la passer à un composant de traitement de texte qui exige explicitement un objet Data structuré. Les couleurs des ports ne vont pas correspondre. Tu ne peux pas forcer une raw string dans un port Data. Pour combler cet écart, tu utilises un composant Type Convert. Tu places le bloc Type Convert entre les deux composants incompatibles. D'abord, tu connectes l'output de la string à l'input du bloc Type Convert. Ensuite, tu connectes son output au port Data de ton composant de traitement en aval. Le bloc Type Convert prend la raw string, l'encapsule dans un vrai objet Data avec un dictionnaire de metadata vide, et la passe en toute sécurité au node suivant. Comprendre le typage strict de ces ports, c'est la différence entre un flow qui marche et un flow qui plante constamment. Si un pipeline plante silencieusement, ne debug pas ta logique en premier, vérifie les couleurs de tes ports pour t'assurer que tes composants parlent exactement le même langage de data. Merci d'avoir écouté. Prenez soin de vous, tout le monde.
3

S'interfacer avec le graphe

3m 15s

Cet épisode couvre les composants Chat Input et Chat Output, ainsi que la structure interne des objets Message. Les auditeurs apprendront comment les métadonnées, telles que les identifiants de session et les horodatages, sont intégrées aux messages pour suivre le contexte conversationnel.

Télécharger
Salut, c'est Alex de DEV STORIES DOT EU. Langflow, épisode 3 sur 15. Un simple message de chat ressemble juste à une string de texte, mais si c'était le cas, ton application perdrait la trace de qui a dit quoi dès qu'un deuxième utilisateur se connecterait. Résoudre ce problème de routage, c'est exactement ce qu'on aborde aujourd'hui : l'interface avec le graph en utilisant Chat Input et Chat Output. Quand tu construis un flow, le point d'entrée est généralement un composant Chat Input. Les développeurs le confondent souvent avec une simple text box qui transmet aveuglément une string au node suivant. C'est un mauvais modèle mental. Le composant Chat Input agit comme une factory de données structurées. Sa fonction principale, c'est d'intercepter le texte brut de l'interface utilisateur et de l'encapsuler dans un type de données spécifique appelé Message object. Le Message object est la monnaie d'échange fondamentale pour le texte qui circule dans un graph Langflow. Au lieu de faire passer des strings nues, le graph route ce package standardisé. À l'intérieur de l'objet, les mots vraiment tapés par l'utilisateur se trouvent dans un champ text principal. Autour de ce texte, il y a une couche de metadata. L'objet contient un champ sender, qui catégorise la source comme étant soit User, soit Machine. Il inclut un sender name, qui gère le label d'affichage visuel sur le front end. Il tamponne aussi l'heure exacte de création dans un champ timestamp. Ces metadata deviennent cruciales quand on gère des utilisateurs simultanés. Prends l'exemple d'un utilisateur qui pose une question dans une application deployée. Le composant Chat Input attrape son texte, le package dans un Message object, définit le sender sur User, et y attache un session ID unique. Ce session ID est le mécanisme qui track un thread de conversation spécifique. À mesure que le Message traverse le graph, en passant par des retrievers ou des nodes de traitement, ce session ID reste attaché. Les outils de state management et les composants de memory dépendent entièrement de cet ID pour regrouper les interactions. Sans lui, le graph n'aurait aucun moyen d'isoler le contexte d'un utilisateur par rapport à un autre. Tu as aussi le contrôle sur la visibilité de cet input. Le composant Chat Input peut être configuré pour cacher son contenu de l'interface de chat principale. C'est super pratique pour faire passer des system parameters par défaut ou des background instructions que l'utilisateur n'a jamais besoin de voir, tout en injectant un Message object valide dans le graph. De l'autre côté du flow se trouve le composant Chat Output. C'est le terminal node qui renvoie les données à l'interface utilisateur. Il attrape le Message object final produit par ta logique. Comme il reçoit un objet complètement formé, le composant Chat Output lit les champs sender et sender name pour faire le rendu de l'interface avec précision, en affichant généralement la réponse comme venant de la Machine. Si un node précédent fait passer du texte brut dans le Chat Output au lieu d'un Message object, le composant corrige ça automatiquement. Il wrap la string brute dans un nouveau Message object avant de l'afficher, ce qui force une cohérence stricte des données aux frontières de ton graph. Les composants Chat Input et Chat Output ne sont pas des éléments d'interface cosmétiques, ce sont les contrôleurs frontaliers de ton application, qui garantissent que chaque morceau de texte est proprement wrappé dans un Message object tracké avant d'être autorisé à bouger. Merci d'avoir écouté. J'espère que tu as appris un truc nouveau.
4

L'abstraction du Language Model

3m 30s

Cet épisode couvre le composant central Language Model et les configurations globales des fournisseurs. Les auditeurs apprendront à abstraire les connexions LLM et à modifier dynamiquement le comportement des ports de sortie pour les intégrations en aval.

Télécharger
Salut, c'est Alex de DEV STORIES DOT EU. Langflow, épisode 4 sur 15. Tu décides de changer de provider de modèle pour ton application en plein milieu du projet. D'habitude, ça veut dire traquer chaque API call, réécrire les objets de configuration, et espérer que tu n'as pas cassé toute ta prompt chain. Une bonne architecture transforme ça en une transition fluide. Le composant Language Model dans Langflow fournit l'abstraction qui rend ça possible. Quand les devs commencent à construire des flows, ils s'attendent souvent à juste glisser-déposer un node de modèle sur le canvas et à coller immédiatement leur clé API directement dans les settings du composant. Ne fais pas ça. Langflow est conçu pour gérer l'authentification de manière globale via le panneau Model Providers. Tu configures tes credentials, comme tes clés OpenAI ou Anthropic, une seule fois dans les settings globaux. Les composants de modèle individuels sur ton canvas servent de références à ces configurations globales. Le node lui-même gère le comportement local, en contrôlant des trucs comme le system prompt, la limite max de tokens, ou le réglage de la température. Le provider global gère la connexion sécurisée. Cette séparation entre l'authentification et la logique d'exécution devient critique quand tu veux expérimenter. Imagine que tu as une prompt chain complexe qui alimente actuellement un composant de modèle OpenAI. Tu veux voir si un modèle Anthropic donne de meilleurs résultats. Grâce à l'abstraction globale, tu as juste à glisser le nouveau composant Anthropic sur le canvas. Tu connectes ta séquence de prompts existante à son input. Tu règles la température que tu veux sur le nouveau node. Le provider global gère automatiquement l'autorisation en background à partir de tes clés sauvegardées. Tu supprimes l'ancien node, et ton flow est immédiatement prêt à être testé. Rien ne casse dans ta prompt chain. Voilà pour la configuration du composant. Maintenant, regarde comment il transmet les données à la suite. Le composant Language Model offre deux types d'outputs, selon ce dont le reste de ton flow a vraiment besoin. Par défaut, le composant émet une Model Response. Tu lui envoies un prompt, le modèle le traite, et le composant sort une string de texte. C'est le comportement standard que tu utilises quand tu construis un chatbot basique ou un outil de résumé. Le node reçoit une requête, génère la réponse, et fait passer cette réponse finalisée à la suite. Mais parfois, un composant en aval n'a pas besoin de la réponse. Il a besoin du moteur. Tu peux changer le comportement du port d'output, pour passer de l'émission d'une réponse Message à l'émission d'une instance LanguageModel. Quand tu fais ça, le composant n'évalue plus le prompt et n'envoie plus de texte. À la place, il package le modèle configuré lui-même, avec ses credentials de provider et ses settings de température, et il passe cet objet au node suivant. C'est essentiel pour des architectures plus avancées. Si tu connectes ton setup à une retrieval chain complexe, cette chain a besoin d'exécuter ses propres requêtes internes pour chercher dans une base de données en fonction de l'historique de conversation. Elle ne peut pas faire ça si tu lui donnes juste une réponse texte statique. Elle a besoin d'un moteur live pour effectuer ses propres tâches de génération de texte. En passant l'instance LanguageModel, tu donnes au node en aval un outil entièrement configuré qu'il peut utiliser de manière répétée pour générer les prompts spécifiques dont il a besoin. Le composant n'est pas juste un API call hardcodé. C'est un conteneur flexible qui sépare tes credentials de ta logique, ce qui te permet de choisir si ton application a besoin d'une réponse finalisée ou d'un moteur d'exécution. C'est tout pour cet épisode. Merci d'avoir écouté, et continue de développer !
5

Moteurs d'exécution intelligents

3m 26s

Cet épisode couvre le composant Agent et son rôle en tant que moteur de raisonnement autonome. Les auditeurs apprendront comment les capacités de mémoire intégrées permettent une prise de décision dynamique au-delà des simples prompts statiques.

Télécharger
Salut, c'est Alex de DEV STORIES DOT EU. Langflow, épisode 5 sur 15. Qu'est-ce qui sépare un chatbot statique d'un vrai moteur de raisonnement ? La capacité de décider de ses propres prochaines étapes. Si ton flow repose entièrement sur des prompt chains hardcodées, il va planter à la seconde où un utilisateur posera une question de suivi inattendue. C'est là qu'interviennent les moteurs d'exécution intelligents, et plus précisément le composant Agent. Beaucoup de devs placent un node Language Model classique sur le canvas et s'attendent à ce qu'il se comporte comme un assistant intelligent, conscient du contexte. Ce n'est pas le cas. Un node Language Model standard est en gros une calculatrice text-in, text-out. Tu lui passes une string, et il te renvoie une string basée uniquement sur ce seul input. Un composant Agent est fondamentalement différent. C'est un moteur de raisonnement autonome. Au lieu de simplement exécuter un seul prompt, un Agent évalue le contexte actuel, décide d'une séquence d'actions et détermine ses propres étapes d'exécution pour atteindre un but. Quand un utilisateur envoie un message à un Agent, le composant ne génère pas immédiatement la réponse finale. Il entre dans une boucle de raisonnement interne. Il analyse l'input, vérifie son state interne et élabore un plan. Cette phase de planification permet à l'Agent de structurer des réponses complexes ou de se rendre compte qu'il doit évaluer les interactions passées avant de continuer. Ça nous amène aux capacités de mémoire intégrées du composant Agent. Un node Language Model standard souffre d'amnésie. Chaque requête est une page blanche. Si un utilisateur demande quelle est la capitale de la France, puis enchaîne en demandant quelle est la population là-bas, un node standard ne saura pas ce que le mot là-bas veut dire. Tu devrais construire manuellement un système pour capturer, stocker, formater et injecter l'historique de conversation précédent dans chaque nouveau prompt. Le composant Agent résout ça nativement. Il maintient automatiquement une context window active des questions précédentes de l'utilisateur et des réponses précédentes du système. Quand cette deuxième question sur la population arrive, l'Agent intercepte la requête. Avant de générer une réponse, il interroge sa mémoire intégrée. Il récupère le contexte de la première question, reconstitue l'historique de la conversation et en déduit que le lieu en question est Paris. Il exécute cette évaluation contextuelle de manière entièrement autonome. Tu n'as pas besoin de connecter des nodes de mémoire séparés, de parser des strings d'historique, ou de construire des boucles d'injection d'historique complexes sur ton canvas. L'Agent gère en interne la nature stateful de la conversation. Il décide quand consulter l'historique, quelle partie est pertinente pour la requête actuelle, et comment utiliser ce contexte historique pour façonner son prochain output. Ce changement modifie ta façon de concevoir les flows. Tu ne mappes plus chaque branche possible d'une conversation. Tu fournis à un moteur intelligent les paramètres dont il a besoin pour gérer la conversation lui-même. Le composant prend en charge le state management et la résolution du contexte. La véritable puissance du composant Agent réside dans cette autonomie. En passant de language models statiques à un Agent, tu délègues le control flow au moteur lui-même. Le système n'est plus un pipeline rigide, mais une entité dynamique capable de maintenir un state, de se souvenir des interactions passées et d'adapter son raisonnement à l'intention de l'utilisateur à la volée. Je voudrais prendre un moment pour te remercier de ton écoute — ça nous aide beaucoup. Passe une excellente journée !
6

Équiper les agents avec le Tool Mode

3m 01s

Cet épisode couvre la mécanique du Tool Mode, qui convertit des composants inertes en fonctions d'agent actionnables. Les auditeurs apprendront à configurer les descriptions d'outils pour guider parfaitement la prise de décision de l'agent.

Télécharger
Salut, c'est Alex de DEV STORIES DOT EU. Langflow, épisode 6 sur 15. Tu penses peut-être que créer un tool pour agent nécessite d'écrire des wrappers Python custom ou de chercher des tool nodes spécialisés dans une library. Eh bien non. Presque n'importe quel composant déjà présent sur ton canvas peut être converti en une capacité active en un seul clic. Aujourd'hui, on regarde comment équiper les agents avec le Tool Mode. On croit souvent à tort qu'il faut des tool components dédiés et hard-codés pour alimenter un agent. Dans Langflow, le Tool Mode est une feature intégrée directement aux nodes standards. Que tu bosses avec un API caller, un database retriever ou un node de traitement de texte, tu peux le passer en Tool Mode. Quand tu actives ce toggle sur un composant, son interface change. Les output ports standards que tu redirigerais normalement vers l'étape suivante d'une chain linéaire disparaissent. À la place, le composant expose un seul output port Tool. Tu prends ce nouveau Tool output et tu le connectes directement à l'input port Tools d'un composant Agent. Une étape de processing inactive devient alors un utilitaire actionnable que l'agent peut déclencher à la demande. Transformer le composant en tool n'est que l'étape mécanique. L'agent a encore besoin de savoir comment l'utiliser. Quand tu actives le Tool Mode, un bouton appelé Edit Action apparaît sur le node. Cliquer dessus révèle trois champs de configuration. Le premier champ est le Slug. C'est un identifiant lisible par la machine, généralement formaté avec des underscores à la place des espaces. Le deuxième est le Name, qui est un titre standard lisible par un humain. Le troisième champ est la Description. C'est la partie qui compte. Le champ Description n'est pas de la documentation pour le développeur. C'est le prompt textuel littéral que le Large Language Model lit pour déterminer s'il doit déclencher ce tool spécifique. Si ta description est vague, l'agent va deviner quand l'utiliser, ce qui va entraîner un comportement imprévisible et un gaspillage de tokens. Prends un composant Web Search comme exemple. Normalement, il prend juste une string et renvoie des résultats de recherche. Si tu actives le Tool Mode sur ce node, il devient un tool d'agent. Maintenant, tu ouvres le menu Edit Action. Si tu écris une description générique comme searches the web, l'agent risque de déclencher une recherche pour des questions factuelles de base qu'il a déjà dans ses training data. À la place, tu écris une description très restrictive. Tu définis des conditions exactes. Tu écris, utilise ce tool exclusivement pour chercher des breaking news, des événements actuels ou la météo en temps réel. L'agent parse cette phrase exacte pendant son cycle de raisonnement. Il évalue le prompt par rapport à ta description, en s'assurant que le node Web Search ne se déclenche que quand l'utilisateur pose une question sur l'actualité récente. Tu peux scaler ça en activant le Tool Mode sur plusieurs composants différents. Tu connectes simplement tous leurs output ports Tool dans l'unique input Tools sur le node Agent. L'agent passe en revue les descriptions pour chaque tool connecté, sélectionne le bon, l'exécute, et synthétise les données renvoyées pour formuler sa réponse finale. La logique sous-jacente du node est entièrement invisible pour l'agent. La seule chose qui contrôle la prise de décision de ton agent, c'est la précision des descriptions de tes tools. Merci d'avoir écouté. À la prochaine !
7

Compositions multi-agents

3m 21s

Cet épisode couvre la stratégie architecturale consistant à imbriquer des sous-flux et à utiliser des agents secondaires comme outils. Les auditeurs apprendront à construire des systèmes multi-agents hiérarchiques pour le routage de tâches complexes.

Télécharger
Salut, c'est Alex de DEV STORIES DOT EU. Langflow, épisode 7 sur 15. Forcer un seul modèle de langage à gérer en même temps le routing de base et l'analyse lourde de données donne généralement des réponses lentes et des factures d'API élevées. La solution, c'est de diviser la charge cognitive, et c'est là qu'interviennent les compositions multi-agents. Beaucoup de gens voient les flows Langflow strictement comme des endpoints isolés. Tu appelles une API, tu obtiens une réponse, et l'exécution s'arrête. C'est une idée reçue. Les flows ne sont pas juste des applications top-level, ils peuvent être imbriqués de manière hiérarchique. Prends l'exemple d'un système pour parser les requêtes utilisateur. Tu configures un agent de routing principal en utilisant un modèle rapide et pas cher. Son seul boulot, c'est de comprendre ce que veut l'utilisateur. Quand un utilisateur demande d'analyser un énorme rapport financier, l'agent principal ne traite pas le document lui-même. À la place, tu connectes un agent secondaire directement dans le tool input de l'agent principal. Cet agent secondaire fait tourner un modèle complètement différent avec une context window beaucoup plus grande, spécialisé spécifiquement pour l'extraction de données. Le routing repose entièrement sur la description du tool. Quand tu connectes l'agent secondaire, tu dois fournir une description textuelle claire de ce qu'il fait. L'agent principal lit cette description en même temps que le prompt de l'utilisateur. Quand une requête correspond à la description, l'agent principal arrête sa propre génération, package le contexte pertinent, et invoque l'agent secondaire. Pour l'agent principal, ce setup secondaire complexe ressemble à une simple fonction. L'agent secondaire exécute sa propre reasoning loop, traite le gros document, et renvoie le texte final à l'agent principal, qui répond ensuite à l'utilisateur. Tu peux pousser cette abstraction encore plus loin en utilisant un flow entier comme un tool. Tu pourrais construire un flow sophistiqué qui scrape un site web, extrait du texte, le formate, et évalue l'output. Une fois construit, tu le sauvegardes. Dans un projet complètement différent, tu déposes un composant Flow Tool sur le canvas et tu sélectionnes ton flow sauvegardé. Quand tu importes un flow dans un autre workspace, tu définis des composants d'input et d'output spécifiques à l'intérieur de ce child flow. L'agent parent mappe les arguments de son tool directement sur ces inputs définis. Il exécute le child flow, attend que le composant d'output final se déclenche, et remonte le texte qui en résulte le long de la chain. Langflow est construit sur une architecture de graph basée sur des nodes. Grâce à cette structure, le moteur permet une composition récursive. Un graph entier peut être encapsulé et traité comme un seul node au sein d'un graph plus vaste. L'agent principal n'a aucune conscience de la complexité imbriquée. Il voit juste un tool appelé scrape_and_evaluate qui prend une URL et renvoie un résumé. La puissance de la composition multi-agents, c'est l'abstraction. Ça te permet de cacher des reasoning loops complexes à plusieurs étapes derrière un seul tool call, ce qui garde ta logique de routing principale propre et prévisible. Si tu veux soutenir l'émission, tu peux nous trouver en cherchant DevStoriesEU sur Patreon. Merci d'avoir écouté. Prenez soin de vous tous.
8

Le client Model Context Protocol

3m 20s

Cet épisode couvre le composant MCP Tools et sa capacité à connecter des outils de serveurs externes directement à vos agents. Les auditeurs apprendront comment le Model Context Protocol remplace les wrappers REST API standards pour le contexte de l'agent.

Télécharger
Salut, c'est Alex de DEV STORIES DOT EU. Langflow, épisode 8 sur 15. Fini le temps où il fallait écrire des wrappers d'API custom pour chaque nouvelle source de données. Tu n'as plus besoin de mapper manuellement les endpoints, de formater les headers, ni de parser du JSON brut juste pour permettre à un agent de lire une page web ou de requêter une base de données locale. Cette friction est éliminée par le Model Context Protocol Client. On confond souvent ça avec les intégrations d'API REST classiques. Ce n'est pas un node de requête HTTP générique où tu câbles le payload toi-même. Le Model Context Protocol, ou MCP, est un standard ouvert conçu spécifiquement pour fournir du contexte et des fonctions exécutables aux modèles d'IA. C'est un langage universel pour le tool use. Dans cette architecture, Langflow fonctionne comme le MCP Client. Il contacte un MCP Server externe, lui demande quelles capacités il offre, et les expose. Tu fais ça en utilisant le composant MCP Tools. Tu glisses ce composant sur ton canvas et tu connectes son output directement dans l'input tools d'un composant Agent. Quand la connexion est établie, Langflow reçoit un schema strict qui définit les tools, leurs descriptions et leurs paramètres requis. Il les traduit automatiquement en tools natifs. L'agent sait alors exactement comment formater les données et déclencher les fonctions externes. Pour faire cette connexion, tu sélectionnes une méthode de transport. Le composant MCP Tools supporte deux options : HTTP via Server-Sent Events, et STDIO. HTTP est le bon choix pour les serveurs distants qui tournent de manière sécurisée sur une autre machine. Tu fournis simplement l'URL de l'endpoint. STDIO est utilisé quand tu veux que Langflow exécute un process local et communique via les streams d'entrée et de sortie standard. Regardons un scénario concret avec STDIO. Disons que tu veux que ton agent résume des news tech directement depuis des URLs externes. Tu peux utiliser un tool pré-construit appelé le fetch MCP server. Dans ton composant MCP Tools, règle le transport sur STDIO. Règle ta commande sur uvx, un tool Python qui télécharge et lance des packages dans des environnements isolés. Pour le champ arguments, tape mcp tiret server tiret fetch. Connecte l'output du composant à ton agent. Quand tu promptes l'agent pour résumer un article spécifique, l'agent appelle nativement le tool fetch. Il streame l'URL cible via STDIO vers le background process isolé, lit le texte renvoyé par la page web, et génère ton résumé. Tu n'as écrit absolument aucun code pour réaliser cette intégration. Beaucoup de tools nécessitent une authentification, comme un mot de passe de base de données ou une clé d'API privée. Le composant MCP Tools inclut un champ Environment Variables qui accepte un dictionnaire de paires key-value. Si tu interagis avec ton graph Langflow de manière programmatique via l'API, tu peux injecter ces credentials dynamiquement en utilisant le dictionnaire tweaks. Tu cibles simplement l'ID du composant MCP Tools et tu passes les variables d'environnement de manière sécurisée dans le payload de ta requête. L'avantage décisif du MCP Client, c'est le découplage total. Tu déploies une capacité externe une seule fois, dans n'importe quel langage de programmation, et tu donnes instantanément à n'importe quel agent Langflow un accès natif à celle-ci sans jamais altérer la logique du graph. Merci d'avoir écouté — à la prochaine.
9

Exposer des flux en tant que serveurs MCP

2m 50s

Cet épisode explique comment transformer vos projets Langflow en outils MCP universels pour des clients externes. Les auditeurs apprendront à configurer des transports HTTP streamables et à concevoir des descriptions d'outils robustes pour les IDE distants.

Télécharger
Salut, c'est Alex de DEV STORIES DOT EU. Langflow, épisode 9 sur 15. Tu écris un pipeline d'IA custom, et tu veux que ton éditeur de code l'exécute nativement comme un outil intégré. Tu poses une question à ton IDE, et il déclenche de façon transparente le système de retrieval complexe que tu as construit hier. Exposer tes flows comme des serveurs MCP rend ça possible. D'abord, on doit clarifier ce qu'est vraiment un serveur MCP. Les auditeurs le confondent parfois avec un endpoint de déploiement standard utilisé pour le backend d'une application web. Ce n'est pas du tout ça. Le Model Context Protocol, ou MCP, est un moyen standardisé de fournir des capacités directement à d'autres agents IA. Un endpoint standard donne des données à une interface utilisateur. Un serveur MCP donne des tools à un moteur de raisonnement. Langflow te permet de transformer automatiquement n'importe quel projet en serveur MCP. Quand tu fais ça, tout ton flow est packagé comme un tool exécutable. Pour communiquer avec des clients externes, Langflow utilise un mécanisme de transport HTTP streamable, en s'appuyant spécifiquement sur les Server-Sent Events. Ça veut dire que ton client externe se connecte via des protocoles web standards et peut recevoir des réponses en streaming directement depuis ton flow, sans avoir besoin de configurations réseau locales complexes. La configuration technique est simple, mais il y a un prérequis absolu que tu dois respecter. Tu dois définir le nom et la description du tool. Quand un agent externe se connecte à ton serveur MCP Langflow, il demande une liste des tools disponibles. L'agent utilise les descriptions fournies pour décider quel tool appeler et quand l'appeler. Si tu laisses la description par défaut ou que tu écris quelque chose de vague, l'agent externe va l'ignorer. Tu dois écrire la description comme une instruction précise pour l'agent IA. En fait, tu es littéralement en train de prompter le système externe sur la façon d'utiliser ton flow. Regardons un scénario spécifique. Tu construis un flow de Document QA dans Langflow qui cherche dans un document d'architecture interne de l'entreprise. Tu veux que l'agent de ton éditeur local Cursor puisse requêter ce document nativement. Tu exposes le flow comme un serveur MCP. Tu nommes le tool query company architecture et tu configures la description pour indiquer qu'il cherche dans le document d'architecture interne de l'entreprise pour répondre à des questions techniques sur les services backend. Ensuite, tu configures Cursor pour qu'il se connecte à ton URL MCP Langflow. Maintenant, tu es en train d'écrire du code dans Cursor et tu demandes à l'agent comment fonctionne le système d'authentification. Cursor vérifie ses serveurs MCP connectés, lit ta description spécifique, et réalise que ton tool Langflow est exactement ce dont il a besoin. Cursor passe ta question comme argument au tool. Langflow reçoit la requête via le transport HTTP, exécute tout le flow de Document QA, et streame la réponse directement dans ton éditeur. Ton IDE vient d'utiliser un projet Langflow complexe comme une fonction native. Le succès d'une intégration MCP dépend entièrement de la qualité du prompt que tu caches dans la description du tool. Si l'agent externe ne peut pas comprendre la description, ton tool n'existe tout simplement pas. C'est tout pour aujourd'hui. Merci pour ton écoute, et continue à développer !
10

Gestion de l'état et des sessions

3m 31s

Cet épisode couvre la persistance de la mémoire et l'isolation stricte des sessions à travers les échanges de chat. Les auditeurs apprendront à différencier la mémoire de l'Agent du composant Message History pour un suivi robuste et linéaire des conversations.

Télécharger
Bonjour, ici Alex de DEV STORIES DOT EU. Langflow, épisode 10 sur 15. Si deux utilisateurs parlent à ton application d'IA exactement en même temps, comment le système évite-t-il de donner les réponses de l'un à l'autre ? La réponse se trouve dans la façon dont tu isoles les threads, et c'est exactement ce que fait le State et le Session Management. D'abord, clarifions un point qui crée souvent de la confusion. Il faut bien faire la différence entre la chat memory et la vector memory sémantique. La vector memory consiste à stocker des documents sous forme d'embeddings et à les récupérer en fonction de leur sens. On ne va pas parler de ça ici. La chat memory, c'est tout simplement le log linéaire et chronologique d'une conversation. C'est le mécanisme qui permet au modèle de langage de se rappeler ce que l'utilisateur a dit il y a trois messages. Par défaut, Langflow stocke cet historique linéaire de messages en local, dans une base de données SQLite. À chaque fois qu'un message passe par le système, il est enregistré. Mais une base de données pleine de messages ne sert à rien si le système ne sait pas quel message appartient à qui. C'est là qu'intervient le session ID. Le session ID est une string unique qui relie une séquence d'interactions entre elles. Quand tu utilises l'interface de Langflow, le système génère automatiquement un session ID pour toi en arrière-plan. En production, tu vas sûrement interagir avec Langflow via son API. Si tu as deux utilisateurs distincts qui interagissent avec ton serveur en même temps, tu dois passer un session ID spécifique pour chacun dans ta requête API. Une pratique courante consiste à utiliser l'user ID unique de ta propre base de données comme session ID pour Langflow. Quand ton premier utilisateur envoie un message, tu passes son ID spécifique. Langflow fait une requête à la base de données SQLite pour cette string exacte, récupère uniquement son historique, l'ajoute au prompt, et génère une réponse. Quand ton deuxième utilisateur interagit une milliseconde plus tard avec son propre ID, Langflow effectue exactement le même processus, de manière totalement isolée. Si tu oublies de passer un session ID dans ton call API, Langflow traite l'interaction comme un tout nouvel événement. Le contexte est complètement perdu. Pour maintenir le thread, ton application externe doit envoyer cet identifiant avec chaque requête. La façon dont tu exposes cet historique au modèle de langage dépend entièrement des composants que tu choisis. Langflow propose deux approches distinctes. Si tu utilises un composant Agent standard, la gestion de la mémoire est directement intégrée. L'Agent gère automatiquement la lecture et l'écriture dans la base de données SQLite en utilisant le session ID actif. Tu n'as besoin de rien câbler de plus pour qu'il se souvienne de la conversation. Les Agents sont très abstraits, donc si tu construis une chain sur mesure de zéro en utilisant des composants de base et des prompts bruts, cette mémoire intégrée n'existe pas. C'est là que tu utilises le composant dédié Message History. Tu places ce composant dans ton flow et tu connectes son output à une variable dans ton composant Prompt. Quand le flow s'exécute, le composant Message History récupère le session ID actif, va chercher le log chronologique correspondant dans la base de données, et le formate en texte. Ça passe physiquement le dialogue stocké dans la context window avant même que le modèle de langage ne le voie. Contrôler le session ID au niveau de l'API est le prérequis le plus critique pour scaler une interface conversationnelle, parce que lier strictement le state à un identifiant passé en paramètre garantit une isolation complète, quel que soit le nombre d'utilisateurs simultanés. C'est tout pour cet épisode. Merci de ton écoute, et continue à développer !
11

Ancrer le LLM avec des Vector Stores

3m 26s

Cet épisode couvre les meilleures pratiques architecturales pour construire des pipelines de Retrieval Augmented Generation. Les auditeurs apprendront à découpler l'ingestion asynchrone de données de la recherche sémantique en temps réel.

Télécharger
Salut, c'est Alex de DEV STORIES DOT EU. Langflow, épisode 11 sur 15. La plus grosse erreur que font les développeurs quand ils construisent du Retrieval Augmented Generation, c'est de combiner l'indexation lente des données et le chat retrieval en temps réel dans un seul pipeline. À chaque fois que l'utilisateur pose une question, le système essaie de relire un PDF de cent pages. La solution, c'est de baser le LLM sur des Vector Stores en utilisant une architecture découplée. C'est hyper courant de relier tous tes composants ensemble sur un seul canvas. Tu connectes un file loader à un text splitter, tu passes ça à un embedding model, tu le mets dans un vector store, et tu le branches directement à une chat interface. Ça crée un énorme bottleneck. La data ingestion et le chat retrieval sont des lifecycle events complètement différents. Ils ne devraient pas se trouver dans le même execution path. L'architecture RAG standard dans Langflow sépare ce processus en deux flows distincts. D'abord, tu as le subflow d'ingestion. C'est là que se passent les opérations lourdes. Tu prends tes documents sources, comme de gros fichiers PDF, et tu les passes dans un document loader. Un text splitter vient ensuite découper les documents en plus petits morceaux. Quand tu configures ton text splitter, tu dois adapter tes chunk sizes aux limites maximales de tokens de l'embedding model que tu as choisi. Si ta chunk size dépasse cette limite, l'embedding model va tronquer le texte silencieusement. Les dernières phrases sont ignorées, et ces données manquantes n'arriveront jamais dans ta vector database. Une fois que le texte est correctement chunké, tu le passes à un embedding component pour générer les vecteurs. Enfin, ces vecteurs sont sauvegardés dans une collection spécifique à l'intérieur de ton composant vector store. Tout ce flow d'ingestion est exécuté quand les données changent, de manière complètement indépendante de l'interface utilisateur. Maintenant, la deuxième partie de cette architecture, c'est le retrieval flow. C'est la partie conversationnelle côté utilisateur. Comme l'indexation lourde est déjà faite ailleurs, ce flow reste rapide et réactif. Il commence par un chat input qui capture la question de l'utilisateur. Cette question est passée à un embedding component. Tu dois configurer ce composant pour utiliser exactement le même embedding model que celui que tu as utilisé pendant la phase d'ingestion. Si tu indexes des données avec un modèle et que tu fais une query avec un autre, le vector store ne trouvera aucune correspondance pertinente. Le composant vector store dans ce flow est configuré pour chercher dans la même collection de base de données que tu as remplie plus tôt. Il prend la question de l'utilisateur embeddée, fait une similarity search sur les données préchargées, et renvoie les chunks de texte les plus pertinents. Tu envoies ensuite ces chunks récupérés, avec la question originale de l'utilisateur, dans un composant prompt template. Ce prompt enrichi est finalement envoyé au language model, qui formule la réponse. En séparant ton implémentation RAG en un write flow asynchrone pour les documents et un read flow rapide pour le chat, tu protèges ta chat interface des délais de traitement du backend. La règle d'or de l'architecture RAG, c'est qu'une user query ne devrait déclencher qu'une recherche, jamais un indexing job. C'est tout pour cet épisode. Merci de m'avoir écouté, et continue à développer !
12

Étendre le moteur via Python

3m 08s

Cet épisode couvre la création fondamentale de composants Python personnalisés au sein du framework. Les auditeurs apprendront comment des annotations strictes au niveau des classes mappent la logique du code interne aux nœuds visuels de l'interface utilisateur.

Télécharger
Salut, ici Alex de DEV STORIES DOT EU. Langflow, épisode 12 sur 15. La programmation visuelle t'amène à 90 % du chemin, mais inévitablement, tu te heurtes à un mur. Tu as besoin d'exécuter une logique métier propriétaire ou de te connecter à une API interne custom, et les nodes pré-construits ne suffisent tout simplement pas. Étendre le moteur via Python t'offre ces 10 % restants de contrôle absolu. C'est facile de penser qu'un composant custom est juste un script Python standard que tu glisses dans un dossier. Ce n'est pas le cas. Un composant custom exige une configuration stricte au niveau de la classe. Sans cette structure spécifique, le moteur Langflow n'a aucune idée de comment faire le rendu de ton node dans l'éditeur visuel, ni comment câbler ses données dans le graph d'exécution. Le node visuel et la logique backend sont étroitement liés. Pour créer un composant custom, tu commences toujours par faire une sous-classe de la classe Component de base fournie par Langflow. Dans cette nouvelle classe, tu n'écris pas de méthode d'initialisation standard pour collecter les variables. À la place, tu définis deux arrays stricts : inputs et outputs. Prenons un cas pratique. Supposons que tu développes un composant Text Analyzer custom qui calcule le nombre de mots et renvoie un objet Data structuré au graph. D'abord, tu configures l'array inputs. Tu remplis cet array en utilisant des classes d'input spécialisées fournies par Langflow. Pour le Text Analyzer, tu as besoin d'une string de texte, donc tu places un objet text input dans l'array et tu lui donnes un nom. C'est ça la partie importante. En déclarant une classe d'input spécifique dans ton code Python, tu dictes l'interface visuelle. Langflow lit cet array et génère automatiquement un champ texte sur ton node dans l'éditeur drag-and-drop. Si tu ajoutais un objet integer input à ce même array, l'UI ferait instantanément le rendu d'un sélecteur numérique. Tu définis le besoin en données dans le code, et le moteur construit l'UI pour toi. Une fois les inputs définis, tu configures l'array outputs. Ça indique explicitement au graph environnant quel type de données ton node va produire. Pour le Text Analyzer, on veut passer notre résultat plus loin dans la chain, donc tu ajoutes un objet Data output à l'array. La configuration de l'output fait encore une chose cruciale. Elle mappe le handle de l'output visuel à une méthode d'exécution principale à l'intérieur de ta classe. Tu dis explicitement au moteur quelle fonction Python exécuter quand le node suivant demande des données. La dernière étape, c'est d'écrire cette méthode d'exécution mappée. C'est là que réside ta logique Python standard. La méthode reçoit automatiquement les valeurs que tes inputs ont collectées depuis l'UI. Tu prends la string de texte entrante, tu la split, et tu comptes les mots. Ensuite, comme le graph attend un format standardisé, tu encapsules ton integer final dans un objet Langflow Data et tu le retournes. La structure impose une séparation propre. L'array inputs construit l'interface et collecte les données, la méthode d'exécution les traite, et l'array outputs les renvoie au graph visuel. C'est tout pour cet épisode. Merci d'avoir écouté, et continue de développer !
13

Hooks de composants avancés et exécution

3m 49s

Cet épisode couvre le cycle de vie du moteur d'exécution interne et les techniques avancées de partage d'état. Les auditeurs apprendront à surcharger les hooks de configuration et à utiliser des dictionnaires de contexte pour la persistance d'états complexes.

Télécharger
Salut, ici Alex de DEV STORIES DOT EU. Langflow, épisode 13 sur 15. Tu pourrais imaginer un node comme une simple boîte noire où les données entrent, une fonction s'exécute, les données ressortent, et le node oublie instantanément tout. Mais que se passe-t-il quand ton pipeline demande à un node d'initialiser une connexion complexe à une base de données ou de compter combien d'éléments il vient de traiter avant de renvoyer un résultat ? Ça demande de sortir des fonctions simples et d'utiliser des hooks de component et une exécution avancée. On pense souvent que les components sont des opérations strictement stateless qui se contentent d'évaluer des inputs. Ce n'est pas le cas. Un component est une instance d'une class Python, et il passe par un lifecycle spécifique géré par l'execution engine interne. Pendant ce lifecycle, le component peut conserver un state interne, orchestrer des setups complexes et partager de la data entre ses propres méthodes internes. Quand Langflow déclenche un component, l'engine lance une séquence stricte. D'abord, avant même que la génération d'output ne commence, l'engine cherche un hook interne appelé pre run setup. Tu override cette méthode quand ton component a besoin de faire le gros du travail avant que la logique principale ne se lance. Si ton component doit s'authentifier avec une API externe, charger un gros modèle de machine learning en mémoire, ou configurer des variables locales, tu places cette logique dans le hook setup. Une fois le setup terminé, l'engine passe à la phase d'exécution en appelant le hook run. C'est là que se trouve ton payload principal et que le vrai traitement des données se fait. Séparer la logique de setup de la logique d'exécution permet de garder ton code organisé et d'éviter les opérations redondantes. Mais ça soulève tout de suite une question mécanique. Comment est-ce que tu passes un client API authentifié ou une variable locale du hook setup vers le hook run ? Tu utilises le context dictionary. Chaque custom component possède un attribut appelé self dot ctx. C'est un dictionnaire attaché directement à l'instance du component. Il sert de banque de mémoire dédiée pendant toute la durée du run de ce component spécifique. Tout ce que tu attaches à ce context dictionary pendant la phase de setup est immédiatement disponible quand l'engine passe à la phase de run. Prenons un scénario pratique où ce partage de state est nécessaire. Imagine un custom component qui traite un stream de documents entrants et qui doit renvoyer en output à la fois le texte nettoyé et le compte final du nombre de documents modifiés avec succès. D'abord, tu override le hook pre run setup. À l'intérieur de cette méthode, tu accèdes au context dictionary et tu crées une variable compteur, en l'initialisant à zéro. Tu pourrais aussi initialiser ta library de nettoyage de texte ici et l'attacher au context. Ensuite, l'engine déclenche le hook run. Ta méthode boucle sur les documents entrants. Pour chaque document qui passe avec succès par la library de nettoyage, tu accèdes au context dictionary, tu récupères la valeur actuelle du compteur, et tu l'incrémentes de un. Parce que le context dictionary persiste à travers ces différents appels de méthodes du lifecycle, ton component maintient son state interne en toute sécurité. Quand le hook run termine enfin sa boucle, il peut retourner les documents traités et récupérer le compte final exact directement depuis le context dictionary pour le passer au node suivant. Maîtriser l'execution engine et les hooks de component change ton mindset : tu passes de l'écriture de simples scripts pass-through à la création d'applications robustes et autonomes qui gèrent entièrement leurs propres lifecycles de données. Si tu veux aider à faire vivre l'émission, tu peux chercher DevStoriesEU sur Patreon. Comme toujours, merci pour ton écoute. On se retrouve dans le prochain épisode.
14

L'API Langflow et les ajustements dynamiques

3m 14s

Cet épisode couvre l'exécution programmatique de graphes via la REST API. Les auditeurs apprendront à utiliser l'Input Schema pour injecter des surcharges de paramètres à l'exécution sans altérer le flux sous-jacent.

Télécharger
Salut, c'est Alex de DEV STORIES DOT EU. Langflow, épisode 14 sur 15. Tu as cinquante clients, et ils ont tous besoin d'une version légèrement différente de ton agent de support IA. Ton premier instinct, c'est de dupliquer ton graph cinquante fois, en remplaçant le system prompt ou l'API key dans chacun d'eux. C'est un cauchemar de maintenance. Tu n'as besoin que d'un seul graph, et tu peux gérer les variations à la volée en utilisant l'API de Langflow et des Tweaks dynamiques. Quand tu construis un graph dans l'interface visuelle, les paramètres à l'intérieur de tes composants sont fixes. C'est facile de penser que pour changer une variable mineure comme un réglage de temperature ou une instruction système, tu dois cloner tout le flow. Ce n'est pas vrai. Les Tweaks résolvent ça dynamiquement au runtime en te permettant d'override les paramètres des composants sans éditer le graph sous-jacent. Tu fais ça en interagissant avec Langflow de manière complètement headless via son API REST. Pour exécuter un flow de façon programmatique, tu envoies une requête HTTP POST à l'endpoint run, plus précisément slash v un slash run, suivi de ton flow ID unique. Le body de cette requête contient tes inputs standards, comme le message texte de l'utilisateur. À côté de ces données d'input, tu peux inclure un objet tweaks. Cet objet est un dictionnaire qui mappe des composants spécifiques de ton graph aux nouvelles valeurs que tu veux injecter pour cette seule exécution. Pour cibler un composant, tu as besoin de son node ID. Dans Langflow, un node ID se compose généralement du nom du composant et d'une string aléatoire, comme Prompt tiret a b c d e. Quand tu construis ton payload de tweaks, tu utilises ce node ID exact comme clé. La valeur est un autre dictionnaire contenant les champs spécifiques que tu veux overwrite. Prends l'exemple d'un flow de support client de base utilisé sur plusieurs sites web. Le graph contient un composant Prompt qui définit comment l'agent se comporte. Pour ton client bancaire, le prompt doit être très formel. Pour ton client gaming, il doit être décontracté. Au lieu de maintenir deux graphs identiques, ton serveur backend fait un appel API vers exactement le même flow ID. Dans le payload de la requête, tu spécifies le node ID de ce composant Prompt. À l'intérieur de ça, tu cibles le champ template et tu passes les instructions formelles pour la banque. Plus tard, quand le site web gaming déclenche un appel, ton backend envoie exactement la même requête, mais remplace la string dans le dictionnaire de tweaks par les instructions décontractées. La logique d'exécution est entièrement séquentielle. D'abord, tu prépares ton payload avec la query de l'utilisateur et ton dictionnaire de tweaks spécifique. Ensuite, tu envoies la requête POST à l'endpoint run. Langflow reçoit l'appel, applique temporairement tes overrides aux nodes ciblés, et exécute le graph. Il renvoie l'output final à ton application, pendant que le flow original sauvegardé sur le serveur reste intact. Tu n'es pas limité aux prompts textuels. Tu peux tweak presque tout ce qui est exposé dans un input schema de composant. Tu peux dynamiquement remplacer le nom du modèle, ajuster la temperature, ou injecter des credentials de base de données différents par requête. Ça transforme un graph visuel statique en une fonction backend réutilisable et ultra flexible. La capacité de séparer ta logique d'application de tes données de configuration, c'est ce qui permet à l'exécution headless de vraiment scale en production. Merci d'avoir écouté. À la prochaine !
15

Conteneurisation en production

3m 22s

Cet épisode couvre la transition du développement visuel aux déploiements en production headless. Les auditeurs apprendront à construire des Dockerfiles, à verrouiller les dépendances et à monter des composants personnalisés de manière sécurisée.

Télécharger
Salut, c'est Alex de DEV STORIES DOT EU. Langflow, épisode 15 sur 15. L'éditeur visuel est génial pour créer ton application. Mais si tu déploies cette même interface drag-and-drop sur tes serveurs de production, tu consommes beaucoup de mémoire et tu laisses la logique de ton application exposée. Quand on passe au trafic de production, tu veux un container backend léger et headless. C'est exactement ce qu'on va voir aujourd'hui avec la containerisation en production. C'est super courant de voir des équipes finir de construire un flow et déployer simplement toute l'application Langflow, avec l'interface utilisateur, sur un serveur cloud. L'interface est strictement réservée au développement. Dans un environnement de production, tu ne veux pas que quelqu'un s'amuse à faire du drag-and-drop avec les nodes. Tu veux une API immuable et sécurisée qui se contente de traiter les requêtes. Langflow propose un mode spécifique pour gérer cette transition. Quand tu démarres le service, tu utilises un flag de commande appelé backend-only. Ça indique à Langflow de désactiver complètement le frontend React. Le serveur démarre quand même, mais il n'expose que les endpoints API nécessaires pour faire tourner tes flows. Ça réduit considérablement la consommation de mémoire. Ça renforce aussi la sécurité en réduisant la surface d'attaque, ce qui garantit que personne ne peut accéder visuellement à la structure de l'application ou la modifier. Pour packager ça pour le déploiement, tu écris un Dockerfile. Tu pars d'une image de base Python standard. Comme Langflow s'appuie sur des outils Python modernes, tu gères tes packages en verrouillant tes dépendances avec UV. Avant de builder l'image, tu exportes ton arbre de dépendances exact dans un lockfile. Dans le Dockerfile, tu utilises ce lockfile pour installer tes packages. Ça garantit que ton container de production fait tourner exactement les mêmes versions de packages que tu as testées pendant le développement. Ensuite, tu intègres la logique de ton application dans l'image. Dans Langflow, ton application, c'est fondamentalement juste de la data. Quand tu as fini de construire dans l'éditeur visuel, tu exportes ton flow sous forme de fichier JSON. Dans ton Dockerfile, tu copies ce fichier JSON directement dans la structure de l'image. C'est la partie qui compte pour la logique custom. Beaucoup de flows complexes reposent sur des custom components, qui sont de petits scripts Python que tu as écrits pour gérer des tâches spécifiques. Le JSON du flow référence ces components, mais il ne contient pas le code Python lui-même. Tu dois copier explicitement le répertoire qui contient tes fichiers de custom components dans l'image Docker. Ensuite, tu définis une variable d'environnement, pour indiquer au container exactement où chercher ce path de component quand le serveur démarre. La dernière pièce du Dockerfile, c'est la commande d'exécution. Cette commande lance le module Langflow, passe le path du fichier vers ton JSON de flow intégré, pointe vers tes custom components, et inclut le flag backend-only. Quand ce container démarre, il est entièrement verrouillé. L'éditeur visuel a disparu, la configuration du flow est statique, et les dépendances sont fixées. Tu te retrouves avec une API rapide et headless, prête à recevoir des prompts et à renvoyer des réponses. Le point le plus important à retenir, c'est que ton environnement de développement et ton runtime de production ont des formes fondamentalement différentes. Construis visuellement, mais déploie en headless. Comme c'est le dernier épisode, je t'encourage à plonger dans la documentation officielle et à essayer de containeriser un flow simple toi-même. Si tu as des idées sur ce qu'on devrait aborder dans notre prochaine série, passe sur dev stories dot eu et fais-le nous savoir. Merci d'avoir passé quelques minutes avec moi. À la prochaine, prends soin de toi.