Come ho esteso un sito Drupal esistente con agenti AI?
Il titolare di un laboratorio di stampa 3D non riusciva più a stare dietro alle richieste dei clienti. Il tempo non finiva nelle stampe. Finiva nel ricopiare un indirizzo sul portale di GLS, nel ritrovare in una chat di WhatsApp una misura mandata giorni prima, nell'aprire lo slicer solo per sapere quanto dura una stampa. Con questo problema è venuto da me.
Così ho analizzato il flusso di lavoro del laboratorio, dal primo messaggio del cliente al pacco consegnato, e l'ho spezzato in dodici operazioni. Sono partito da quelle che si ripetono a ogni ordine, e per ognuna ho scelto la tecnologia adatta: un agente deterministico, un agente AI, un'app per Mac.
Oggi al titolare restano tre operazioni: disegnare il pezzo, avviare la stampa, controllare il risultato. Sono il suo mestiere.
Al centro c'è Drupal 11, il CMS che il laboratorio già usava con i clienti, e resta l'unica fonte di ordini e stati. Ciò che arriva a un cliente o al pubblico parte dopo un sì del titolare.
Cosa fa Drupal per un cliente?
Drupal qui fa un e-commerce particolare: raccoglie requisiti, più che vendere da un catalogo. Il cliente racconta cosa gli serve, e molti pezzi nascono su misura per lui e restano privati. Nella sua pagina segue i passi della lavorazione: quali pezzi sono già stampati, cosa manca, il pagamento e il tracking della spedizione.
Drupal fissa l'accordo: ciò che il cliente ha chiesto resta scritto con le sue immagini, e ogni richiesta nuova diventa una riga nuova con il suo prezzo. Il pagamento passa fuori da Drupal e lo registra il titolare.
Il modello dati regge tutto il resto: una richiesta è un nodo, ogni riga è un paragrafo, e il pezzo è un nodo condiviso fra più richieste. Prezzo, colore, quantità e note stanno sulla riga. Al 5 novembre 2026 Drupal conteneva oltre 150 richieste da più di 70 clienti, circa 700 righe d'ordine e quasi 400 pezzi.
Dove andava il tempo del laboratorio?
Ogni ordine attraversava dodici passi, e il titolare li copriva tutti da solo:
| Passo | Cosa si faceva a mano |
|---|---|
| Requisiti | chiamate, messaggi WhatsApp, foto, schizzi e anteprime animate dei pezzi rimandati al cliente |
| Scheda | misure, note e accordi ricopiati in Drupal |
| Disegno | progetto in Fusion 360, esportazioni, aggiornamento di Drupal a ogni passo |
| Video | registrazione del pezzo da Fusion 360, quando c'era tempo |
| Tempi | lo slicer aperto per ogni pezzo e il tempo annotato |
| Batch di stampa | pezzi di ordini diversi con lo stesso filamento accorpati a mano per stamparli insieme |
| Stampa | macchina impostata e stampa avviata |
| Qualità | controllo del pezzo e ristampa quando serve |
| Social | foto e video del pezzo finito, qualche storia su Instagram |
| Spedizione | prenotazione del ritiro su GLS o su spedire.com, un broker che offre più corrieri senza un contratto diretto con ciascuno |
| Etichette | segnacollo e bolla dal programma di ogni corriere |
| Tracking | inserimento in Drupal e controllo della consegna |
Il passo più lento era il primo. Per disegnare un pezzo servono misure, foto e risposte del cliente, e una richiesta incompleta si ferma prima del preventivo. Prezzo e accordi finali scivolavano spesso su WhatsApp, lontano da Drupal.
Con quale regola ho diviso i compiti?
Per ogni operazione mi sono chiesto cosa serve per farla bene, e la risposta ha deciso la tecnologia.
| Se il compito… | va a… |
|---|---|
| si calcola | un agente deterministico, senza AI, provato con un test |
| richiede linguaggio su dati dei clienti | modello locale con RAG |
| richiede linguaggio rivolto al pubblico | il modello locale scelto per quel contenuto |
| passa da programmi del Mac, stampanti o siti senza API | un'app per Mac |
| arriva a un cliente o al pubblico | l'approvazione del titolare |
| richiede l'occhio e la mano di chi stampa | il titolare |
La regola mette l'AI dove serve linguaggio e un agente deterministico dove serve un risultato sempre uguale. Il resto del lavoro è integrazione: collegare programmi, macchine e servizi che esistevano già.
Chi fa cosa adesso?
Qui sotto vedi come il laboratorio gestiva le richieste prima e come le gestisce adesso. L'animazione parte da sola: con Riguarda la rivedi, con Velocità la rallenti.
La filiera, prima e adesso
Chi fa ogni passo, e quanto resta al laboratorio?
| Passo | Gruppo | Carico | Titolare | Agenti AI locali | Agenti deterministici | App per Mac | Drupal | Prima | Adesso |
|---|---|---|---|---|---|---|---|---|---|
| Requisiti | Raccolta | approvo | approva | Mora chiede | classifica | - | salva | Chiamate, WhatsApp, foto, schizzi e anteprime animate: si raccoglieva tutto a mano. | Mora raccoglie i requisiti su WhatsApp con un modello locale, un agente deterministico classifica le risposte e ogni messaggio parte dopo il sì del titolare. |
| Scheda | Raccolta | delegato | - | Mora compila | - | mostra | salva | Misure, note e accordi ricopiati in Drupal. | Mora scrive la scheda tecnica, e il pannello della segretaria nell'app la mostra al titolare quando progetta. |
| Disegno | Progetto | a mano | disegna | - | - | esporta | salva i file | Progetto in Fusion 360 ed esportazioni una per una. | Il progetto resta al titolare. L'app prende STL e STEP da Fusion 360 e li salva sul pezzo, unica fonte dei file. |
| Video | Progetto | delegato | - | - | genera | - | mostra | Il pezzo registrato da Fusion 360, quando c'era tempo. | Al salvataggio dell'STL il server genera da solo il video del pezzo, pronto per i social. |
| Tempi | Progetto | delegato | - | - | - | fa lo slicing | salva | Lo slicer aperto per ogni pezzo e il tempo annotato. | L'app passa il file a Bambu Studio o PrusaSlicer per lo slicing, e Drupal salva tempo e impostazioni per colore, marca e materiale. |
| Batch di stampa | Produzione | approvo | sceglie | - | Sambuco raggruppa | dispone | - | Pezzi di ordini diversi con lo stesso filamento accorpati a mano per stamparli insieme. | Sambuco raggruppa i pezzi per filamento con un calcolo, l'app li dispone sul piatto e il titolare sceglie quale stampare. |
| Stampa | Produzione | a mano | avvia | - | - | invia | - | Macchina impostata e stampa avviata a mano. | L'app manda il piatto alla stampante, e la stampa parte da un gesto del titolare. |
| Qualità | Produzione | a mano | controlla | - | - | - | registra | Controllo del pezzo e ristampa quando serviva. | Il controllo chiede occhio e mano, e resta al titolare. L'esito entra in Drupal con una foto per pezzo. |
| Social | Consegna | approvo | registra e approva | Ribes monta | - | compila il reel | - | Foto e video quasi mai, al massimo qualche storia su Instagram. | Il titolare registra il materiale grezzo e Ribes monta il video sul server. Quando il pacco parte, il cliente riceve il video del suo ordine e dà il suo parere. Il parere avvia la pipeline social: Ribes monta il reel, il titolare lo vede e lo approva, e il video va su TikTok, Instagram e Facebook. |
| Spedizione | Consegna | approvo | controlla | - | - | compila il corriere | dà l'indirizzo | Ritiro prenotato su GLS o sul broker spedire.com ricopiando l'indirizzo. | L'app compila le pagine di GLS e del broker spedire.com con i dati dell'ordine, e il titolare controlla prima di confermare. |
| Etichette | Consegna | approvo | preme | - | - | stampa | - | Segnacollo e bolla dal programma di ogni corriere. | L'app stampa il segnacollo sulla stampante di etichette e la bolla su quella normale, per ogni corriere, e il titolare preme «Prepara etichetta». |
| Tracking | Consegna | approvo | conferma | - | - | prende il codice | mostra | Tracking inserito a mano e consegna seguita a vista. | Quando il corriere rilascia il codice, l'app lo prende e lo inserisce nell'ordine dopo la conferma del titolare. Il cliente lo riceve su WhatsApp e per email, e lo segue nella sua pagina. |
Gli agenti girano su modelli locali, sul server del laboratorio. Ogni agente ha un ruolo, un compito e un limite scritto:
| Ruolo | Nome | Compito | Limite |
|---|---|---|---|
| Coordinatore | Mirtillo | riassume cosa va fatto, risponde a testo e a voce, dà gli avvisi | indirizza e informa, le decisioni restano al titolare |
| Produzione | Sambuco | calcola il piano del giorno e propone i piatti per filamento | gli stati degli ordini restano al titolare |
| Segretaria | Mora | raccoglie i requisiti su WhatsApp e prepara la scheda tecnica | invia dopo l'approvazione del titolare |
| Curatore del catalogo | Ginepro | tiene archivio dei file, tempi di stampa e proposte di copertina | propone, e Drupal applica |
| Social media manager | Ribes | monta i video dal materiale grezzo sul NAS e prepara le bozze | pubblica dopo l'approvazione del titolare |
Accanto agli agenti lavora un'app per Mac, scritta in Swift. È un involucro sottile: apre le pagine di Drupal in una finestra e aggiunge solo i collegamenti con i programmi e le macchine del laboratorio. Quando Drupal cambia, l'app mostra già la versione nuova, senza reinstallarla.
- File del pezzo: si collega a Fusion 360 ed esporta STL e STEP sul pezzo in Drupal, che diventa l'unica fonte dei file.
- Tempi e impostazioni: passa il file a Bambu Studio o PrusaSlicer per lo slicing, il passaggio in cui il software di stampa trasforma il modello 3D nelle istruzioni per la macchina. Drupal salva tempo e parametri per colore, marca e materiale.
- Batch di stampa: prende i pezzi proposti da Sambuco, anche di ordini diversi con lo stesso filamento, li dispone sul piatto nello slicer e li manda alla stampante.
- Stato della stampa: mostra a che punto è ogni piatto.
- Pannello della segretaria: mostra i requisiti raccolti da Mora quando il titolare si siede a progettare.
- Spedizione: compila le pagine di GLS e del broker spedire.com con i dati dell'ordine, e il titolare controlla prima di confermare.
- Etichette: stampa il segnacollo sulla stampante di etichette e la bolla sulla stampante normale, con lo stesso comando per ogni corriere.
- Tracking: quando il corriere rilascia il codice, l'app lo prende e lo inserisce nell'ordine dopo la conferma del titolare, e il cliente lo riceve su WhatsApp e per email.
- Social: compila il reel per ogni canale e lo porta all'approvazione del titolare.
Sul server, il salvataggio di un STL genera da solo il video del pezzo, che serve ai social.
Al titolare restano il progetto in Fusion 360, l'avvio della stampa, il controllo della qualità, il materiale grezzo per i social e le approvazioni.
Quali scelte ho verificato con i fatti?
Approvazione a mano invece di una soglia. La soglia automatica sembrava la soluzione più comoda, e l'ho scartata dopo averla misurata: il classificatore, cioè il modello che decide di che tipo è un messaggio, accompagna ogni risposta con un punteggio di sicurezza da 0 a 1. Quel punteggio stava quasi sempre fra 0,8 e 0,95 anche quando la risposta era sbagliata, quindi non serviva a separare le risposte giuste da quelle sbagliate. Una proposta ha identificativo, contenuto intero, autore e scadenza. Se il testo cambia, l'approvazione decade. Fa eccezione un solo caso: i messaggi di spedizione a testo fisso, approvati una volta per tutti gli invii.
Il piano di produzione è deterministico. Sambuco ordina per data di consegna, stato di stampa e tempo. Un calcolo deterministico si controlla con un test, e qui serve quello.
Un agente deterministico instrada, il modello scrive. Drupal usa la sua suite AI, che separa il CMS dal modello. Un gateway come LiteLLM collegherebbe fornitori diversi, locali o in cloud, come Anthropic, OpenAI e Google Gemini. Ho valutato il suo modulo Drupal e l'ho lasciato fuori, perché non è coperto dalle security advisory di drupal.org. Il gateway è il server del laboratorio: Drupal parla solo con lui, e lui smista le richieste ai modelli. Lì cambio modello e regole della chat quando serve, senza toccare Drupal. Il prezzo è un po' di lentezza, accettata in cambio del controllo. All'inizio l'instradamento lo decideva il modello, e i modelli locali sbagliavano sempre sugli stessi casi. Ora un classificatore sceglie fra voci chiuse, un workflow instrada e il modello scrive dentro il passo assegnato.
WhatsApp dall'API ufficiale. Ogni invio di Mora ha un conteggio con il costo stimato, e il tetto iniziale è di 10 euro al mese: raggiunto il tetto, Mora si ferma e avvisa il titolare.
Spedizioni dalle interfacce già in uso. GLS e il broker spedire.com offrono API a pagamento o assenti per un laboratorio di queste dimensioni. L'app compila le stesse pagine che il titolare compilava a mano, con indirizzi presi dall'ordine, e l'errore di battitura sparisce.
Una sola fonte per i file. STL e STEP stanno sul pezzo. Il 3MF prodotto dallo slicing appartiene alla stampa, perché cambia con colore, marca, materiale e stampante.
Cosa succede quando un agente sbaglia?
Un modello sbaglia, e il sistema è costruito perché l'errore non arrivi al cliente. Ogni messaggio verso un cliente o verso il pubblico è una proposta, e parte solo con il sì del titolare. Il modello sceglie fra voci chiuse e scrive dentro il passo assegnato, e un agente deterministico controlla il formato di ogni sua risposta.
Quando il titolare corregge una proposta, la coppia fra testo sbagliato e testo corretto entra nella memoria RAG comune. Alla richiesta simile successiva l'agente ritrova quella correzione e la usa come esempio. Il modello resta lo stesso: cambia ciò che ricorda.
I casi su cui un agente ha sbagliato diventano prove fisse, da rilanciare a ogni cambio di modello o di istruzioni. Ogni decisione registra modello, richiesta, risposta e chi l'ha approvata, così si interviene su un caso preciso.
Perché Drupal sta al centro di tutto?
Drupal è la fonte di verità e il collettore di tutto il sistema. Il Drupal del laboratorio aveva già un modello dati solido, e per questo non l'ho riscritto: l'ho trasformato in una piattaforma, con una dashboard nuova per il titolare, una PWA per telefono e computer e un collegamento al sistema locale degli agenti. Dentro Drupal stanno i fatti approvati, fuori sta il lavoro in corso:
- Ordini e stati esistono solo nel database Drupal.
- Agenti e app passano dalle interfacce di Drupal, che applicano permessi e regole.
- Una cache accelera una lettura, e in caso di differenza vale Drupal.
- Se Drupal è irraggiungibile, l'agente lo dice e mostra solo ciò che sa di certo.
Il sistema locale gira su un server del laboratorio: piccoli servizi Python, modelli serviti da Ollama e una memoria RAG comune, da cui ogni agente legge storico dei clienti, schede e fascicoli dei pezzi. Drupal sta su un hosting condiviso, e la connessione con il server è chiusa su più livelli, non con un controllo solo: ogni chiamata porta un certificato client in mTLS, il proxy davanti ai modelli lascia passare due sole operazioni e al massimo 30 richieste al minuto, e indirizzo e certificati stanno nelle impostazioni dell'ambiente, fuori dalla configurazione esportata. Sulla riga d'ordine entra un solo campo nuovo, il numero del fascicolo.
Dashboard, PWA e app per Mac mostrano le stesse pagine di Drupal. Non esiste un'app mobile separata né un secondo programma da aggiornare: il titolare cambia una pagina in Drupal, e la versione nuova compare su telefono, computer e Mac.
Da dove partire con un sito Drupal esistente?
Si parte dalla filiera, prima che dalla tecnologia. Questo è l'ordine che seguirei di nuovo:
- Scrivi ogni passo del lavoro, dal primo contatto alla consegna.
- Per ogni passo chiediti cosa serve: un calcolo, del linguaggio, un programma o una macchina, oppure l'esperienza di chi fa il lavoro.
- Assegna la tecnologia con quella risposta.
- Metti un'approvazione su ogni passo che arriva a una persona.
- Comincia dal passo in cui il lavoro si ferma, con esempi veri.
- Aggiungi il passo successivo quando il primo regge.
Questo è il primo articolo di una serie in cinque parti. Le successive entrano nel dettaglio di WhatsApp, della PWA e dell'infrastruttura:
- Come ho esteso un sito Drupal esistente con agenti AI (questo articolo)
- La raccolta requisiti con un agente su WhatsApp
- La PWA e il coordinatore come unico interlocutore
- L'infrastruttura dietro Drupal
- I numeri a progetto finito
Il metodo con cui ho scritto il codice è in Come lavoro con l'AI nello sviluppo.
Che cosa diventa un sito Drupal, quando lavora ogni giorno?
Un sito che racconta chi sei e cosa fai è il punto di partenza. Il valore arriva quando la stessa struttura diventa lo strumento che il titolare apre ogni mattina e lo alleggerisce delle cose che si ripetono. Con Drupal è stato possibile perché il modello dati c'era già: è bastato collegarlo al resto.
Questo progetto mi ha portato oltre il PHP di tutti i giorni. Gli agenti sono in Python, l'app per Mac è in Swift, e il linguaggio è diventato un dettaglio di implementazione. Conta la forma mentis dell'analisi: leggere un flusso di lavoro, spezzarlo in passi e scegliere per ognuno la tecnica giusta. Come riferimento ho usato paradigmi noti, quelli delle fonti qui sotto: workflow deterministici accanto agli agenti, la RAG come memoria comune, la sorveglianza umana su tutto ciò che arriva alle persone.
Lavori come questo cambiano alcuni mestieri, e il cambiamento arriva comunque, oggi o fra qualche anno. Preferisco accompagnarlo. Un'infrastruttura così è un supporto per chi fa del proprio mestiere un'arte: al titolare restano il disegno, la stampa e l'occhio sul pezzo finito, e il resto lo smistano gli agenti.
Fonti
- AI (Artificial Intelligence) (si apre in una nuova scheda), modulo Drupal
- AI Agents (si apre in una nuova scheda), modulo Drupal
- Building effective agents (si apre in una nuova scheda), Anthropic: workflow deterministici e agenti, e quando usare gli uni o gli altri
- Retrieval-Augmented Generation for Knowledge-Intensive NLP Tasks (si apre in una nuova scheda), Lewis e altri, 2020: l'articolo che ha introdotto la RAG
- LLM06: Excessive Agency (si apre in una nuova scheda), OWASP Top 10 per le applicazioni LLM: perché un agente non decide da solo
- Articolo 14 dell'AI Act, sorveglianza umana (si apre in una nuova scheda)
- Ollama (si apre in una nuova scheda), per i modelli locali
- LiteLLM, fornitori supportati (si apre in una nuova scheda)
- Security advisory policy (si apre in una nuova scheda) di drupal.org
- WhatsApp Business Platform (si apre in una nuova scheda)
Questo contenuto è stato prodotto dall'AI e rivisto da una persona.
Come è stata usata l'AI?
Le bozze sono prodotte con l'assistenza dell'AI, poi dirette, rivedute e verificate da una persona. Numeri, date e versioni sono confrontati con le fonti pubbliche prima della pubblicazione, e la data di quel controllo è indicata nel testo.