AI Blog

Spring AI vs LangChain4j vs Eino vs Rig

All four build agents with tool calling, RAG and MCP, so features are not the decision. What separates them is what each one demands of the runtime you already operate — and for the JVM pair that demand is a Spring Boot major version.

By Agentic AI Wiki 15 min read

Spring AI 2.0 went GA on 12 June 2026 and requires Spring Boot 4, which means that for a team still on Boot 3.x, adding an agent to one service is a platform-wide framework migration. That is the actual comparison. All four of these frameworks do tool calling, retrieval, streaming and MCP competently in 2026; what separates them is what each one demands of the runtime you already operate, and only one of them asks for a major version.

At a glance

Two of these are JVM frameworks that most enterprises treat as interchangeable and are not. The other two exist because a Go or Rust service already deploys as a single binary and nobody wanted to stand up a Python sidecar to give it a tool loop.

FrameworkRuntimeMaturityWhat it asks of your stack
Spring AI JVM, Spring Boot 1.0 GA May 2025; 2.0 GA 12 June 2026 Spring Boot 4.0 or 4.1, Spring Framework 7, Jackson 3
LangChain4j JVM, framework-agnostic 1.0 GA May 2025, shipping steadily since Java 17 and a build file; starters for Boot 3.5+ and Boot 4
Eino Go Open-sourced by ByteDance under CloudWeGo; ADK published April 2026, alpha A Go module, and a tolerance for an agent kit still marked alpha
Rig Rust Past 7,600 GitHub stars mid-2026, roughly 1,900 of them added in six months A crate; also compiles to WebAssembly
Where each framework commits A four by four matrix. Rows are Spring AI, LangChain4j, Eino and Rig. Columns are runtime freedom, official MCP SDK conformance tier for the framework's language, in-process orchestration, and how close the surrounding evaluation and optimisation ecosystem is. Spring AI is weak on runtime freedom because it requires Spring Boot 4, sits on the Tier 2 Java SDK which is maintained in collaboration with Spring AI itself, is strong on in-process orchestration through the Spring programming model, and medium on ecosystem proximity. LangChain4j is strong on runtime freedom because it ships starters for Spring Boot 3.5 and above as well as Boot 4 and runs under Quarkus, Micronaut or plain Java, sits on the same Tier 2 Java SDK, is medium on in-process orchestration, and medium on ecosystem proximity. Eino is strong on runtime freedom as an ordinary Go library, sits on the Tier 1 Go SDK maintained in collaboration with Google, is strong on in-process orchestration through its graph and workflow model, and weak on ecosystem proximity. Rig is strong on runtime freedom as an ordinary Rust crate that also compiles to WebAssembly, sits on the Rust SDK that was promoted to Tier 1 in August 2026, is medium on in-process orchestration, and weak on ecosystem proximity. Where each one commits RUNTIME FREEDOM MCP SDK TIER IN-PROCESS ORCHESTRATION ECOSYSTEM NEARBY Spring AI Weak · Boot 4 only Tier 2 · Java Strong · Spring model Medium LangChain4j Strong · Boot 3.5+ or 4 Tier 2 · Java Medium · compose it Medium Eino Strong · a Go library Tier 1 · Go Strong · graph + ADK Weak Rig Strong · crate, WASM Tier 1 · Rust Medium · pipelines Weak Strong Medium Weak Strong is not better. Spring AI's weak runtime freedom is the same decision as its strong integration with the platform.
Every strong cell is a commitment, and every commitment is paid for in the row next to it.

What you are actually choosing

Feature comparisons of these four are close to useless, and that is a compliment to all of them. Chat abstractions, tool calling, structured output, embeddings, vector store adapters, chat memory, streaming, observability hooks and an MCP client are table stakes in every one. If you build the same agent four times, the interesting differences will be in how the code reads, not in what it can do.

The decision that survives contact with an actual codebase is narrower and more boring: what does this dependency require of the runtime around it, and what does it cost me to stay current with it for three years? That question has genuinely different answers here, and for the two JVM options the answer is not about AI at all.

On the JVM the decision is a Spring Boot decision

What each framework demands of the runtime you already operate A diagram in two halves. The left half shows the JVM path: an existing application on Spring Boot 3.x can adopt LangChain4j directly, because LangChain4j ships starters for both Boot 3.5 and above and Boot 4, and also runs under Quarkus, Micronaut or plain Java. Adopting Spring AI 2.0 from the same starting point first requires a platform migration to Spring Boot 4.0 or 4.1, Spring Framework 7 and Jackson 3, drawn as a gate the application must pass through. The right half shows the Go and Rust path: Eino and Rig are adopted by adding a library to a service that is already built as a single deployed binary, with no framework generation to cross, and the cost sits elsewhere — a smaller surrounding ecosystem for evaluation and optimisation tooling. THE JVM PATH Your service today Spring Boot 3.x LangChain4j Boot 3.5+ or Boot 4 starter Migrate the platform Boot 4.0 / 4.1, Framework 7 Jackson 3 Spring AI 2.0 GA 12 June 2026 Not on Boot at all? Quarkus Micronaut plain Java The agent library is a dependency. The framework generation underneath it is a programme of work, and only one of these two paths asks for it. THE GO AND RUST PATH Your service today one deployed binary Eino / Rig add a library No generation to cross No container, no framework major, no serialisation swap. Eino and Rig both target a service that already exists and both ship graph or pipeline orchestration in-process. The bill arrives somewhere else Prompt optimisers, eval harnesses and RL environment tooling still land in Python first, and stay there longest.
The agent library is a dependency. The framework generation underneath it is a programme of work.

Spring AI and LangChain4j both reached 1.0 GA in May 2025 and both are production-ready, which is why the comparisons written since then tend to trail off into taste. Spring AI 2.0 ended that. It targets Spring Boot 4.0 and 4.1 on Spring Framework 7, and it brings Jackson 3 with it. If your estate is on Boot 3.x — and most large Java estates are, because Boot majors are multi-quarter programmes with a long tail of libraries — then Spring AI 2.0 is not a library you can add to one service this sprint.

LangChain4j's answer to the same question is deliberately unheroic: it publishes a starter for Boot 3.5 and above and a separate one for Boot 4, so it runs on either generation, and it is not coupled to a web framework at all — Quarkus, Micronaut and plain Java are all first-class, and the Quarkus extension family is actively maintained (the MCP extension shipped 1.13.1 on 31 August 2026). For a team that wants an agent in one service without touching the platform, that is the entire argument, and it is enough.

The mirror image is the honest case for Spring AI. If you are already on Boot 4, the coupling stops being a tax and becomes the product: auto-configuration, Micrometer observability, the Spring programming model and one upgrade path across the whole application. The Boot 4 requirement is not a bug in Spring AI's roadmap, it is the same decision that gives it the tight integration people choose it for. Pick it because you are on Boot 4, not despite not being.

Eino and Rig are not Python ports — they are deployment shapes

The Go and Rust entries exist for a different reason than the JVM pair, and reading them as "LangChain, but in Go" gets the trade-off backwards. Their pitch is that the service is already there. It is one binary, it starts in milliseconds, it has no interpreter and no GIL, and the alternative to a native agent library is running a Python process next to it and inventing an interface between them.

Eino is ByteDance's, open-sourced under CloudWeGo, and it shows: it is idiomatic Go rather than a translated Python API, its orchestration model is explicit graphs and workflows that can themselves be exposed as tools, and its agent kit covers tool use, multi-agent coordination, context management and interrupt/resume for human-in-the-loop. It is also load-bearing inside products at ByteDance scale, which is a better reliability signal than a star count. The caveat is real and worth respecting: the ADK layer was published in April 2026 and is explicitly alpha, with interfaces that may change.

Rig is the Rust ecosystem's centre of gravity for this, past 7,600 GitHub stars by mid-2026 with roughly 1,900 added in the first half of the year, with 20-plus model providers, 10-plus vector store integrations, OpenTelemetry GenAI semantic conventions, MCP support and WebAssembly compatibility. That last item is the one that is genuinely hard to replicate elsewhere — an agent loop that compiles to WASM runs in places a JVM does not go — and Rig lists production users including Neon, Nethermind and St Jude.

What both give up is the same thing, and it is not features. It is the density of the surrounding ecosystem, which is the subject of the next two sections.

MCP dissolved the argument that used to settle this

Where an agent's tool integrations live, then and now Three columns showing how the integration question changed. In the first column, the in-process era, every connector was an SDK wrapper compiled into the agent, so the count of available integrations was a property of the language and leaving Python meant leaving the catalogue behind. In the second column, drawn as the accent column, tools live behind Model Context Protocol servers reached over HTTP, so the same catalogue is available to any client that speaks the protocol and integration breadth stops being a language property. The third column names what did not move: prompt optimisers, evaluation harnesses and reinforcement-learning environment tooling are still Python libraries that import your agent rather than call it, so they do not cross the boundary the way tools did. Compiled in one SDK wrapper per service shipped inside the agent catalogue size = library count THE 2024 SHAPE leaving Python meant leaving the catalogue Behind a protocol tools run as MCP servers reached over ordinary HTTP any conforming client, any language THE 2026 SHAPE integration breadth stopped being a language property Still in-process prompt optimisers eval harnesses RL environment tooling WHAT DID NOT MOVE these import your agent rather than call it
Tools crossed the language boundary in 2025. The tooling that grades your agent did not.

Two years ago the reason to write agents in Python was not the language. It was that every integration existed as a Python SDK wrapper compiled into the process, so the number of things your agent could touch was a property of the language you picked. That argument has quietly expired. Tools now live behind MCP servers reached over ordinary HTTP, and the July 2026 specification made those servers substantially easier to run at scale by removing transport-level session management entirely — the stateless core is a load-balancer story more than a protocol one. All four frameworks here are MCP clients. The catalogue is the same catalogue.

There is a wrinkle worth knowing before you assume the JVM is the conservative choice. The official MCP SDKs carry conformance tiers, and on the 2026-07-28 specification TypeScript, Python, C#, Go and Rust hold Tier 1, while Java sits at Tier 2 — the Rust SDK was promoted up on 21 August 2026. The Java SDK is maintained in collaboration with Spring AI and the Go SDK in collaboration with Google, so none of these is unmaintained. But if protocol conformance is the axis you care about, the enterprise-default runtime is currently behind the two you were treating as adventurous.

What does not port is the tooling that grades the agent

Here is the cost of leaving Python, stated precisely, because the usual version of this warning is vague enough to be useless. It is not integrations, and it is not model support — every framework here covers the major providers. It is the second ring: prompt optimisers, evaluation harnesses, judge frameworks, trajectory analysis, RL environment tooling. Those land in Python first, and they stay there longest, because unlike a tool they do not sit behind a network boundary — they import your agent and drive it.

The practical resolution is boring and it works: run the agent in your language, run the evals in Python against it over HTTP. Put a thin endpoint in front of the agent that takes a task and returns a trajectory, then point whichever eval harness you prefer at it. You lose in-process hooks and gain a boundary you would eventually have wanted anyway, since an eval that can only run inside your build is an eval that cannot grade production.

Budget for the version drift, though. When a new technique arrives — a better optimiser, a new judge protocol, a scoring convention — you will get it in Python on day one and in your framework on some other day, if at all. If your competitive edge depends on being early to that ring, that is a real argument for Python that no amount of framework quality answers.

When to pick which

SituationPickBecause
Already on Spring Boot 4Spring AIThe coupling you would otherwise pay for is now the feature: auto-config, Micrometer, one upgrade path.
On Boot 3.x with no migration scheduledLangChain4jIt ships starters for both generations, so the agent does not become a platform programme.
Quarkus, Micronaut, or plain JavaLangChain4jIt is the only one of the two that was designed not to care.
A Go service that needs a tool loopEinoIdiomatic Go, explicit graph orchestration, and a Tier 1 MCP SDK underneath. Pin versions while the ADK is alpha.
Rust, edge, or WASM targetsRigNothing else here compiles to WebAssembly, and OTel GenAI conventions are already wired.
Your edge is being first to new eval and optimisation techniquesPython, stillThat ring does not cross the language boundary the way tools now do.

One rule underneath the table: choose the framework your on-call team can upgrade at 4pm on a Thursday. Every other criterion here is recoverable in a sprint. That one compounds for years.

FAQ

Can I use Spring AI without migrating to Spring Boot 4?

Not Spring AI 2.0 — it targets Boot 4.0 and 4.1 on Spring Framework 7 and brings Jackson 3 with it. The 1.x line remains for existing Boot 3 applications, but you are then choosing a branch that will diverge from where the project's attention is going. If a Boot 4 migration is not on your roadmap this year, that constraint should decide the framework rather than the other way round.

Is Eino or Rig production-ready?

Both have production users, with the usual caveat about which layer. Eino's core is used inside ByteDance products at large scale; its ADK agent layer was published in April 2026 and is explicitly alpha, so pin your version and expect interface churn there. Rig lists production deployments including Neon, Nethermind and St Jude. "Production-ready" is a question about your upgrade discipline as much as theirs.

Do I lose access to tool integrations by leaving Python?

Largely no, and this is the biggest change since 2024. Integrations now live behind MCP servers reached over HTTP rather than as in-process SDK wrappers, and all four frameworks are MCP clients, so the catalogue is shared. What you do lose is the second ring — optimisers, eval harnesses and RL environment tooling — which imports your agent rather than calling it.

Does the MCP SDK conformance tier actually matter day to day?

Mostly it matters at the edges: newer spec features, stricter conformance checks, and how quickly a change in the specification reaches you. Tier 2 does not mean broken — the Java SDK is maintained in collaboration with Spring AI. It does mean that if you are building against the newest parts of the protocol, you may wait, and it is worth knowing that Go and Rust currently sit a tier above Java.

Should an existing Python agent be rewritten in Go or Rust?

Only if the deployment shape is the problem you actually have — cold starts, a sidecar you do not want, memory footprint, an edge or WASM target, or a service boundary you keep crossing for no reason. "It would be faster" is rarely the real motivation and rarely survives contact with the eval tooling you would leave behind. A rewrite to fix latency you have not measured is the most expensive way to learn what your latency was.

Further reading

On this wiki:

Project sources: