Chi porta l'AI in un sistema Java finisce quasi sempre per confrontare tre nomi: Spring AI, LangChain4j ed Embabel. Spesso vengono presentati come alternative, ma operano a livelli diversi, e la scelta dipende più dal vostro stack e dalla natura del problema che dall'elenco delle funzionalità. I dati sono aggiornati a ottobre 2026: i tre progetti rilasciano spesso, quindi verificate le fonti prima di decidere.
Tre livelli, non tre alternative equivalenti
- Spring AI è il livello di integrazione AI dell'ecosistema Spring: client verso i modelli, advisor, tool calling, vector store, MCP e osservabilità con Micrometer.
- LangChain4j è una libreria di integrazione indipendente dal framework applicativo: funziona con Quarkus, Spring Boot, Helidon, Micronaut o Java puro.
- Embabel è un framework per agenti costruito sopra Spring AI. Il suo README lo spiega con un'analogia: Spring AI sta al livello della Servlet API, Embabel è più vicino a Spring MVC.
Spring AI ed Embabel sono quindi complementari. LangChain4j è invece un'alternativa a Spring AI per l'integrazione e, con il suo modulo agentico ancora sperimentale, anche a Embabel.
| Spring AI | LangChain4j | Embabel Agent | |
|---|---|---|---|
| Ultima release stabile | 2.0.1 (21 agosto 2026) | 1.22.0 (8 ottobre 2026) | 1.5.3 (5 ottobre 2026) |
| Versione minima di Java | 17 | 17 | 21 |
| Framework ospite | Spring Boot 4.0 / 4.1 | Qualsiasi; starter per Boot 3 e Boot 4 | Spring Boot 4.1 e Spring AI 2.0 |
| Maturità | 2.0 GA a giugno 2026 | Core stabile, molti moduli in beta | 1.0 GA a luglio 2026 |
Spring AI: ChatClient e advisor
L'API principale è ChatClient, un client fluente nello stile di RestClient. Ogni richiesta attraversa una catena ordinata di advisor: memoria conversazionale, RAG (QuestionAnswerAdvisor, RetrievalAugmentationAdvisor), logging e validazione diventano componenti riusabili e indipendenti dal provider. Dalla 2.0 anche il ciclo di tool calling è un advisor.
record Triage(Category category, String rationale) {}
Triage triage = chatClient.prompt()
.system("Classifica il ticket di assistenza.")
.user(ticket.text())
.call()
.entity(Triage.class);
Spring AI supporta i principali provider, da OpenAI e Anthropic ad Amazon Bedrock e Ollama, e offre 22 moduli di vector store. In un'applicazione Spring Boot è la scelta più naturale: autoconfigurazione, Actuator, Spring Security e transazioni sono già presenti, ed esiste supporto commerciale. Manca invece un modello agentico con pianificazione: i pattern agentici documentati dal team Spring vanno implementati nel codice applicativo.
Due note pratiche. Spring AI 2.0 richiede Spring Boot 4, mentre la linea 1.1.x, legata a Boot 3.5, ha terminato il supporto open source il 30 giugno 2026. E la migrazione da 1.x a 2.0 ha breaking change concreti: Jackson 3, classi di opzioni dei provider senza setter, null-safety JSpecify.
LangChain4j: AI Services su qualsiasi stack Java
Nonostante il nome, LangChain4j non è un port Java di LangChain. Il progetto dichiara che API, implementazione e rilasci sono indipendenti dal progetto Python; il nome è un retaggio storico. Non c'è compatibilità con LangChain, LangGraph o LangSmith: per questo scriviamo sempre "LangChain4j" per esteso.
L'astrazione centrale è l'AI Service: si dichiara un'interfaccia annotata e LangChain4j ne genera l'implementazione, con uno stile simile a Spring Data o Feign.
interface TicketTriage {
@SystemMessage("Classifica il ticket di assistenza.")
Triage classify(@UserMessage String ticket);
}
TicketTriage triage = AiServices.create(TicketTriage.class, chatModel);
Il catalogo di integrazioni è il più ampio dei tre (oltre 20 provider di LLM, oltre 30 embedding store). Con Quarkus si usa l'estensione quarkus-langchain4j, con Spring Boot 3 e 4 starter dedicati; sono supportati anche Helidon e Micronaut.
Il punto di attenzione è la maturità dei singoli moduli. Il core è stabile, ma molti moduli sono ancora pubblicati con suffisso -beta, tra cui langchain4j-agentic, langchain4j-mcp, langchain4j-guardrails e gli starter Spring Boot, e la documentazione definisce sperimentali il modulo agentico e i guardrail. Le release arrivano ogni una o due settimane: la gestione delle dipendenze richiede disciplina.
Embabel: goal, action e pianificazione
Embabel è stato creato da Rod Johnson, l'autore di Spring, ed è scritto in Kotlin con un'API pensata anche per Java. Si descrivono action, goal e condition sui propri tipi di dominio; il piano lo formula il framework, non il programmatore, e viene rivalutato dopo ogni azione. Il pianificatore predefinito è GOAP (Goal-Oriented Action Planning), che non dipende dal modello linguistico; in alternativa c'è Utility AI.
@Agent(description = "Prepara una nota di revisione per una pratica")
public class CaseReviewAgent {
@Action
public CaseFacts extractFacts(SupportCase input, OperationContext context) {
return context.ai().withLlmByRole("extractor")
.createObject("Estrai i fatti da: " + input.text(), CaseFacts.class);
}
@AchievesGoal(description = "La nota è pronta per la revisione umana")
@Action
public ReviewNote draftNote(CaseFacts facts, OperationContext context) { /* ... */ }
}
Parametri e tipo di ritorno dicono di cosa ha bisogno un'azione e cosa produce: le precondizioni discendono dai tipi. I ruoli dei modelli permettono di scegliere per ogni passo il modello adatto per costo o riservatezza, anche locale. Gli agenti sono normali bean Spring.
I vincoli: Java 21 o superiore, Spring Boot, una community più piccola e un'API giovane. Gli starter dei provider e del server MCP sono stabili; i moduli A2A, di test e di valutazione sono in incubazione o sperimentali. Governiamo quindi Embabel come una dipendenza strategica, con versioni fissate e test di contratto.
Tool calling e MCP
Tutti e tre supportano il tool calling tramite metodi Java annotati. Le differenze emergono sul Model Context Protocol:
- Spring AI 2.0 include il MCP Java SDK 2.0.0, segue la specifica 2025-11-25 e supporta sia client sia server, con annotazioni come
@McpToole@McpResource. Il trasporto predefinito è Streamable HTTP, SSE è deprecato. Il progettomcp-securityaggiunge OAuth 2.0 e API key. - LangChain4j offre un client MCP completo (stdio, Streamable HTTP, stdio in Docker), supporta le versioni del protocollo 2025-11-25 e 2026-07-28 e permette di filtrare o rinominare i tool con
McpToolProvider. Esporre server MCP non è l'obiettivo del core. - Embabel usa i tool MCP tramite Spring AI ed espone gli agenti come server MCP con
embabel-agent-starter-mcpserver.@SecureAgentToolverifica un'espressione Spring Security sull'utente corrente prima che un tool remoto venga eseguito;ToolCallContextpassa token o tenant ID ai tool senza mostrarli al modello.
Con qualsiasi framework separiamo i tool di sola lettura da quelli che modificano dati e verifichiamo i permessi sull'utente reale, non su un utente di servizio onnipotente.
Output strutturato
Tutti e tre convertono la risposta del modello in tipi Java; cambia la gestione delle risposte non valide. In Spring AI StructuredOutputValidationAdvisor chiede al modello di correggersi se il JSON non rispetta lo schema. LangChain4j offre JsonExtractorOutputGuardrail, ancora sperimentale. Embabel valida con Bean Validation gli oggetti restituiti da createObject, ripete la chiamata una volta spiegando l'errore e poi lancia InvalidLlmReturnTypeException, che può innescare una ripianificazione.
In ogni caso trattiamo il risultato come una proposta tipizzata: il modello propone, i servizi di dominio esistenti validano e decidono.
Osservabilità e dati sensibili
Spring AI e LangChain4j producono metriche Micrometer secondo le convenzioni OpenTelemetry GenAI (gen_ai.client.token.usage): token e latenza finiscono nelle dashboard che usate già. Spring AI non registra per impostazione predefinita il contenuto di prompt, risposte e tool: va abilitato esplicitamente con proprietà come spring.ai.chat.client.observations.log-prompt.
embabel-agent-starter-observability traccia agenti, azioni, chiamate ai modelli, tool e pianificazione verso qualsiasi backend OpenTelemetry. Attenzione al default: cattura il contenuto dei messaggi, gli argomenti dei tool, le query RAG e lo stato del processo. Con dati personali, bancari o sanitari disattivatelo o filtratelo:
embabel:
agent:
platform:
observability:
capture-message-content: false
Combinare i framework
- Embabel sopra Spring AI è la combinazione nativa: Spring AI per modelli, vector store, MCP e osservabilità, Embabel per l'orchestrazione.
- Spring AI come server MCP può esporre i servizi di dominio Spring come tool per agenti costruiti altrove, per esempio con LangChain4j su Quarkus.
- LangChain4j dentro Spring Boot ha senso solo per una capacità che non trovate altrove: isolatelo in un modulo ed evitate due astrazioni di modello nello stesso servizio.
Tabella decisionale
| Situazione | La nostra scelta di partenza | Perché |
|---|---|---|
| Applicazione Spring Boot, caso d'uso circoscritto (classificazione, estrazione, RAG su documenti interni) | Spring AI | Nessuna dipendenza in più; sicurezza e osservabilità già presenti |
| Quarkus, Jakarta EE, Helidon, Micronaut o Java puro | LangChain4j | Indipendente dal framework, estensione Quarkus dedicata |
| Processo in più passi su un domain model ricco, in cui il passo successivo dipende dai dati | Embabel sopra Spring AI | Pianificazione su oggetti tipizzati, testabile senza chiamare un modello |
| Flusso noto e deterministico | Spring AI o LangChain4j con un workflow esplicito | Un pianificatore aggiunge complessità senza benefici |
| Esporre servizi Spring ad assistenti AI | Server MCP di Spring AI | Annotazioni, Streamable HTTP, OAuth con mcp-security |
| Sistema ancora su Spring Boot 3.5 | Pianificare prima l'upgrade a Boot 4 | Spring AI 2.0 ed Embabel 1.5 richiedono Boot 4 |
Per l'ultimo caso trovate il percorso nel nostro articolo sulla strategia di upgrade di Spring Boot.
Che cosa conta più del framework
La scelta del framework si può rivedere; una progettazione debole attorno al framework no. Prima della produzione chiediamo un dataset di valutazione eseguito in CI a ogni cambio di prompt, modello o versione del framework, prompt versionati, identificativi di modello fissati, metriche di costo per caso d'uso e controlli sui rischi descritti nell'OWASP Top 10 for LLM Applications.
Fonti ufficiali: Spring AI reference, annuncio di Spring AI 2.0, documentazione LangChain4j, LangChain4j e MCP, Embabel Agent su GitHub.
Se state valutando l'AI per un sistema Java, il nostro servizio di AI engineering e il pacchetto Fattibilità e prototipo di AI enterprise partono dal vostro caso d'uso e dai vostri dati. Contattateci per parlarne.
Raccontateci il vostro sistema.
Descrivete la sfida in poche righe: una piattaforma da modernizzare, un incidente che si ripete, una vulnerabilità da chiudere, un'idea di AI. Rispondiamo personalmente, di solito entro due giorni lavorativi.