Torna al catalogo
Season 54 15 Episodi 55 min 2026

Langflow

v1.8 — Edizione 2026. Un corso audio tecnico completo sulla creazione di applicazioni AI con Langflow 1.8, passando dalla prototipazione visiva al deployment in produzione del backend.

Orchestrazione LLM Prototipazione Visiva Framework AI/ML
Langflow
In Riproduzione
Click play to start
0:00
0:00
1
Il paradigma di Langflow
Questo episodio copre l'identità principale del framework e come la sua interfaccia visiva si traduce nell'esecuzione backend. Gli ascoltatori impareranno come la logica dell'applicazione è strutturata come un Directed Acyclic Graph, consentendo transizioni fluide dalla prototipazione rapida alle API in produzione.
3m 31s
2
Architettura dei componenti e tipi di dati
Questo episodio copre l'anatomia di un componente, incluse le porte di input e output, e i tipi di dati principali come Data e Message. Gli ascoltatori impareranno come la tipizzazione rigorosa e i colori delle porte dettano il flusso di informazioni attraverso il grafo.
4m 04s
3
Interfacciarsi con il grafo
Questo episodio copre i componenti Chat Input e Chat Output, oltre alla struttura interna degli oggetti Message. Gli ascoltatori impareranno come i metadati, come gli ID di sessione e i timestamp, vengono integrati nei messaggi per tracciare il contesto conversazionale.
3m 42s
4
L'astrazione del Language Model
Questo episodio copre il componente principale Language Model e le configurazioni globali dei provider. Gli ascoltatori impareranno come astrarre le connessioni LLM e cambiare dinamicamente il comportamento delle porte di output per le integrazioni a valle.
3m 56s
5
Motori di esecuzione intelligenti
Questo episodio copre il componente Agent e il suo ruolo come motore di ragionamento autonomo. Gli ascoltatori impareranno come le capacità di memoria integrate consentono un processo decisionale dinamico che va oltre i semplici prompt statici.
4m 04s
6
Equipaggiare gli Agent con la Tool Mode
Questo episodio copre le meccaniche della Tool Mode, che converte componenti inerti in funzioni azionabili per gli agent. Gli ascoltatori impareranno come configurare le descrizioni dei tool per guidare perfettamente il processo decisionale dell'agent.
3m 37s
7
Composizioni Multi-Agent
Questo episodio copre la strategia architettonica di annidare i sub-flow e utilizzare agent secondari come tool. Gli ascoltatori impareranno come costruire sistemi multi-agent gerarchici per l'instradamento di task complessi.
3m 19s
8
Il client Model Context Protocol
Questo episodio copre il componente MCP Tools e la sua capacità di connettere tool server esterni direttamente ai tuoi agent. Gli ascoltatori impareranno come il Model Context Protocol sostituisce i classici wrapper REST API per il contesto degli agent.
3m 42s
9
Esporre i flow come server MCP
Questo episodio copre la trasformazione dei tuoi progetti Langflow in tool MCP universali per client esterni. Gli ascoltatori impareranno come configurare trasporti HTTP streamable e creare descrizioni robuste dei tool per IDE remoti.
3m 31s
10
Gestione dello stato e delle sessioni
Questo episodio copre la persistenza della memoria e il rigoroso isolamento delle sessioni attraverso i turni di chat. Gli ascoltatori impareranno a distinguere tra la memoria dell'Agent e il componente Message History per un tracciamento lineare e robusto delle conversazioni.
3m 35s
11
Grounding dell'LLM con i Vector Store
Questo episodio copre le best practice architettoniche per costruire pipeline di Retrieval Augmented Generation. Gli ascoltatori impareranno come disaccoppiare l'ingestione asincrona dei dati dalla ricerca semantica in tempo reale.
3m 23s
12
Estendere il motore tramite Python
Questo episodio copre la creazione di base di componenti Python personalizzati all'interno del framework. Gli ascoltatori impareranno come le rigorose annotazioni a livello di classe mappano la logica del codice interno ai nodi visivi della UI.
3m 30s
13
Hook dei componenti ed esecuzione avanzata
Questo episodio copre il ciclo di vita del motore di esecuzione interno e le tecniche avanzate di condivisione dello stato. Gli ascoltatori impareranno a sovrascrivere i setup hook e a utilizzare i dizionari di contesto per la persistenza di stati complessi.
3m 52s
14
L'API di Langflow e i Tweak dinamici
Questo episodio copre l'esecuzione programmatica dei grafi tramite la REST API. Gli ascoltatori impareranno come utilizzare l'Input Schema per iniettare override dei parametri a runtime senza alterare il flow sottostante.
3m 42s
15
Containerizzazione in produzione
Questo episodio copre la transizione dallo sviluppo visivo ai deployment in produzione headless. Gli ascoltatori impareranno come costruire Dockerfile, bloccare le dipendenze e montare componenti personalizzati in modo sicuro.
3m 43s

Episodi

1

Il paradigma di Langflow

3m 31s

Questo episodio copre l'identità principale del framework e come la sua interfaccia visiva si traduce nell'esecuzione backend. Gli ascoltatori impareranno come la logica dell'applicazione è strutturata come un Directed Acyclic Graph, consentendo transizioni fluide dalla prototipazione rapida alle API in produzione.

Download
Ciao, sono Alex di DEV STORIES DOT EU. Langflow, episodio 1 di 15. Prototipare un'applicazione AI di solito significa creare rapidamente un mockup visivo, dimostrare che l'idea funziona e poi buttare via tutta quella UI per scrivere da zero il backend di produzione vero e proprio. Perdi giorni a tradurre i concetti visivi in codice server. Questo episodio parla del Paradigma di Langflow, un concetto che elimina completamente questa fase di traduzione. Langflow è un framework progettato per creare applicazioni AI. Dato che ci interagisci principalmente tramite un canvas dove fai drag and drop di componenti, è molto facile scambiarlo per un ennesimo tool di UI o un giocattolo low-code. Ma è un malinteso. Fai attenzione a questa distinzione. Langflow è un framework backend Python completo. L'interfaccia visiva è semplicemente una finestra sull'architettura Python sottostante. Ogni componente visivo che posizioni sul canvas corrisponde direttamente a una classe Python, e il graph che disegni si traduce direttamente nella logica dell'API di backend. In Langflow, le applicazioni che crei si chiamano flow. Quando apri il workspace, stai essenzialmente costruendo un Directed Acyclic Graph, o DAG. Inizi aggiungendo dei nodi al canvas. Ogni nodo rappresenta un blocco di funzionalità distinto, come un text parser, un data loader o un processing module. Poi tracci delle linee che collegano gli handle di output di un nodo agli handle di input di un altro. Queste linee non sono lì solo per bellezza. Dettano le dipendenze di esecuzione di tutta la tua applicazione. Se colleghi l'output di un nodo document loader all'input di un nodo di processing, l'engine sottostante lo interpreta come una rigida regola di dipendenza. Sa che deve eseguire prima il document loader, aspettare il risultato, e poi passare quei dati downstream. I dati fluiscono rigorosamente in un'unica direzione attraverso il graph, garantendo un percorso prevedibile e tracciabile dal tuo user input alla risposta finale. Il framework gestisce il type checking tra questi handle collegati, assicurandosi che l'output di un nodo sia compatibile con l'input del successivo prima ancora che inizi l'esecuzione. Immagina di creare un flow di prototipazione per un semplice tool di question-answering. Nel workspace, colleghi un nodo di text input a un nodo di processing, e poi fai il routing verso un nodo di output. Lo testi direttamente lì nel browser, ritoccando i parametri finché le risposte non sembrano corrette. In un workflow tradizionale, il passo successivo è consegnare un documento di specifiche a un backend engineer per riscrivere quella logica in Python. Nel paradigma Langflow, salti completamente questo passaggio. Nel momento in cui il tuo flow visivo funziona, è già un'API funzionante. Ti basta inviare una richiesta al run endpoint integrato con il tuo flow identifier e le variabili di input. Il framework attraversa il graph esattamente come lo hai progettato, eseguendo ogni classe Python nell'ordine corretto, e restituisce la risposta. Passi da un prototipo visivo a un backend Python servito senza scrivere una singola riga di codice di configurazione del server. L'identità principale di Langflow è che la mappa visiva che disegni per comprendere la tua applicazione è esattamente la stessa struttura che il server usa per eseguirla. Se trovi utili questi episodi e vuoi supportare lo show, puoi cercare DevStoriesEU su Patreon. Grazie per l'ascolto, buon coding a tutti!
2

Architettura dei componenti e tipi di dati

4m 04s

Questo episodio copre l'anatomia di un componente, incluse le porte di input e output, e i tipi di dati principali come Data e Message. Gli ascoltatori impareranno come la tipizzazione rigorosa e i colori delle porte dettano il flusso di informazioni attraverso il grafo.

Download
Ciao, sono Alex di DEV STORIES DOT EU. Langflow, episodio 2 di 15. Colleghi due nodi, avvii la tua pipeline e non succede assolutamente nulla. La connessione sembra corretta, ma l'esecuzione fallisce o lancia un errore criptico. Il problema di solito risiede nel modo in cui i dati si muovono tra i blocchi, il che ci porta all'architettura dei componenti e ai data type. Un'ipotesi comune è che i componenti di Langflow si scambino payload JSON non strutturati come una normale web API. Non è così. Ogni componente in Langflow è un'esecuzione di una classe Python discreta e rigorosamente tipizzata. Un componente contiene uno stato interno, porte di input e porte di output. I dati fluiscono esclusivamente attraverso queste porte definite, e tali porte richiedono specifici oggetti Langflow. Puoi tenere traccia di questi data type usando i colori delle porte. Ogni porta su un componente ha un colore specifico che corrisponde al tipo di dati che accetta o restituisce. Se colleghi una porta di output a una porta di input e i colori corrispondono, i dati fluiscono senza problemi. Se i colori non corrispondono, stai tentando di passare dati incompatibili. Il componente a valle non sarà in grado di parsare l'oggetto in ingresso e il flow fallirà. Per creare pipeline affidabili, devi comprendere i tre data object principali che viaggiano attraverso queste connessioni. Il primo è il tipo Message. Un oggetto Message viene usato per i dati conversazionali. Trasporta il contenuto testuale effettivo insieme alle informazioni di routing, in particolare il ruolo, che indica al sistema se il testo proviene da un utente, da un system prompt o da un modello AI. Il secondo tipo principale è l'oggetto Data. Un oggetto Data funge da wrapper per le informazioni non strutturate. Contiene il contenuto testuale insieme a un dictionary di metadati. Quando recuperi documenti da un vector database, fai scraping di una pagina web o leggi un file di testo, quelle informazioni viaggiano attraverso il tuo flow come un oggetto Data strutturato, non come una raw string. Il dictionary dei metadati ti permette di passare source URL o timestamp insieme al testo senza rompere la logica di processing a valle. Il terzo tipo è l'oggetto DataFrame. Questo viene usato per dati tabellari bidimensionali. Si comporta in modo molto simile a un Pandas DataFrame, il che lo rende il tipo richiesto quando passi file CSV parsati o righe e colonne strutturate tra componenti analitici. Poiché le porte sono strettamente tipizzate, incontrerai spesso situazioni in cui hai un data type ma il componente successivo ne richiede un altro. Prendi lo scenario in cui recuperi una raw text string da un blocco di esecuzione Python di base e devi passarla a un componente di text processing che richiede esplicitamente un oggetto Data strutturato. I colori delle porte non corrisponderanno. Non puoi forzare una raw string in una porta Data. Per colmare questo divario, usi un componente Type Convert. Posizioni il blocco Type Convert tra i due componenti incompatibili. Per prima cosa colleghi l'output della string all'input del blocco Type Convert. Quindi colleghi il suo output alla porta Data del tuo componente di processing a valle. Il blocco Type Convert prende la raw string, la incapsula in un oggetto Data appropriato con un dictionary di metadati vuoto e la passa in modo sicuro al nodo successivo. Comprendere la tipizzazione rigorosa di queste porte è la differenza tra un flow che funziona e un flow che si rompe continuamente. Se una pipeline fallisce silenziosamente, non debuggare subito la tua logica, controlla i colori delle porte per assicurarti che i tuoi componenti stiano effettivamente parlando lo stesso identico linguaggio dati. Grazie per l'ascolto. Statemi bene, tutti.
3

Interfacciarsi con il grafo

3m 42s

Questo episodio copre i componenti Chat Input e Chat Output, oltre alla struttura interna degli oggetti Message. Gli ascoltatori impareranno come i metadati, come gli ID di sessione e i timestamp, vengono integrati nei messaggi per tracciare il contesto conversazionale.

Download
Ciao, sono Alex di DEV STORIES DOT EU. Langflow, episodio 3 di 15. Un semplice messaggio di chat sembra solo una string di testo, ma se così fosse, la tua applicazione perderebbe traccia di chi ha detto cosa nel momento in cui si connette un secondo utente. Risolvere questo problema di routing è esattamente ciò che tratteremo oggi: interfacciarsi con il graph tramite Chat Input e Chat Output. Quando crei un flow, l'entry point è in genere un componente Chat Input. Gli sviluppatori spesso lo confondono con una semplice text box che inoltra ciecamente una string al node successivo. Questo è un modello mentale sbagliato. Il componente Chat Input funziona come una factory di dati strutturati. La sua funzione principale è intercettare il raw text dalla user interface e incapsularlo in un data type specifico chiamato oggetto Message. L'oggetto Message è la moneta di scambio fondamentale per il testo che si muove attraverso un graph Langflow. Invece di passare delle semplici string, il graph fa il routing di questo pacchetto standardizzato. All'interno dell'oggetto, le parole effettivamente digitate dall'utente si trovano in un text field principale. Attorno a questo testo c'è un layer di metadati. L'oggetto contiene un campo sender, che classifica la sorgente come User o Machine. Include un sender name, che gestisce l'etichetta visualizzata sul frontend. Inoltre, registra l'ora esatta di creazione in un campo timestamp. Questi metadati diventano cruciali quando gestisci utenti concorrenti. Immagina uno scenario in cui un utente fa una domanda in un'applicazione deployata. Il componente Chat Input cattura il suo testo, lo impacchetta in un oggetto Message, imposta il sender su User e gli associa un session ID univoco. Questo session ID è il meccanismo che traccia uno specifico thread di conversazione. Man mano che il Message attraversa il graph, passando attraverso retriever o processing node, quel session ID rimane associato. I tool di state management e i componenti di memory si basano interamente su questo ID per raggruppare le interazioni. Senza di esso, il graph non avrebbe modo di isolare il contesto di un utente da quello di un altro. Hai anche il controllo sulla visibilità di questo input. Il componente Chat Input può essere configurato per nascondere il suo contenuto dall'interfaccia principale della chat. Questo è utile quando passi parametri di sistema predefiniti o istruzioni in background che l'utente non ha mai bisogno di vedere, pur iniettando un oggetto Message valido nel graph. Dall'altro lato del flow si trova il componente Chat Output. Questo è il terminal node che ripresenta i dati alla user interface. Cattura l'oggetto Message finale prodotto dalla tua logica. Poiché riceve un oggetto completamente formato, il componente Chat Output legge i campi sender e sender name per renderizzare l'interfaccia in modo accurato, mostrando in genere la risposta come proveniente dalla Machine. Se un node precedente dovesse passare del raw text al Chat Output invece di un oggetto Message, il componente lo corregge automaticamente. Wrappa la raw string in un nuovo oggetto Message prima di visualizzarla, garantendo una rigorosa coerenza dei dati ai confini del tuo graph. I componenti Chat Input e Output non sono elementi di interfaccia puramente estetici, sono i border controller della tua applicazione, che garantiscono che ogni porzione di testo sia correttamente incapsulata in un oggetto Message tracciato prima di potersi muovere. Grazie per averci ascoltato. Spero tu abbia imparato qualcosa di nuovo.
4

L'astrazione del Language Model

3m 56s

Questo episodio copre il componente principale Language Model e le configurazioni globali dei provider. Gli ascoltatori impareranno come astrarre le connessioni LLM e cambiare dinamicamente il comportamento delle porte di output per le integrazioni a valle.

Download
Ciao, sono Alex di DEV STORIES DOT EU. Langflow, episodio 4 di 15. Decidi di cambiare il provider del modello della tua applicazione a metà progetto. Di solito, questo significa dover scovare ogni singola chiamata API, riscrivere gli oggetti di configurazione e sperare di non aver rotto l'intera prompt chain. Una buona architettura trasforma tutto questo in una transizione fluida. Il componente Language Model in Langflow fornisce l'astrazione che rende tutto questo possibile. Quando gli sviluppatori iniziano a creare dei flow, spesso si aspettano di trascinare un nodo del modello sul canvas e incollare subito la loro API key direttamente nelle impostazioni del componente. Non farlo. Langflow è progettato per gestire l'autenticazione a livello globale tramite il pannello Model Providers. Configuri le tue credenziali, come le tue chiavi OpenAI o Anthropic, una sola volta nelle impostazioni globali. I singoli componenti del modello sul tuo canvas fungono da riferimenti a quelle configurazioni globali. Il nodo stesso gestisce il comportamento locale, controllando parametri come il system prompt, il limite massimo di token o l'impostazione della temperature. Il provider globale gestisce la connessione sicura. Questa separazione tra autenticazione e logica di esecuzione diventa fondamentale quando vuoi sperimentare. Immagina di avere una complessa prompt chain che attualmente alimenta un componente del modello OpenAI. Vuoi vedere se un modello Anthropic produce risultati migliori. Grazie all'astrazione globale, ti basta semplicemente trascinare il nuovo componente Anthropic sul canvas. Colleghi la tua sequenza di prompt esistente al suo input. Imposti la temperature desiderata sul nuovo nodo. Il provider globale gestisce automaticamente l'autorizzazione in background in base alle tue chiavi salvate. Elimini il vecchio nodo, e il tuo flow è subito pronto per essere testato. Non si rompe nulla nella tua prompt chain. Questo copre la configurazione del componente. Ora, guarda come passa i dati in avanti. Il componente Language Model offre una doppia capacità di output a seconda di cosa richiede effettivamente il resto del tuo flow. Di default, il componente emette una Model Response. Gli invii un prompt, il modello lo elabora e il componente restituisce una text string. Questo è il comportamento standard che usi quando crei un chatbot di base o un tool di riassunto. Il nodo riceve una request, genera la risposta e passa questa risposta finale al componente successivo. Tuttavia, a volte un componente a valle non ha bisogno della risposta. Ha bisogno dell'engine. Puoi cambiare il comportamento della porta di output, passando dall'emettere una risposta Message all'emettere un'istanza LanguageModel. Quando lo fai, il componente non valuta più il prompt e non invia testo. Invece, impacchetta il modello configurato stesso, insieme alle credenziali del provider e alle impostazioni della temperature, e passa quell'oggetto al nodo successivo. Questo è essenziale per architetture più avanzate. Se colleghi il tuo setup a una retrieval chain complessa, quella chain deve eseguire le sue query interne per cercare in un database in base alla cronologia della conversazione. Non può farlo se le passi solo una risposta di testo statica. Richiede un engine live per eseguire i propri task di generazione del testo. Passando l'istanza LanguageModel, fornisci al nodo a valle un tool completamente configurato che può usare ripetutamente per generare i prompt specifici di cui ha bisogno. Il componente non è solo una chiamata API hardcoded. È un container flessibile che separa le tue credenziali dalla tua logica, permettendoti di scegliere se la tua applicazione ha bisogno di una risposta finale o di un execution engine. Questo è tutto per questo episodio. Grazie per l'ascolto, e continua a sviluppare!
5

Motori di esecuzione intelligenti

4m 04s

Questo episodio copre il componente Agent e il suo ruolo come motore di ragionamento autonomo. Gli ascoltatori impareranno come le capacità di memoria integrate consentono un processo decisionale dinamico che va oltre i semplici prompt statici.

Download
Ciao, sono Alex di DEV STORIES DOT EU. Langflow, episodio 5 di 15. Cosa distingue un chatbot statico da un vero motore di ragionamento? La capacità di decidere autonomamente i propri step successivi. Se il tuo flow si basa interamente su prompt chain hardcoded, fallirà nel momento in cui un utente farà una domanda di follow-up inaspettata. È qui che entrano in gioco gli Intelligent Execution Engine, in particolare il componente Agent. Molti sviluppatori inseriscono un normale nodo Language Model sul canvas e si aspettano che si comporti come un assistente intelligente e context-aware. Non è così. Un nodo Language Model standard è essenzialmente una calcolatrice text-in, text-out. Gli passi una string, e lui ti restituisce una string basata esclusivamente su quel singolo input. Un componente Agent è fondamentalmente diverso. È un motore di ragionamento autonomo. Invece di limitarsi a eseguire un singolo prompt, un Agent valuta il contesto corrente, decide una sequenza di azioni e determina autonomamente i propri step di esecuzione per raggiungere un obiettivo. Quando un utente invia un messaggio a un Agent, il componente non genera immediatamente la risposta finale. Entra in un loop di ragionamento interno. Analizza l'input, verifica il proprio state interno e formula un piano. Questa fase di pianificazione consente all'Agent di strutturare risposte complesse o di rendersi conto di dover valutare le interazioni passate prima di procedere. Questo ci porta alle capacità di memoria integrate del componente Agent. Un nodo Language Model standard soffre di amnesia. Ogni richiesta è una tabula rasa. Se un utente chiede qual è la capitale della Francia, e poi fa una domanda di follow-up chiedendo quale sia la popolazione "lì", un nodo standard non saprà cosa significhi la parola "lì". Dovresti costruire manualmente un sistema per catturare, memorizzare, formattare e iniettare la cronologia della chat precedente in ogni nuovo prompt. Il componente Agent risolve questo problema in modo nativo. Mantiene automaticamente una context window attiva delle domande precedenti dell'utente e delle risposte precedenti del sistema. Quando arriva quella seconda domanda sulla popolazione, l'Agent intercetta la richiesta. Prima di generare una risposta, esegue una query sulla sua memoria integrata. Recupera il contesto della prima domanda, ricostruisce la cronologia della conversazione e deduce che la località in questione è Parigi. Esegue questa valutazione contestuale in completa autonomia. Non devi collegare nodi di memoria separati, fare il parsing delle string di cronologia, o costruire complessi loop di iniezione della cronologia sul tuo canvas. L'Agent gestisce internamente la natura stateful della conversazione. Decide quando consultare la cronologia, quanta parte di essa è rilevante per la query corrente e come utilizzare tale contesto storico per modellare il suo output successivo. Questo cambiamento modifica il modo in cui progetti i flow. Non stai più mappando ogni possibile ramo di una conversazione. Stai fornendo a un motore intelligente i parametri di cui ha bisogno per gestire la conversazione stessa. Il componente si fa carico dello state management e della context resolution. La vera potenza del componente Agent risiede in questa autonomia. Passando da language model statici a un Agent, deleghi il control flow al motore stesso. Il sistema non è più una pipeline rigida, ma un'entità dinamica in grado di mantenere lo state, ricordare le interazioni passate e adattare il proprio ragionamento al volo per soddisfare l'intento dell'utente. Vorrei prendermi un momento per ringraziarti per l'ascolto: ci aiuta tantissimo. Buona giornata!
6

Equipaggiare gli Agent con la Tool Mode

3m 37s

Questo episodio copre le meccaniche della Tool Mode, che converte componenti inerti in funzioni azionabili per gli agent. Gli ascoltatori impareranno come configurare le descrizioni dei tool per guidare perfettamente il processo decisionale dell'agent.

Download
Ciao, sono Alex di DEV STORIES DOT EU. Langflow, episodio 6 di 15. Potresti pensare che creare un tool per un agent richieda di scrivere wrapper Python personalizzati o di cercare in una library dei tool node specializzati. Non è così. Quasi ogni component già presente sul tuo canvas può essere convertito in una funzionalità attiva con un solo clic. Oggi vedremo come dotare gli agent del Tool Mode. Un errore comune è pensare che servano dei component tool dedicati e hard-coded per alimentare un agent. In Langflow, il Tool Mode è una feature integrata direttamente nei node standard. Che tu stia lavorando con un API caller, un database retriever o un node di text processing, puoi passarlo in Tool Mode. Quando attivi questo toggle su un component, la sua interfaccia cambia. Le output port standard che normalmente collegheresti allo step successivo di una chain lineare scompaiono. Al loro posto, il component espone una singola output port di tipo Tool. Prendi questo nuovo output Tool e lo colleghi direttamente alla input port Tools di un component Agent. Uno step di processing inerte diventa così un'utility che l'agent può triggerare on demand. Trasformare il component in un tool è solo lo step meccanico. L'agent deve ancora sapere come usarlo. Quando abiliti il Tool Mode, sul node compare un pulsante chiamato Edit Action. Cliccandoci sopra, vedrai tre campi di configurazione. Il primo campo è lo Slug. Si tratta di un identificatore machine-readable, solitamente formattato con underscore al posto degli spazi. Il secondo è il Name, un titolo standard human-readable. Il terzo campo è la Description. Questa è la parte che conta. Il campo Description non è documentazione per il developer. È il prompt di testo letterale che il Large Language Model legge per determinare se triggerare questo specifico tool. Se la tua description è vaga, l'agent cercherà di indovinare quando usarlo, portando a comportamenti imprevedibili e token sprecati. Prendi come esempio un component Web Search. Normalmente, prende in input una string e restituisce i risultati di ricerca. Se attivi il Tool Mode su questo node, diventa un tool per l'agent. Ora, apri il menu Edit Action. Se scrivi una description generica come "searches the web", l'agent potrebbe triggerare una ricerca per domande fattuali di base che ha già nei suoi dati di training. Invece, scrivi una description molto restrittiva. Definisci le condizioni esatte. Scrivi: "Usa questo tool esclusivamente per cercare breaking news, eventi di attualità o meteo in real-time". L'agent fa il parsing di quella frase esatta durante il suo ciclo di reasoning. Valuta il prompt rispetto alla tua description, assicurandosi che il node Web Search si attivi solo quando l'utente chiede notizie recenti. Puoi scalare tutto questo abilitando il Tool Mode su diversi component. Ti basta collegare tutte le loro output port Tool al singolo input Tools sul node agent. L'agent esamina le description di ogni tool collegato, seleziona quello giusto, lo esegue e sintetizza i dati restituiti per formulare la sua risposta finale. La logica sottostante del node è completamente invisibile all'agent. L'unica cosa che controlla il processo decisionale del tuo agent è la precisione delle description dei tuoi tool. Grazie per averci seguito. Alla prossima!
7

Composizioni Multi-Agent

3m 19s

Questo episodio copre la strategia architettonica di annidare i sub-flow e utilizzare agent secondari come tool. Gli ascoltatori impareranno come costruire sistemi multi-agent gerarchici per l'instradamento di task complessi.

Download
Ciao, sono Alex di DEV STORIES DOT EU. Langflow, episodio 7 di 15. Costringere un singolo language model a gestire contemporaneamente il routing di base e un'analisi dati pesante di solito si traduce in risposte lente e costi API elevati. La soluzione è suddividere il carico cognitivo, ed è qui che entrano in gioco le composizioni multi-agente. Molti considerano i flow di Langflow strettamente come endpoint isolati. Chiami un'API, ricevi una risposta e l'esecuzione termina. Questo è un malinteso. I flow non sono solo applicazioni top-level; possono essere embedded gerarchicamente. Pensa a un sistema per il parsing delle richieste utente. Configuri un agente di routing primario usando un modello veloce ed economico. Il suo unico compito è capire cosa vuole l'utente. Quando un utente chiede di analizzare un enorme report finanziario, l'agente primario non processa il documento in prima persona. Invece, colleghi un agente secondario direttamente nel tool input dell'agente primario. Questo agente secondario fa girare un modello completamente diverso con una context window molto più grande, specializzato specificamente per la data extraction. Il routing si basa interamente sulla tool description. Quando colleghi l'agente secondario, devi fornire una chiara descrizione testuale di cosa fa. L'agente primario legge questa descrizione insieme al prompt dell'utente. Quando una richiesta fa match con la descrizione, l'agente primario ferma la propria generazione, impacchetta il context rilevante e invoca l'agente secondario. Per l'agente primario, questo complesso setup secondario sembra una singola funzione. L'agente secondario esegue il proprio reasoning loop, processa il grande documento e restituisce il testo finale all'agente primario, che poi risponde all'utente. Puoi spingere questa astrazione ancora oltre usando un intero flow come tool. Potresti creare un flow sofisticato che fa scraping di un sito web, estrae il testo, lo formatta e ne valuta l'output. Una volta creato, lo salvi. In un progetto completamente diverso, trascini un componente Flow Tool sul canvas e selezioni il tuo flow salvato. Quando porti un flow in un altro workspace, definisci componenti di input e output specifici all'interno di quel child flow. Il parent agent mappa i suoi tool argument direttamente a quegli input definiti. Esegue il child flow, aspetta che il componente di output finale venga triggerato, e recupera il testo risultante risalendo la chain. Langflow è costruito su un'architettura a grafi basata su nodi. Grazie a questa struttura, l'engine permette la composizione ricorsiva. Un intero grafo può essere incapsulato e trattato come un singolo nodo all'interno di un grafo più grande. L'agente primario non ha alcuna consapevolezza della complessità annidata. Vede semplicemente un tool chiamato scrape_and_evaluate che prende un URL e restituisce un summary. La potenza della composizione multi-agente è l'astrazione. Ti permette di nascondere reasoning loop complessi e multi-step dietro una singola tool call, mantenendo la tua logica di routing primaria pulita e prevedibile. Se vuoi supportare lo show, puoi trovarci cercando DevStoriesEU su Patreon. Grazie per l'ascolto. Statemi bene, tutti.
8

Il client Model Context Protocol

3m 42s

Questo episodio copre il componente MCP Tools e la sua capacità di connettere tool server esterni direttamente ai tuoi agent. Gli ascoltatori impareranno come il Model Context Protocol sostituisce i classici wrapper REST API per il contesto degli agent.

Download
Ciao, sono Alex di DEV STORIES DOT EU. Langflow, episodio 8 di 15. I giorni in cui dovevi scrivere wrapper API custom per ogni nuova data source sono finiti. Non devi più mappare manualmente gli endpoint, formattare gli header e parsare il JSON raw solo per permettere a un agent di leggere una pagina web o interrogare un database locale. Questa frizione viene eliminata dal Model Context Protocol Client. Spesso si confonde tutto questo con le integrazioni REST API standard. Non è un nodo generico per le request HTTP in cui devi configurare il payload a mano. Il Model Context Protocol, o MCP, è uno standard aperto progettato specificamente per fornire context e funzioni eseguibili ai modelli AI. È un linguaggio universale per il tool use. In questa architettura, Langflow opera come MCP Client. Si connette a un MCP Server esterno, gli chiede quali capability offre e le espone. Puoi ottenere questo risultato usando il componente MCP Tools. Ti basta trascinare questo componente sul tuo canvas e collegare il suo output direttamente al tools input di un componente Agent. Una volta stabilita la connessione, Langflow riceve uno strict schema che definisce i tool, le loro descrizioni e i parametri richiesti. Li traduce automaticamente in tool nativi. L'agent sa intrinsecamente come formattare i dati e triggerare le funzioni esterne. Per stabilire questa connessione, devi selezionare un metodo di transport. Il componente MCP Tools supporta due opzioni: HTTP tramite Server-Sent Events, e STDIO. HTTP è la scelta giusta per i server remoti che girano in modo sicuro su un'altra macchina. Ti basta fornire l'URL dell'endpoint. STDIO viene usato quando vuoi che Langflow esegua un processo locale e comunichi tramite gli stream di standard input e output. Vediamo uno scenario concreto usando STDIO. Mettiamo che tu voglia far riassumere al tuo agent delle tech news direttamente da URL esterni. Puoi usare un tool pre-built chiamato fetch MCP server. Nel tuo componente MCP Tools, imposta il transport su STDIO. Imposta il command su uvx, un tool Python che scarica e fa girare i pacchetti in ambienti isolati. Nel campo arguments, inserisci mcp dash server dash fetch. Collega l'output del componente al tuo agent. Quando fai un prompt all'agent per riassumere un articolo specifico, l'agent chiama nativamente il fetch tool. Manda in stream l'URL di destinazione tramite STDIO al background process isolato, legge il testo restituito dalla pagina web e genera il tuo riassunto. Non hai scritto assolutamente codice per realizzare questa integrazione. Molti tool richiedono autenticazione, come la password di un database o una API key privata. Il componente MCP Tools include un campo Environment Variables che accetta un dictionary di coppie key-value. Se interagisci con il tuo graph Langflow programmaticamente tramite l'API, puoi iniettare queste credenziali dinamicamente usando il dictionary tweaks. Ti basta puntare all'ID del componente MCP Tools e passare le environment variables in modo sicuro nel payload della tua request. Il vantaggio decisivo dell'MCP Client è il decoupling totale. Fai il deploy di una capability esterna una sola volta, in qualsiasi linguaggio di programmazione, e dai all'istante a qualsiasi agent Langflow l'accesso nativo, senza mai alterare la logica del graph. Grazie per l'ascolto — ci sentiamo alla prossima.
9

Esporre i flow come server MCP

3m 31s

Questo episodio copre la trasformazione dei tuoi progetti Langflow in tool MCP universali per client esterni. Gli ascoltatori impareranno come configurare trasporti HTTP streamable e creare descrizioni robuste dei tool per IDE remoti.

Download
Ciao, sono Alex di DEV STORIES DOT EU. Langflow, episodio 9 di 15. Scrivi una pipeline AI personalizzata e vuoi che il tuo editor di codice la esegua nativamente come tool integrato. Fai una domanda al tuo IDE e questo attiva senza problemi il complesso retrieval system che hai creato ieri. Esporre i flow come server MCP rende tutto questo possibile. Innanzitutto, dobbiamo chiarire cosa sia effettivamente un server MCP. A volte gli ascoltatori lo confondono con un endpoint di deploy standard utilizzato per fare da backend a un'applicazione web. Ma non è così. Il Model Context Protocol, o MCP, è un metodo standardizzato per fornire funzionalità direttamente ad altri agenti AI. Un endpoint standard fornisce dati a un'interfaccia utente. Un server MCP fornisce tool a un reasoning engine. Langflow ti permette di trasformare automaticamente qualsiasi progetto in un server MCP. Quando lo fai, l'intero flow viene impacchettato come tool eseguibile. Per comunicare con i client esterni, Langflow utilizza un meccanismo di transport HTTP in streaming, basato in particolare sui Server-Sent Events. Ciò significa che il tuo client esterno si connette tramite protocolli web standard e può ricevere risposte in streaming direttamente dal tuo flow senza richiedere complesse configurazioni di rete locali. La configurazione tecnica è semplice, ma c'è un requisito fondamentale che devi assolutamente rispettare. Devi definire il nome e la descrizione del tool. Quando un agente esterno si connette al tuo server MCP di Langflow, richiede un elenco dei tool disponibili. L'agente utilizza le descrizioni fornite per decidere quale tool chiamare e quando farlo. Se lasci la descrizione di default o scrivi qualcosa di vago, l'agente esterno la ignorerà. Devi scrivere la descrizione come un'istruzione precisa per l'agente AI. Stai a tutti gli effetti facendo prompting al sistema esterno su come usare il tuo flow. Vediamo uno scenario specifico. Crei un flow di Document QA in Langflow che cerca all'interno di un documento sull'architettura aziendale interna. Vuoi che l'agente locale del tuo editor Cursor interroghi nativamente questo documento. Esponi il flow come server MCP. Chiami il tool query company architecture e imposti la descrizione per indicare che cerca nel documento interno sull'architettura aziendale per rispondere a domande tecniche sui servizi di backend. A questo punto, configuri Cursor per connettersi al tuo URL MCP di Langflow. Ora, stai scrivendo codice in Cursor e chiedi all'agente come funziona il sistema di autenticazione. Cursor controlla i suoi server MCP connessi, legge la tua descrizione specifica e si rende conto che il tuo tool Langflow è esattamente ciò di cui ha bisogno. Cursor passa la tua domanda come argomento al tool. Langflow riceve la richiesta tramite il transport HTTP, esegue l'intero flow di Document QA e invia la risposta in streaming direttamente nel tuo editor. Il tuo IDE ha appena utilizzato un progetto Langflow complesso come funzione nativa. Il successo di un'integrazione MCP dipende interamente dalla qualità del prompt che nascondi nella descrizione del tool. Se l'agente esterno non riesce a capire la descrizione, il tuo tool di fatto non esiste. Questo è tutto per questo episodio. Grazie per l'ascolto e continua a sviluppare!
10

Gestione dello stato e delle sessioni

3m 35s

Questo episodio copre la persistenza della memoria e il rigoroso isolamento delle sessioni attraverso i turni di chat. Gli ascoltatori impareranno a distinguere tra la memoria dell'Agent e il componente Message History per un tracciamento lineare e robusto delle conversazioni.

Download
Ciao, sono Alex di DEV STORIES DOT EU. Langflow, episodio 10 di 15. Se due utenti parlano con la tua applicazione AI esattamente nello stesso momento, come fa il sistema a evitare di dare le risposte di un utente all'altro? La risposta sta nel modo in cui isoli i thread, ed è esattamente quello che fa lo State e Session Management. Innanzitutto, chiariamo un punto di confusione molto comune. Dobbiamo tracciare una linea netta tra chat memory e vector memory semantica. La vector memory consiste nel salvare i documenti come embeddings e recuperarli in base al significato. Non ne parleremo qui. La chat memory è semplicemente il log lineare e cronologico di una conversazione. È il meccanismo che permette al language model di ricordare cosa ha detto l'utente tre messaggi fa. Di default, Langflow salva questa message history lineare localmente usando un database SQLite. Ogni volta che un messaggio passa attraverso il sistema, viene registrato. Ma un database pieno di messaggi è inutile se il sistema non sa quale messaggio appartiene a chi. È qui che entra in gioco il session ID. Il session ID è una string univoca che lega insieme una sequenza di interazioni. Quando usi l'interfaccia di Langflow, il sistema genera automaticamente un session ID per te dietro le quinte. In produzione, probabilmente interagirai con Langflow tramite la sua API. Se hai due utenti distinti che interagiscono simultaneamente con il tuo server, devi passare un session ID specifico per ciascuno nella tua API request. Una pratica standard è usare lo user ID univoco del tuo database come session ID di Langflow. Quando il tuo primo utente invia un messaggio, passi il suo ID specifico. Langflow fa una query al database SQLite per quell'esatta string, estrae solo la sua history, la aggiunge al prompt e genera una risposta. Quando il tuo secondo utente interagisce un millisecondo dopo con il proprio ID, Langflow esegue esattamente lo stesso processo in completo isolamento. Se non passi un session ID nella tua API call, Langflow tratta l'interazione come un evento completamente nuovo. Il context si perde completamente. Per mantenere il thread, la tua applicazione esterna deve inviare quell'identificatore con ogni singola richiesta. Il modo in cui esponi questa history al language model dipende interamente dai componenti che scegli. Langflow offre due approcci distinti. Se usi un componente Agent standard, il memory management è già integrato. L'Agent gestisce automaticamente la lettura e la scrittura sul database SQLite usando il session ID attivo. Non devi collegare nulla di extra per fargli ricordare la conversazione. Gli Agent sono altamente astratti, quindi se stai costruendo una custom chain da zero usando componenti base e raw prompt, quella memoria integrata non esiste. È qui che usi il componente dedicato Message History. Inserisci questo componente nel tuo flow e colleghi il suo output a una variabile nel tuo componente Prompt. Quando il flow viene eseguito, il componente Message History prende il session ID attivo, recupera il log cronologico pertinente dal database e lo formatta come testo. Questo passa fisicamente il dialogo memorizzato nella context window prima ancora che il language model lo veda. Controllare il session ID a livello di API è il requisito in assoluto più critico per scalare un'interfaccia conversazionale, perché legare lo state strettamente a un identificatore passato garantisce un isolamento completo tra qualsiasi numero di utenti simultanei. Questo è tutto per questo episodio. Grazie per l'ascolto, e continua a costruire!
11

Grounding dell'LLM con i Vector Store

3m 23s

Questo episodio copre le best practice architettoniche per costruire pipeline di Retrieval Augmented Generation. Gli ascoltatori impareranno come disaccoppiare l'ingestione asincrona dei dati dalla ricerca semantica in tempo reale.

Download
Ciao, sono Alex di DEV STORIES DOT EU. Langflow, episodio 11 di 15. L'errore più grande che gli sviluppatori commettono quando implementano la Retrieval Augmented Generation è combinare la lenta indicizzazione dei dati e il chat retrieval in tempo reale in un'unica pipeline. Ogni volta che l'utente fa una domanda, il sistema cerca di rileggere un PDF di cento pagine. La soluzione è fare grounding dell'LLM con i Vector Store usando un'architettura disaccoppiata. È incredibilmente comune collegare tutti i tuoi componenti su un unico canvas. Colleghi un file loader a un text splitter, lo passi a un embedding model, lo inserisci in un vector store e lo colleghi direttamente a una chat interface. Questo crea un enorme bottleneck. La data ingestion e il chat retrieval sono eventi del lifecycle completamente diversi. Non dovrebbero trovarsi nello stesso execution path. L'architettura RAG standard in Langflow separa questo processo in due flow distinti. Per prima cosa, hai il subflow di ingestion. È qui che avvengono le operazioni più pesanti. Prendi i tuoi documenti sorgente, come dei grandi file PDF, e li passi attraverso un document loader. Un text splitter poi suddivide i documenti in parti più piccole. Quando configuri il tuo text splitter, devi far corrispondere la dimensione dei tuoi chunk ai token limit massimi dell'embedding model che hai scelto. Se la dimensione del tuo chunk supera quel limite, l'embedding model troncherà silenziosamente il testo. Le frasi finali vengono ignorate e quei dati mancanti non arriveranno mai nel tuo vector database. Una volta che il testo è diviso correttamente in chunk, lo passi a un embedding component per generare i vettori. Infine, quei vettori vengono salvati in una collection specifica all'interno del tuo vector store component. Questo intero ingestion flow viene eseguito quando i dati cambiano, in modo completamente indipendente dalla user interface. Ora, il secondo elemento di questa architettura è il retrieval flow. Questa è la parte conversazionale rivolta all'utente. Dato che l'indicizzazione pesante è già stata fatta altrove, questo flow rimane veloce e reattivo. Inizia con un chat input che cattura la domanda dell'utente. Quella domanda viene passata a un embedding component. Devi configurare questo componente per usare esattamente lo stesso embedding model che hai usato durante la fase di ingestion. Se indicizzi i dati con un modello e fai una query con uno diverso, il vector store non riuscirà a trovare nessuna corrispondenza rilevante. Il vector store component in questo flow è configurato per cercare nell'esatta database collection che hai popolato prima. Prende l'embedded user question, esegue una similarity search sui dati precaricati e restituisce i chunk di testo più rilevanti. A questo punto instradi quei chunk recuperati, insieme alla domanda originale dell'utente, in un componente prompt template. Quel prompt arricchito viene infine inviato al language model, che formula la risposta. Dividendo la tua implementazione RAG in un write flow asincrono per i documenti e un read flow veloce per la chat, proteggi la tua chat interface dai ritardi di elaborazione del backend. La regola d'oro dell'architettura RAG è che una user query dovrebbe attivare solo una ricerca, mai un indexing job. Questo è tutto per questo episodio. Grazie per l'ascolto, e continua a sviluppare!
12

Estendere il motore tramite Python

3m 30s

Questo episodio copre la creazione di base di componenti Python personalizzati all'interno del framework. Gli ascoltatori impareranno come le rigorose annotazioni a livello di classe mappano la logica del codice interno ai nodi visivi della UI.

Download
Ciao, sono Alex di DEV STORIES DOT EU. Langflow, episodio 12 di 15. La programmazione visuale ti fa fare il novanta percento del percorso, ma inevitabilmente sbatti contro un muro. Devi eseguire della business logic proprietaria o connetterti a un'API interna custom, e i node pre-built semplicemente non bastano. Estendere l'engine tramite Python sblocca quel dieci percento finale di controllo assoluto. È facile pensare che un custom component sia solo un normale script Python che butti in una directory. Non è così. Un custom component richiede una configurazione rigorosa a livello di classe. Senza questa struttura specifica, l'engine di Langflow non ha idea di come renderizzare il tuo node nel visual editor o di come collegare i suoi dati all'execution graph. Il visual node e la logica di backend sono strettamente legati. Per creare un custom component, inizi sempre creando una subclass della classe base Component fornita da Langflow. All'interno di questa nuova classe, non scrivi un metodo di inizializzazione standard per raccogliere le variabili. Invece, definisci due array rigorosi: inputs e outputs. Vediamo uno scenario pratico. Supponiamo che tu stia creando un custom component Text Analyzer che calcola il conteggio delle parole e restituisce un oggetto Data strutturato al graph. Per prima cosa, configuri l'array inputs. Popoli questo array usando delle classi di input specializzate fornite da Langflow. Per il Text Analyzer, ti serve una string di testo, quindi inserisci un oggetto text input nell'array e gli dai un nome. Questa è la parte importante. Dichiarando una specifica classe di input nel tuo codice Python, stai dettando la visual interface. Langflow legge quell'array e genera automaticamente un text field sul tuo node nell'editor drag-and-drop. Se aggiungessi un oggetto integer input a quello stesso array, la UI renderizzerebbe all'istante un number spinner. Definisci i requisiti dei dati nel codice, e l'engine costruisce la user interface per te. Una volta definiti gli inputs, configuri l'array outputs. Questo dice esplicitamente al graph circostante quale data type produrrà il tuo node. Per il Text Analyzer, vogliamo passare il nostro risultato lungo la chain, quindi aggiungi un oggetto Data output all'array. La configurazione di output fa un'altra cosa fondamentale. Mappa il visual output handle a un metodo di esecuzione primario all'interno della tua classe. Stai dicendo esplicitamente all'engine quale funzione Python eseguire quando il node successivo richiede i dati. Il passaggio finale è scrivere quel metodo di esecuzione mappato. È qui che risiede la tua logica Python standard. Il metodo riceve automaticamente i valori che i tuoi inputs hanno raccolto dalla UI. Prendi la string di testo in ingresso, fai lo split e conti le parole. Poi, dato che il graph si aspetta un formato standardizzato, wrappi il tuo integer finale in un oggetto Data di Langflow e lo restituisci. La struttura impone una netta separazione. L'array inputs costruisce l'interfaccia e raccoglie i dati, il metodo di esecuzione li elabora, e l'array outputs li restituisce al visual graph. Questo è tutto per questo episodio. Grazie per l'ascolto, e continua a sviluppare!
13

Hook dei componenti ed esecuzione avanzata

3m 52s

Questo episodio copre il ciclo di vita del motore di esecuzione interno e le tecniche avanzate di condivisione dello stato. Gli ascoltatori impareranno a sovrascrivere i setup hook e a utilizzare i dizionari di contesto per la persistenza di stati complessi.

Download
Ciao, sono Alex di DEV STORIES DOT EU. Langflow, episodio 13 di 15. Potresti pensare a un node come a una semplice black box dove entrano i dati, viene eseguita una funzione, escono i dati e il node dimentica tutto all'istante. Ma cosa succede quando la tua pipeline richiede a un node di inizializzare una connessione complessa al database o di tenere traccia di quanti item ha appena elaborato prima di restituire un risultato? Questo richiede di andare oltre le semplici funzioni e di utilizzare hook e meccanismi di execution avanzati per i component. Spesso si pensa che i component siano operazioni strettamente stateless che si limitano a valutare gli input. Non è così. Un component è un'istanza di una classe Python e attraversa uno specifico lifecycle gestito dall'execution engine interno. Durante questo lifecycle, il component può mantenere uno state interno, orchestrare setup complessi e condividere dati tra i suoi metodi interni. Quando Langflow triggera un component, l'engine avvia una sequenza precisa. Per prima cosa, prima che inizi qualsiasi generazione di output, l'engine cerca un hook interno chiamato pre run setup. Fai l'override di questo metodo quando il tuo component deve eseguire operazioni pesanti prima che parta la logica principale. Se il tuo component deve autenticarsi con un'API esterna, caricare in memoria un modello di machine learning di grandi dimensioni o impostare delle variabili locali, inserisci questa logica all'interno dell'hook di setup. Una volta completato il setup, l'engine passa alla fase di execution chiamando l'hook di run. È qui che risiede il tuo payload principale e dove avviene il vero e proprio data processing. Separare la logica di setup da quella di execution mantiene il tuo codice organizzato e previene operazioni ridondanti. Questo però solleva un'immediata questione tecnica: come passi un client API autenticato o una variabile locale dall'hook di setup a quello di run? Usi il context dictionary. Ogni custom component ha un attributo chiamato self dot ctx. È un dictionary collegato direttamente all'istanza del component. Funge da banco di memoria dedicato per tutta la durata della run di quello specifico component. Tutto ciò che colleghi a questo context dictionary durante la fase di setup è immediatamente disponibile quando l'engine passa alla fase di run. Vediamo uno scenario pratico in cui questa condivisione dello state è necessaria. Immagina un custom component che elabora uno stream di documenti in entrata e deve restituire in output sia il testo ripulito, sia un conteggio finale di quanti documenti sono stati modificati con successo. Per prima cosa, fai l'override dell'hook di pre run setup. All'interno di questo metodo, accedi al context dictionary e crei una variabile contatore, impostando il suo valore iniziale a zero. Qui potresti anche inizializzare la tua library di pulizia del testo e collegarla al context. Successivamente, l'engine triggera l'hook di run. Il tuo metodo fa un loop sui documenti in entrata. Per ogni documento che passa con successo attraverso la library di pulizia, accedi al context dictionary, recuperi il valore corrente del contatore e lo incrementi di uno. Dato che il context dictionary persiste tra queste diverse chiamate ai metodi del lifecycle, il tuo component mantiene in modo sicuro il suo state interno. Quando l'hook di run completa finalmente il suo loop, può restituire i documenti elaborati e recuperare il conteggio finale preciso direttamente dal context dictionary per passarlo al node successivo. Padroneggiare l'execution engine e i component hook sposta il tuo mindset dallo scrivere semplici script di pass-through al creare applicazioni robuste e indipendenti che gestiscono completamente i propri data lifecycle. Se vuoi contribuire a sostenere il podcast, puoi cercare DevStoriesEU su Patreon. Come sempre, grazie per l'ascolto. Ci vediamo al prossimo episodio.
14

L'API di Langflow e i Tweak dinamici

3m 42s

Questo episodio copre l'esecuzione programmatica dei grafi tramite la REST API. Gli ascoltatori impareranno come utilizzare l'Input Schema per iniettare override dei parametri a runtime senza alterare il flow sottostante.

Download
Ciao, sono Alex di DEV STORIES DOT EU. Langflow, episodio 14 di 15. Hai cinquanta clienti e ognuno di loro ha bisogno di una versione leggermente diversa del tuo agente di supporto AI. L'istinto è quello di duplicare il tuo graph cinquanta volte, sostituendo il system prompt o la API key in ognuno. È un incubo per la manutenzione. Ti serve un solo graph, e puoi gestire le variazioni al volo usando la API di Langflow e i tweaks dinamici. Quando crei un graph nell'interfaccia visiva, i parametri all'interno dei tuoi componenti sono fissi. È facile pensare che per modificare una variabile minore, come un'impostazione di temperature o un'istruzione di sistema, tu debba clonare l'intero flow. Non è così. I tweaks risolvono questo problema dinamicamente a runtime, permettendoti di sovrascrivere i parametri dei componenti senza modificare il graph sottostante. Lo fai interagendo con Langflow in modo completamente headless tramite la sua REST API. Per eseguire un flow programmaticamente, invii una richiesta HTTP POST all'endpoint run, nello specifico slash v uno slash run, seguito dal tuo flow ID univoco. Il body di questa richiesta contiene i tuoi input standard, come ad esempio il messaggio di testo dell'utente. Insieme a questi dati di input, puoi includere un oggetto tweaks. Questo oggetto è un dizionario che mappa componenti specifici nel tuo graph ai nuovi valori che vuoi iniettare per quella singola esecuzione. Per puntare a un componente, ti serve il suo node ID. In Langflow, un node ID in genere è composto dal nome del componente e da una string casuale, come Prompt trattino a b c d e. Quando costruisci il tuo payload tweaks, usi esattamente questo node ID come chiave. Il valore è un altro dizionario che contiene i campi specifici che vuoi sovrascrivere. Immagina un flow di assistenza clienti di base usato su più siti web. Il graph contiene un componente Prompt che definisce come si comporta l'agente. Per il tuo cliente bancario, il prompt deve essere molto formale. Per il tuo cliente nel settore gaming, deve essere informale. Invece di mantenere due graph identici, il tuo server backend fa una chiamata API allo stesso identico flow ID. Nel payload della richiesta, specifichi il node ID di quel componente Prompt. Al suo interno, punti al campo template e passi le istruzioni formali per la banca. Più tardi, quando il sito web di gaming fa partire una chiamata, il tuo backend invia la stessa identica richiesta, ma sostituisce la string nel dizionario dei tweaks con le istruzioni informali. La logica di esecuzione è interamente sequenziale. Per prima cosa, prepari il tuo payload con la query dell'utente e il tuo dizionario tweaks specifico. Poi, invii la richiesta POST all'endpoint run. Langflow riceve la chiamata, applica temporaneamente i tuoi override ai nodi di destinazione ed esegue il graph. Restituisce l'output finale alla tua applicazione, mentre il flow originale salvato sul server rimane intatto. Non sei limitato ai prompt di testo. Puoi applicare un tweak a quasi qualsiasi cosa esposta nell'input schema di un componente. Puoi sostituire dinamicamente il nome del modello, regolare la temperature o iniettare credenziali del database diverse per ogni richiesta. Questo trasforma un graph visivo statico in una funzione di backend riutilizzabile e altamente flessibile. La capacità di separare la logica della tua applicazione dai tuoi dati di configurazione è ciò che rende l'esecuzione headless davvero scalabile in produzione. Grazie per averci seguito. Alla prossima!
15

Containerizzazione in produzione

3m 43s

Questo episodio copre la transizione dallo sviluppo visivo ai deployment in produzione headless. Gli ascoltatori impareranno come costruire Dockerfile, bloccare le dipendenze e montare componenti personalizzati in modo sicuro.

Download
Ciao, sono Alex di DEV STORIES DOT EU. Langflow, episodio 15 di 15. L'editor visuale è fantastico per creare la tua applicazione. Ma se fai il deploy di quella stessa interfaccia drag-and-drop sui tuoi server in produzione, stai consumando memoria e lasciando esposta la logica della tua applicazione. Quando è il momento del traffico di produzione, hai bisogno di un container backend leggero e headless. È esattamente ciò che tratteremo oggi con la containerizzazione in produzione. È incredibilmente comune vedere team che, una volta finito di creare un flow, fanno semplicemente il deploy dell'intera applicazione Langflow, user interface inclusa, su un server cloud. L'interfaccia serve solo per lo sviluppo. In un ambiente di produzione, non vuoi che nessuno faccia drag-and-drop dei nodi. Hai bisogno di un'API immutabile e sicura che si limiti a elaborare le richieste. Langflow offre una modalità specifica per gestire questa transizione. Quando avvii il servizio, usi un command flag chiamato backend-only. Questo dice a Langflow di disabilitare completamente il frontend React. Il server si avvia comunque, ma espone solo gli endpoint API necessari per far girare i tuoi flow. Questo riduce drasticamente il consumo di memoria. Inoltre, rafforza la sicurezza riducendo la superficie di attacco, garantendo che nessuno possa accedere visivamente o modificare la struttura dell'applicazione. Per pacchettizzare il tutto per il deploy, scrivi un Dockerfile. Parti da un'immagine base Python standard. Dato che Langflow si basa su tooling Python moderni, gestisci i tuoi pacchetti bloccando le dipendenze con UV. Prima di fare la build dell'immagine, esporti l'esatto albero delle dipendenze in un lockfile. All'interno del Dockerfile, usi questo lockfile per installare i tuoi pacchetti. Questo garantisce che il tuo container in produzione faccia girare esattamente le stesse versioni dei pacchetti che hai testato durante lo sviluppo. Poi, porti la logica della tua applicazione dentro l'immagine. In Langflow, la tua applicazione è fondamentalmente solo dati. Una volta finito di fare la build nell'editor visuale, esporti il tuo flow come file JSON. All'interno del tuo Dockerfile, copi questo file JSON direttamente nella struttura dell'immagine. Questa è la parte che conta per la logica custom. Molti flow complessi si basano su custom component, che sono piccoli script Python che hai scritto per gestire task specifici. Il JSON del flow fa riferimento a questi componenti, ma non contiene il vero e proprio codice Python. Devi copiare esplicitamente la directory che contiene i file dei tuoi custom component nell'immagine Docker. Poi imposti una variabile d'ambiente, istruendo il container su dove cercare esattamente quel path dei componenti quando il server si avvia. L'ultimo pezzo del Dockerfile è il comando di esecuzione. Questo comando lancia il modulo Langflow, passa il file path al tuo JSON del flow integrato, punta ai tuoi custom component e include il flag backend-only. Quando questo container si avvia, è completamente blindato. L'editor visuale non c'è più, la configurazione del flow è statica e le dipendenze sono fisse. Ti ritrovi con un'API headless veloce, pronta a ricevere prompt e restituire risposte. La cosa più importante da capire è che il tuo ambiente di sviluppo e il tuo runtime di produzione sono fondamentalmente diversi. Fai la build in modo visuale, ma fai il deploy in modalità headless. Dato che questo è l'ultimo episodio, ti incoraggio a tuffarti nella documentazione ufficiale e a provare a containerizzare un semplice flow da solo. Se hai idee su cosa dovremmo trattare nella nostra prossima serie, fai un salto su DEV STORIES DOT EU e faccelo sapere. Grazie per aver trascorso qualche minuto con me. Alla prossima, stammi bene.