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 - Fix dead JavaDoc link in upgrade notes #6419
- Update outdated Pinecone free-tier namespace notes #6383
- Fix duplicate "is is" typo in
openai-chat.adoc#6037 - Update Ollama OpenAI API compatibility example to use builder pattern #5999
🔨 Dependency Upgrades
- Delegate Maven plugin versions to Spring Boot BOM #6586
- Align gRPC version management with Spring Boot #6585
- Upgrade Milvus java client to 2.6.21 #6503
- Upgrade pinecone client to 6.2.0 #6496
- Upgrade qdrant client to 1.18.0 #6494
❤️ Contributors
Thank you to all the contributors who worked on this release:
@DragonFSKY, @EvanYao826, @JamesBLewis, @MKP999, @OneZero-Y, @OreOreDa, @Seol-JY, @TimurRakhmatullin86, @YashRL, @ZhangDT-sky, @angus-guo, @chaechaepower, @chemicL, @dimitarproynov, @ericbottard, @gaoxiaolei-s59, @gh7035, @guanxuc, @hutiefang76, @ilayaperumalg, @iuliiasobolevska, @jewoodev, @kamalcis, @kezhenxu94, @leeworms, @liushenling2001, @nicolaskrier, @prachipanditrao, @pyg410, @quaff, @rea9r, @sdeleuze, @sdudzin, @seeun0210, @sobychacko, @strogiyotec, @subhashpolisetti, @thjanssen, @tzolov, @ultramancode, and @yyyCode