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.
| Framework | Runtime | Maturity | What 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 |
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
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
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
| Situation | Pick | Because |
|---|---|---|
| Already on Spring Boot 4 | Spring AI | The coupling you would otherwise pay for is now the feature: auto-config, Micrometer, one upgrade path. |
| On Boot 3.x with no migration scheduled | LangChain4j | It ships starters for both generations, so the agent does not become a platform programme. |
| Quarkus, Micronaut, or plain Java | LangChain4j | It is the only one of the two that was designed not to care. |
| A Go service that needs a tool loop | Eino | Idiomatic Go, explicit graph orchestration, and a Tier 1 MCP SDK underneath. Pin versions while the ADK is alpha. |
| Rust, edge, or WASM targets | Rig | Nothing else here compiles to WebAssembly, and OTel GenAI conventions are already wired. |
| Your edge is being first to new eval and optimisation techniques | Python, still | That 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:
- Agent frameworks — what the layer is for, and when you do not need one.
- The agent harness — the code around the model that these libraries are competing to own.
- What is MCP — the protocol that made this comparison possible.
- MCP over streamable HTTP — the transport the stateless core runs on.
- Model deprecation & migration — the other upgrade treadmill your framework choice sits on.
- LangGraph vs CrewAI vs OpenAI Agents SDK vs Google ADK — the same decision one language over.
Project sources:
- Spring AI 2.0.0 GA — the release, and the Boot 4 requirement.
- LangChain4j documentation — modules, starters and supported runtimes.
- cloudwego/eino — the Go framework and its ADK.
- 0xPlaygrounds/rig — the Rust framework.
- The 2026-07-28 MCP specification — the stateless core and the SDK conformance tiers.