diff --git a/pom.xml b/pom.xml
index 6f000e45e463..714702c183ce 100644
--- a/pom.xml
+++ b/pom.xml
@@ -761,7 +761,7 @@
spring-actuator
spring-ai
spring-ai-2
- spring-ai-3
+ spring-ai-3
spring-aop
spring-aop-2
spring-batch
@@ -1150,7 +1150,7 @@
spring-actuator
spring-ai
spring-ai-2
- spring-ai-3
+ spring-ai-3
spring-aop
spring-aop-2
spring-batch
diff --git a/spring-ai-2/README.md b/spring-ai-2/README.md
new file mode 100644
index 000000000000..512b64d9b27e
--- /dev/null
+++ b/spring-ai-2/README.md
@@ -0,0 +1,2 @@
+## Relevant Articles
+
diff --git a/spring-ai-3/README.md b/spring-ai-3/README.md
new file mode 100644
index 000000000000..ae92e6521af1
--- /dev/null
+++ b/spring-ai-3/README.md
@@ -0,0 +1,2 @@
+## Relevant Articles
+- [Building a RAG App Using MongoDB and Spring AI](https://www.baeldung.com/spring-ai-mongodb-rag)
diff --git a/spring-ai-3/docker-compose.yml b/spring-ai-3/docker-compose.yml
new file mode 100644
index 000000000000..2b4b28761035
--- /dev/null
+++ b/spring-ai-3/docker-compose.yml
@@ -0,0 +1,29 @@
+services:
+ postgres:
+ image: pgvector/pgvector:pg17
+ environment:
+ POSTGRES_DB: vectordb
+ POSTGRES_USER: postgres
+ POSTGRES_PASSWORD: postgres
+ ports:
+ - "5434:5432"
+ healthcheck:
+ test: [ "CMD-SHELL", "pg_isready -U postgres" ]
+ interval: 10s
+ timeout: 5s
+ retries: 5
+
+ ollama:
+ image: ollama/ollama:latest
+ ports:
+ - "11435:11434"
+ volumes:
+ - ollama_data:/root/.ollama
+ healthcheck:
+ test: [ "CMD", "curl", "-f", "http://localhost:11435/api/health" ]
+ interval: 10s
+ timeout: 5s
+ retries: 10
+
+volumes:
+ ollama_data:
\ No newline at end of file
diff --git a/spring-ai-3/pom.xml b/spring-ai-3/pom.xml
index 33ecbf36265f..6070046f9d00 100644
--- a/spring-ai-3/pom.xml
+++ b/spring-ai-3/pom.xml
@@ -26,15 +26,72 @@
+
+
+
+ org.springframework.ai
+ spring-ai-bom
+ ${spring-ai.version}
+ pom
+ import
+
+
+
+
org.springframework.boot
spring-boot-starter-web
+
+ org.springframework.ai
+ spring-ai-markdown-document-reader
+
+
+ org.springframework.ai
+ spring-ai-mcp-client-spring-boot-starter
+
+
+ org.springframework.ai
+ spring-ai-mcp-server-webmvc-spring-boot-starter
+
+
+ org.springframework.ai
+ spring-ai-ollama-spring-boot-starter
+
+
+ org.springframework.ai
+ spring-ai-chroma-store-spring-boot-starter
+
+
+ org.springframework.ai
+ spring-ai-anthropic-spring-boot-starter
+
+
+ org.springframework.ai
+ spring-ai-bedrock-converse-spring-boot-starter
+
+
+ org.springframework.boot
+ spring-boot-starter-data-jpa
+
+
+ org.springframework.ai
+ spring-ai-openai-spring-boot-starter
+
+
+ org.hsqldb
+ hsqldb
+ runtime
+
+
+ org.springframework.ai
+ spring-ai-pgvector-store-spring-boot-starter
+
org.springframework.ai
spring-ai-starter-model-openai
- ${spring-ai.version}
+ ${spring-ai-start-model-openai.version}
@@ -43,14 +100,99 @@
spring-boot-starter-test
test
+
+ org.springframework.ai
+ spring-ai-spring-boot-testcontainers
+ test
+
+
+ org.testcontainers
+ chromadb
+ test
+
+
+ org.testcontainers
+ ollama
+ test
+
+
+ org.springframework.boot
+ spring-boot-docker-compose
+ ${spring-boot-docker-compose.version}
+
+
+ org.springframework.ai
+ spring-ai-starter-vector-store-mongodb-atlas
+ ${spring-ai-mongodb-atlas.version}
+
- transcribe
+ chromadb
true
+
+ com.baeldung.springai.chromadb.Application
+
+
+
+ assistant
+
+ com.baeldung.spring.ai.om.OrderManagementApplication
+
+
+
+ anthropic
+
+ com.baeldung.springai.anthropic.Application
+
+
+
+ deepseek
+
+ com.baeldung.springai.deepseek.Application
+
+
+
+ evaluator
+
+ com.baeldung.springai.evaluator.Application
+
+
+
+ hugging-face
+
+ com.baeldung.springai.huggingface.Application
+
+
+
+ mcp-server
+
+ com.baeldung.springai.mcp.server.ServerApplication
+
+
+
+ mcp-client
+
+ com.baeldung.springai.mcp.client.ClientApplication
+
+
+
+ amazon-nova
+
+ com.baeldung.springai.nova.Application
+
+
+
+ pgvector
+
+ com.baeldung.springai.semanticsearch.Application
+
+
+
+ transcribe
com.baeldung.springai.transcribe.Application
@@ -77,8 +219,12 @@
+ 1.0.0-M7
+ 5.9.0
+ 3.1.1
3.4.5
- 1.0.0-M7
+ 1.0.0-M6
+ 1.0.0-M7
-
\ No newline at end of file
+
diff --git a/spring-ai/src/main/java/com/baeldung/springai/rag/mongodb/configuration/AdvisorConfiguration.java b/spring-ai-3/src/main/java/com/baeldung/springai/rag/mongodb/configuration/AdvisorConfiguration.java
similarity index 95%
rename from spring-ai/src/main/java/com/baeldung/springai/rag/mongodb/configuration/AdvisorConfiguration.java
rename to spring-ai-3/src/main/java/com/baeldung/springai/rag/mongodb/configuration/AdvisorConfiguration.java
index 4571dfc5fb6a..2b0190d52985 100644
--- a/spring-ai/src/main/java/com/baeldung/springai/rag/mongodb/configuration/AdvisorConfiguration.java
+++ b/spring-ai-3/src/main/java/com/baeldung/springai/rag/mongodb/configuration/AdvisorConfiguration.java
@@ -11,6 +11,6 @@ public class AdvisorConfiguration {
@Bean
public QuestionAnswerAdvisor questionAnswerAdvisor(VectorStore vectorStore) {
- return new QuestionAnswerAdvisor(vectorStore, SearchRequest.defaults());
+ return new QuestionAnswerAdvisor(vectorStore, SearchRequest.builder().build());
}
}
diff --git a/spring-ai/src/main/java/com/baeldung/springai/rag/mongodb/controller/WikiDocumentsController.java b/spring-ai-3/src/main/java/com/baeldung/springai/rag/mongodb/controller/WikiDocumentsController.java
similarity index 100%
rename from spring-ai/src/main/java/com/baeldung/springai/rag/mongodb/controller/WikiDocumentsController.java
rename to spring-ai-3/src/main/java/com/baeldung/springai/rag/mongodb/controller/WikiDocumentsController.java
diff --git a/spring-ai/src/main/java/com/baeldung/springai/rag/mongodb/dto/WikiDocument.java b/spring-ai-3/src/main/java/com/baeldung/springai/rag/mongodb/dto/WikiDocument.java
similarity index 100%
rename from spring-ai/src/main/java/com/baeldung/springai/rag/mongodb/dto/WikiDocument.java
rename to spring-ai-3/src/main/java/com/baeldung/springai/rag/mongodb/dto/WikiDocument.java
diff --git a/spring-ai/src/main/java/com/baeldung/springai/rag/mongodb/repository/WikiDocumentsRepository.java b/spring-ai-3/src/main/java/com/baeldung/springai/rag/mongodb/repository/WikiDocumentsRepository.java
similarity index 89%
rename from spring-ai/src/main/java/com/baeldung/springai/rag/mongodb/repository/WikiDocumentsRepository.java
rename to spring-ai-3/src/main/java/com/baeldung/springai/rag/mongodb/repository/WikiDocumentsRepository.java
index afde24ff5a51..89cb9a568137 100644
--- a/spring-ai/src/main/java/com/baeldung/springai/rag/mongodb/repository/WikiDocumentsRepository.java
+++ b/spring-ai-3/src/main/java/com/baeldung/springai/rag/mongodb/repository/WikiDocumentsRepository.java
@@ -33,16 +33,16 @@ public void saveWikiDocument(WikiDocument wikiDocument) {
public List findSimilarDocuments(String searchText) {
return vectorStore
- .similaritySearch(SearchRequest
+ .similaritySearch(SearchRequest.builder()
.query(searchText)
- .withSimilarityThreshold(0.87)
- .withTopK(10))
+ .similarityThreshold(0.87)
+ .topK(10).build())
.stream()
.map(document -> {
WikiDocument wikiDocument = new WikiDocument();
wikiDocument.setFilePath((String) document
.getMetadata().get("filePath"));
- wikiDocument.setContent(document.getContent());
+ wikiDocument.setContent(document.getText());
return wikiDocument;
})
diff --git a/spring-ai/src/main/java/com/baeldung/springai/rag/mongodb/service/WikiDocumentsServiceImpl.java b/spring-ai-3/src/main/java/com/baeldung/springai/rag/mongodb/service/WikiDocumentsServiceImpl.java
similarity index 100%
rename from spring-ai/src/main/java/com/baeldung/springai/rag/mongodb/service/WikiDocumentsServiceImpl.java
rename to spring-ai-3/src/main/java/com/baeldung/springai/rag/mongodb/service/WikiDocumentsServiceImpl.java
diff --git a/spring-ai/src/test/docker/mongodb/docker-compose.yml b/spring-ai-3/src/test/docker/mongodb/docker-compose.yml
similarity index 100%
rename from spring-ai/src/test/docker/mongodb/docker-compose.yml
rename to spring-ai-3/src/test/docker/mongodb/docker-compose.yml
diff --git a/spring-ai/src/test/java/com/baeldung/springai/rag/mongodb/RAGMongoDBApplicationManualTest.java b/spring-ai-3/src/test/java/com/baeldung/springai/rag/mongodb/RAGMongoDBApplicationManualTest.java
similarity index 100%
rename from spring-ai/src/test/java/com/baeldung/springai/rag/mongodb/RAGMongoDBApplicationManualTest.java
rename to spring-ai-3/src/test/java/com/baeldung/springai/rag/mongodb/RAGMongoDBApplicationManualTest.java
diff --git a/spring-ai-3/src/test/java/com/baeldung/springai/rag/mongodb/config/VectorStoreConfig.java b/spring-ai-3/src/test/java/com/baeldung/springai/rag/mongodb/config/VectorStoreConfig.java
new file mode 100644
index 000000000000..eee28c92f967
--- /dev/null
+++ b/spring-ai-3/src/test/java/com/baeldung/springai/rag/mongodb/config/VectorStoreConfig.java
@@ -0,0 +1,25 @@
+package com.baeldung.springai.rag.mongodb.config;
+
+import org.springframework.ai.autoconfigure.vectorstore.mongo.MongoDBAtlasVectorStoreProperties;
+import org.springframework.ai.embedding.EmbeddingModel;
+import org.springframework.ai.vectorstore.mongodb.atlas.MongoDBAtlasVectorStore;
+import org.springframework.beans.factory.annotation.Qualifier;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.data.mongodb.core.MongoTemplate;
+
+@Configuration
+public class VectorStoreConfig {
+ @Bean
+ public MongoDBAtlasVectorStore vectorStore(MongoTemplate mongoTemplate,
+ @Qualifier("openAiEmbeddingModel") EmbeddingModel embeddingModel,
+ MongoDBAtlasVectorStoreProperties properties) {
+
+ return MongoDBAtlasVectorStore.builder(mongoTemplate, embeddingModel)
+ .collectionName(properties.getCollectionName())
+ .pathName(properties.getPathName())
+ .vectorIndexName(properties.getIndexName())
+ .initializeSchema(properties.isInitializeSchema())
+ .build();
+ }
+}
diff --git a/spring-ai/src/test/resources/application.yml b/spring-ai-3/src/test/resources/application.yml
similarity index 100%
rename from spring-ai/src/test/resources/application.yml
rename to spring-ai-3/src/test/resources/application.yml
diff --git a/spring-ai/README.md b/spring-ai/README.md
index 873cbd9da898..5db6224d8faf 100644
--- a/spring-ai/README.md
+++ b/spring-ai/README.md
@@ -1,7 +1,6 @@
## Relevant Articles
- [Introduction to Spring AI](https://www.baeldung.com/spring-ai)
- [A Guide to Structured Output in Spring AI](https://www.baeldung.com/spring-artificial-intelligence-structure-output)
-- [Building a RAG App Using MongoDB and Spring AI](https://www.baeldung.com/spring-ai-mongodb-rag)
- [Create a RAG (Retrieval Augmented Generation) Application with Redis and Spring AI](https://www.baeldung.com/spring-ai-redis-rag-app)
- [Create a ChatGPT Like Chatbot With Ollama and Spring AI](https://www.baeldung.com/spring-ai-ollama-chatgpt-like-chatbot)
- [Function Calling in Java and Spring AI Using the Mistral AI API](https://www.baeldung.com/spring-ai-mistral-api-function-calling)
diff --git a/spring-ai/pom.xml b/spring-ai/pom.xml
index e2e97bfc2f84..6d068c0db336 100644
--- a/spring-ai/pom.xml
+++ b/spring-ai/pom.xml
@@ -78,10 +78,6 @@
org.springframework.ai
spring-ai-pdf-document-reader
-
- org.springframework.ai
- spring-ai-mongodb-atlas-store-spring-boot-starter
-
org.springframework.ai
spring-ai-ollama-spring-boot-starter
diff --git a/spring-ai/src/test/java/com/baeldung/springai/rag/mongodb/config/VectorStoreConfig.java b/spring-ai/src/test/java/com/baeldung/springai/rag/mongodb/config/VectorStoreConfig.java
deleted file mode 100644
index 3cdcc26a22e2..000000000000
--- a/spring-ai/src/test/java/com/baeldung/springai/rag/mongodb/config/VectorStoreConfig.java
+++ /dev/null
@@ -1,34 +0,0 @@
-package com.baeldung.springai.rag.mongodb.config;
-
-import org.springframework.ai.autoconfigure.vectorstore.mongo.MongoDBAtlasVectorStoreProperties;
-import org.springframework.ai.embedding.EmbeddingModel;
-import org.springframework.ai.vectorstore.MongoDBAtlasVectorStore;
-import org.springframework.beans.factory.annotation.Qualifier;
-import org.springframework.context.annotation.Bean;
-import org.springframework.context.annotation.Configuration;
-import org.springframework.data.mongodb.core.MongoTemplate;
-import org.springframework.util.StringUtils;
-
-@Configuration
-public class VectorStoreConfig {
- @Bean
- public MongoDBAtlasVectorStore vectorStore(MongoTemplate mongoTemplate,
- @Qualifier("openAiEmbeddingModel") EmbeddingModel embeddingModel,
- MongoDBAtlasVectorStoreProperties properties) {
- MongoDBAtlasVectorStore.MongoDBVectorStoreConfig.Builder builder = MongoDBAtlasVectorStore.MongoDBVectorStoreConfig.builder();
- if (StringUtils.hasText(properties.getCollectionName())) {
- builder.withCollectionName(properties.getCollectionName());
- }
-
- if (StringUtils.hasText(properties.getPathName())) {
- builder.withPathName(properties.getPathName());
- }
-
- if (StringUtils.hasText(properties.getIndexName())) {
- builder.withVectorIndexName(properties.getIndexName());
- }
-
- MongoDBAtlasVectorStore.MongoDBVectorStoreConfig config = builder.build();
- return new MongoDBAtlasVectorStore(mongoTemplate, embeddingModel, config, properties.isInitializeSchema());
- }
-}