v1.8 — Edición 2026. Un completo curso técnico en audio sobre la creación de aplicaciones de IA con Langflow 1.8, pasando del prototipado visual al despliegue del backend en producción.
Orquestación de LLMPrototipado visualFrameworks de AI/ML
Este episodio cubre la identidad central del framework y cómo su interfaz visual se traduce en la ejecución del backend. Los oyentes aprenderán cómo la lógica de la aplicación se estructura como un Directed Acyclic Graph, permitiendo transiciones fluidas desde el prototipado rápido hasta las APIs de producción.
4m 20s
2
Arquitectura de componentes y tipos de datos
Este episodio cubre la anatomía de un componente, incluyendo los puertos de entrada y salida, y los tipos de datos principales como Data y Message. Los oyentes aprenderán cómo el tipado estricto y los colores de los puertos dictan el flujo de información a través del grafo.
4m 16s
3
Interactuando con el grafo
Este episodio cubre los componentes Chat Input y Chat Output, así como la estructura interna de los objetos Message. Los oyentes aprenderán cómo los metadatos, como los identificadores de sesión y las marcas de tiempo, se envuelven en los mensajes para rastrear el contexto conversacional.
4m 02s
4
La abstracción del Language Model
Este episodio cubre el componente principal Language Model y las configuraciones de proveedores globales. Los oyentes aprenderán a abstraer las conexiones de LLM y a cambiar dinámicamente el comportamiento del puerto de salida para las integraciones posteriores.
4m 13s
5
Motores de ejecución inteligentes
Este episodio cubre el componente Agent y su papel como motor de razonamiento autónomo. Los oyentes aprenderán cómo las capacidades de memoria integradas permiten la toma de decisiones dinámicas más allá de los simples prompts estáticos.
4m 04s
6
Equipando a los agentes con el Tool Mode
Este episodio cubre la mecánica del Tool Mode, que convierte componentes inertes en funciones de agente procesables. Los oyentes aprenderán a configurar las descripciones de las herramientas para guiar a la perfección la toma de decisiones del agente.
4m 04s
7
Composiciones multiagente
Este episodio cubre la estrategia arquitectónica de anidar subflujos y utilizar agentes secundarios como herramientas. Los oyentes aprenderán a construir sistemas jerárquicos multiagente para el enrutamiento de tareas complejas.
3m 35s
8
El cliente del Model Context Protocol
Este episodio cubre el componente MCP Tools y su capacidad para conectar herramientas de servidores externos directamente a tus agentes. Los oyentes aprenderán cómo el Model Context Protocol reemplaza los wrappers estándar de REST API para el contexto del agente.
3m 59s
9
Exponiendo flujos como servidores MCP
Este episodio trata sobre cómo convertir tus proyectos de Langflow en herramientas MCP universales para clientes externos. Los oyentes aprenderán a configurar transportes HTTP en streaming y a crear descripciones de herramientas robustas para IDEs remotos.
3m 58s
10
Gestión de estado y sesiones
Este episodio cubre la persistencia de la memoria y el aislamiento estricto de las sesiones a lo largo de los turnos de chat. Los oyentes aprenderán a diferenciar entre la memoria del Agent y el componente Message History para un seguimiento robusto de la conversación lineal.
4m 19s
11
Fundamentando el LLM con Vector Stores
Este episodio cubre las mejores prácticas arquitectónicas para construir pipelines de Retrieval Augmented Generation. Los oyentes aprenderán a desacoplar la ingesta de datos asíncrona de la búsqueda semántica en tiempo real.
4m 01s
12
Extendiendo el motor mediante Python
Este episodio cubre la creación fundamental de componentes personalizados de Python dentro del framework. Los oyentes aprenderán cómo las anotaciones estrictas a nivel de clase mapean la lógica interna del código a los nodos visuales de la interfaz de usuario.
4m 11s
13
Hooks de componentes y ejecución avanzados
Este episodio cubre el ciclo de vida interno del motor de ejecución y las técnicas avanzadas para compartir el estado. Los oyentes aprenderán a sobrescribir los hooks de configuración y a utilizar diccionarios de contexto para la persistencia de estados complejos.
4m 36s
14
La API de Langflow y Tweaks dinámicos
Este episodio cubre la ejecución de grafos programáticamente a través de la REST API. Los oyentes aprenderán a usar el Input Schema para inyectar anulaciones de parámetros en tiempo de ejecución sin alterar el flujo subyacente.
4m 22s
15
Contenerización en producción
Este episodio cubre la transición del desarrollo visual a los despliegues de producción headless. Los oyentes aprenderán a construir Dockerfiles, bloquear dependencias y montar componentes personalizados de forma segura.
4m 11s
Episodios
1
El paradigma de Langflow
4m 20s
Este episodio cubre la identidad central del framework y cómo su interfaz visual se traduce en la ejecución del backend. Los oyentes aprenderán cómo la lógica de la aplicación se estructura como un Directed Acyclic Graph, permitiendo transiciones fluidas desde el prototipado rápido hasta las APIs de producción.
Hola, soy Alex de DEV STORIES DOT EU. Langflow, episodio 1 de 15. Prototipar una aplicación de IA suele implicar crear un mockup visual rápido, comprobar que la idea funciona y luego descartar toda esa UI para escribir el backend de producción desde cero. Pierdes días traduciendo conceptos visuales a código de servidor. Este episodio trata sobre el Paradigma Langflow, un concepto que elimina por completo ese paso de traducción.
Langflow es un framework diseñado para crear aplicaciones de IA. Como interactúas con él principalmente a través de un canvas donde arrastras y sueltas componentes, es muy fácil confundirlo con otra herramienta de UI o un simple juguete low-code. Esto es un error. Presta atención a esta distinción. Langflow es un framework completo de backend en Python. La interfaz visual es solo una ventana a la arquitectura subyacente de Python. Cada componente visual que colocas en el canvas se corresponde directamente con una clase de Python, y el grafo que dibujas se traduce directamente en la lógica de la API del backend.
En Langflow, las aplicaciones que creas se llaman flows. Al abrir el workspace, básicamente estás construyendo un grafo acíclico dirigido, o DAG. Empiezas añadiendo nodos al canvas. Cada nodo representa un bloque de funcionalidad distinto, como un parser de texto, un data loader o un módulo de procesamiento. A continuación, dibujas líneas que conectan los handles de output de un nodo con los handles de input de otro. Estas líneas no son solo decorativas. Dictan la dependencia de ejecución de toda tu aplicación.
Si conectas el output de un nodo de document loader con el input de un nodo de procesamiento, el motor subyacente lo interpreta como una regla de dependencia estricta. Sabe que debe ejecutar primero el document loader, esperar el resultado y luego pasar esos datos downstream. Los datos fluyen estrictamente en una dirección a través del grafo, lo que garantiza una ruta predecible y rastreable desde el input del usuario hasta la respuesta final. El framework se encarga del type checking entre estos handles conectados, asegurando que el output de un nodo sea compatible con el input del siguiente incluso antes de que comience la ejecución.
Imagina que creas un flow de prototipado para una herramienta básica de preguntas y respuestas. En el workspace, conectas un nodo de text input a un nodo de procesamiento y luego lo diriges a un nodo de output. Lo pruebas directamente en el navegador, ajustando los parámetros hasta que las respuestas sean correctas. En un workflow tradicional, el siguiente paso es entregar un documento de especificaciones a un ingeniero de backend para que reescriba esa lógica en Python. Con el paradigma de Langflow, te saltas ese paso por completo. En el momento en que tu flow visual funciona, ya es una API operativa. Simplemente envías una request al run endpoint integrado con tu identificador de flow y tus variables de input. El framework recorre el grafo exactamente como lo diseñaste, ejecutando cada clase de Python en el orden correcto, y devuelve la respuesta. Pasas de un prototipo visual a un backend de Python servido sin escribir ni una sola línea de código de configuración del servidor.
La esencia de Langflow es que el mapa visual que dibujas para comprender tu aplicación es exactamente la misma estructura que usa el servidor para ejecutarla. Si estos episodios te resultan útiles y quieres apoyar el programa, puedes buscar DevStoriesEU en Patreon. ¡Gracias por escuchar, y happy coding a todos!
2
Arquitectura de componentes y tipos de datos
4m 16s
Este episodio cubre la anatomía de un componente, incluyendo los puertos de entrada y salida, y los tipos de datos principales como Data y Message. Los oyentes aprenderán cómo el tipado estricto y los colores de los puertos dictan el flujo de información a través del grafo.
Hola, soy Alex de DEV STORIES DOT EU. Langflow, episodio 2 de 15. Conectas dos nodos, ejecutas tu pipeline y no pasa absolutamente nada. La conexión parece correcta, pero la ejecución falla o lanza un error críptico. El problema suele estar relacionado con la forma en que los datos se mueven entre los bloques, lo que nos lleva a la arquitectura de componentes y los tipos de datos.
Es común suponer que los componentes de Langflow se pasan payloads JSON sueltos de un lado a otro como una API web estándar. No es así. Cada componente en Langflow es una ejecución de una clase de Python discreta y de tipado estricto. Un componente contiene un estado interno, puertos de entrada y puertos de salida. Los datos fluyen estrictamente a través de estos puertos definidos, y esos puertos requieren objetos de Langflow específicos.
Puedes rastrear estos tipos de datos mediante los colores de los puertos. Cada puerto de un componente tiene un color específico que corresponde al tipo de datos que acepta o devuelve. Si conectas un puerto de salida a un puerto de entrada y los colores coinciden, los datos fluyen sin problemas. Si los colores no coinciden, estás intentando pasar datos incompatibles. El componente downstream no podrá parsear el objeto entrante y el flow fallará.
Para crear pipelines fiables, necesitas comprender los tres objetos de datos principales que viajan a través de estas conexiones. El primero es el tipo Message. Un objeto Message se utiliza para datos conversacionales. Contiene el contenido de texto real junto con información de routing, específicamente el rol, que le dice al sistema si el texto proviene de un usuario, de un system prompt o de un modelo de IA.
El segundo tipo principal es el objeto Data. Un objeto Data funciona como un wrapper para información no estructurada. Contiene contenido de texto junto con un diccionario de metadatos. Cuando recuperas documentos de una base de datos vectorial, haces scraping de una página web o lees un archivo de texto, esa información viaja por tu flow como un objeto Data estructurado, no como un raw string. El diccionario de metadatos te permite pasar URLs de origen o timestamps junto con el texto sin romper la lógica de procesamiento downstream.
El tercer tipo es el objeto DataFrame. Este se utiliza para datos tabulares bidimensionales. Se comporta de forma muy similar a un DataFrame de Pandas, lo que lo convierte en el tipo requerido cuando pasas archivos CSV parseados o filas y columnas estructuradas entre componentes analíticos.
Como los puertos tienen un tipado estricto, te encontrarás frecuentemente con situaciones en las que tienes un tipo de datos, pero el siguiente componente requiere otro. Imagina el escenario de coger un raw string de texto de un bloque de ejecución básico de Python y necesitar pasarlo a un componente de procesamiento de texto que exige explícitamente un objeto Data estructurado. Los colores de los puertos no coincidirán. No puedes forzar un raw string en un puerto Data.
Para salvar esta distancia, usas un componente Type Convert. Colocas el bloque Type Convert entre los dos componentes incompatibles. Primero conectas el output del string al input del bloque Type Convert. Luego conectas su output al puerto Data de tu componente de procesamiento downstream. El bloque Type Convert coge el raw string, lo envuelve en un objeto Data adecuado con un diccionario de metadatos vacío y lo pasa de forma segura al siguiente nodo.
Entender el tipado estricto de estos puertos es la diferencia entre un flow que funciona y un flow que se rompe constantemente. Si un pipeline falla silenciosamente, no hagas debug de tu lógica primero, comprueba los colores de tus puertos para asegurarte de que tus componentes están hablando exactamente el mismo lenguaje de datos.
Gracias por escuchar. Cuidaos todos.
3
Interactuando con el grafo
4m 02s
Este episodio cubre los componentes Chat Input y Chat Output, así como la estructura interna de los objetos Message. Los oyentes aprenderán cómo los metadatos, como los identificadores de sesión y las marcas de tiempo, se envuelven en los mensajes para rastrear el contexto conversacional.
Hola, soy Alex de DEV STORIES DOT EU. Langflow, episodio 3 de 15. Un simple mensaje de chat parece solo un string de texto, pero si eso fuera cierto, tu aplicación perdería el rastro de quién dijo qué en el momento en que se conectara un segundo usuario. Resolver ese problema de routing es exactamente lo que vamos a ver hoy: cómo interactuar con el graph usando Chat Input y Chat Output.
Cuando montas un flow, el punto de entrada suele ser un componente Chat Input. Los desarrolladores a menudo lo confunden con una simple caja de texto que pasa ciegamente un string al siguiente nodo. Ese es un modelo mental incorrecto. El componente Chat Input actúa como una fábrica de datos estructurados. Su función principal es interceptar el texto raw de la interfaz de usuario y encapsularlo en un tipo de dato específico llamado objeto Message.
El objeto Message es la moneda de cambio fundamental para el texto que se mueve por un graph de Langflow. En lugar de pasar strings sueltos, el graph hace el routing de este paquete estandarizado. Dentro del objeto, las palabras reales que escribe el usuario se guardan en un campo text principal. Rodeando ese texto hay una capa de metadatos. El objeto contiene un campo sender, que clasifica el origen como User o Machine. Incluye un sender name, que gestiona la etiqueta visual que se muestra en el frontend. También graba la hora exacta de creación en un campo timestamp.
Estos metadatos se vuelven cruciales cuando gestionas usuarios concurrentes. Imagina un escenario donde un usuario hace una pregunta en una aplicación deployada. El componente Chat Input captura su texto, lo empaqueta en un objeto Message, pone el sender en User y le adjunta un session ID único. Este session ID es el mecanismo que rastrea un hilo de conversación específico. A medida que el Message atraviesa el graph, pasando por retrievers o nodos de procesamiento, ese session ID sigue adjunto. Las herramientas de gestión del state y los componentes de memoria dependen completamente de este ID para agrupar las interacciones. Sin él, el graph no tendría forma de aislar el contexto de un usuario del de otro.
También tienes control sobre la visibilidad de este input. El componente Chat Input se puede configurar para ocultar su contenido de la interfaz de chat principal. Esto es útil cuando pasas parámetros del sistema por defecto o instrucciones en segundo plano que el usuario no necesita ver nunca, inyectando igualmente un objeto Message válido en el graph.
En el lado opuesto del flow se encuentra el componente Chat Output. Este es el nodo terminal que devuelve los datos a la interfaz de usuario. Captura el objeto Message final producido por tu lógica. Como recibe un objeto completamente formado, el componente Chat Output lee los campos sender y sender name para renderizar la interfaz con precisión, mostrando normalmente la respuesta como si viniera de Machine. Si da la casualidad de que un nodo anterior pasa texto raw al Chat Output en lugar de un objeto Message, el componente lo corrige automáticamente. Envuelve el string raw en un nuevo objeto Message antes de mostrarlo, forzando una estricta consistencia de datos en los límites de tu graph.
Los componentes Chat Input y Chat Output no son elementos cosméticos de la interfaz, son los controladores fronterizos de tu aplicación, garantizando que cada fragmento de texto esté limpiamente envuelto en un objeto Message rastreado antes de permitirle moverse.
Gracias por pasarte un rato. Espero que hayas aprendido algo nuevo.
4
La abstracción del Language Model
4m 13s
Este episodio cubre el componente principal Language Model y las configuraciones de proveedores globales. Los oyentes aprenderán a abstraer las conexiones de LLM y a cambiar dinámicamente el comportamiento del puerto de salida para las integraciones posteriores.
Hola, soy Alex de DEV STORIES DOT EU. Langflow, episodio 4 de 15. Decides cambiar tu aplicación de un proveedor de modelos a otro a mitad de proyecto. Normalmente, esto implica rastrear cada API call, reescribir los objetos de configuración y cruzar los dedos para no haber roto todo el prompt chain. Una arquitectura adecuada convierte esto en una transición fluida. El componente Language Model en Langflow proporciona la abstracción que hace esto posible.
Cuando los desarrolladores empiezan a crear flows, suelen esperar arrastrar un nodo de modelo al canvas y pegar inmediatamente su API key directamente en la configuración del componente. No lo hagas. Langflow está diseñado para gestionar la autenticación de forma global a través del panel de Model Providers.
Configuras tus credenciales, como tus keys de OpenAI o Anthropic, exactamente una vez en la configuración global. Los componentes de modelo individuales en tu canvas actúan como referencias a esas configuraciones globales. El nodo en sí gestiona el comportamiento local, controlando cosas como el system prompt, el límite máximo de tokens o la configuración de temperatura. El proveedor global gestiona la conexión segura.
Esta separación entre la autenticación y la lógica de ejecución resulta fundamental cuando quieres experimentar. Imagina que tienes un prompt chain complejo que actualmente alimenta a un componente de modelo de OpenAI. Quieres comprobar si un modelo de Anthropic da mejores resultados. Gracias a la abstracción global, simplemente arrastras el nuevo componente de Anthropic al canvas. Conectas tu secuencia de prompts existente a su input. Configuras la temperatura deseada en el nuevo nodo. El proveedor global gestiona automáticamente la autorización en segundo plano basándose en tus keys guardadas. Eliminas el nodo anterior y tu flow está listo para probarse inmediatamente. Nada en tu prompt chain se rompe.
Eso cubre cómo se configura el componente. Ahora, veamos cómo pasa los datos hacia adelante. El componente Language Model ofrece capacidades de doble salida, dependiendo de lo que realmente necesite el resto de tu flow.
Por defecto, el componente emite un Model Response. Le envías un prompt, el modelo lo procesa y el componente devuelve un string de texto. Este es el comportamiento estándar que usas al crear un chatbot básico o una herramienta de resumen. El nodo recibe una request, genera la respuesta y pasa esa respuesta finalizada hacia adelante.
Sin embargo, a veces un componente downstream no necesita la respuesta. Necesita el motor.
Puedes cambiar el comportamiento del puerto de output, pasando de emitir una respuesta Message a emitir una instancia de LanguageModel. Cuando haces esto, el componente ya no evalúa el prompt ni envía texto. En su lugar, empaqueta el propio modelo configurado, junto con las credenciales de su proveedor y la configuración de temperatura, y pasa ese objeto al siguiente nodo.
Esto es esencial para arquitecturas más avanzadas. Si conectas tu configuración a un retrieval chain complejo, ese chain necesita ejecutar sus propias queries internas para buscar en una base de datos basándose en el historial de la conversación. No puede hacerlo si solo le pasas una respuesta de texto estática. Requiere un motor activo para realizar sus propias tareas de generación de texto. Al pasar la instancia de LanguageModel, le entregas al nodo downstream una herramienta completamente configurada que puede usar repetidamente para generar los prompts específicos que necesita.
El componente no es solo una API call hardcodeada. Es un contenedor flexible que separa tus credenciales de tu lógica, lo que te permite elegir si tu aplicación necesita una respuesta finalizada o un motor de ejecución.
Eso es todo por este episodio. Gracias por escuchar, ¡y sigue construyendo!
5
Motores de ejecución inteligentes
4m 04s
Este episodio cubre el componente Agent y su papel como motor de razonamiento autónomo. Los oyentes aprenderán cómo las capacidades de memoria integradas permiten la toma de decisiones dinámicas más allá de los simples prompts estáticos.
Hola, soy Alex de DEV STORIES DOT EU. Langflow, episodio 5 de 15. ¿Qué diferencia a un chatbot estático de un verdadero motor de razonamiento? La capacidad de decidir sus propios pasos. Si tu flow depende completamente de prompt chains hardcodeados, fallará en el momento en que un usuario haga una pregunta de seguimiento inesperada. Ahí es donde entran en juego los motores de ejecución inteligente, específicamente el componente Agent.
Muchos desarrolladores colocan un nodo de Language Model estándar en el canvas y esperan que se comporte como un asistente inteligente y consciente del contexto. No es así. Un nodo de Language Model estándar es esencialmente una calculadora de text-in, text-out. Le pasas un string, y te devuelve un string basado puramente en ese único input. Un componente Agent es fundamentalmente diferente. Es un motor de razonamiento autónomo. En lugar de simplemente ejecutar un solo prompt, un Agent evalúa el contexto actual, decide una secuencia de acciones y determina sus propios pasos de ejecución para alcanzar un objetivo.
Cuando un usuario envía un mensaje a un Agent, el componente no genera la respuesta final de inmediato. Entra en un loop de razonamiento interno. Analiza el input, comprueba su state interno y formula un plan. Esta fase de planificación permite al Agent estructurar respuestas complejas o darse cuenta de que necesita evaluar interacciones pasadas antes de continuar.
Esto nos lleva a las capacidades de memoria integradas del componente Agent. Un nodo de Language Model estándar sufre de amnesia. Cada request es una página en blanco. Si un usuario pregunta cuál es la capital de Francia, y luego hace una pregunta de seguimiento sobre cuál es la población allí, un nodo estándar no sabrá qué significa la palabra allí. Tendrías que construir manualmente un sistema para capturar, almacenar, formatear e inyectar el historial de chat anterior en cada nuevo prompt.
El componente Agent resuelve esto de forma nativa. Mantiene automáticamente un context window continuo de las preguntas anteriores del usuario y las respuestas anteriores del sistema. Cuando llega esa segunda pregunta sobre la población, el Agent intercepta la request. Antes de generar una respuesta, consulta su memoria integrada. Recupera el contexto de la primera pregunta, une el historial conversacional y deduce que la ubicación en cuestión es París.
Ejecuta esta evaluación contextual por sí solo. No necesitas conectar nodos de memoria separados, parsear strings de historial, ni construir loops complejos de inyección de historial en tu canvas. El Agent gestiona internamente la naturaleza stateful de la conversación. Decide cuándo mirar el historial, qué parte es relevante para la query actual, y cómo usar ese contexto histórico para dar forma a su siguiente output.
Este cambio transforma cómo diseñas tus flows. Ya no estás mapeando cada posible rama de una conversación. Le estás proporcionando a un motor inteligente los parámetros que necesita para gestionar la conversación por sí mismo. El componente asume la carga del state management y la resolución de contexto.
El verdadero poder del componente Agent reside en esta autonomía. Al pasar de language models estáticos a un Agent, delegas el control flow al propio motor. El sistema ya no es un pipeline rígido, sino una entidad dinámica capaz de mantener el state, recordar interacciones pasadas y adaptar su razonamiento para coincidir con la intención del usuario sobre la marcha.
Me gustaría tomarme un momento para darte las gracias por escucharnos; nos ayuda muchísimo. ¡Que tengas un buen día!
6
Equipando a los agentes con el Tool Mode
4m 04s
Este episodio cubre la mecánica del Tool Mode, que convierte componentes inertes en funciones de agente procesables. Los oyentes aprenderán a configurar las descripciones de las herramientas para guiar a la perfección la toma de decisiones del agente.
Hola, soy Alex de DEV STORIES DOT EU. Langflow, episodio 6 de 15. Quizás pienses que crear una tool para un agente requiere escribir wrappers personalizados en Python o buscar nodos de tools especializados en una librería. Pues no. Casi cualquier componente que ya esté en tu canvas se puede convertir en una capacidad activa con un solo clic. Hoy veremos cómo equipar a los agentes con el Tool Mode.
Un error común es pensar que necesitas componentes de tools dedicados y hardcodeados para alimentar a un agente. En Langflow, el Tool Mode es una feature integrada directamente en los nodos estándar. Tanto si trabajas con un API caller, un database retriever, o un nodo de procesamiento de texto, puedes pasarlo a Tool Mode.
Al activar este toggle en un componente, su interfaz cambia. Los puertos de output estándar que normalmente enrutarías al siguiente paso de una chain lineal desaparecen. En su lugar, el componente expone un único puerto de output de Tool. Coges ese nuevo output de Tool y lo conectas directamente al puerto de input de Tools de un componente Agent. Un paso de procesamiento inerte se convierte ahora en una utilidad accionable que el agente puede ejecutar bajo demanda.
Convertir el componente en una tool es solo el paso mecánico. El agente aún necesita saber cómo usarla. Al activar el Tool Mode, aparece un botón llamado Edit Action en el nodo. Al hacer clic en él, se revelan tres campos de configuración.
El primer campo es el Slug. Es un identificador legible por máquina, normalmente formateado con guiones bajos en lugar de espacios. El segundo es el Name, que es un título estándar legible por humanos. El tercer campo es la Description.
Esta es la parte que importa. El campo Description no es documentación para el developer. Es el prompt de texto literal que el Large Language Model lee para determinar si debe activar esta tool específica. Si tu descripción es vaga, el agente adivinará cuándo usarla, lo que provocará un comportamiento impredecible y un desperdicio de tokens.
Pongamos como ejemplo un componente Web Search. Normalmente, solo recibe un string y devuelve resultados de búsqueda. Si activas el Tool Mode en este nodo, se convierte en una tool para el agente. Ahora, abres el menú Edit Action. Si escribes una descripción genérica como busca en la web, el agente podría disparar una búsqueda para preguntas factuales básicas que ya tiene en sus datos de entrenamiento.
En su lugar, escribes una descripción muy restrictiva. Defines condiciones exactas. Escribes, usa esta tool exclusivamente para buscar noticias de última hora, eventos actuales o el tiempo en tiempo real. El agente parsea esa frase exacta durante su ciclo de razonamiento. Evalúa el prompt contra tu descripción, asegurando que el nodo Web Search solo se dispare cuando el usuario pregunte por noticias recientes.
Puedes escalar esto activando el Tool Mode en varios componentes diferentes. Simplemente conectas todos sus puertos de output de Tool al único input de Tools en el nodo del agente. El agente revisa las descripciones de cada tool conectada, selecciona la correcta, la ejecuta y sintetiza los datos devueltos para formular su respuesta final.
La lógica subyacente del nodo es completamente invisible para el agente. Lo único que controla la toma de decisiones de tu agente es la precisión de las descripciones de tus tools.
Gracias por escuchar. ¡Hasta la próxima!
7
Composiciones multiagente
3m 35s
Este episodio cubre la estrategia arquitectónica de anidar subflujos y utilizar agentes secundarios como herramientas. Los oyentes aprenderán a construir sistemas jerárquicos multiagente para el enrutamiento de tareas complejas.
Hola, soy Alex de DEV STORIES DOT EU. Langflow, episodio 7 de 15. Obligar a un único modelo de lenguaje a gestionar a la vez el routing básico y el análisis de datos pesado suele provocar respuestas lentas y costes de API elevados. La solución es dividir la carga cognitiva, y ahí es donde entran en juego las composiciones multiagente.
Mucha gente ve los flows de Langflow estrictamente como endpoints aislados. Llamas a una API, obtienes una respuesta y la ejecución termina. Eso es un error. Los flows no son solo aplicaciones de nivel superior; pueden integrarse jerárquicamente.
Imagina un sistema para parsear las peticiones de los usuarios. Configuras un agente de routing principal usando un modelo rápido y barato. Su único trabajo es averiguar qué quiere el usuario. Cuando un usuario pide analizar un informe financiero enorme, el agente principal no procesa el documento por sí mismo. En su lugar, conectas un agente secundario directamente en el tool input del agente principal. Este agente secundario ejecuta un modelo completamente distinto con una context window mucho más grande, especializado específicamente en la extracción de datos.
El routing depende por completo de la tool description. Al conectar el agente secundario, tienes que proporcionar una descripción de texto clara de lo que hace. El agente principal lee esta descripción junto con el prompt del usuario. Cuando una petición coincide con la descripción, el agente principal detiene su propia generación, empaqueta el contexto relevante e invoca al agente secundario. Para el agente principal, este complejo setup secundario parece una única función. El agente secundario ejecuta su propio reasoning loop, procesa el documento enorme y devuelve el texto final al agente principal, que luego responde al usuario.
Puedes llevar esta abstracción aún más lejos usando un flow entero como tool. Podrías montar un flow sofisticado que scrapee una web, extraiga texto, lo formatee y evalúe el output. Una vez montado, lo guardas. En un proyecto completamente distinto, arrastras un componente Flow Tool al canvas y seleccionas tu flow guardado.
Al llevar un flow a otro workspace, defines componentes de input y output específicos dentro de ese child flow. El agente padre mapea sus tool arguments directamente a esos inputs definidos. Ejecuta el child flow, espera a que se active el output component final y devuelve el texto resultante hacia arriba en la chain.
Langflow está construido sobre una arquitectura de graph basada en nodos. Gracias a esta estructura, el engine permite la composición recursiva. Un graph entero puede encapsularse y tratarse como un único nodo dentro de un graph mayor. El agente principal no es consciente de la complejidad anidada. Simplemente ve una tool llamada scrape_and_evaluate que recibe una URL y devuelve un resumen.
El poder de la composición multiagente es la abstracción. Te permite ocultar reasoning loops complejos de varios pasos tras una única tool call, manteniendo tu lógica de routing principal limpia y predecible.
Si quieres apoyar el programa, puedes encontrarnos buscando DevStoriesEU en Patreon. Gracias por escuchar. Cuidaos todos.
8
El cliente del Model Context Protocol
3m 59s
Este episodio cubre el componente MCP Tools y su capacidad para conectar herramientas de servidores externos directamente a tus agentes. Los oyentes aprenderán cómo el Model Context Protocol reemplaza los wrappers estándar de REST API para el contexto del agente.
Hola, soy Alex de DEV STORIES DOT EU. Langflow, episodio 8 de 15. Se acabaron los días de escribir API wrappers personalizados para cada nueva fuente de datos. Ya no necesitas mapear manualmente los endpoints, formatear los headers y parsear raw JSON solo para que un agente lea una página web o consulte una base de datos local. Esa fricción la elimina el Model Context Protocol Client.
La gente suele confundir esto con las integraciones estándar de REST API. No es un nodo de HTTP request genérico donde tú mismo montas el payload. El Model Context Protocol, o MCP, es un estándar abierto diseñado específicamente para entregar contexto y funciones ejecutables a los modelos de IA. Es un lenguaje universal para el uso de herramientas.
En esta arquitectura, Langflow opera como el MCP Client. Se conecta a un MCP Server externo, le pregunta qué capacidades ofrece y las expone. Esto lo consigues usando el componente MCP Tools. Arrastras este componente a tu canvas y conectas su output directamente al input de tools de un componente Agent. Cuando se establece la conexión, Langflow recibe un schema estricto que define las tools, sus descripciones y sus parámetros requeridos. Las traduce a tools nativas automáticamente. El agente sabe de forma inherente exactamente cómo formatear los datos y lanzar las funciones externas.
Para hacer esta conexión, seleccionas un método de transporte. El componente MCP Tools soporta dos opciones: HTTP a través de Server-Sent Events, y STDIO. HTTP es la opción correcta para servidores remotos que se ejecutan de forma segura en otra máquina. Simplemente proporcionas la URL del endpoint. STDIO se usa cuando quieres que Langflow ejecute un proceso local y se comunique a través de los streams de entrada y salida estándar.
Veamos un escenario concreto usando STDIO. Imagina que quieres que tu agente resuma noticias de tecnología directamente desde URLs externas. Puedes usar una tool preconstruida llamada fetch MCP server. En tu componente MCP Tools, configura el transporte en STDIO. Pon tu comando como uvx, una tool de Python que descarga y ejecuta paquetes en entornos aislados. Para el campo de argumentos, introduce mcp guion server guion fetch. Conecta el output del componente a tu agente. Cuando le pasas un prompt al agente para que resuma un artículo específico, el agente llama de forma nativa a la tool fetch. Hace stream de la URL de destino a través de STDIO al proceso aislado en segundo plano, lee el texto devuelto de la página web y genera tu resumen. No escribiste absolutamente nada de código para lograr esta integración.
Muchas tools requieren autenticación, como la contraseña de una base de datos o una API key privada. El componente MCP Tools incluye un campo de Environment Variables que acepta un diccionario de pares clave-valor. Si interactúas con tu grafo de Langflow programáticamente a través de la API, puedes inyectar estas credenciales dinámicamente usando el diccionario de tweaks. Simplemente apuntas al ID del componente MCP Tools y pasas las environment variables de forma segura en el payload de tu request.
La ventaja definitiva del MCP Client es el desacoplamiento total. Haces el deploy de una capacidad externa una sola vez, en cualquier lenguaje de programación, y al instante le das acceso nativo a cualquier agente de Langflow sin alterar nunca la lógica del grafo.
Gracias por escuchar. ¡Nos vemos en la próxima!
9
Exponiendo flujos como servidores MCP
3m 58s
Este episodio trata sobre cómo convertir tus proyectos de Langflow en herramientas MCP universales para clientes externos. Los oyentes aprenderán a configurar transportes HTTP en streaming y a crear descripciones de herramientas robustas para IDEs remotos.
Hola, soy Alex de DEV STORIES DOT EU. Langflow, episodio 9 de 15. Escribes una pipeline de IA personalizada y quieres que tu editor de código la ejecute de forma nativa como una tool integrada. Le haces una pregunta a tu IDE y este activa de forma transparente el complejo sistema de retrieval que creaste ayer. Exponer los flows como servidores MCP lo hace posible.
Primero, debemos aclarar qué es realmente un servidor MCP. A veces, los oyentes lo confunden con un endpoint de deploy estándar utilizado como backend de una aplicación web. No se trata de eso. El Model Context Protocol, o MCP, es una forma estandarizada de servir capacidades directamente a otros agentes de IA. Un endpoint estándar proporciona datos a una interfaz de usuario. Un servidor MCP proporciona tools a un motor de razonamiento.
Langflow te permite convertir automáticamente cualquier proyecto en un servidor MCP. Al hacerlo, todo tu flow se empaqueta como una tool ejecutable. Para comunicarse con clientes externos, Langflow utiliza un mecanismo de transporte HTTP que soporta streaming, basado específicamente en Server-Sent Events. Esto significa que tu cliente externo se conecta mediante protocolos web estándar y puede recibir respuestas en streaming directamente desde tu flow sin necesidad de configuraciones de red locales complejas.
La configuración técnica es sencilla, pero hay un requisito fundamental que debes hacer bien. Tienes que definir el nombre y la descripción de la tool. Cuando un agente externo se conecta a tu servidor MCP de Langflow, solicita una lista de las tools disponibles. El agente utiliza las descripciones proporcionadas para decidir a qué tool llamar y cuándo hacerlo.
Si dejas la descripción por defecto o escribes algo vago, el agente externo la ignorará. Debes escribir la descripción como una instrucción precisa para el agente de IA. En la práctica, le estás haciendo un prompt al sistema externo sobre cómo usar tu flow.
Veamos un escenario específico. Creas un flow de Document QA en Langflow que busca en un documento interno de arquitectura de la empresa. Quieres que el agente de tu editor Cursor local consulte este documento de forma nativa. Expones el flow como un servidor MCP. Nombras a la tool query company architecture y estableces la descripción para indicar que busca en el documento interno de arquitectura de la empresa para responder preguntas técnicas sobre los servicios de backend.
Luego, configuras Cursor para que se conecte a tu URL de Langflow MCP. Ahora, mientras escribes código en Cursor, le preguntas al agente cómo funciona el sistema de autenticación. Cursor comprueba sus servidores MCP conectados, lee tu descripción específica y se da cuenta de que tu tool de Langflow es justo lo que necesita. Cursor pasa tu pregunta como argumento a la tool. Langflow recibe la petición a través del transporte HTTP, ejecuta todo el flow de Document QA y devuelve la respuesta en streaming a tu editor. Tu IDE acaba de utilizar un proyecto complejo de Langflow como una función nativa.
El éxito de una integración con MCP depende completamente de la calidad del prompt que ocultes dentro de la descripción de la tool. Si el agente externo no puede entender la descripción, tu tool prácticamente no existe.
Eso es todo por este episodio. Gracias por escuchar, ¡y sigue programando!
10
Gestión de estado y sesiones
4m 19s
Este episodio cubre la persistencia de la memoria y el aislamiento estricto de las sesiones a lo largo de los turnos de chat. Los oyentes aprenderán a diferenciar entre la memoria del Agent y el componente Message History para un seguimiento robusto de la conversación lineal.
Hola, soy Alex de DEV STORIES DOT EU. Langflow, episodio 10 de 15. Si dos usuarios hablan con tu aplicación de IA exactamente al mismo tiempo, ¿cómo evita el sistema pasarle las respuestas de un usuario al otro? La respuesta está en cómo aíslas los threads, y eso es exactamente lo que hace la gestión de State y Session.
Primero, aclaremos un punto de confusión muy común. Tenemos que trazar una línea clara entre la chat memory y la semantic vector memory. La vector memory consiste en almacenar documentos como embeddings y recuperarlos basándose en su significado. No vamos a cubrir eso aquí. La chat memory es simplemente el log lineal y cronológico de una conversación. Es el mecanismo que le permite al modelo de lenguaje recordar lo que dijo el usuario hace tres mensajes.
Por defecto, Langflow almacena este historial lineal de mensajes en local usando una base de datos SQLite. Cada vez que un mensaje pasa por el sistema, se registra. Pero una base de datos llena de mensajes es inútil si el sistema no sabe qué mensaje pertenece a quién. Aquí es donde entra en juego el session ID. El session ID es un string único que vincula una secuencia de interacciones. Cuando usas la interfaz de Langflow, el sistema genera un session ID para ti automáticamente por debajo.
En producción, probablemente interactúes con Langflow a través de su API. Si tienes dos usuarios distintos interactuando con tu servidor simultáneamente, tienes que pasar un session ID específico para cada uno en tu API request. Una práctica estándar es usar el user ID único de tu propia base de datos como el session ID de Langflow. Cuando tu primer usuario envía un mensaje, pasas su ID específico. Langflow hace una query a la base de datos SQLite buscando ese string exacto, saca solo su historial, lo añade al prompt, y genera una respuesta. Cuando tu segundo usuario interactúa un milisegundo después con su propio ID, Langflow hace exactamente el mismo proceso de forma completamente aislada. Si no pasas un session ID en tu API call, Langflow trata la interacción como un evento totalmente nuevo. El contexto se pierde por completo. Para mantener el thread, tu aplicación externa tiene que enviar ese identificador con cada request.
La forma en que expones este historial al modelo de lenguaje depende completamente de los componentes que elijas. Langflow ofrece dos enfoques distintos. Si estás usando un componente Agent estándar, la gestión de memoria ya viene integrada. El Agent gestiona automáticamente la lectura y escritura en la base de datos SQLite usando el session ID activo. No necesitas conectar nada extra para que recuerde la conversación.
Los Agents son muy abstractos, así que si estás construyendo una chain personalizada desde cero usando componentes base y raw prompts, esa memoria integrada no existe. Aquí es donde usas el componente dedicado Message History. Pones este componente en tu flow y conectas su output a una variable en tu componente Prompt. Cuando el flow se ejecuta, el componente Message History coge el session ID activo, recupera el log cronológico relevante de la base de datos, y lo formatea como texto. Esto pasa físicamente el diálogo almacenado a la context window antes de que el modelo de lenguaje llegue a verlo.
Controlar el session ID a nivel de API es el requisito más crítico para escalar una interfaz conversacional, porque vincular el state estrictamente a un identificador que le pasas garantiza un aislamiento completo entre cualquier número de usuarios simultáneos.
Eso es todo por este episodio. Gracias por escuchar, ¡y sigue construyendo!
11
Fundamentando el LLM con Vector Stores
4m 01s
Este episodio cubre las mejores prácticas arquitectónicas para construir pipelines de Retrieval Augmented Generation. Los oyentes aprenderán a desacoplar la ingesta de datos asíncrona de la búsqueda semántica en tiempo real.
Hola, soy Alex de DEV STORIES DOT EU. Langflow, episodio 11 de 15. El mayor error que cometen los desarrolladores al montar Retrieval Augmented Generation es combinar la indexación lenta de datos y el chat retrieval en tiempo real en un solo pipeline. Cada vez que el usuario hace una pregunta, el sistema intenta releer un PDF de cien páginas. La solución es hacer grounding del LLM con Vector Stores usando una arquitectura desacoplada.
Es súper común conectar todos tus componentes juntos en un solo canvas. Conectas un file loader a un text splitter, se lo pasas a un embedding model, lo metes en un vector store y lo conectas directamente a una chat interface. Eso crea un cuello de botella enorme. La ingesta de datos y el chat retrieval son eventos del lifecycle completamente distintos. No deberían vivir en el mismo execution path.
La arquitectura RAG estándar en Langflow separa este proceso en dos flows distintos. Primero, tienes el subflow de ingesta. Aquí es donde ocurren las operaciones pesadas. Coges tus documentos de origen, como archivos PDF grandes, y los pasas por un document loader. Luego, un text splitter divide los documentos en chunks más pequeños.
Al configurar tu text splitter, debes ajustar el tamaño de tus chunks a los límites máximos de tokens del embedding model que hayas elegido. Si el tamaño de tu chunk supera ese límite, el embedding model truncará el texto silenciosamente. Las últimas frases se ignoran, y esos datos perdidos nunca llegarán a tu vector database. Una vez que el texto está bien dividido en chunks, se lo pasas a un componente de embedding para generar los vectores. Finalmente, esos vectores se guardan en una collection específica dentro de tu componente vector store. Todo este flow de ingesta se ejecuta cuando los datos cambian, de forma totalmente independiente de la interfaz de usuario.
Ahora, la segunda pieza de esta arquitectura es el flow de retrieval. Esta es la parte conversacional de cara al usuario. Como la indexación pesada ya se ha hecho en otro lado, este flow se mantiene rápido y con buena respuesta. Empieza con un chat input que captura la pregunta del usuario. Esa pregunta se le pasa a un componente de embedding. Tienes que configurar este componente para que use exactamente el mismo embedding model que usaste durante la fase de ingesta. Si indexas datos con un modelo y haces una query con uno distinto, el vector store no encontrará ninguna coincidencia relevante.
El componente vector store en este flow está configurado para buscar exactamente en la misma collection de la base de datos que poblaste antes. Coge la pregunta del usuario ya con su embedding, hace una similarity search contra los datos precargados, y devuelve los chunks de texto más relevantes. Luego, enrutas esos chunks recuperados, junto con la pregunta original del usuario, hacia un componente prompt template. Ese prompt enriquecido se envía finalmente al language model, que formula la respuesta.
Al dividir tu implementación RAG en un flow de escritura asíncrono para documentos y un flow de lectura rápida para el chat, proteges tu chat interface de los retrasos de procesamiento del backend. La regla de oro de la arquitectura RAG es que una query del usuario solo debería disparar una búsqueda, nunca un indexing job. Eso es todo por este episodio. ¡Gracias por escuchar, y sigue programando!
12
Extendiendo el motor mediante Python
4m 11s
Este episodio cubre la creación fundamental de componentes personalizados de Python dentro del framework. Los oyentes aprenderán cómo las anotaciones estrictas a nivel de clase mapean la lógica interna del código a los nodos visuales de la interfaz de usuario.
Hola, soy Alex de DEV STORIES DOT EU. Langflow, episodio 12 de 15. La programación visual te lleva el noventa por ciento del camino, pero inevitablemente, te chocas contra un muro. Necesitas ejecutar lógica de negocio propia o conectarte a una API interna personalizada, y los nodos preconstruidos simplemente no lo cubren. Extender el motor con Python desbloquea ese último diez por ciento de control absoluto.
Es fácil pensar que un componente personalizado es simplemente un script estándar de Python que sueltas en un directorio. Pero no lo es. Un componente personalizado requiere una configuración estricta a nivel de clase. Sin esta estructura específica, el motor de Langflow no tiene ni idea de cómo renderizar tu nodo en el editor visual ni de cómo conectar sus datos al grafo de ejecución. El nodo visual y la lógica de backend están fuertemente unidos.
Para crear un componente personalizado, siempre empiezas creando una subclase de la clase base Component que proporciona Langflow. Dentro de esta nueva clase, no escribes un método de inicialización estándar para recoger variables. En su lugar, defines dos arrays estrictos: inputs y outputs.
Veamos un escenario práctico. Supongamos que estás creando un componente personalizado Text Analyzer que calcula el número de palabras y devuelve un objeto Data estructurado al grafo.
Primero, configuras el array de inputs. Rellenas este array usando clases de input especializadas que proporciona Langflow. Para el Text Analyzer, necesitas un string de texto, así que metes un objeto de text input en el array y le das un nombre. Esta es la parte importante. Al declarar una clase de input específica en tu código Python, estás dictando la interfaz visual. Langflow lee ese array y genera automáticamente un campo de texto en tu nodo dentro del editor drag-and-drop. Si añadieras un objeto de integer input a ese mismo array, la UI renderizaría al instante un selector numérico. Tú defines el requisito de datos en el código, y el motor construye la interfaz de usuario por ti.
Una vez definidos los inputs, configuras el array de outputs. Esto le dice explícitamente al grafo que lo rodea qué tipo de datos va a producir tu nodo. Para el Text Analyzer, queremos pasar nuestro resultado a lo largo de la chain, así que añades un objeto Data output al array. La configuración del output hace una cosa más que es fundamental. Mapea el handle visual de output a un método de ejecución principal dentro de tu clase. Le estás diciendo explícitamente al motor qué función de Python ejecutar cuando el siguiente nodo pida datos.
El último paso es escribir ese método de ejecución mapeado. Aquí es donde vive tu lógica estándar de Python. El método recibe automáticamente los valores que tus inputs recogieron de la UI. Coges el string de texto entrante, lo divides y cuentas las palabras. Luego, como el grafo espera un formato estandarizado, envuelves tu integer final dentro de un objeto Data de Langflow y lo devuelves.
La estructura fuerza una separación limpia. El array de inputs construye la interfaz y recoge los datos, el método de ejecución los procesa, y el array de outputs los devuelve al grafo visual.
Eso es todo por este episodio. Gracias por escuchar, ¡y sigue programando!
13
Hooks de componentes y ejecución avanzados
4m 36s
Este episodio cubre el ciclo de vida interno del motor de ejecución y las técnicas avanzadas para compartir el estado. Los oyentes aprenderán a sobrescribir los hooks de configuración y a utilizar diccionarios de contexto para la persistencia de estados complejos.
Hola, soy Alex de DEV STORIES DOT EU. Langflow, episodio 13 de 15. Podrías pensar en un node como una simple caja negra donde entran datos, se ejecuta una función, salen datos y el node lo olvida todo al instante. Pero, ¿qué pasa cuando tu pipeline requiere que un node inicialice una conexión compleja a una base de datos o que registre cuántos elementos acaba de procesar antes de devolver un resultado? Esto requiere ir más allá de las funciones simples y usar hooks de componentes y ejecución avanzados.
Se suele asumir que los componentes son operaciones estrictamente stateless que solo evalúan inputs. No es así. Un componente es una instancia de una clase de Python, y pasa por un lifecycle específico gestionado por el execution engine interno. Durante este lifecycle, el componente puede mantener su estado interno, orquestar setups complejos y compartir datos entre sus propios métodos internos.
Cuando Langflow activa un componente, el engine inicia una secuencia estricta. Primero, antes de que comience la generación de cualquier output, el engine busca un hook interno llamado pre run setup. Sobrescribes este método cuando tu componente necesita hacer el trabajo pesado antes de que se ejecute la lógica principal. Si tu componente necesita autenticarse con una API externa, cargar un modelo de machine learning grande en memoria o configurar variables locales, colocas esa lógica dentro del setup hook.
Una vez completado el setup, el engine pasa a la fase de ejecución llamando al run hook. Aquí es donde reside tu payload principal y donde ocurre el procesamiento de datos real. Separar la lógica de setup de la lógica de ejecución mantiene tu código organizado y evita operaciones redundantes.
Pero esto plantea una pregunta mecánica inmediata. ¿Cómo pasas un cliente de API autenticado o una variable local desde el setup hook hasta el run hook?
Usas el diccionario de contexto. Cada componente personalizado tiene un atributo llamado self punto ctx. Este es un diccionario asociado directamente a la instancia del componente. Actúa como un banco de memoria dedicado durante la ejecución de ese componente específico. Cualquier cosa que añadas a este diccionario de contexto durante la fase de setup estará disponible inmediatamente cuando el engine pase a la fase de run.
Veamos un escenario práctico donde este intercambio de estado es necesario. Imagina un componente personalizado que procesa un stream de documentos entrantes y necesita devolver como output tanto el texto limpio como un recuento final de cuántos documentos se modificaron correctamente.
Primero, sobrescribes el pre run setup hook. Dentro de este método, accedes al diccionario de contexto y creas una variable contador, estableciendo su valor inicial a cero. También podrías inicializar tu librería de limpieza de texto aquí y adjuntarla al contexto.
A continuación, el engine activa el run hook. Tu método itera sobre los documentos entrantes. Por cada documento que pasa correctamente por la librería de limpieza, accedes al diccionario de contexto, recuperas el valor actual del contador y lo incrementas en uno.
Como el diccionario de contexto persiste a través de estas distintas llamadas a los métodos del lifecycle, tu componente mantiene su estado interno de forma segura. Cuando el run hook por fin termina su bucle, puede devolver los documentos procesados y sacar el recuento final exacto directamente del diccionario de contexto para pasarlo al siguiente node.
Dominar el execution engine y los hooks de componentes cambia tu mentalidad de escribir simples scripts de paso a crear aplicaciones robustas y autónomas que gestionan por completo sus propios lifecycles de datos.
Si quieres ayudar a que el programa siga adelante, puedes buscar DevStoriesEU en Patreon. Como siempre, gracias por escuchar. Nos vemos en el próximo episodio.
14
La API de Langflow y Tweaks dinámicos
4m 22s
Este episodio cubre la ejecución de grafos programáticamente a través de la REST API. Los oyentes aprenderán a usar el Input Schema para inyectar anulaciones de parámetros en tiempo de ejecución sin alterar el flujo subyacente.
Hola, soy Alex de DEV STORIES DOT EU. Langflow, episodio 14 de 15. Tienes cincuenta clientes y cada uno necesita una versión ligeramente diferente de tu agente de soporte de IA. El instinto es duplicar tu grafo cincuenta veces, cambiando el system prompt o la API key en cada uno. Eso es una pesadilla de mantenimiento. Solo necesitas un grafo, y puedes gestionar las variaciones sobre la marcha usando la API de Langflow y Tweaks dinámicos.
Cuando creas un grafo en la interfaz visual, los parámetros dentro de tus componentes son fijos. Es fácil suponer que para cambiar una variable menor, como la configuración de temperatura o una system instruction, tienes que clonar todo el flow. Esto no es cierto. Los Tweaks resuelven esto dinámicamente en runtime, permitiéndote sobrescribir los parámetros de los componentes sin editar el grafo subyacente. Haces esto interactuando con Langflow de forma totalmente headless a través de su API REST.
Para ejecutar un flow programáticamente, envías una request HTTP POST al endpoint run, específicamente barra uve uno barra run, seguido de tu flow ID único. El body de esta request contiene tus inputs estándar, como el mensaje de texto del usuario. Junto con esos datos de input, puedes incluir un objeto tweaks. Este objeto es un diccionario que mapea componentes específicos de tu grafo a los nuevos valores que quieres inyectar para esa única ejecución.
Para apuntar a un componente, necesitas su node ID. En Langflow, un node ID normalmente consiste en el nombre del componente y un string aleatorio, como Prompt guion a b c d e. Cuando construyes tu payload de tweaks, usas este node ID exacto como la key. El valor es otro diccionario que contiene los campos específicos que quieres sobrescribir.
Considera un flow básico de atención al cliente utilizado en varios sitios web. El grafo contiene un componente Prompt que define cómo se comporta el agente. Para tu cliente bancario, el prompt debe ser muy formal. Para tu cliente de videojuegos, debe ser informal. En lugar de mantener dos grafos idénticos, tu servidor backend hace una llamada a la API al mismo flow ID exacto. En el payload de la request, especificas el node ID de ese componente Prompt. Dentro de eso, apuntas al campo template y le pasas las instrucciones formales para el banco. Más tarde, cuando el sitio web de videojuegos activa una llamada, tu backend envía exactamente la misma request, pero cambia el string en el diccionario de tweaks por las instrucciones informales.
La lógica de ejecución es completamente secuencial. Primero, preparas tu payload con la query del usuario y tu diccionario de tweaks específico. Luego, envías la request POST al endpoint run. Langflow recibe la llamada, aplica temporalmente tus overrides a los nodos objetivo, y ejecuta el grafo. Devuelve el output final a tu aplicación, mientras que el flow original guardado en el servidor permanece intacto.
No estás limitado a text prompts. Puedes modificar casi cualquier cosa expuesta en el input schema de un componente. Puedes cambiar dinámicamente el nombre del modelo, ajustar la temperatura, o inyectar diferentes credenciales de base de datos por request. Esto convierte un grafo visual estático en una función de backend reutilizable y altamente flexible. La capacidad de separar la lógica de tu aplicación de tus datos de configuración es lo que hace que la ejecución headless realmente escale en producción.
Gracias por sintonizarnos. ¡Hasta la próxima!
15
Contenerización en producción
4m 11s
Este episodio cubre la transición del desarrollo visual a los despliegues de producción headless. Los oyentes aprenderán a construir Dockerfiles, bloquear dependencias y montar componentes personalizados de forma segura.
Hola, soy Alex de DEV STORIES DOT EU. Langflow, episodio 15 de 15. El editor visual es genial para construir tu aplicación. Pero si haces deploy de esa misma interfaz drag-and-drop en tus servidores de producción, te estás comiendo la memoria y dejando expuesta la lógica de tu aplicación. Cuando llega la hora del tráfico de producción, lo que quieres es un contenedor backend ligero y headless. Eso es exactamente lo que vamos a ver hoy con la contenerización en producción.
Es súper común ver a equipos que terminan de montar un flow y simplemente hacen deploy de toda la aplicación de Langflow, con interfaz de usuario y todo, en un servidor en la nube. La interfaz es estrictamente para desarrollo. En un entorno de producción, no quieres a nadie haciendo drag-and-drop de nodos. Quieres una API inmutable y segura que simplemente procese requests.
Langflow ofrece un modo específico para gestionar esta transición. Cuando arrancas el servicio, usas una flag de comando llamada backend-only. Esto le dice a Langflow que desactive el frontend de React por completo. El servidor arranca igual, pero solo expone los endpoints de la API necesarios para ejecutar tus flows. Esto reduce drásticamente el consumo de memoria. También refuerza la seguridad al reducir la superficie de ataque, asegurando que nadie pueda acceder visualmente ni alterar la estructura de la aplicación.
Para empaquetar esto para el deploy, escribes un Dockerfile. Empiezas con una imagen base estándar de Python. Como Langflow depende de tooling moderno de Python, gestionas tus paquetes bloqueando tus dependencias con UV. Antes de hacer la build de la imagen, exportas tu árbol de dependencias exacto a un lockfile. Dentro del Dockerfile, usas este lockfile para instalar tus paquetes. Esto garantiza que tu contenedor de producción ejecute exactamente las mismas versiones de los paquetes que probaste durante el desarrollo.
A continuación, metes la lógica de tu aplicación en la imagen. En Langflow, tu aplicación es fundamentalmente solo datos. Cuando terminas de construir en el editor visual, exportas tu flow como un archivo JSON. Dentro de tu Dockerfile, copias este archivo JSON directamente en la estructura de la imagen.
Esta es la parte que importa para la lógica custom. Muchos flows complejos dependen de componentes custom, que son pequeños scripts de Python que escribiste para manejar tareas específicas. El JSON del flow hace referencia a estos componentes, pero no contiene el código Python en sí. Tienes que copiar explícitamente el directorio que contiene los archivos de tus componentes custom en la imagen de Docker. Luego configuras una variable de entorno, indicándole al contenedor exactamente dónde buscar el path de ese componente cuando arranque el servidor.
La última pieza del Dockerfile es el comando de ejecución. Este comando lanza el módulo de Langflow, le pasa el file path de tu JSON del flow integrado, apunta a tus componentes custom e incluye la flag backend-only. Cuando este contenedor arranca, está completamente blindado. El editor visual ya no está, la configuración del flow es estática y las dependencias son fijas. Te quedas con una API rápida y headless, lista para recibir prompts y devolver respuestas.
La conclusión más crítica es que tu entorno de desarrollo y tu runtime de producción tienen formas fundamentalmente distintas. Construye de forma visual, pero haz el deploy de forma headless.
Como este es el último episodio, te animo a que te sumerjas en la documentación oficial y pruebes a contenerizar un flow sencillo tú mismo. Si tienes ideas sobre qué deberíamos cubrir en nuestra próxima serie, pásate por DEV STORIES DOT EU y cuéntanos. Gracias por pasar unos minutos conmigo. Hasta la próxima, cuídate.
Tap to start playing
Browsers block autoplay
Share this episode
Episode
—
Copy this episode in another language:
Este sitio web no utiliza cookies. Nuestro proveedor de alojamiento puede registrar tu dirección IP con fines analíticos. Saber más.