Repository navigation
Releases
v2.1.0-RC2
⭐ New Features
- Expose the version-checked append on SessionService #7314
- Add server support for the MCP 2026-07-28 ("modern") protocol revision #7284
- Implement OllamaDecisionModel #7261
- Add DecisionToolIndex for tool search #7253
- Add decision-based RAG document post-processors #7252
- Add SystemOneDecisionModel #7249
- Stream tool call argument deltas #7233
- Introduce DecisionModel API #7205
- Upgrade Anthropic Java SDK to 3.4.0 #7306
- Add upsert and query-embedding search to Chroma #7230
- Add upsert and query-embedding search to MariaDB #7235
- Add upsert and query-embedding search to MongoDB Atlas #7272
- Add upsert and query-embedding search to Typesense #7303
- Add upsert and query-embedding search to Neo4j #7318
- Include cached tokens in Anthropic and Bedrock prompt tokens #7268
vector store
❤️ Contributors
Thank you to all the contributors who worked on this release:
@ThomasVitale, @dimitarproynov, @sobychacko, @iuliiasobolevska, @Ajax-1 , and @tzolov
v2.1.0-RC1
For upgrading from 2.1.0-M1 to 2.1.0-RC1, please refer to the upgrade notes here.
⭐ New Features
- Deprecate ChatMemory in favor of session memory #7186
- Add upsert and query-embedding search to OpenSearch #7177
- Fail fast on unsupported upsert and vector search #7176
- Add session memory: an event log with turn-aware compaction #7161
- Add tool call confirmation to tool calling #7157
- Migrate DeepSeek chat model to message parts #7128
- Migrate OpenAI chat model to message parts #7107
- Fail clearly on out-of-range OpenAI Responses usage counts #7052
- Support for Text Chunking with Overlap in TokenTextSplitter #2123
🔨 Dependency Upgrades
❤️ Contributors
Thank you to all the contributors who worked on this release:
@56wj, @Ashfaqbs, @OreOreDa, @Rainmemery, @dimitarproynov, @iuliiasobolevska, @sedhossein, @sobychacko, @ss-bhatt, @stack3mpty, and @tzolov
v2.0.2
For upgrading from 2.0.1 to 2.0.2, please refer to the upgrade notes here.
⭐ New Features
- Upgrade the Anthropic Java SDK to 2.72.0 #7164
- Add observability support for
TextToSpeechModel,TranscriptionModelandStabilityAiImageModel#7141 - Configure Redis vector store metadata fields #6870
- Add customizers for stateless MCP servers #6539
🐞 Bug Fixes
- Fix numeric filters in Cassandra vector store #7117
- Fix StructuredOutputValidationAdvisor repeating tool call requests #7100
- Handle Ollama responses without a message #7066
- Return final answer first in
AnthropicChatModel#7001 - Honor disabled reasoning in tool history #6984
- Include thinking text in Anthropic streaming chunks #6982
- Fix Neo4j chat memory index properties #6967
- Fix invalid JSON in Bedrock tool-call arguments #6963
- Backfill
additionalProperties: falsein OpenAI strict tool schemas #6865 - Restore honoring the configured OpenAI timeout #6837
- Fix
JsoupDocumentReaderdropping relative link URLs #6803 - Close the resource stream in
TextReader#6797 - Fix tool call extraction in GoogleGenAiChatModel for mixed content responses #5468
📔 Documentation
- Document Anthropic server-side spans in traces #7165
- Correct stale API names in AI metadata docs #7032
- docs: document OpenAI reasoning effort property #6943
- Document MCP client scope and session boundaries #6820
🔨 Dependency Upgrades
❤️ Contributors
Thank you to all the contributors who worked on this release:
@CodeTrainerMan, @CryoThrust, @JamesBLewis, @Lubaoshuai, @Rainmemery, @ashakirin, @chabinhwang, @chengwudi1, @chensishang, @dimitarproynov, @dlwldn30, @flex-ilsub, @herder, @ikaitist, @iuliiasobolevska, @jhpark1227, @jianran, @kezhenxu94, @lazer-dev, @martin-grofcik, @nicolaskrier, @pengjonas, @pengmoubuaixuexi, @rvullriede, @ryujungkyun, @seo92js, @sharanrenukeshbharmshetty, @sobychacko, @tzolov, @vinayreddykalluri, @wantaekchoi, @xujiantop-crypto, and @zxuhan
Spring AI 2.1.0-M1
For upgrading from 2.0.1 to 2.1.0-M1, please refer to the upgrade notes here.
⭐ New Features
- Add OpenAI Responses API support #7006
- Add VectorStore.upsert for pre-computed embeddings #7002
- Introduce MessagePart in AbstractMessage #6997
🔨 Dependency Upgrades
- Upgrade Spring Boot to 4.2 #7003
❤️ Contributors
Thank you to all the contributors who worked on this release:
Spring AI 2.0.1
For upgrading from 2.0.0 to 2.0.1, please refer to the upgrade notes here.
For the detailed reference documentation on 2.0.1, please refer here
⭐ New Features
- Harden Ollama integration tests against flakiness #6776
- Retire deprecated Mistral AI chat models #6772
- Document additional 2.0.1 breaking changes #6771
- Support audio streaming in OpenAiAudioSpeechModel #6733
- Add configurable tool call limits #6726
- Enrich OpenAI transcription options and responses #6697
- Update Couchbase vector store to use Spring Boot-managed client #6583
- Remove explicit
protobuf-javaversion properties #6552 - Add ToolChoice support for Google GenAI chat model #6531
- Remove fastjson2 dependency from
spring-ai-azure-store#6508 - Refactor
Mediabuilder to use typeddataoverloads #6481 - Validate
TokenTextSplitterbuilder arguments #6452 - Support page ranges in
PagePdfDocumentReader#6445 - Revise DeepSeekApi #6428
- GraalVM for mcp annotations doesn't work in Spring AI 2.0.0 #6427
- Rename
spring-ai-autoconfigure-model-chat-memory-redis#6416 - Restore PDF media mapping in
OpenAiChatModel#6410 - Google Image generation support #6408
- Remove unused field
maxResults#6344 - Confusing WARN log while AWS region resolving #5108
- SpringAI does not follow the AWS SDK's default region resolution rules #823
🐞 Bug Fixes
- Reserve Redis chat memory timestamps atomically #6784
- Fix RedisChatMemoryRepository clear() #6783
- Escape metadata values in Redis chat memory queries #6765
- Validate resolved resource path #6764
- Introduce maxSessions and sessionIdleTimeout #6760
- Fix
OpenAiAudioTranscriptionModelleaking the stream on cancellation #6759 - Merge java-compile compilerArgs instead of overriding #6756
- Default OpenAI tool-calling strict mode to false #6755
- Use temporary directory for cache #6754
- Handle malformed pdf in PdfDocumentReader #6753
- Make tool resolution fallback configurable #6751
- Use full length hash #6746
- Correct
ToolContextparameter detection #6744 - Return a single Generation on ToolCallLimitExceededException #6742
- Fix ToolCallingAdvisor streaming loop dropping doBeforeStream mutations #6737
- Add instructions option to OpenAiAudioSpeechModel #6731
- Apply MCP HTTP client request customizer beans #6716
- Close OpenAI stream response on cancellation #6656
- Validate text length to prevent
StringIndexOutOfBoundsExceptionforMarkdownCodeBlockCleaner#6645 - Fix AnthropicChatOptions.timeout(Duration) being ignored outside model construction #6605
- Close native resources in
TransformersEmbeddingModel#6572 - Fix
OllamaChatModelprompt options not inheriting configured model #6567 - Use Locale.ROOT for String uppercase/lowercase operations on wire/protocol values #6566
- Handle null fields in Mistral AI moderation
CategoriesandCategoryScores#6565 - Fix Azure OpenAI authentication failure behind a TLS-inspecting proxy #6553
- Fix
OpenSearchVectorStoredocument deserialization #6550 - Fix group precedence in
MilvusFilterExpressionConverter#6543 - Fix strict mode payload placement in
OpenAiChatModel#6540 - Align
@McpToolexception handling with@Toolcontract #6534 - Fix MCP stdio connections without args #6533
- Fix Milvus metadata integer values deserialized as Long instead of Double #6517
- Fix OpenAI stream handling for empty tool_calls #6504
- Fix shared mutable state in chat options builder
clone()#6498 - Fix tool-search reference extraction for parallel calls #6497
- Fix incorrect assertions in
CouchbaseSearchVectorStore.Builder#6490 - Fix shared mutable state in
AnthropicChatOptions.Builder.clone()#6487 - Fix null parent for tool call observations in blocking mode #6475
- Fix Milvus filters with custom metadata field #6470
- Add tool-search advisor modules to BOM #6464
- Use model-independent assertions for tool-call token usage #6461
- Fix tool-search advisor auto-config ordering #6458
- There is a bug in the openai streaming mode #6441
- Validate PgVectorStore table schema after initialization #6438
- Accumulate tool calling advisor usage #6424
- Fix MarkdownCodeBlockCleaner discarding content of single-line fenced code blocks #6423
- Merge streaming tool call deltas by index in
OpenAiChatModel#6381 reasoningContentin metadata is always null when calling DeepSeek model via OpenAI API #6375- Fix genai thinking level validation #6339
- Fix Microsoft Foundry URL path mode for proxy hosts #6180
- Perform
Optionalunwrapping inOpenAiChatModel#buildGeneration#6009 - Fix Streamable HTTP WebClient transport to accept SSE frames without
eventfield #5783
📔 Documentation
- Fix inaccurate Content interface Javadoc #6704
- Document conversation ID scoping for chat memory #6651
- Fix OpenAI audio documentation title and broken link #6606
- Restructure structured-output documentation #6495
- Restore the
CosmosDBChatMemoryRepositorysection #6491 - Fix typos in McpTool JavaDoc comments #6449
- Restructure tool calling reference docs #6432
- Remove
ToolSearchToolCallingAdvisorfor upgrade notes [#6421](https://g...
Spring AI 2.0.0
For upgrading from 1.1.x to 2.0.0, please refer to the upgrade notes here.
For the detailed reference documentation on 2.0.0, please refer here
⭐ New Features
- Update Google GenAI models #6406
- Use only Jackson 2 in
OpenAiChatModel#6392 - Make
org.springframework.ai.image.observationnull-marked #6388 - Polish
Prompt#6387 - Preserve OpenAI tool call additional properties #6365
🐞 Bug Fixes
- Filter unsupported tool messages in
CassandraChatMemoryRepository#6400 - Filter unsupported tool messages in
MongoChatMemoryRepository#6399 - Filter unsupported tool messages in
JdbcChatMemoryRepository#6398 - Remove
streamToolCallResponsesfrom advisor builders #6391 - Add missing
promptCacheKeyparameter inOpenAiChatOptions#6380
📔 Documentation
- Update reference docs to reflect 2.0 API changes #6405
- Add more guides #6401
- Introduce
CLAUDE.mdandAGENTS.md#6376 - Consolidate upgrade notes for 2.0.0 #6333
🔨 Dependency Upgrades
❤️ Contributors
Thank you to all the contributors who worked on this release:
@ericbottard, @guanxuc, @ilayaperumalg, @sdeleuze, @sdudzin, @tzolov, and @ultramancode
Spring AI 1.1.8
Spring AI 1.0.9
2.0.0-RC2
⭐ New Features
- Make Anthropic HTTP client configurable #6354
- Restore compatibility with Spring Framework < 7.0.4 #6334
- Make OpenAI HTTP Client configurable #6294
🐞 Bug Fixes
- Fix BedrockProxyChatModel model option handling #6370
- Fix
spring-ai-autoconfigure-model-bedrock-aidependencies #6368 - 2.0.0-RC1 regression: additional dependency is needed for Bedrock SDK #6367
- Always auto-register
ToolCallingAdvisorto support runtime-injected tools #6349 - Restore options replacing instead of merging in
ChatModel#6336 - Replay
reasoning_contentin OpenAI assistant history #6296 - Fix
OllamaChatModeldropping thinking field in multi-turn conversation history #6062 - Binding failure for
spring.ai.ollama.chat.think#4853
📔 Documentation
- Document native structured output limitations for Ollama and OpenAI #6363
- Rewrite
CONTRIBUTING.adocand convert it toCONTRIBUTING.md#6352 - Fix tool callback example in user-controlled tool execution docs #6324
❤️ Contributors
Thank you to all the contributors who worked on this release:
@ThomasVitale, @ericbottard, @guanxuc, @ilayaperumalg, @sdeleuze, @sdudzin, @suryateja-g13, @tzolov, and @uc4w6c
Spring AI 2.0.0-RC1
⭐ New Features
- Add turn-boundary snapping to MessageWindowChatMemory eviction #6312
- Finish to remove default values from models #6311
- Move advisors to their proper modules #6309
- Remove SpringBeanToolCallbackResolver and toolNames() API #6301
- Streamline OpenAiChatModel implementations #6295
- Remove
ToolSpecconsumer API fromChatClient#6292 - Remove Minimax dedicated support in favor of Anthropic one #6290
- Remove internalToolExecutionEnabled #6289
- Rename
N()ton()in options builders #6285 - Refine
JdbcChatMemoryRepositoryDialectto use default method #6283 - Replace SLF4J by
org.apache.commons.logging.LogFactory#6280 - Remove internal tool execution from MiniMaxChatModel #6279
- Remove internal tool execution from BedrockProxyChatModel #6272
- fix(core): allow tool callbacks and providers directly in ChatClient tools() #6263
- Remove internal tool execution from MistralAiChatModel #6260
- Remove internal tool execution from DeepSeekChatModel #6258
- Remove internal tool execution from OpenAiChatModel #6257
- Remove internal tool execution from OllamaChatModel #6256
- Remove duplicate builder overrides in OpenAiChatOptions #6255
- Refactor tool search by consolidating into a single module #6254
- Remove internal tool execution from AnthropicChatModel #6252
- Refactor toOptions method for vendor-specific autoconfiguration properties #6248
- Make equals parameter nullable #6239
- Remove unused
GoogleGenAiChatOptions.TransportType#6238 - GH-6211: Avoid duplicate chat memory in tool prompts #6228
- GH-6206: Update tool callback guidance #6214
- Update Mistral AI chat models #6210
- Deprecate and rename ChatClient customizer #6204
- Refine Spring Boot dependencies #6200
- Simplify ToolCallAdvisor stream aggregation by removing publish() multicast #6195
- Add DeepSeek V4 chat model constants #6194
- Add EntityParamSpec to ChatClient entity() methods for per-call structured output configuration #6165
- Remove toolNames() API and SpringBeanToolCallbackResolver — use explicit ToolCallback beans instead #6154
- Retire Pixtral Large model #6149
- Refactor JSON utilities #6135
- Use .class reference for autoconf ordering #6119
- Add Tool Search Tool advisor for on-demand tool discovery #5909
- Allow accessing "timestamp" field from spring_ai_chat_memory table programatically when using JdbcChatMemoryRepository #5168
🐞 Bug Fixes
- fix: place memory advisors outside ToolCallingAdvisor by default #6314
- Rename ToolCallAdvisor to ToolCallingAdvisor with backward-compat shims and bug fixes #6303
- Fix OpenAiChatModel.stream() to only buffer tool calls. #6288
- refactor(chat-client): enforce non-null ToolCallAdvisor.Builder and fix advisor chain mutation #6282
- fix: fix span hierarchy in streaming paths for all remaining chat models #6276
- fix: bring parent span into ThreadLocals to maintain Observation and span hierarchy parity #6249
- Guard JSON schema generation #6217
- Fix merge in openai options #6215
- deepseek V4 Function calling 400 Bad Request from POST #5963
📔 Documentation
- Fix "vector strore" typo in RAG diagram #6300
- Polish reference documentation #6234
- Improve Mistral AI Chat documentation for reasoning models and
ReasoningEffortJavadoc #6191 - Reintroduce community support documentation for OCI and Azure CosmosDB #6125
🔨 Dependency Upgrades
- Upgrade to MCP SDK
2.0.0-RC1#6287
❤️ Contributors
Thank you to all the contributors who worked on this release:
@Baqirrizvidev, @Dream95, @EvanYao826, @ThomasVitale, @YunKuiLu, @chemicL, @dafriz, @ericbottard, @galenzo17, @goutamadwant, @guanxuc, @ilayaperumalg, @juanjuandog, @nicolaskrier, @quaff, @rajadilipkolli, @sdeleuze, @sobychacko, @stohirov, @symphony-enrico, @tzolov, and @wolf8334