# Spring AI 2.1.0-M1 Available Now

DevFeed: [Spring AI 2.1.0-M1 Available Now](<https://devfeed.tech/articles/spring-ai-2-1-0-m1-available-now-59815.md>)

Original publisher: [Read original article](<https://spring.io/blog/2026/09/25/spring-ai-2-1-0-M1-available-now>)

Author: tzolov

Published: 2026-09-25T00:00:00Z

Content type: release

Language: en

Sources: [Spring](<https://devfeed.tech/sources/spring.md>)

Topics: [Spring AI](<https://devfeed.tech/topics/spring-ai.md>), [AI Chat](<https://devfeed.tech/topics/ai-chat.md>), [Embeddings](<https://devfeed.tech/topics/embeddings.md>), [Spring Boot](<https://devfeed.tech/topics/spring-boot.md>)

Tags: [accessors](<https://devfeed.tech/tags/accessors.md>), [adapter](<https://devfeed.tech/tags/adapter.md>), [ai](<https://devfeed.tech/tags/ai.md>), [announce](<https://devfeed.tech/tags/announce.md>), [anthropic](<https://devfeed.tech/tags/anthropic.md>), [api](<https://devfeed.tech/tags/api.md>), [apis](<https://devfeed.tech/tags/apis.md>), [batch](<https://devfeed.tech/tags/batch.md>), [block](<https://devfeed.tech/tags/block.md>), [blocks](<https://devfeed.tech/tags/blocks.md>), [boot](<https://devfeed.tech/tags/boot.md>), [builder](<https://devfeed.tech/tags/builder.md>), [builds](<https://devfeed.tech/tags/builds.md>), [but](<https://devfeed.tech/tags/but.md>), [can](<https://devfeed.tech/tags/can.md>), [capabilities](<https://devfeed.tech/tags/capabilities.md>), [central](<https://devfeed.tech/tags/central.md>), [change](<https://devfeed.tech/tags/change.md>), [charts](<https://devfeed.tech/tags/charts.md>), [cloud](<https://devfeed.tech/tags/cloud.md>), [event-driven](<https://devfeed.tech/tags/event-driven.md>), [java](<https://devfeed.tech/tags/java.md>), [microservices](<https://devfeed.tech/tags/microservices.md>), [reactive](<https://devfeed.tech/tags/reactive.md>), [serverless](<https://devfeed.tech/tags/serverless.md>), [spring](<https://devfeed.tech/tags/spring.md>), [spring-ai](<https://devfeed.tech/tags/spring-ai.md>), [web-applications](<https://devfeed.tech/tags/web-applications.md>)

## AI overview

Spring AI 2.1.0-M1, the first milestone in the 2.1 line, builds on 2.0.1 and moves to Spring Boot 4.2 (built against 4.2.0-M2). It adds ordered message parts to preserve interleaved text, reasoning, tools and media, including opaque provider payloads and unknown blocks; in this milestone, only OpenAiResponsesChatModel handles parts natively. That model adds OpenAI's Responses endpoint alongside the existing Chat Completions model, with reasoning and tool support, but persistent chat memory repositories do not yet preserve message parts; InMemoryChatMemoryRepository does. VectorStore.upsert() stores supplied document vectors and replaces rows with matching IDs; pgvector, Redis, Elasticsearch and Qdrant support it, while other stores reject it. The milestone APIs may change before GA.

## Source excerpt

On behalf of the Spring AI team and everyone who has contributed, I'm happy to announce that Spring AI 2.1.0-M1 has been released and is now available from Maven Central! Release notes | Upgrade notes | Reference documentation 2.1.0-M1 is the first milestone of the 2.1 line. It builds on everything that shipped in 2.0.1, moves the baseline to Spring Boot 4.2 (this milestone is built against 4.2.0-M2), and introduces three new capabilities: initial support for a structured, ordered model for message content, support for the OpenAI Responses API, and a way to write pre-computed embeddings into a vector store. As with any milestone, the new APIs are ready to try but may still change before GA. Your feedback now is what shapes them. New in this release Message Parts Until now, a Spring AI message was a text plus side lists of tool calls and media. That shape cannot represent what current models actually return: reasoning interleaved with tool calls, text between images, or provider-specific blocks that must be sent back verbatim on the next turn. AssistantMessage, UserMessage, and ToolResponseMessage now hold their content as an ordered list of MessagePart entries: TextPart, ReasoningPart, ToolCallPart, ToolResultPart, MediaPart, and UnknownPart. Parts keep the order the provider produced them in, so a conversation round-trips faithfully. A ReasoningPart or ToolCallPart can carry an OpaquePayload, which holds data such as an Anthropic thinking signature or a Gemini thought signature that has to be replayed unchanged. UnknownPart keeps the raw JSON of any block an adapter does not model yet, so nothing is silently dropped. The familiar accessors (getText(), getMedia(), getToolCalls(), and the new getReasoning()) are now views over the parts, and existing constructors and builders keep producing them in the legacy order. To control the order yourself, add parts directly: UserMessage question = UserMessage.builder() .part(TextPart.of("What changed between these two charts?