Agenti compositi: governance e affidabilità
Con Mastra e TypeScript l'AI valuta, il codice decide: sotto 80 punti la pratica si ferma. Agenti compositi con logica deterministica e governance verificabile.
Oltre l'hype: la necessità del controllo
Siamo ormai giunti alla fine del 2025 e la conversazione attorno all'Intelligenza Artificiale nelle aziende e nella Pubblica Amministrazione è definitivamente maturata. In pratica, è ormai consolidata la capacità generativa delle AI ("Wow, scrive una poesia!"). Oggi siamo nella fase dell'ingegnerizzazione e della responsabilità, quella che produce (o dovrebbe produrre) valore.
Affidarsi a un singolo modello (LLM) per gestire processi critici è un rischio da evitare quando si parla di produzione e affidabilità. Un LLM monolitico può creare problemi ed è, soprattutto, opaco. In contesti regolati dall'AI Act, dal GDPR e/o da rigide policy aziendali, il "black box" non è per niente consigliabile.
La soluzione è il passaggio ai sistemi ad Agenti Compositi: architetture dove molteplici intelligenze specializzate (modelli o componenti AI) collaborano, orchestrate da regole deterministiche scritte in codice e non (solo) in linguaggio naturale.
L'architettura della "responsabilità" (con Mastra)
Per dimostrare che la governance non è solo teoria, abbiamo rilasciato una demo tecnica pubblica basata su Mastra AI, un framework molto apprezzato per la sua capacità di unire la flessibilità degli LLM con il rigore di TypeScript. Il concetto alla base è semplice: dividere i compiti per mantenere il controllo. Nell'esempio (un flusso di validazione documentale per la PA), non esiste un unico "cervellone", ma tre agenti distinti:
- Classifier: Identifica il tema della richiesta (Welfare, Tasse, Urbanistica).
- Compliance Officer: Non scrive risposte, ma valuta. Assegna un punteggio (0-100) e lista i rischi.
- Approver: Genera la risposta ufficiale solo se autorizzato.
La barriera: una logica deterministica
Nel progetto demo, la decisione di approvare o respingere una pratica non è presa dall'AI, ma da una logica deterministica scritta in TypeScript all'interno del Workflow.
Guardiamo un estratto reale dal file src/workflow.ts del nostro progetto:
const governanceStep = createStep({ id: "governanceDecision", // Usiamo Zod per garantire che i dati siano strutturati inputSchema: z.object({ score: z.number(), riskFactors: z.array(z.string()), }), execute: async ({ inputData, getInitData }) => { const { score, riskFactors } = inputData; // GOVERNANCE DETERMINISTICA // Se lo score è inferiore a 80, l'AI NON PUÒ approvare. // Non importa quanto il modello sia "convinto": il codice vince. // Tuttavia, lo score è calcolato dalla AI questo può esser cambiato per renderlo ancora più robusto (in base ai casi) if (score < 80) { return { status: "REJECTED_MANUAL_REVIEW", message: `Governance Alert: Score ${score}/100 too low. Risks: ${riskFactors.join(", ")}`, score, riskFactors, }; } // Solo se il check passa, attiviamo l'agente di approvazione const approvalResponse = await approvalAgent.generate( `Request is compliant (Score: ${score}). Generate approval.` ); return { status: "APPROVED", message: approvalResponse.text, score, riskFactors, }; },});Perché questo approccio è migliore?
Analizzando il codice sopra e l'output della demo (trovate il file nel repository, link in fondo all'articolo), emergono alcune scelte proprie per uno sviluppo "tailor-made":
- Sicurezza dei tipi (Type Safety): Utilizzando zod, definiamo schemi rigidi. L'agente Compliance non può rispondere con un testo vago; è costretto a restituire un oggetto JSON con un numero (score) e un array di stringhe (riskFactors). Se non lo fa, il sistema genera un errore tecnico gestito, invece di una risposta allucinata all'utente.
- Logica deterministica: La condizione if (score < 80) è invalicabile. Questo garantisce che, indipendentemente dalla creatività del modello linguistico, le regole di business (Business Logic) vengano rispettate al 100%. Ovviamente nella demo questa validazione è semplice, ma può diventare molto complessa e robusta per evitare situazioni spiacevoli.
- Separazione delle responsabilità: L'agente che approva (approvalAgent) viene invocato solo se il semaforo è verde. Non ha nemmeno accesso alle pratiche scartate, riducendo il rischio di errori contestuali.
I risultati: Bad Request vs Formal Request
Eseguendo la demo, il sistema gestisce due scenari opposti con coerenza:
- Scenario "Bad Request": Una richiesta informale e sospetta ("Guadagno 2M€ al mese ma voglio il bonus"). L'agente Compliance rileva incongruenze, assegna un punteggio basso e il workflow si blocca in stato REJECTED_MANUAL_REVIEW.
- Scenario "Formal Request": Una PEC completa di dati e riferimenti normativi. Il punteggio supera la soglia e solo allora l'agente Approver genera la lettera ufficiale del Comune.
Un ecosistema solido
Usare gli agenti compositi non è una visione per il futuro, è ingegneria applicata disponibile e applicabile già da oggi. Il codice che abbiamo mostrato è una forte semplificazione, ma rappresenta il nucleo di come si possono costruire soluzioni che siano: solide, trasparenti e molto più robuste rispetto a un singolo "prompt" che si spera ben scritto.
Mettiamo a disposizione il codice di questo progetto su GitHub per chiunque voglia esplorare come Mastra AI possa abilitare una governance reale.
Se vuoi passare da sperimentazioni isolate a un'architettura AI governata, scalabile e sicura, siamo qui per disegnarla insieme a te.
Per ulteriori informazioni si possono consultare le seguenti risorse:
Le domande che restano
Come far convivere più agenti su un processo vero
Tutte le domande frequentiQuando servono più agenti invece di uno solo?
Quando i compiti richiedono strumenti e permessi diversi, o quando conviene poterli valutare e sostituire separatamente. Un agente unico con venti strumenti è più difficile da testare e da limitare di tre agenti con sei strumenti ciascuno. In più è anche meno efficiente. Se invece il compito è uno e lineare, dividerlo in più agenti aggiunge latenza e punti di rottura senza dare nulla in cambio.
Come si evita che gli agenti si passino errori a vicenda?
Con contratti espliciti fra i passaggi. Se un agente consegna testo libero al successivo, l'errore si propaga e si amplifica; se consegna una struttura dati validata, l'errore si ferma dove nasce.
Il punto in cui i sistemi multi-agente si rompono non è quasi mai il ragionamento del singolo agente, ma l'assenza di un formato verificabile fra un passaggio e l'altro. In più, esistono sistemi di guardrail più o meno smart per mettere in discussione anche l'artefatto parziale prodotto.
Chi risponde della decisione finale?
Una persona, sempre, e va deciso prima di andare in produzione. Crediamo fortemente che in questo momento sia il modo migliore di procedere (HITL).
La composizione di più agenti rende difficile ricostruire chi ha deciso cosa, ed è il motivo per cui serve una traccia per ogni passaggio e un punto di approvazione umano sulle azioni che contano. Un sistema in cui nessuno sa dire perché è stata presa una decisione non è governabile, anche quando funziona.
Hai letto qualcosa che riguarda il tuo progetto.
Raccontaci il tuo caso: ti rispondono le persone che lavorano ogni giorno su questi temi.
- Non parli con un commerciale
- NDA prima di entrare nel merito
- Il codice resta di tua proprietà
Altri articoli sullo stesso tema.

Web Bot Auth: visitatori senza occhi
Gli agenti AI leggono il tuo sito e convertono meglio dell'organico, ma non compaiono negli analytics. Come misurarli e verificarli con Web Bot Auth.
Leggi
Generative UI: per umani e macchine
Il tuo gestionale serve persone e agenti AI. Con la Generative UI l'interfaccia si compone sul contesto, con un accesso per gli agenti e un fallback manuale.
Leggi
SaaS multi-tenant: segregare i dati in modo corretto
Cosa significa multi-tenant e come si sceglie l'isolamento dei dati in un SaaS: database dedicato, schema separato o riga condivisa, e cosa cambia con l'AI.
Leggi