diff --git a/pom.xml b/pom.xml
index a2cf091e9c9b..5bf0e34875fc 100644
--- a/pom.xml
+++ b/pom.xml
@@ -764,10 +764,6 @@
spring-6-rsocket
spring-activiti
spring-actuator
- spring-ai
- spring-ai-2
- spring-ai-3
- spring-ai-4
spring-ai-modules
spring-aop
spring-aop-2
@@ -1203,10 +1199,6 @@
spring-6-rsocket
spring-activiti
spring-actuator
- spring-ai
- spring-ai-2
- spring-ai-3
- spring-ai-4
spring-ai-modules
spring-aop
spring-aop-2
diff --git a/spring-ai-2/README.md b/spring-ai-2/README.md
deleted file mode 100644
index 512b64d9b27e..000000000000
--- a/spring-ai-2/README.md
+++ /dev/null
@@ -1,2 +0,0 @@
-## Relevant Articles
-
diff --git a/spring-ai-2/pom.xml b/spring-ai-2/pom.xml
deleted file mode 100644
index 591141b18ccd..000000000000
--- a/spring-ai-2/pom.xml
+++ /dev/null
@@ -1,188 +0,0 @@
-
-
- 4.0.0
- spring-ai-2
- 0.0.1
- jar
- spring-ai-2
-
-
- com.baeldung
- parent-boot-3
- 0.0.1-SNAPSHOT
- ../parent-boot-3
-
-
-
-
- spring-milestones
- Spring Milestones
- https://repo.spring.io/milestone
-
- false
-
-
-
-
-
-
-
- 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-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.boot
- 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-redis-store-spring-boot-starter
-
-
- org.springframework.ai
- spring-ai-pdf-document-reader
-
-
-
-
-
- chromadb
-
- true
-
-
- com.baeldung.springai.chromadb.Application
-
-
-
- assistant
-
- com.baeldung.spring.ai.om.OrderManagementApplication
-
-
-
- anthropic
-
- com.baeldung.springai.anthropic.Application
-
-
-
- evaluator
-
- com.baeldung.springai.evaluator.Application
-
-
-
- hugging-face
-
- com.baeldung.springai.huggingface.Application
-
-
-
- amazon-nova
-
- com.baeldung.springai.nova.Application
-
-
-
-
-
-
-
- org.springframework.boot
- spring-boot-maven-plugin
-
- ${spring.boot.mainclass}
-
-
-
- org.apache.maven.plugins
- maven-compiler-plugin
-
- 21
-
-
-
-
-
-
- 3.4.1
- 1.0.0-M6
- 5.9.0
- 3.1.1
-
-
-
\ No newline at end of file
diff --git a/spring-ai-2/src/main/resources/application-mcp-client.properties b/spring-ai-2/src/main/resources/application-mcp-client.properties
deleted file mode 100644
index e92e91fef1e9..000000000000
--- a/spring-ai-2/src/main/resources/application-mcp-client.properties
+++ /dev/null
@@ -1,11 +0,0 @@
-spring.ai.anthropic.api-key=${ANTHROPIC_API_KEY}
-spring.ai.anthropic.chat.options.model=claude-3-7-sonnet-20250219
-
-spring.ai.mcp.client.sse.connections.author-tools-server.url=http://localhost:8081
-
-spring.ai.mcp.client.stdio.connections.filesystem.command=npx
-spring.ai.mcp.client.stdio.connections.filesystem.args=-y, @modelcontextprotocol/server-filesystem, ./
-
-spring.ai.mcp.client.stdio.connections.brave-search.command=npx
-spring.ai.mcp.client.stdio.connections.brave-search.args=-y, @modelcontextprotocol/server-brave-search
-spring.ai.mcp.client.stdio.connections.brave-search.env.BRAVE_API_KEY=${BRAVE_API_KEY}
\ No newline at end of file
diff --git a/spring-ai-3/README.md b/spring-ai-3/README.md
deleted file mode 100644
index ae92e6521af1..000000000000
--- a/spring-ai-3/README.md
+++ /dev/null
@@ -1,2 +0,0 @@
-## 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/pom.xml b/spring-ai-3/pom.xml
deleted file mode 100644
index 8942749ffb46..000000000000
--- a/spring-ai-3/pom.xml
+++ /dev/null
@@ -1,172 +0,0 @@
-
-
- 4.0.0
- spring-ai-3
- 0.0.1
- jar
- spring-ai-3
-
-
- com.baeldung
- parent-boot-3
- 0.0.1-SNAPSHOT
- ../parent-boot-3
-
-
-
-
- spring-milestones
- Spring Milestones
- https://repo.spring.io/milestone
-
- false
-
-
-
-
-
-
-
- org.springframework.ai
- spring-ai-bom
- ${spring-ai.version}
- pom
- import
-
-
-
-
-
-
- org.springframework.boot
- spring-boot-starter-web
-
-
- org.springframework.boot
- spring-boot-starter-data-jpa
-
-
- org.springframework.ai
- spring-ai-openai-spring-boot-starter
-
-
- org.springframework.ai
- spring-ai-mcp-server-webmvc-spring-boot-starter
-
-
- org.hsqldb
- hsqldb
- runtime
-
-
- org.springframework.ai
- spring-ai-starter-model-openai
- ${spring-ai-start-model-openai.version}
-
-
- org.springframework.boot
- spring-boot-starter-oauth2-resource-server
- ${oauth2-resource-server.version}
-
-
- org.springframework.boot
- spring-boot-starter-oauth2-authorization-server
- ${oauth2-authorization-server.version}
-
-
-
-
- org.springframework.boot
- spring-boot-starter-test
- test
-
-
- org.springframework.ai
- spring-ai-spring-boot-testcontainers
- test
-
-
- org.testcontainers
- junit-jupiter
- 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}
-
-
- org.springframework.ai
- spring-ai-mistral-ai-spring-boot-starter
-
-
-
-
-
- amazon-nova
-
- true
-
-
- com.baeldung.springai.nova.Application
-
-
-
- transcribe
-
- com.baeldung.springai.transcribe.Application
-
-
- true
-
-
-
-
-
-
-
- org.springframework.boot
- spring-boot-maven-plugin
-
- ${spring.boot.mainclass}
-
-
-
- org.apache.maven.plugins
- maven-compiler-plugin
-
- 21
-
-
-
-
-
-
- 1.0.0-M7
- 5.9.0
- 3.1.1
- 3.5.0
- 1.0.0-M6
- 1.0.0-M7
- 3.4.2
- 3.3.3
-
-
-
diff --git a/spring-ai-3/src/main/java/com/baeldung/springai/dto/Patient.java b/spring-ai-3/src/main/java/com/baeldung/springai/dto/Patient.java
deleted file mode 100644
index 493cf23bde46..000000000000
--- a/spring-ai-3/src/main/java/com/baeldung/springai/dto/Patient.java
+++ /dev/null
@@ -1,4 +0,0 @@
-package com.baeldung.springai.dto;
-
-public record Patient(String patientId) {
-}
diff --git a/spring-ai-4/pom.xml b/spring-ai-4/pom.xml
deleted file mode 100644
index ac2466af39f8..000000000000
--- a/spring-ai-4/pom.xml
+++ /dev/null
@@ -1,119 +0,0 @@
-
-
- 4.0.0
- spring-ai-4
- 0.0.1
- jar
- spring-ai-4
-
-
- com.baeldung
- parent-boot-3
- 0.0.1-SNAPSHOT
- ../parent-boot-3
-
-
-
-
- spring-milestones
- Spring Milestones
- https://repo.spring.io/milestone
-
- false
-
-
- true
-
-
-
- spring-snapshots
- Spring Snapshots
- https://repo.spring.io/snapshot
-
- true
-
-
- false
-
-
-
-
-
-
-
- org.springframework.ai
- spring-ai-bom
- ${spring-ai.version}
- pom
- import
-
-
-
-
-
-
- org.springframework.boot
- spring-boot-starter-web
-
-
- org.springframework.ai
- spring-ai-starter-model-openai
-
-
- org.springframework.ai
- spring-ai-model-chat-memory-repository-jdbc
-
-
- org.hsqldb
- hsqldb
- runtime
-
-
-
-
- org.springframework.boot
- spring-boot-starter-test
- test
-
-
-
-
-
- chat-memory
-
- true
-
-
- com.baeldung.springai.memory.Application
-
-
-
-
-
-
-
- org.springframework.boot
- spring-boot-maven-plugin
-
- ${spring.boot.mainclass}
-
-
-
- org.apache.maven.plugins
- maven-compiler-plugin
-
- 21
-
-
-
-
-
-
- 5.9.0
- 3.5.0
- 1.0.0
-
-
-
diff --git a/spring-ai-modules/pom.xml b/spring-ai-modules/pom.xml
index 44c133498d10..7ac5499cb3f2 100644
--- a/spring-ai-modules/pom.xml
+++ b/spring-ai-modules/pom.xml
@@ -1,7 +1,7 @@
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
4.0.0
spring-ai-modules
0.0.1
@@ -16,9 +16,13 @@
- spring-ai-mcp
- spring-ai-text-to-sql
- spring-ai-vector-stores
+ spring-ai-advanced-features
+ spring-ai-chat-models
+ spring-ai-conversational
+ spring-ai-core
+ spring-ai-infrastructure
+ spring-ai-multimodal
+ spring-ai-vector-rag
\ No newline at end of file
diff --git a/spring-ai-modules/spring-ai-advanced-features/pom.xml b/spring-ai-modules/spring-ai-advanced-features/pom.xml
new file mode 100644
index 000000000000..fd4a426c26a2
--- /dev/null
+++ b/spring-ai-modules/spring-ai-advanced-features/pom.xml
@@ -0,0 +1,202 @@
+
+
+ 4.0.0
+ spring-ai-advanced-features
+ spring-ai-advanced-features
+ war
+
+
+ com.baeldung
+ spring-ai-modules
+ 0.0.1
+ ../pom.xml
+
+
+
+
+ spring-snapshots
+ Spring Snapshots
+ https://repo.spring.io/snapshot
+
+ false
+
+
+
+ Central Portal Snapshots
+ central-portal-snapshots
+ https://central.sonatype.com/repository/maven-snapshots/
+
+ false
+
+
+ true
+
+
+
+
+
+
+
+ org.springframework.boot
+ spring-boot-dependencies
+ ${spring-boot.version}
+ pom
+ import
+
+
+ org.springframework.ai
+ spring-ai-bom
+ ${spring-ai.version}
+ pom
+ import
+
+
+
+
+
+
+ org.springframework.boot
+ spring-boot-starter-web
+
+
+ org.springframework.ai
+ spring-ai-starter-model-anthropic
+ 1.0.0
+
+
+ org.springframework.ai
+ spring-ai-starter-mcp-client
+ 1.0.0
+
+
+ org.springframework.ai
+ spring-ai-starter-mcp-server-webmvc
+ 1.0.0
+
+
+ org.springframework.ai
+ spring-ai-openai-spring-boot-starter
+
+
+ org.springframework.ai
+ spring-ai-mistral-ai-spring-boot-starter
+
+
+ org.springframework.ai
+ spring-ai-redis-store-spring-boot-starter
+
+
+ org.springframework.ai
+ spring-ai-transformers-spring-boot-starter
+
+
+ org.springframework.ai
+ spring-ai-ollama-spring-boot-starter
+
+
+ org.springframework.ai
+ spring-ai-pgvector-store-spring-boot-starter
+
+
+ org.springframework.boot
+ spring-boot-docker-compose
+
+
+ org.springframework.ai
+ spring-ai-bedrock-converse-spring-boot-starter
+
+
+
+ org.springframework.boot
+ spring-boot-starter-test
+ test
+
+
+
+ org.springframework.boot
+ spring-boot-starter-data-jpa
+
+
+ com.mysql
+ mysql-connector-j
+
+
+ org.flywaydb
+ flyway-mysql
+
+
+
+ org.springframework.boot
+ spring-boot-testcontainers
+ test
+
+
+ org.testcontainers
+ mysql
+ test
+
+
+ org.testcontainers
+ ollama
+ test
+
+
+ org.springframework.ai
+ spring-ai-pdf-document-reader
+
+
+ org.springframework.ai
+ spring-ai-markdown-document-reader
+
+
+ org.springframework.ai
+ spring-ai-client-chat
+ 1.0.0
+ test
+
+
+
+
+
+ mcp-server
+
+ true
+
+
+ com.baeldung.springai.mcp.server.ServerApplication
+
+
+
+ mcp-client
+
+ com.baeldung.springai.mcp.client.ClientApplication
+
+
+
+
+
+
+
+ org.springframework.boot
+ spring-boot-maven-plugin
+
+
+ org.apache.maven.plugins
+ maven-compiler-plugin
+
+ 21
+
+
+
+
+
+
+ 1.0.0-M6
+ 3.4.1
+ 5.9.0
+ true
+
+
+
\ No newline at end of file
diff --git a/spring-ai-3/src/main/java/com/baeldung/springai/advisors/CustomLoggingAdvisor.java b/spring-ai-modules/spring-ai-advanced-features/src/main/java/com/baeldung/springai/advisors/CustomLoggingAdvisor.java
similarity index 100%
rename from spring-ai-3/src/main/java/com/baeldung/springai/advisors/CustomLoggingAdvisor.java
rename to spring-ai-modules/spring-ai-advanced-features/src/main/java/com/baeldung/springai/advisors/CustomLoggingAdvisor.java
diff --git a/spring-ai-2/src/main/java/com/baeldung/springai/evaluator/Application.java b/spring-ai-modules/spring-ai-advanced-features/src/main/java/com/baeldung/springai/evaluator/Application.java
similarity index 100%
rename from spring-ai-2/src/main/java/com/baeldung/springai/evaluator/Application.java
rename to spring-ai-modules/spring-ai-advanced-features/src/main/java/com/baeldung/springai/evaluator/Application.java
diff --git a/spring-ai-2/src/main/java/com/baeldung/springai/evaluator/LLMConfiguration.java b/spring-ai-modules/spring-ai-advanced-features/src/main/java/com/baeldung/springai/evaluator/LLMConfiguration.java
similarity index 100%
rename from spring-ai-2/src/main/java/com/baeldung/springai/evaluator/LLMConfiguration.java
rename to spring-ai-modules/spring-ai-advanced-features/src/main/java/com/baeldung/springai/evaluator/LLMConfiguration.java
diff --git a/spring-ai-2/src/main/java/com/baeldung/springai/evaluator/VectorStoreInitializer.java b/spring-ai-modules/spring-ai-advanced-features/src/main/java/com/baeldung/springai/evaluator/VectorStoreInitializer.java
similarity index 100%
rename from spring-ai-2/src/main/java/com/baeldung/springai/evaluator/VectorStoreInitializer.java
rename to spring-ai-modules/spring-ai-advanced-features/src/main/java/com/baeldung/springai/evaluator/VectorStoreInitializer.java
index 3910914e3e72..42216d3ed7a3 100644
--- a/spring-ai-2/src/main/java/com/baeldung/springai/evaluator/VectorStoreInitializer.java
+++ b/spring-ai-modules/spring-ai-advanced-features/src/main/java/com/baeldung/springai/evaluator/VectorStoreInitializer.java
@@ -1,5 +1,10 @@
package com.baeldung.springai.evaluator;
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+
import org.springframework.ai.document.Document;
import org.springframework.ai.reader.markdown.MarkdownDocumentReader;
import org.springframework.ai.reader.markdown.config.MarkdownDocumentReaderConfig;
@@ -11,11 +16,6 @@
import org.springframework.core.io.support.ResourcePatternResolver;
import org.springframework.stereotype.Component;
-import java.io.IOException;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.List;
-
@Component
class VectorStoreInitializer implements ApplicationRunner {
diff --git a/spring-ai-modules/spring-ai-mcp/src/main/java/com/baeldung/springai/mcp/client/ChatbotConfiguration.java b/spring-ai-modules/spring-ai-advanced-features/src/main/java/com/baeldung/springai/mcp/client/ChatbotConfiguration.java
similarity index 88%
rename from spring-ai-modules/spring-ai-mcp/src/main/java/com/baeldung/springai/mcp/client/ChatbotConfiguration.java
rename to spring-ai-modules/spring-ai-advanced-features/src/main/java/com/baeldung/springai/mcp/client/ChatbotConfiguration.java
index f1b979a31bb8..3d6a504ab0d6 100644
--- a/spring-ai-modules/spring-ai-mcp/src/main/java/com/baeldung/springai/mcp/client/ChatbotConfiguration.java
+++ b/spring-ai-modules/spring-ai-advanced-features/src/main/java/com/baeldung/springai/mcp/client/ChatbotConfiguration.java
@@ -13,7 +13,7 @@ class ChatbotConfiguration {
ChatClient chatClient(ChatModel chatModel, SyncMcpToolCallbackProvider toolCallbackProvider) {
return ChatClient
.builder(chatModel)
- .defaultToolCallbacks(toolCallbackProvider.getToolCallbacks())
+ .defaultTools(toolCallbackProvider.getToolCallbacks())
.build();
}
diff --git a/spring-ai-modules/spring-ai-mcp/src/main/java/com/baeldung/springai/mcp/client/ChatbotController.java b/spring-ai-modules/spring-ai-advanced-features/src/main/java/com/baeldung/springai/mcp/client/ChatbotController.java
similarity index 100%
rename from spring-ai-modules/spring-ai-mcp/src/main/java/com/baeldung/springai/mcp/client/ChatbotController.java
rename to spring-ai-modules/spring-ai-advanced-features/src/main/java/com/baeldung/springai/mcp/client/ChatbotController.java
diff --git a/spring-ai-modules/spring-ai-mcp/src/main/java/com/baeldung/springai/mcp/client/ChatbotService.java b/spring-ai-modules/spring-ai-advanced-features/src/main/java/com/baeldung/springai/mcp/client/ChatbotService.java
similarity index 100%
rename from spring-ai-modules/spring-ai-mcp/src/main/java/com/baeldung/springai/mcp/client/ChatbotService.java
rename to spring-ai-modules/spring-ai-advanced-features/src/main/java/com/baeldung/springai/mcp/client/ChatbotService.java
diff --git a/spring-ai-modules/spring-ai-mcp/src/main/java/com/baeldung/springai/mcp/client/ClientApplication.java b/spring-ai-modules/spring-ai-advanced-features/src/main/java/com/baeldung/springai/mcp/client/ClientApplication.java
similarity index 100%
rename from spring-ai-modules/spring-ai-mcp/src/main/java/com/baeldung/springai/mcp/client/ClientApplication.java
rename to spring-ai-modules/spring-ai-advanced-features/src/main/java/com/baeldung/springai/mcp/client/ClientApplication.java
diff --git a/spring-ai-modules/spring-ai-mcp/src/main/java/com/baeldung/springai/mcp/server/AuthorRepository.java b/spring-ai-modules/spring-ai-advanced-features/src/main/java/com/baeldung/springai/mcp/server/AuthorRepository.java
similarity index 100%
rename from spring-ai-modules/spring-ai-mcp/src/main/java/com/baeldung/springai/mcp/server/AuthorRepository.java
rename to spring-ai-modules/spring-ai-advanced-features/src/main/java/com/baeldung/springai/mcp/server/AuthorRepository.java
diff --git a/spring-ai-modules/spring-ai-mcp/src/main/java/com/baeldung/springai/mcp/server/MCPServerConfiguration.java b/spring-ai-modules/spring-ai-advanced-features/src/main/java/com/baeldung/springai/mcp/server/MCPServerConfiguration.java
similarity index 100%
rename from spring-ai-modules/spring-ai-mcp/src/main/java/com/baeldung/springai/mcp/server/MCPServerConfiguration.java
rename to spring-ai-modules/spring-ai-advanced-features/src/main/java/com/baeldung/springai/mcp/server/MCPServerConfiguration.java
diff --git a/spring-ai-modules/spring-ai-mcp/src/main/java/com/baeldung/springai/mcp/server/ServerApplication.java b/spring-ai-modules/spring-ai-advanced-features/src/main/java/com/baeldung/springai/mcp/server/ServerApplication.java
similarity index 100%
rename from spring-ai-modules/spring-ai-mcp/src/main/java/com/baeldung/springai/mcp/server/ServerApplication.java
rename to spring-ai-modules/spring-ai-advanced-features/src/main/java/com/baeldung/springai/mcp/server/ServerApplication.java
diff --git a/spring-ai-3/src/main/java/com/baeldung/spring/ai/mistral/functioncalling/SpringAIApplication.java b/spring-ai-modules/spring-ai-advanced-features/src/main/java/com/baeldung/springai/mistral/functioncalling/SpringAIApplication.java
similarity index 83%
rename from spring-ai-3/src/main/java/com/baeldung/spring/ai/mistral/functioncalling/SpringAIApplication.java
rename to spring-ai-modules/spring-ai-advanced-features/src/main/java/com/baeldung/springai/mistral/functioncalling/SpringAIApplication.java
index dd88db5875cb..35e2615b6363 100644
--- a/spring-ai-3/src/main/java/com/baeldung/spring/ai/mistral/functioncalling/SpringAIApplication.java
+++ b/spring-ai-modules/spring-ai-advanced-features/src/main/java/com/baeldung/springai/mistral/functioncalling/SpringAIApplication.java
@@ -1,4 +1,4 @@
-package com.baeldung.spring.ai.mistral.functioncalling;
+package com.baeldung.springai.mistral.functioncalling;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
diff --git a/spring-ai-3/src/main/java/com/baeldung/springai/dto/HealthStatus.java b/spring-ai-modules/spring-ai-advanced-features/src/main/java/com/baeldung/springai/mistral/functioncalling/dto/HealthStatus.java
similarity index 62%
rename from spring-ai-3/src/main/java/com/baeldung/springai/dto/HealthStatus.java
rename to spring-ai-modules/spring-ai-advanced-features/src/main/java/com/baeldung/springai/mistral/functioncalling/dto/HealthStatus.java
index d21991cadfde..f29389885f16 100644
--- a/spring-ai-3/src/main/java/com/baeldung/springai/dto/HealthStatus.java
+++ b/spring-ai-modules/spring-ai-advanced-features/src/main/java/com/baeldung/springai/mistral/functioncalling/dto/HealthStatus.java
@@ -1,4 +1,4 @@
-package com.baeldung.springai.dto;
+package com.baeldung.springai.mistral.functioncalling.dto;
import java.time.LocalDate;
diff --git a/spring-ai-modules/spring-ai-advanced-features/src/main/java/com/baeldung/springai/mistral/functioncalling/dto/Patient.java b/spring-ai-modules/spring-ai-advanced-features/src/main/java/com/baeldung/springai/mistral/functioncalling/dto/Patient.java
new file mode 100644
index 000000000000..05c71e29be8e
--- /dev/null
+++ b/spring-ai-modules/spring-ai-advanced-features/src/main/java/com/baeldung/springai/mistral/functioncalling/dto/Patient.java
@@ -0,0 +1,4 @@
+package com.baeldung.springai.mistral.functioncalling.dto;
+
+public record Patient(String patientId) {
+}
diff --git a/spring-ai-modules/spring-ai-text-to-sql/src/main/java/com/baeldung/texttosql/ApiExceptionHandler.java b/spring-ai-modules/spring-ai-advanced-features/src/main/java/com/baeldung/springai/texttosql/ApiExceptionHandler.java
similarity index 94%
rename from spring-ai-modules/spring-ai-text-to-sql/src/main/java/com/baeldung/texttosql/ApiExceptionHandler.java
rename to spring-ai-modules/spring-ai-advanced-features/src/main/java/com/baeldung/springai/texttosql/ApiExceptionHandler.java
index f593365955d9..906e7bf549e3 100644
--- a/spring-ai-modules/spring-ai-text-to-sql/src/main/java/com/baeldung/texttosql/ApiExceptionHandler.java
+++ b/spring-ai-modules/spring-ai-advanced-features/src/main/java/com/baeldung/springai/texttosql/ApiExceptionHandler.java
@@ -1,4 +1,4 @@
-package com.baeldung.texttosql;
+package com.baeldung.springai.texttosql;
import org.springframework.http.ProblemDetail;
import org.springframework.web.bind.annotation.ExceptionHandler;
diff --git a/spring-ai-modules/spring-ai-text-to-sql/src/main/java/com/baeldung/texttosql/Application.java b/spring-ai-modules/spring-ai-advanced-features/src/main/java/com/baeldung/springai/texttosql/Application.java
similarity index 87%
rename from spring-ai-modules/spring-ai-text-to-sql/src/main/java/com/baeldung/texttosql/Application.java
rename to spring-ai-modules/spring-ai-advanced-features/src/main/java/com/baeldung/springai/texttosql/Application.java
index 49da408663a2..2ac6d023710a 100644
--- a/spring-ai-modules/spring-ai-text-to-sql/src/main/java/com/baeldung/texttosql/Application.java
+++ b/spring-ai-modules/spring-ai-advanced-features/src/main/java/com/baeldung/springai/texttosql/Application.java
@@ -1,4 +1,4 @@
-package com.baeldung.texttosql;
+package com.baeldung.springai.texttosql;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
diff --git a/spring-ai-modules/spring-ai-text-to-sql/src/main/java/com/baeldung/texttosql/ChatbotConfiguration.java b/spring-ai-modules/spring-ai-advanced-features/src/main/java/com/baeldung/springai/texttosql/ChatbotConfiguration.java
similarity index 96%
rename from spring-ai-modules/spring-ai-text-to-sql/src/main/java/com/baeldung/texttosql/ChatbotConfiguration.java
rename to spring-ai-modules/spring-ai-advanced-features/src/main/java/com/baeldung/springai/texttosql/ChatbotConfiguration.java
index 02ec5e899b43..1091f40a345d 100644
--- a/spring-ai-modules/spring-ai-text-to-sql/src/main/java/com/baeldung/texttosql/ChatbotConfiguration.java
+++ b/spring-ai-modules/spring-ai-advanced-features/src/main/java/com/baeldung/springai/texttosql/ChatbotConfiguration.java
@@ -1,4 +1,4 @@
-package com.baeldung.texttosql;
+package com.baeldung.springai.texttosql;
import org.springframework.ai.chat.client.ChatClient;
import org.springframework.ai.chat.model.ChatModel;
diff --git a/spring-ai-modules/spring-ai-text-to-sql/src/main/java/com/baeldung/texttosql/EmptyResultException.java b/spring-ai-modules/spring-ai-advanced-features/src/main/java/com/baeldung/springai/texttosql/EmptyResultException.java
similarity index 86%
rename from spring-ai-modules/spring-ai-text-to-sql/src/main/java/com/baeldung/texttosql/EmptyResultException.java
rename to spring-ai-modules/spring-ai-advanced-features/src/main/java/com/baeldung/springai/texttosql/EmptyResultException.java
index 53d5660fb16c..4a7b358362db 100644
--- a/spring-ai-modules/spring-ai-text-to-sql/src/main/java/com/baeldung/texttosql/EmptyResultException.java
+++ b/spring-ai-modules/spring-ai-advanced-features/src/main/java/com/baeldung/springai/texttosql/EmptyResultException.java
@@ -1,4 +1,4 @@
-package com.baeldung.texttosql;
+package com.baeldung.springai.texttosql;
import org.springframework.http.HttpStatus;
import org.springframework.web.server.ResponseStatusException;
diff --git a/spring-ai-modules/spring-ai-text-to-sql/src/main/java/com/baeldung/texttosql/InvalidQueryException.java b/spring-ai-modules/spring-ai-advanced-features/src/main/java/com/baeldung/springai/texttosql/InvalidQueryException.java
similarity index 86%
rename from spring-ai-modules/spring-ai-text-to-sql/src/main/java/com/baeldung/texttosql/InvalidQueryException.java
rename to spring-ai-modules/spring-ai-advanced-features/src/main/java/com/baeldung/springai/texttosql/InvalidQueryException.java
index e72f044a6426..ab1908b48f16 100644
--- a/spring-ai-modules/spring-ai-text-to-sql/src/main/java/com/baeldung/texttosql/InvalidQueryException.java
+++ b/spring-ai-modules/spring-ai-advanced-features/src/main/java/com/baeldung/springai/texttosql/InvalidQueryException.java
@@ -1,4 +1,4 @@
-package com.baeldung.texttosql;
+package com.baeldung.springai.texttosql;
import org.springframework.http.HttpStatus;
import org.springframework.web.server.ResponseStatusException;
diff --git a/spring-ai-modules/spring-ai-text-to-sql/src/main/java/com/baeldung/texttosql/QueryController.java b/spring-ai-modules/spring-ai-advanced-features/src/main/java/com/baeldung/springai/texttosql/QueryController.java
similarity index 95%
rename from spring-ai-modules/spring-ai-text-to-sql/src/main/java/com/baeldung/texttosql/QueryController.java
rename to spring-ai-modules/spring-ai-advanced-features/src/main/java/com/baeldung/springai/texttosql/QueryController.java
index b3ceb7880a45..cd72d820636a 100644
--- a/spring-ai-modules/spring-ai-text-to-sql/src/main/java/com/baeldung/texttosql/QueryController.java
+++ b/spring-ai-modules/spring-ai-advanced-features/src/main/java/com/baeldung/springai/texttosql/QueryController.java
@@ -1,4 +1,4 @@
-package com.baeldung.texttosql;
+package com.baeldung.springai.texttosql;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.PostMapping;
diff --git a/spring-ai-modules/spring-ai-text-to-sql/src/main/java/com/baeldung/texttosql/SqlExecutor.java b/spring-ai-modules/spring-ai-advanced-features/src/main/java/com/baeldung/springai/texttosql/SqlExecutor.java
similarity index 93%
rename from spring-ai-modules/spring-ai-text-to-sql/src/main/java/com/baeldung/texttosql/SqlExecutor.java
rename to spring-ai-modules/spring-ai-advanced-features/src/main/java/com/baeldung/springai/texttosql/SqlExecutor.java
index d0d7361e64fd..83ffd63d8d0d 100644
--- a/spring-ai-modules/spring-ai-text-to-sql/src/main/java/com/baeldung/texttosql/SqlExecutor.java
+++ b/spring-ai-modules/spring-ai-advanced-features/src/main/java/com/baeldung/springai/texttosql/SqlExecutor.java
@@ -1,4 +1,4 @@
-package com.baeldung.texttosql;
+package com.baeldung.springai.texttosql;
import jakarta.persistence.EntityManager;
import org.springframework.stereotype.Service;
diff --git a/spring-ai-modules/spring-ai-text-to-sql/src/main/java/com/baeldung/texttosql/SqlGenerator.java b/spring-ai-modules/spring-ai-advanced-features/src/main/java/com/baeldung/springai/texttosql/SqlGenerator.java
similarity index 93%
rename from spring-ai-modules/spring-ai-text-to-sql/src/main/java/com/baeldung/texttosql/SqlGenerator.java
rename to spring-ai-modules/spring-ai-advanced-features/src/main/java/com/baeldung/springai/texttosql/SqlGenerator.java
index b4542c19e61d..ee40c5d3ee63 100644
--- a/spring-ai-modules/spring-ai-text-to-sql/src/main/java/com/baeldung/texttosql/SqlGenerator.java
+++ b/spring-ai-modules/spring-ai-advanced-features/src/main/java/com/baeldung/springai/texttosql/SqlGenerator.java
@@ -1,4 +1,4 @@
-package com.baeldung.texttosql;
+package com.baeldung.springai.texttosql;
import org.springframework.ai.chat.client.ChatClient;
import org.springframework.stereotype.Service;
diff --git a/spring-ai-2/src/main/resources/application-evaluator.properties b/spring-ai-modules/spring-ai-advanced-features/src/main/resources/application-evaluator.properties
similarity index 100%
rename from spring-ai-2/src/main/resources/application-evaluator.properties
rename to spring-ai-modules/spring-ai-advanced-features/src/main/resources/application-evaluator.properties
diff --git a/spring-ai-modules/spring-ai-mcp/src/main/resources/application-mcp-client.properties b/spring-ai-modules/spring-ai-advanced-features/src/main/resources/application-mcp-client.properties
similarity index 100%
rename from spring-ai-modules/spring-ai-mcp/src/main/resources/application-mcp-client.properties
rename to spring-ai-modules/spring-ai-advanced-features/src/main/resources/application-mcp-client.properties
diff --git a/spring-ai-2/src/main/resources/application-mcp-server.properties b/spring-ai-modules/spring-ai-advanced-features/src/main/resources/application-mcp-server.properties
similarity index 100%
rename from spring-ai-2/src/main/resources/application-mcp-server.properties
rename to spring-ai-modules/spring-ai-advanced-features/src/main/resources/application-mcp-server.properties
diff --git a/spring-ai-modules/spring-ai-text-to-sql/src/main/resources/application.yaml b/spring-ai-modules/spring-ai-advanced-features/src/main/resources/application.yml
similarity index 52%
rename from spring-ai-modules/spring-ai-text-to-sql/src/main/resources/application.yaml
rename to spring-ai-modules/spring-ai-advanced-features/src/main/resources/application.yml
index 9b0cc27265bd..56a579bd70fd 100644
--- a/spring-ai-modules/spring-ai-text-to-sql/src/main/resources/application.yaml
+++ b/spring-ai-modules/spring-ai-advanced-features/src/main/resources/application.yml
@@ -1,13 +1,12 @@
spring:
ai:
+ mistralai:
+ api-key: ${MISTRAL_AI_API_KEY}
+ chat:
+ options:
+ model: mistral-small-latest
anthropic:
api-key: ${ANTHROPIC_API_KEY}
chat:
options:
model: claude-opus-4-20250514
-
-logging:
- level:
- org:
- hibernate:
- SQL: DEBUG
\ No newline at end of file
diff --git a/spring-ai-modules/spring-ai-text-to-sql/src/main/resources/db/migration/V01__creating_database_tables.sql b/spring-ai-modules/spring-ai-advanced-features/src/main/resources/db/migration/V01__creating_database_tables.sql
similarity index 100%
rename from spring-ai-modules/spring-ai-text-to-sql/src/main/resources/db/migration/V01__creating_database_tables.sql
rename to spring-ai-modules/spring-ai-advanced-features/src/main/resources/db/migration/V01__creating_database_tables.sql
diff --git a/spring-ai-modules/spring-ai-text-to-sql/src/main/resources/db/migration/V02__adding_hogwarts_houses_data.sql b/spring-ai-modules/spring-ai-advanced-features/src/main/resources/db/migration/V02__adding_hogwarts_houses_data.sql
similarity index 100%
rename from spring-ai-modules/spring-ai-text-to-sql/src/main/resources/db/migration/V02__adding_hogwarts_houses_data.sql
rename to spring-ai-modules/spring-ai-advanced-features/src/main/resources/db/migration/V02__adding_hogwarts_houses_data.sql
diff --git a/spring-ai-modules/spring-ai-text-to-sql/src/main/resources/db/migration/V03__adding_wizards_data.sql b/spring-ai-modules/spring-ai-advanced-features/src/main/resources/db/migration/V03__adding_wizards_data.sql
similarity index 100%
rename from spring-ai-modules/spring-ai-text-to-sql/src/main/resources/db/migration/V03__adding_wizards_data.sql
rename to spring-ai-modules/spring-ai-advanced-features/src/main/resources/db/migration/V03__adding_wizards_data.sql
diff --git a/spring-ai-2/src/main/resources/documents/leave-policy.md b/spring-ai-modules/spring-ai-advanced-features/src/main/resources/documents/leave-policy.md
similarity index 100%
rename from spring-ai-2/src/main/resources/documents/leave-policy.md
rename to spring-ai-modules/spring-ai-advanced-features/src/main/resources/documents/leave-policy.md
diff --git a/spring-ai-3/src/main/resources/logback-spring.xml b/spring-ai-modules/spring-ai-advanced-features/src/main/resources/logback-spring.xml
similarity index 100%
rename from spring-ai-3/src/main/resources/logback-spring.xml
rename to spring-ai-modules/spring-ai-advanced-features/src/main/resources/logback-spring.xml
diff --git a/spring-ai-modules/spring-ai-text-to-sql/src/main/resources/system-prompt.st b/spring-ai-modules/spring-ai-advanced-features/src/main/resources/system-prompt.st
similarity index 100%
rename from spring-ai-modules/spring-ai-text-to-sql/src/main/resources/system-prompt.st
rename to spring-ai-modules/spring-ai-advanced-features/src/main/resources/system-prompt.st
diff --git a/spring-ai-3/src/test/java/com/baeldung/springai/advisors/CustomSimpleVectorStore.java b/spring-ai-modules/spring-ai-advanced-features/src/test/java/com/baeldung/springai/advisors/CustomSimpleVectorStore.java
similarity index 100%
rename from spring-ai-3/src/test/java/com/baeldung/springai/advisors/CustomSimpleVectorStore.java
rename to spring-ai-modules/spring-ai-advanced-features/src/test/java/com/baeldung/springai/advisors/CustomSimpleVectorStore.java
diff --git a/spring-ai-3/src/test/java/com/baeldung/springai/advisors/SimpleVectorStoreConfiguration.java b/spring-ai-modules/spring-ai-advanced-features/src/test/java/com/baeldung/springai/advisors/SimpleVectorStoreConfiguration.java
similarity index 100%
rename from spring-ai-3/src/test/java/com/baeldung/springai/advisors/SimpleVectorStoreConfiguration.java
rename to spring-ai-modules/spring-ai-advanced-features/src/test/java/com/baeldung/springai/advisors/SimpleVectorStoreConfiguration.java
diff --git a/spring-ai-3/src/test/java/com/baeldung/springai/advisors/SpringAILiveTest.java b/spring-ai-modules/spring-ai-advanced-features/src/test/java/com/baeldung/springai/advisors/SpringAILiveTest.java
similarity index 100%
rename from spring-ai-3/src/test/java/com/baeldung/springai/advisors/SpringAILiveTest.java
rename to spring-ai-modules/spring-ai-advanced-features/src/test/java/com/baeldung/springai/advisors/SpringAILiveTest.java
diff --git a/spring-ai-2/src/test/java/com/baeldung/springai/evaluator/LLMResponseEvaluatorLiveTest.java b/spring-ai-modules/spring-ai-advanced-features/src/test/java/com/baeldung/springai/evaluator/LLMResponseEvaluatorLiveTest.java
similarity index 100%
rename from spring-ai-2/src/test/java/com/baeldung/springai/evaluator/LLMResponseEvaluatorLiveTest.java
rename to spring-ai-modules/spring-ai-advanced-features/src/test/java/com/baeldung/springai/evaluator/LLMResponseEvaluatorLiveTest.java
index 5a432246897a..eb22b8bc73f3 100644
--- a/spring-ai-2/src/test/java/com/baeldung/springai/evaluator/LLMResponseEvaluatorLiveTest.java
+++ b/spring-ai-modules/spring-ai-advanced-features/src/test/java/com/baeldung/springai/evaluator/LLMResponseEvaluatorLiveTest.java
@@ -1,5 +1,9 @@
package com.baeldung.springai.evaluator;
+import static org.assertj.core.api.AssertionsForClassTypes.assertThat;
+
+import java.util.List;
+
import org.junit.jupiter.api.Test;
import org.springframework.ai.chat.client.ChatClient;
import org.springframework.ai.chat.client.advisor.QuestionAnswerAdvisor;
@@ -13,10 +17,6 @@
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.context.annotation.Import;
-import java.util.List;
-
-import static org.assertj.core.api.AssertionsForClassTypes.assertThat;
-
@SpringBootTest
@Import(TestcontainersConfiguration.class)
class LLMResponseEvaluatorLiveTest {
diff --git a/spring-ai-2/src/test/java/com/baeldung/springai/evaluator/TestcontainersConfiguration.java b/spring-ai-modules/spring-ai-advanced-features/src/test/java/com/baeldung/springai/evaluator/TestcontainersConfiguration.java
similarity index 100%
rename from spring-ai-2/src/test/java/com/baeldung/springai/evaluator/TestcontainersConfiguration.java
rename to spring-ai-modules/spring-ai-advanced-features/src/test/java/com/baeldung/springai/evaluator/TestcontainersConfiguration.java
diff --git a/spring-ai-modules/spring-ai-mcp/src/test/java/com/baeldung/springai/mcp/client/ChatbotServiceLiveTest.java b/spring-ai-modules/spring-ai-advanced-features/src/test/java/com/baeldung/springai/mcp/client/ChatbotServiceLiveTest.java
similarity index 100%
rename from spring-ai-modules/spring-ai-mcp/src/test/java/com/baeldung/springai/mcp/client/ChatbotServiceLiveTest.java
rename to spring-ai-modules/spring-ai-advanced-features/src/test/java/com/baeldung/springai/mcp/client/ChatbotServiceLiveTest.java
diff --git a/spring-ai-3/src/test/java/com/baeldung/spring/ai/mistral/functioncalling/MistralAIFunctionCallingManualTest.java b/spring-ai-modules/spring-ai-advanced-features/src/test/java/com/baeldung/springai/mistral/functioncalling/MistralAIFunctionCallingManualTest.java
similarity index 98%
rename from spring-ai-3/src/test/java/com/baeldung/spring/ai/mistral/functioncalling/MistralAIFunctionCallingManualTest.java
rename to spring-ai-modules/spring-ai-advanced-features/src/test/java/com/baeldung/springai/mistral/functioncalling/MistralAIFunctionCallingManualTest.java
index 116565e3b105..1183bbbbbbe7 100644
--- a/spring-ai-3/src/test/java/com/baeldung/spring/ai/mistral/functioncalling/MistralAIFunctionCallingManualTest.java
+++ b/spring-ai-modules/spring-ai-advanced-features/src/test/java/com/baeldung/springai/mistral/functioncalling/MistralAIFunctionCallingManualTest.java
@@ -1,4 +1,11 @@
-package com.baeldung.spring.ai.mistral.functioncalling;
+package com.baeldung.springai.mistral.functioncalling;
+
+import java.io.IOException;
+import java.net.URI;
+import java.net.http.HttpClient;
+import java.net.http.HttpRequest;
+import java.net.http.HttpResponse;
+import java.util.Set;
import org.assertj.core.api.Assertions;
import org.junit.jupiter.api.Test;
@@ -14,13 +21,6 @@
import org.springframework.context.annotation.Import;
import org.springframework.test.context.junit.jupiter.SpringExtension;
-import java.io.IOException;
-import java.net.URI;
-import java.net.http.HttpClient;
-import java.net.http.HttpRequest;
-import java.net.http.HttpResponse;
-import java.util.Set;
-
@Import(MistralAIFunctionConfiguration.class)
@ExtendWith(SpringExtension.class)
@SpringBootTest
diff --git a/spring-ai-3/src/test/java/com/baeldung/spring/ai/mistral/functioncalling/MistralAIFunctionConfiguration.java b/spring-ai-modules/spring-ai-advanced-features/src/test/java/com/baeldung/springai/mistral/functioncalling/MistralAIFunctionConfiguration.java
similarity index 87%
rename from spring-ai-3/src/test/java/com/baeldung/spring/ai/mistral/functioncalling/MistralAIFunctionConfiguration.java
rename to spring-ai-modules/spring-ai-advanced-features/src/test/java/com/baeldung/springai/mistral/functioncalling/MistralAIFunctionConfiguration.java
index 8dee5bc53f5c..917aa4041673 100644
--- a/spring-ai-3/src/test/java/com/baeldung/spring/ai/mistral/functioncalling/MistralAIFunctionConfiguration.java
+++ b/spring-ai-modules/spring-ai-advanced-features/src/test/java/com/baeldung/springai/mistral/functioncalling/MistralAIFunctionConfiguration.java
@@ -1,14 +1,15 @@
-package com.baeldung.spring.ai.mistral.functioncalling;
+package com.baeldung.springai.mistral.functioncalling;
+
+import java.time.LocalDate;
+import java.util.Map;
+import java.util.function.Function;
-import com.baeldung.springai.dto.HealthStatus;
-import com.baeldung.springai.dto.Patient;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Description;
-import java.time.LocalDate;
-import java.util.Map;
-import java.util.function.Function;
+import com.baeldung.springai.mistral.functioncalling.dto.HealthStatus;
+import com.baeldung.springai.mistral.functioncalling.dto.Patient;
@Configuration
public class MistralAIFunctionConfiguration {
diff --git a/spring-ai-modules/spring-ai-text-to-sql/src/test/java/com/baeldung/texttosql/TestcontainersConfiguration.java b/spring-ai-modules/spring-ai-advanced-features/src/test/java/com/baeldung/springai/texttosql/TestcontainersConfiguration.java
similarity index 94%
rename from spring-ai-modules/spring-ai-text-to-sql/src/test/java/com/baeldung/texttosql/TestcontainersConfiguration.java
rename to spring-ai-modules/spring-ai-advanced-features/src/test/java/com/baeldung/springai/texttosql/TestcontainersConfiguration.java
index ecb03e63f7b9..56ceff207fd6 100644
--- a/spring-ai-modules/spring-ai-text-to-sql/src/test/java/com/baeldung/texttosql/TestcontainersConfiguration.java
+++ b/spring-ai-modules/spring-ai-advanced-features/src/test/java/com/baeldung/springai/texttosql/TestcontainersConfiguration.java
@@ -1,4 +1,4 @@
-package com.baeldung.texttosql;
+package com.baeldung.springai.texttosql;
import org.springframework.boot.test.context.TestConfiguration;
import org.springframework.boot.testcontainers.service.connection.ServiceConnection;
diff --git a/spring-ai-modules/spring-ai-text-to-sql/src/test/java/com/baeldung/texttosql/TextToSQLLiveTest.java b/spring-ai-modules/spring-ai-advanced-features/src/test/java/com/baeldung/springai/texttosql/TextToSQLLiveTest.java
similarity index 99%
rename from spring-ai-modules/spring-ai-text-to-sql/src/test/java/com/baeldung/texttosql/TextToSQLLiveTest.java
rename to spring-ai-modules/spring-ai-advanced-features/src/test/java/com/baeldung/springai/texttosql/TextToSQLLiveTest.java
index 1431e0b5d730..eef61f0112de 100644
--- a/spring-ai-modules/spring-ai-text-to-sql/src/test/java/com/baeldung/texttosql/TextToSQLLiveTest.java
+++ b/spring-ai-modules/spring-ai-advanced-features/src/test/java/com/baeldung/springai/texttosql/TextToSQLLiveTest.java
@@ -1,4 +1,4 @@
-package com.baeldung.texttosql;
+package com.baeldung.springai.texttosql;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.condition.EnabledIfEnvironmentVariable;
diff --git a/spring-ai-modules/spring-ai-chat-models/pom.xml b/spring-ai-modules/spring-ai-chat-models/pom.xml
new file mode 100644
index 000000000000..85fad851a097
--- /dev/null
+++ b/spring-ai-modules/spring-ai-chat-models/pom.xml
@@ -0,0 +1,131 @@
+
+
+ 4.0.0
+ spring-ai-chat-models
+ spring-ai-chat-models
+ war
+
+
+ com.baeldung
+ spring-ai-modules
+ 0.0.1
+ ../pom.xml
+
+
+
+
+ spring-milestones
+ Spring Milestones
+ https://repo.spring.io/milestone
+
+ false
+
+
+
+
+
+
+
+ org.springframework.ai
+ spring-ai-bom
+ ${spring-ai.version}
+ pom
+ import
+
+
+
+
+
+
+ org.springframework.boot
+ spring-boot-starter-web
+
+
+ org.springframework.ai
+ spring-ai-anthropic-spring-boot-starter
+
+
+ org.springframework.ai
+ spring-ai-bedrock-converse-spring-boot-starter
+
+
+ org.springframework.ai
+ spring-ai-ollama-spring-boot-starter
+
+
+ org.springframework.boot
+ spring-boot-starter-data-jpa
+
+
+ org.springframework.ai
+ spring-ai-openai-spring-boot-starter
+
+
+
+ org.springframework.boot
+ spring-boot-starter-test
+ test
+
+
+ org.springframework.ai
+ spring-ai-spring-boot-testcontainers
+ test
+
+
+ org.testcontainers
+ ollama
+ test
+
+
+
+
+
+ anthropic
+
+ com.baeldung.springai.anthropic.Application
+
+
+
+ hugging-face
+
+ com.baeldung.springai.huggingface.Application
+
+
+
+ amazon-nova
+
+ com.baeldung.springai.nova.Application
+
+
+
+
+
+
+
+ org.springframework.boot
+ spring-boot-maven-plugin
+
+ ${spring.boot.mainclass}
+
+
+
+ org.apache.maven.plugins
+ maven-compiler-plugin
+
+ 21
+
+
+
+
+
+
+ 3.4.1
+ 1.0.0-M6
+ 5.9.0
+ 3.1.1
+ true
+
+
+
\ No newline at end of file
diff --git a/spring-ai-2/src/main/java/com/baeldung/springai/anthropic/Application.java b/spring-ai-modules/spring-ai-chat-models/src/main/java/com/baeldung/springai/anthropic/Application.java
similarity index 100%
rename from spring-ai-2/src/main/java/com/baeldung/springai/anthropic/Application.java
rename to spring-ai-modules/spring-ai-chat-models/src/main/java/com/baeldung/springai/anthropic/Application.java
diff --git a/spring-ai-2/src/main/java/com/baeldung/springai/anthropic/ChatRequest.java b/spring-ai-modules/spring-ai-chat-models/src/main/java/com/baeldung/springai/anthropic/ChatRequest.java
similarity index 100%
rename from spring-ai-2/src/main/java/com/baeldung/springai/anthropic/ChatRequest.java
rename to spring-ai-modules/spring-ai-chat-models/src/main/java/com/baeldung/springai/anthropic/ChatRequest.java
index bbacb0b1f00b..1fd34d69d7fe 100644
--- a/spring-ai-2/src/main/java/com/baeldung/springai/anthropic/ChatRequest.java
+++ b/spring-ai-modules/spring-ai-chat-models/src/main/java/com/baeldung/springai/anthropic/ChatRequest.java
@@ -1,8 +1,8 @@
package com.baeldung.springai.anthropic;
-import org.springframework.lang.Nullable;
-
import java.util.UUID;
+import org.springframework.lang.Nullable;
+
public record ChatRequest(@Nullable UUID chatId, String question) {
}
\ No newline at end of file
diff --git a/spring-ai-2/src/main/java/com/baeldung/springai/anthropic/ChatResponse.java b/spring-ai-modules/spring-ai-chat-models/src/main/java/com/baeldung/springai/anthropic/ChatResponse.java
similarity index 100%
rename from spring-ai-2/src/main/java/com/baeldung/springai/anthropic/ChatResponse.java
rename to spring-ai-modules/spring-ai-chat-models/src/main/java/com/baeldung/springai/anthropic/ChatResponse.java
diff --git a/spring-ai-2/src/main/java/com/baeldung/springai/anthropic/ChatbotConfiguration.java b/spring-ai-modules/spring-ai-chat-models/src/main/java/com/baeldung/springai/anthropic/ChatbotConfiguration.java
similarity index 100%
rename from spring-ai-2/src/main/java/com/baeldung/springai/anthropic/ChatbotConfiguration.java
rename to spring-ai-modules/spring-ai-chat-models/src/main/java/com/baeldung/springai/anthropic/ChatbotConfiguration.java
diff --git a/spring-ai-2/src/main/java/com/baeldung/springai/anthropic/ChatbotController.java b/spring-ai-modules/spring-ai-chat-models/src/main/java/com/baeldung/springai/anthropic/ChatbotController.java
similarity index 100%
rename from spring-ai-2/src/main/java/com/baeldung/springai/anthropic/ChatbotController.java
rename to spring-ai-modules/spring-ai-chat-models/src/main/java/com/baeldung/springai/anthropic/ChatbotController.java
index d283c5da7726..3a7cbef1202f 100644
--- a/spring-ai-2/src/main/java/com/baeldung/springai/anthropic/ChatbotController.java
+++ b/spring-ai-modules/spring-ai-chat-models/src/main/java/com/baeldung/springai/anthropic/ChatbotController.java
@@ -1,5 +1,7 @@
package com.baeldung.springai.anthropic;
+import java.util.UUID;
+
import org.springframework.http.MediaType;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.PostMapping;
@@ -8,8 +10,6 @@
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile;
-import java.util.UUID;
-
@RestController
public class ChatbotController {
diff --git a/spring-ai-2/src/main/java/com/baeldung/springai/anthropic/ChatbotService.java b/spring-ai-modules/spring-ai-chat-models/src/main/java/com/baeldung/springai/anthropic/ChatbotService.java
similarity index 100%
rename from spring-ai-2/src/main/java/com/baeldung/springai/anthropic/ChatbotService.java
rename to spring-ai-modules/spring-ai-chat-models/src/main/java/com/baeldung/springai/anthropic/ChatbotService.java
index d3554c91fe0e..1e95bde9d14f 100644
--- a/spring-ai-2/src/main/java/com/baeldung/springai/anthropic/ChatbotService.java
+++ b/spring-ai-modules/spring-ai-chat-models/src/main/java/com/baeldung/springai/anthropic/ChatbotService.java
@@ -1,15 +1,15 @@
package com.baeldung.springai.anthropic;
+import java.util.Optional;
+import java.util.UUID;
+import java.util.stream.Stream;
+
import org.springframework.ai.chat.client.ChatClient;
import org.springframework.ai.model.Media;
import org.springframework.stereotype.Service;
import org.springframework.util.MimeType;
import org.springframework.web.multipart.MultipartFile;
-import java.util.Optional;
-import java.util.UUID;
-import java.util.stream.Stream;
-
@Service
public class ChatbotService {
diff --git a/spring-ai/src/main/java/com/baeldung/springai/deepseek/Application.java b/spring-ai-modules/spring-ai-chat-models/src/main/java/com/baeldung/springai/deepseek/Application.java
similarity index 100%
rename from spring-ai/src/main/java/com/baeldung/springai/deepseek/Application.java
rename to spring-ai-modules/spring-ai-chat-models/src/main/java/com/baeldung/springai/deepseek/Application.java
diff --git a/spring-ai/src/main/java/com/baeldung/springai/deepseek/ChatRequest.java b/spring-ai-modules/spring-ai-chat-models/src/main/java/com/baeldung/springai/deepseek/ChatRequest.java
similarity index 100%
rename from spring-ai/src/main/java/com/baeldung/springai/deepseek/ChatRequest.java
rename to spring-ai-modules/spring-ai-chat-models/src/main/java/com/baeldung/springai/deepseek/ChatRequest.java
index ebb7d32fe618..cf1b9757ff48 100644
--- a/spring-ai/src/main/java/com/baeldung/springai/deepseek/ChatRequest.java
+++ b/spring-ai-modules/spring-ai-chat-models/src/main/java/com/baeldung/springai/deepseek/ChatRequest.java
@@ -1,8 +1,8 @@
package com.baeldung.springai.deepseek;
-import org.springframework.lang.Nullable;
-
import java.util.UUID;
+import org.springframework.lang.Nullable;
+
record ChatRequest(@Nullable UUID chatId, String question) {
}
\ No newline at end of file
diff --git a/spring-ai/src/main/java/com/baeldung/springai/deepseek/ChatResponse.java b/spring-ai-modules/spring-ai-chat-models/src/main/java/com/baeldung/springai/deepseek/ChatResponse.java
similarity index 100%
rename from spring-ai/src/main/java/com/baeldung/springai/deepseek/ChatResponse.java
rename to spring-ai-modules/spring-ai-chat-models/src/main/java/com/baeldung/springai/deepseek/ChatResponse.java
diff --git a/spring-ai/src/main/java/com/baeldung/springai/deepseek/ChatbotConfiguration.java b/spring-ai-modules/spring-ai-chat-models/src/main/java/com/baeldung/springai/deepseek/ChatbotConfiguration.java
similarity index 100%
rename from spring-ai/src/main/java/com/baeldung/springai/deepseek/ChatbotConfiguration.java
rename to spring-ai-modules/spring-ai-chat-models/src/main/java/com/baeldung/springai/deepseek/ChatbotConfiguration.java
diff --git a/spring-ai/src/main/java/com/baeldung/springai/deepseek/ChatbotController.java b/spring-ai-modules/spring-ai-chat-models/src/main/java/com/baeldung/springai/deepseek/ChatbotController.java
similarity index 100%
rename from spring-ai/src/main/java/com/baeldung/springai/deepseek/ChatbotController.java
rename to spring-ai-modules/spring-ai-chat-models/src/main/java/com/baeldung/springai/deepseek/ChatbotController.java
diff --git a/spring-ai/src/main/java/com/baeldung/springai/deepseek/ChatbotService.java b/spring-ai-modules/spring-ai-chat-models/src/main/java/com/baeldung/springai/deepseek/ChatbotService.java
similarity index 100%
rename from spring-ai/src/main/java/com/baeldung/springai/deepseek/ChatbotService.java
rename to spring-ai-modules/spring-ai-chat-models/src/main/java/com/baeldung/springai/deepseek/ChatbotService.java
index fe4f2018a303..3fd37484ffe0 100644
--- a/spring-ai/src/main/java/com/baeldung/springai/deepseek/ChatbotService.java
+++ b/spring-ai-modules/spring-ai-chat-models/src/main/java/com/baeldung/springai/deepseek/ChatbotService.java
@@ -1,11 +1,11 @@
package com.baeldung.springai.deepseek;
-import org.springframework.ai.chat.client.ChatClient;
-import org.springframework.stereotype.Service;
-
import java.util.Optional;
import java.util.UUID;
+import org.springframework.ai.chat.client.ChatClient;
+import org.springframework.stereotype.Service;
+
@Service
class ChatbotService {
diff --git a/spring-ai/src/main/java/com/baeldung/springai/deepseek/DeepSeekModelOutputConverter.java b/spring-ai-modules/spring-ai-chat-models/src/main/java/com/baeldung/springai/deepseek/DeepSeekModelOutputConverter.java
similarity index 100%
rename from spring-ai/src/main/java/com/baeldung/springai/deepseek/DeepSeekModelOutputConverter.java
rename to spring-ai-modules/spring-ai-chat-models/src/main/java/com/baeldung/springai/deepseek/DeepSeekModelOutputConverter.java
diff --git a/spring-ai/src/main/java/com/baeldung/springai/deepseek/DeepSeekModelResponse.java b/spring-ai-modules/spring-ai-chat-models/src/main/java/com/baeldung/springai/deepseek/DeepSeekModelResponse.java
similarity index 100%
rename from spring-ai/src/main/java/com/baeldung/springai/deepseek/DeepSeekModelResponse.java
rename to spring-ai-modules/spring-ai-chat-models/src/main/java/com/baeldung/springai/deepseek/DeepSeekModelResponse.java
diff --git a/spring-ai-2/src/main/java/com/baeldung/groq/ChatAppConfiguration.java b/spring-ai-modules/spring-ai-chat-models/src/main/java/com/baeldung/springai/groq/ChatAppConfiguration.java
similarity index 96%
rename from spring-ai-2/src/main/java/com/baeldung/groq/ChatAppConfiguration.java
rename to spring-ai-modules/spring-ai-chat-models/src/main/java/com/baeldung/springai/groq/ChatAppConfiguration.java
index 6575f0d96ba2..f57de950b98d 100644
--- a/spring-ai-2/src/main/java/com/baeldung/groq/ChatAppConfiguration.java
+++ b/spring-ai-modules/spring-ai-chat-models/src/main/java/com/baeldung/springai/groq/ChatAppConfiguration.java
@@ -1,4 +1,4 @@
-package com.baeldung.groq;
+package com.baeldung.springai.groq;
import org.springframework.ai.openai.OpenAiChatModel;
import org.springframework.ai.openai.api.OpenAiApi;
diff --git a/spring-ai-2/src/main/java/com/baeldung/groq/CustomGroqChatService.java b/spring-ai-modules/spring-ai-chat-models/src/main/java/com/baeldung/springai/groq/CustomGroqChatService.java
similarity index 95%
rename from spring-ai-2/src/main/java/com/baeldung/groq/CustomGroqChatService.java
rename to spring-ai-modules/spring-ai-chat-models/src/main/java/com/baeldung/springai/groq/CustomGroqChatService.java
index 5177c77fa58c..87c15f5fdb6b 100644
--- a/spring-ai-2/src/main/java/com/baeldung/groq/CustomGroqChatService.java
+++ b/spring-ai-modules/spring-ai-chat-models/src/main/java/com/baeldung/springai/groq/CustomGroqChatService.java
@@ -1,4 +1,4 @@
-package com.baeldung.groq;
+package com.baeldung.springai.groq;
import org.springframework.ai.chat.prompt.ChatOptions;
import org.springframework.ai.chat.prompt.Prompt;
diff --git a/spring-ai-2/src/main/java/com/baeldung/groq/GroqChatApplication.java b/spring-ai-modules/spring-ai-chat-models/src/main/java/com/baeldung/springai/groq/GroqChatApplication.java
similarity index 96%
rename from spring-ai-2/src/main/java/com/baeldung/groq/GroqChatApplication.java
rename to spring-ai-modules/spring-ai-chat-models/src/main/java/com/baeldung/springai/groq/GroqChatApplication.java
index 5248ea6d6e5e..dd3578cd29f9 100644
--- a/spring-ai-2/src/main/java/com/baeldung/groq/GroqChatApplication.java
+++ b/spring-ai-modules/spring-ai-chat-models/src/main/java/com/baeldung/springai/groq/GroqChatApplication.java
@@ -1,4 +1,4 @@
-package com.baeldung.groq;
+package com.baeldung.springai.groq;
import org.springframework.ai.autoconfigure.anthropic.AnthropicAutoConfiguration;
import org.springframework.ai.autoconfigure.bedrock.converse.BedrockConverseProxyChatAutoConfiguration;
diff --git a/spring-ai-2/src/main/java/com/baeldung/groq/GroqChatService.java b/spring-ai-modules/spring-ai-chat-models/src/main/java/com/baeldung/springai/groq/GroqChatService.java
similarity index 93%
rename from spring-ai-2/src/main/java/com/baeldung/groq/GroqChatService.java
rename to spring-ai-modules/spring-ai-chat-models/src/main/java/com/baeldung/springai/groq/GroqChatService.java
index a75f36c39123..7d7139a8417f 100644
--- a/spring-ai-2/src/main/java/com/baeldung/groq/GroqChatService.java
+++ b/spring-ai-modules/spring-ai-chat-models/src/main/java/com/baeldung/springai/groq/GroqChatService.java
@@ -1,4 +1,4 @@
-package com.baeldung.groq;
+package com.baeldung.springai.groq;
import org.springframework.ai.chat.prompt.ChatOptions;
import org.springframework.ai.openai.OpenAiChatModel;
diff --git a/spring-ai-2/src/main/java/com/baeldung/springai/huggingface/Application.java b/spring-ai-modules/spring-ai-chat-models/src/main/java/com/baeldung/springai/huggingface/Application.java
similarity index 100%
rename from spring-ai-2/src/main/java/com/baeldung/springai/huggingface/Application.java
rename to spring-ai-modules/spring-ai-chat-models/src/main/java/com/baeldung/springai/huggingface/Application.java
diff --git a/spring-ai-2/src/main/java/com/baeldung/springai/huggingface/chat/ChatRequest.java b/spring-ai-modules/spring-ai-chat-models/src/main/java/com/baeldung/springai/huggingface/chat/ChatRequest.java
similarity index 100%
rename from spring-ai-2/src/main/java/com/baeldung/springai/huggingface/chat/ChatRequest.java
rename to spring-ai-modules/spring-ai-chat-models/src/main/java/com/baeldung/springai/huggingface/chat/ChatRequest.java
index 5b0f7d589006..6859c24a4385 100644
--- a/spring-ai-2/src/main/java/com/baeldung/springai/huggingface/chat/ChatRequest.java
+++ b/spring-ai-modules/spring-ai-chat-models/src/main/java/com/baeldung/springai/huggingface/chat/ChatRequest.java
@@ -1,8 +1,8 @@
package com.baeldung.springai.huggingface.chat;
-import org.springframework.lang.Nullable;
-
import java.util.UUID;
+import org.springframework.lang.Nullable;
+
public record ChatRequest(@Nullable UUID chatId, String question) {
}
\ No newline at end of file
diff --git a/spring-ai-2/src/main/java/com/baeldung/springai/huggingface/chat/ChatResponse.java b/spring-ai-modules/spring-ai-chat-models/src/main/java/com/baeldung/springai/huggingface/chat/ChatResponse.java
similarity index 100%
rename from spring-ai-2/src/main/java/com/baeldung/springai/huggingface/chat/ChatResponse.java
rename to spring-ai-modules/spring-ai-chat-models/src/main/java/com/baeldung/springai/huggingface/chat/ChatResponse.java
diff --git a/spring-ai-2/src/main/java/com/baeldung/springai/huggingface/chat/ChatbotConfiguration.java b/spring-ai-modules/spring-ai-chat-models/src/main/java/com/baeldung/springai/huggingface/chat/ChatbotConfiguration.java
similarity index 100%
rename from spring-ai-2/src/main/java/com/baeldung/springai/huggingface/chat/ChatbotConfiguration.java
rename to spring-ai-modules/spring-ai-chat-models/src/main/java/com/baeldung/springai/huggingface/chat/ChatbotConfiguration.java
diff --git a/spring-ai-2/src/main/java/com/baeldung/springai/huggingface/chat/ChatbotController.java b/spring-ai-modules/spring-ai-chat-models/src/main/java/com/baeldung/springai/huggingface/chat/ChatbotController.java
similarity index 100%
rename from spring-ai-2/src/main/java/com/baeldung/springai/huggingface/chat/ChatbotController.java
rename to spring-ai-modules/spring-ai-chat-models/src/main/java/com/baeldung/springai/huggingface/chat/ChatbotController.java
diff --git a/spring-ai-2/src/main/java/com/baeldung/springai/huggingface/chat/ChatbotService.java b/spring-ai-modules/spring-ai-chat-models/src/main/java/com/baeldung/springai/huggingface/chat/ChatbotService.java
similarity index 100%
rename from spring-ai-2/src/main/java/com/baeldung/springai/huggingface/chat/ChatbotService.java
rename to spring-ai-modules/spring-ai-chat-models/src/main/java/com/baeldung/springai/huggingface/chat/ChatbotService.java
index 8c9e087a8415..039e5f76117e 100644
--- a/spring-ai-2/src/main/java/com/baeldung/springai/huggingface/chat/ChatbotService.java
+++ b/spring-ai-modules/spring-ai-chat-models/src/main/java/com/baeldung/springai/huggingface/chat/ChatbotService.java
@@ -1,11 +1,11 @@
package com.baeldung.springai.huggingface.chat;
-import org.springframework.ai.chat.client.ChatClient;
-import org.springframework.stereotype.Service;
-
import java.util.Optional;
import java.util.UUID;
+import org.springframework.ai.chat.client.ChatClient;
+import org.springframework.stereotype.Service;
+
@Service
public class ChatbotService {
diff --git a/spring-ai-2/src/main/java/com/baeldung/springai/huggingface/embedding/Quote.java b/spring-ai-modules/spring-ai-chat-models/src/main/java/com/baeldung/springai/huggingface/embedding/Quote.java
similarity index 100%
rename from spring-ai-2/src/main/java/com/baeldung/springai/huggingface/embedding/Quote.java
rename to spring-ai-modules/spring-ai-chat-models/src/main/java/com/baeldung/springai/huggingface/embedding/Quote.java
diff --git a/spring-ai-2/src/main/java/com/baeldung/springai/huggingface/embedding/QuoteFetcher.java b/spring-ai-modules/spring-ai-chat-models/src/main/java/com/baeldung/springai/huggingface/embedding/QuoteFetcher.java
similarity index 100%
rename from spring-ai-2/src/main/java/com/baeldung/springai/huggingface/embedding/QuoteFetcher.java
rename to spring-ai-modules/spring-ai-chat-models/src/main/java/com/baeldung/springai/huggingface/embedding/QuoteFetcher.java
index 758a216a9c7d..b9e94643b60b 100644
--- a/spring-ai-2/src/main/java/com/baeldung/springai/huggingface/embedding/QuoteFetcher.java
+++ b/spring-ai-modules/spring-ai-chat-models/src/main/java/com/baeldung/springai/huggingface/embedding/QuoteFetcher.java
@@ -1,10 +1,10 @@
package com.baeldung.springai.huggingface.embedding;
+import java.util.List;
+
import org.springframework.core.ParameterizedTypeReference;
import org.springframework.web.client.RestClient;
-import java.util.List;
-
public class QuoteFetcher {
private static final String BASE_URL = "https://quoteslate.vercel.app";
diff --git a/spring-ai-2/src/main/java/com/baeldung/springai/huggingface/embedding/VectorStoreConfiguration.java b/spring-ai-modules/spring-ai-chat-models/src/main/java/com/baeldung/springai/huggingface/embedding/VectorStoreConfiguration.java
similarity index 100%
rename from spring-ai-2/src/main/java/com/baeldung/springai/huggingface/embedding/VectorStoreConfiguration.java
rename to spring-ai-modules/spring-ai-chat-models/src/main/java/com/baeldung/springai/huggingface/embedding/VectorStoreConfiguration.java
diff --git a/spring-ai-2/src/main/java/com/baeldung/springai/huggingface/embedding/VectorStoreInitializer.java b/spring-ai-modules/spring-ai-chat-models/src/main/java/com/baeldung/springai/huggingface/embedding/VectorStoreInitializer.java
similarity index 100%
rename from spring-ai-2/src/main/java/com/baeldung/springai/huggingface/embedding/VectorStoreInitializer.java
rename to spring-ai-modules/spring-ai-chat-models/src/main/java/com/baeldung/springai/huggingface/embedding/VectorStoreInitializer.java
index 6f034aea33c9..2953889029fd 100644
--- a/spring-ai-2/src/main/java/com/baeldung/springai/huggingface/embedding/VectorStoreInitializer.java
+++ b/spring-ai-modules/spring-ai-chat-models/src/main/java/com/baeldung/springai/huggingface/embedding/VectorStoreInitializer.java
@@ -1,14 +1,14 @@
package com.baeldung.springai.huggingface.embedding;
+import java.util.List;
+import java.util.Map;
+
import org.springframework.ai.document.Document;
import org.springframework.ai.vectorstore.VectorStore;
import org.springframework.boot.ApplicationArguments;
import org.springframework.boot.ApplicationRunner;
import org.springframework.stereotype.Component;
-import java.util.List;
-import java.util.Map;
-
@Component
public class VectorStoreInitializer implements ApplicationRunner {
diff --git a/spring-ai-3/src/main/java/com/baeldung/springai/nova/Application.java b/spring-ai-modules/spring-ai-chat-models/src/main/java/com/baeldung/springai/nova/Application.java
similarity index 100%
rename from spring-ai-3/src/main/java/com/baeldung/springai/nova/Application.java
rename to spring-ai-modules/spring-ai-chat-models/src/main/java/com/baeldung/springai/nova/Application.java
diff --git a/spring-ai-3/src/main/java/com/baeldung/springai/nova/AuthorFetcher.java b/spring-ai-modules/spring-ai-chat-models/src/main/java/com/baeldung/springai/nova/AuthorFetcher.java
similarity index 100%
rename from spring-ai-3/src/main/java/com/baeldung/springai/nova/AuthorFetcher.java
rename to spring-ai-modules/spring-ai-chat-models/src/main/java/com/baeldung/springai/nova/AuthorFetcher.java
diff --git a/spring-ai-3/src/main/java/com/baeldung/springai/nova/ChatRequest.java b/spring-ai-modules/spring-ai-chat-models/src/main/java/com/baeldung/springai/nova/ChatRequest.java
similarity index 100%
rename from spring-ai-3/src/main/java/com/baeldung/springai/nova/ChatRequest.java
rename to spring-ai-modules/spring-ai-chat-models/src/main/java/com/baeldung/springai/nova/ChatRequest.java
index c2e253022894..1fe25fe62ef5 100644
--- a/spring-ai-3/src/main/java/com/baeldung/springai/nova/ChatRequest.java
+++ b/spring-ai-modules/spring-ai-chat-models/src/main/java/com/baeldung/springai/nova/ChatRequest.java
@@ -1,8 +1,8 @@
package com.baeldung.springai.nova;
-import org.springframework.lang.Nullable;
-
import java.util.UUID;
+import org.springframework.lang.Nullable;
+
public record ChatRequest(@Nullable UUID chatId, String question) {
}
\ No newline at end of file
diff --git a/spring-ai-3/src/main/java/com/baeldung/springai/nova/ChatResponse.java b/spring-ai-modules/spring-ai-chat-models/src/main/java/com/baeldung/springai/nova/ChatResponse.java
similarity index 100%
rename from spring-ai-3/src/main/java/com/baeldung/springai/nova/ChatResponse.java
rename to spring-ai-modules/spring-ai-chat-models/src/main/java/com/baeldung/springai/nova/ChatResponse.java
diff --git a/spring-ai-3/src/main/java/com/baeldung/springai/nova/ChatbotConfiguration.java b/spring-ai-modules/spring-ai-chat-models/src/main/java/com/baeldung/springai/nova/ChatbotConfiguration.java
similarity index 100%
rename from spring-ai-3/src/main/java/com/baeldung/springai/nova/ChatbotConfiguration.java
rename to spring-ai-modules/spring-ai-chat-models/src/main/java/com/baeldung/springai/nova/ChatbotConfiguration.java
index 2267de9e3e67..c2fa84c60c7e 100644
--- a/spring-ai-3/src/main/java/com/baeldung/springai/nova/ChatbotConfiguration.java
+++ b/spring-ai-modules/spring-ai-chat-models/src/main/java/com/baeldung/springai/nova/ChatbotConfiguration.java
@@ -1,5 +1,7 @@
package com.baeldung.springai.nova;
+import java.util.function.Function;
+
import org.springframework.ai.chat.client.ChatClient;
import org.springframework.ai.chat.client.advisor.MessageChatMemoryAdvisor;
import org.springframework.ai.chat.memory.ChatMemory;
@@ -11,8 +13,6 @@
import org.springframework.context.annotation.Description;
import org.springframework.core.io.Resource;
-import java.util.function.Function;
-
@Configuration
public class ChatbotConfiguration {
diff --git a/spring-ai-3/src/main/java/com/baeldung/springai/nova/ChatbotController.java b/spring-ai-modules/spring-ai-chat-models/src/main/java/com/baeldung/springai/nova/ChatbotController.java
similarity index 100%
rename from spring-ai-3/src/main/java/com/baeldung/springai/nova/ChatbotController.java
rename to spring-ai-modules/spring-ai-chat-models/src/main/java/com/baeldung/springai/nova/ChatbotController.java
index 4ec2af61341a..42b891d503ff 100644
--- a/spring-ai-3/src/main/java/com/baeldung/springai/nova/ChatbotController.java
+++ b/spring-ai-modules/spring-ai-chat-models/src/main/java/com/baeldung/springai/nova/ChatbotController.java
@@ -1,5 +1,7 @@
package com.baeldung.springai.nova;
+import java.util.UUID;
+
import org.springframework.http.MediaType;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.PostMapping;
@@ -8,8 +10,6 @@
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile;
-import java.util.UUID;
-
@RestController
public class ChatbotController {
diff --git a/spring-ai-3/src/main/java/com/baeldung/springai/nova/ChatbotService.java b/spring-ai-modules/spring-ai-chat-models/src/main/java/com/baeldung/springai/nova/ChatbotService.java
similarity index 100%
rename from spring-ai-3/src/main/java/com/baeldung/springai/nova/ChatbotService.java
rename to spring-ai-modules/spring-ai-chat-models/src/main/java/com/baeldung/springai/nova/ChatbotService.java
index be60ef5942a1..bfaa9948485b 100644
--- a/spring-ai-3/src/main/java/com/baeldung/springai/nova/ChatbotService.java
+++ b/spring-ai-modules/spring-ai-chat-models/src/main/java/com/baeldung/springai/nova/ChatbotService.java
@@ -1,15 +1,15 @@
package com.baeldung.springai.nova;
+import java.util.Optional;
+import java.util.UUID;
+import java.util.stream.Stream;
+
import org.springframework.ai.chat.client.ChatClient;
import org.springframework.ai.model.Media;
import org.springframework.stereotype.Service;
import org.springframework.util.MimeType;
import org.springframework.web.multipart.MultipartFile;
-import java.util.Optional;
-import java.util.UUID;
-import java.util.stream.Stream;
-
@Service
public class ChatbotService {
diff --git a/spring-ai-2/src/main/resources/application-anthropic.properties b/spring-ai-modules/spring-ai-chat-models/src/main/resources/application-anthropic.properties
similarity index 100%
rename from spring-ai-2/src/main/resources/application-anthropic.properties
rename to spring-ai-modules/spring-ai-chat-models/src/main/resources/application-anthropic.properties
diff --git a/spring-ai-2/src/main/resources/application-customgroq.properties b/spring-ai-modules/spring-ai-chat-models/src/main/resources/application-customgroq.properties
similarity index 100%
rename from spring-ai-2/src/main/resources/application-customgroq.properties
rename to spring-ai-modules/spring-ai-chat-models/src/main/resources/application-customgroq.properties
diff --git a/spring-ai/src/main/resources/application-deepseek.properties b/spring-ai-modules/spring-ai-chat-models/src/main/resources/application-deepseek.properties
similarity index 100%
rename from spring-ai/src/main/resources/application-deepseek.properties
rename to spring-ai-modules/spring-ai-chat-models/src/main/resources/application-deepseek.properties
diff --git a/spring-ai-2/src/main/resources/application-groq.properties b/spring-ai-modules/spring-ai-chat-models/src/main/resources/application-groq.properties
similarity index 100%
rename from spring-ai-2/src/main/resources/application-groq.properties
rename to spring-ai-modules/spring-ai-chat-models/src/main/resources/application-groq.properties
diff --git a/spring-ai-2/src/main/resources/application-huggingface.properties b/spring-ai-modules/spring-ai-chat-models/src/main/resources/application-huggingface.properties
similarity index 100%
rename from spring-ai-2/src/main/resources/application-huggingface.properties
rename to spring-ai-modules/spring-ai-chat-models/src/main/resources/application-huggingface.properties
diff --git a/spring-ai-3/src/main/resources/application-nova.properties b/spring-ai-modules/spring-ai-chat-models/src/main/resources/application-nova.properties
similarity index 100%
rename from spring-ai-3/src/main/resources/application-nova.properties
rename to spring-ai-modules/spring-ai-chat-models/src/main/resources/application-nova.properties
diff --git a/spring-ai-2/src/main/resources/logback-spring.xml b/spring-ai-modules/spring-ai-chat-models/src/main/resources/logback-spring.xml
similarity index 100%
rename from spring-ai-2/src/main/resources/logback-spring.xml
rename to spring-ai-modules/spring-ai-chat-models/src/main/resources/logback-spring.xml
diff --git a/spring-ai-2/src/main/resources/prompts/chatbot-system-prompt.st b/spring-ai-modules/spring-ai-chat-models/src/main/resources/prompts/chatbot-system-prompt.st
similarity index 100%
rename from spring-ai-2/src/main/resources/prompts/chatbot-system-prompt.st
rename to spring-ai-modules/spring-ai-chat-models/src/main/resources/prompts/chatbot-system-prompt.st
diff --git a/spring-ai-2/src/main/resources/prompts/grumpgpt-system-prompt.st b/spring-ai-modules/spring-ai-chat-models/src/main/resources/prompts/grumpgpt-system-prompt.st
similarity index 100%
rename from spring-ai-2/src/main/resources/prompts/grumpgpt-system-prompt.st
rename to spring-ai-modules/spring-ai-chat-models/src/main/resources/prompts/grumpgpt-system-prompt.st
diff --git a/spring-ai-2/src/test/java/com/baeldung/springai/anthropic/ChatbotServiceLiveTest.java b/spring-ai-modules/spring-ai-chat-models/src/test/java/com/baeldung/springai/anthropic/ChatbotServiceLiveTest.java
similarity index 100%
rename from spring-ai-2/src/test/java/com/baeldung/springai/anthropic/ChatbotServiceLiveTest.java
rename to spring-ai-modules/spring-ai-chat-models/src/test/java/com/baeldung/springai/anthropic/ChatbotServiceLiveTest.java
diff --git a/spring-ai/src/test/java/com/baeldung/springai/deepseek/ChatbotServiceLiveTest.java b/spring-ai-modules/spring-ai-chat-models/src/test/java/com/baeldung/springai/deepseek/ChatbotServiceLiveTest.java
similarity index 100%
rename from spring-ai/src/test/java/com/baeldung/springai/deepseek/ChatbotServiceLiveTest.java
rename to spring-ai-modules/spring-ai-chat-models/src/test/java/com/baeldung/springai/deepseek/ChatbotServiceLiveTest.java
index 630df006b4f5..a620e3dcb34c 100644
--- a/spring-ai/src/test/java/com/baeldung/springai/deepseek/ChatbotServiceLiveTest.java
+++ b/spring-ai-modules/spring-ai-chat-models/src/test/java/com/baeldung/springai/deepseek/ChatbotServiceLiveTest.java
@@ -1,11 +1,11 @@
package com.baeldung.springai.deepseek;
+import static org.assertj.core.api.Assertions.assertThat;
+
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
-import static org.assertj.core.api.Assertions.assertThat;
-
@SpringBootTest
class ChatbotServiceLiveTest {
diff --git a/spring-ai/src/test/java/com/baeldung/springai/deepseek/DeepSeekModelOutputConverterUnitTest.java b/spring-ai-modules/spring-ai-chat-models/src/test/java/com/baeldung/springai/deepseek/DeepSeekModelOutputConverterUnitTest.java
similarity index 99%
rename from spring-ai/src/test/java/com/baeldung/springai/deepseek/DeepSeekModelOutputConverterUnitTest.java
rename to spring-ai-modules/spring-ai-chat-models/src/test/java/com/baeldung/springai/deepseek/DeepSeekModelOutputConverterUnitTest.java
index 0aba421926ee..4d3e14236b50 100644
--- a/spring-ai/src/test/java/com/baeldung/springai/deepseek/DeepSeekModelOutputConverterUnitTest.java
+++ b/spring-ai-modules/spring-ai-chat-models/src/test/java/com/baeldung/springai/deepseek/DeepSeekModelOutputConverterUnitTest.java
@@ -1,12 +1,13 @@
package com.baeldung.springai.deepseek;
-import net.bytebuddy.utility.RandomString;
+import static org.assertj.core.api.AssertionsForClassTypes.assertThat;
+import static org.assertj.core.api.AssertionsForClassTypes.assertThatThrownBy;
+
import org.junit.jupiter.api.Test;
import org.junit.jupiter.params.ParameterizedTest;
import org.junit.jupiter.params.provider.MethodSource;
-import static org.assertj.core.api.AssertionsForClassTypes.assertThat;
-import static org.assertj.core.api.AssertionsForClassTypes.assertThatThrownBy;
+import net.bytebuddy.utility.RandomString;
class DeepSeekModelOutputConverterUnitTest {
diff --git a/spring-ai-2/src/test/java/com/baeldung/groq/GroqAutoconfiguredChatClientLiveTest.java b/spring-ai-modules/spring-ai-chat-models/src/test/java/com/baeldung/springai/groq/GroqAutoconfiguredChatClientLiveTest.java
similarity index 98%
rename from spring-ai-2/src/test/java/com/baeldung/groq/GroqAutoconfiguredChatClientLiveTest.java
rename to spring-ai-modules/spring-ai-chat-models/src/test/java/com/baeldung/springai/groq/GroqAutoconfiguredChatClientLiveTest.java
index 1bbe722921eb..e0dc12d1c355 100644
--- a/spring-ai-2/src/test/java/com/baeldung/groq/GroqAutoconfiguredChatClientLiveTest.java
+++ b/spring-ai-modules/spring-ai-chat-models/src/test/java/com/baeldung/springai/groq/GroqAutoconfiguredChatClientLiveTest.java
@@ -1,4 +1,4 @@
-package com.baeldung.groq;
+package com.baeldung.springai.groq;
import static org.assertj.core.api.Assertions.assertThat;
diff --git a/spring-ai-2/src/test/java/com/baeldung/groq/GroqCustomChatClientLiveTest.java b/spring-ai-modules/spring-ai-chat-models/src/test/java/com/baeldung/springai/groq/GroqCustomChatClientLiveTest.java
similarity index 97%
rename from spring-ai-2/src/test/java/com/baeldung/groq/GroqCustomChatClientLiveTest.java
rename to spring-ai-modules/spring-ai-chat-models/src/test/java/com/baeldung/springai/groq/GroqCustomChatClientLiveTest.java
index 6778ba9e9800..e017ef97ff17 100644
--- a/spring-ai-2/src/test/java/com/baeldung/groq/GroqCustomChatClientLiveTest.java
+++ b/spring-ai-modules/spring-ai-chat-models/src/test/java/com/baeldung/springai/groq/GroqCustomChatClientLiveTest.java
@@ -1,4 +1,4 @@
-package com.baeldung.groq;
+package com.baeldung.springai.groq;
import static org.assertj.core.api.Assertions.assertThat;
diff --git a/spring-ai-2/src/test/java/com/baeldung/springai/huggingface/TestApplication.java b/spring-ai-modules/spring-ai-chat-models/src/test/java/com/baeldung/springai/huggingface/TestApplication.java
similarity index 100%
rename from spring-ai-2/src/test/java/com/baeldung/springai/huggingface/TestApplication.java
rename to spring-ai-modules/spring-ai-chat-models/src/test/java/com/baeldung/springai/huggingface/TestApplication.java
diff --git a/spring-ai-2/src/test/java/com/baeldung/springai/huggingface/TestcontainersConfiguration.java b/spring-ai-modules/spring-ai-chat-models/src/test/java/com/baeldung/springai/huggingface/TestcontainersConfiguration.java
similarity index 100%
rename from spring-ai-2/src/test/java/com/baeldung/springai/huggingface/TestcontainersConfiguration.java
rename to spring-ai-modules/spring-ai-chat-models/src/test/java/com/baeldung/springai/huggingface/TestcontainersConfiguration.java
diff --git a/spring-ai-2/src/test/java/com/baeldung/springai/huggingface/chat/ChatbotServiceLiveTest.java b/spring-ai-modules/spring-ai-chat-models/src/test/java/com/baeldung/springai/huggingface/chat/ChatbotServiceLiveTest.java
similarity index 99%
rename from spring-ai-2/src/test/java/com/baeldung/springai/huggingface/chat/ChatbotServiceLiveTest.java
rename to spring-ai-modules/spring-ai-chat-models/src/test/java/com/baeldung/springai/huggingface/chat/ChatbotServiceLiveTest.java
index cd263f244cc8..96fca8583cd4 100644
--- a/spring-ai-2/src/test/java/com/baeldung/springai/huggingface/chat/ChatbotServiceLiveTest.java
+++ b/spring-ai-modules/spring-ai-chat-models/src/test/java/com/baeldung/springai/huggingface/chat/ChatbotServiceLiveTest.java
@@ -1,12 +1,13 @@
package com.baeldung.springai.huggingface.chat;
-import com.baeldung.springai.huggingface.TestcontainersConfiguration;
+import static org.assertj.core.api.Assertions.assertThat;
+
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.context.annotation.Import;
-import static org.assertj.core.api.Assertions.assertThat;
+import com.baeldung.springai.huggingface.TestcontainersConfiguration;
@SpringBootTest
@Import(TestcontainersConfiguration.class)
diff --git a/spring-ai-2/src/test/java/com/baeldung/springai/huggingface/embedding/SemanticSearchLiveTest.java b/spring-ai-modules/spring-ai-chat-models/src/test/java/com/baeldung/springai/huggingface/embedding/SemanticSearchLiveTest.java
similarity index 99%
rename from spring-ai-2/src/test/java/com/baeldung/springai/huggingface/embedding/SemanticSearchLiveTest.java
rename to spring-ai-modules/spring-ai-chat-models/src/test/java/com/baeldung/springai/huggingface/embedding/SemanticSearchLiveTest.java
index a0c284022fc5..358b26a8279e 100644
--- a/spring-ai-2/src/test/java/com/baeldung/springai/huggingface/embedding/SemanticSearchLiveTest.java
+++ b/spring-ai-modules/spring-ai-chat-models/src/test/java/com/baeldung/springai/huggingface/embedding/SemanticSearchLiveTest.java
@@ -1,6 +1,9 @@
package com.baeldung.springai.huggingface.embedding;
-import com.baeldung.springai.huggingface.TestcontainersConfiguration;
+import static org.assertj.core.api.Assertions.assertThat;
+
+import java.util.List;
+
import org.junit.jupiter.params.ParameterizedTest;
import org.junit.jupiter.params.provider.ValueSource;
import org.springframework.ai.document.Document;
@@ -10,9 +13,7 @@
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.context.annotation.Import;
-import java.util.List;
-
-import static org.assertj.core.api.Assertions.assertThat;
+import com.baeldung.springai.huggingface.TestcontainersConfiguration;
@SpringBootTest
@Import(TestcontainersConfiguration.class)
diff --git a/spring-ai-3/src/test/java/com/baeldung/springai/nova/ChatbotServiceLiveTest.java b/spring-ai-modules/spring-ai-chat-models/src/test/java/com/baeldung/springai/nova/ChatbotServiceLiveTest.java
similarity index 100%
rename from spring-ai-3/src/test/java/com/baeldung/springai/nova/ChatbotServiceLiveTest.java
rename to spring-ai-modules/spring-ai-chat-models/src/test/java/com/baeldung/springai/nova/ChatbotServiceLiveTest.java
index 763d1b248dbc..5da4e1393bc0 100644
--- a/spring-ai-3/src/test/java/com/baeldung/springai/nova/ChatbotServiceLiveTest.java
+++ b/spring-ai-modules/spring-ai-chat-models/src/test/java/com/baeldung/springai/nova/ChatbotServiceLiveTest.java
@@ -1,5 +1,9 @@
package com.baeldung.springai.nova;
+import static org.assertj.core.api.Assertions.assertThat;
+
+import java.io.IOException;
+
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
@@ -7,10 +11,6 @@
import org.springframework.mock.web.MockMultipartFile;
import org.springframework.web.multipart.MultipartFile;
-import java.io.IOException;
-
-import static org.assertj.core.api.Assertions.assertThat;
-
@SpringBootTest
class ChatbotServiceLiveTest {
diff --git a/spring-ai-2/src/test/resources/images/batman-deadpool-christmas.jpeg b/spring-ai-modules/spring-ai-chat-models/src/test/resources/images/batman-deadpool-christmas.jpeg
similarity index 100%
rename from spring-ai-2/src/test/resources/images/batman-deadpool-christmas.jpeg
rename to spring-ai-modules/spring-ai-chat-models/src/test/resources/images/batman-deadpool-christmas.jpeg
diff --git a/spring-ai-modules/spring-ai-conversational/pom.xml b/spring-ai-modules/spring-ai-conversational/pom.xml
new file mode 100644
index 000000000000..b08650ee2eac
--- /dev/null
+++ b/spring-ai-modules/spring-ai-conversational/pom.xml
@@ -0,0 +1,140 @@
+
+
+ 4.0.0
+ spring-ai-conversational
+ spring-ai-conversational
+ war
+
+
+ com.baeldung
+ spring-ai-modules
+ 0.0.1
+ ../pom.xml
+
+
+
+
+ spring-snapshots
+ Spring Snapshots
+ https://repo.spring.io/snapshot
+
+ false
+
+
+
+ Central Portal Snapshots
+ central-portal-snapshots
+ https://central.sonatype.com/repository/maven-snapshots/
+
+ false
+
+
+ true
+
+
+
+
+
+
+
+ org.springframework.boot
+ spring-boot-dependencies
+ ${spring-boot.version}
+ pom
+ import
+
+
+ org.springframework.ai
+ spring-ai-bom
+ ${spring-ai.version}
+ pom
+ import
+
+
+
+
+
+
+ org.springframework.boot
+ spring-boot-starter-web
+
+
+ org.springframework.boot
+ spring-boot-starter-data-jpa
+
+
+ org.springframework.ai
+ spring-ai-openai-spring-boot-starter
+ 1.0.0-M6
+
+
+ org.springframework.ai
+ spring-ai-ollama-spring-boot-starter
+ 1.0.0-M6
+
+
+ org.springframework.ai
+ spring-ai-starter-model-openai
+ 1.0.0
+
+
+ org.springframework.ai
+ spring-ai-model-chat-memory-repository-jdbc
+ 1.0.0
+
+
+ org.hsqldb
+ hsqldb
+ runtime
+
+
+ org.springframework.boot
+ spring-boot-starter-test
+ test
+
+
+ org.springframework.boot
+ spring-boot-test
+ test
+
+
+
+
+
+ chat-memory
+
+ true
+
+
+ com.baeldung.springai.memory.Application
+
+
+
+
+
+
+
+ org.springframework.boot
+ spring-boot-maven-plugin
+
+ ${spring.boot.mainclass}
+
+
+
+ org.apache.maven.plugins
+ maven-compiler-plugin
+
+ 21
+
+
+
+
+
+
+ 1.0.0-M6
+ 5.9.0
+
+
+
\ No newline at end of file
diff --git a/spring-ai-4/src/main/java/com/baeldung/springai/memory/Application.java b/spring-ai-modules/spring-ai-conversational/src/main/java/com/baeldung/springai/memory/Application.java
similarity index 100%
rename from spring-ai-4/src/main/java/com/baeldung/springai/memory/Application.java
rename to spring-ai-modules/spring-ai-conversational/src/main/java/com/baeldung/springai/memory/Application.java
diff --git a/spring-ai-4/src/main/java/com/baeldung/springai/memory/ChatConfig.java b/spring-ai-modules/spring-ai-conversational/src/main/java/com/baeldung/springai/memory/ChatConfig.java
similarity index 100%
rename from spring-ai-4/src/main/java/com/baeldung/springai/memory/ChatConfig.java
rename to spring-ai-modules/spring-ai-conversational/src/main/java/com/baeldung/springai/memory/ChatConfig.java
diff --git a/spring-ai-4/src/main/java/com/baeldung/springai/memory/ChatController.java b/spring-ai-modules/spring-ai-conversational/src/main/java/com/baeldung/springai/memory/ChatController.java
similarity index 100%
rename from spring-ai-4/src/main/java/com/baeldung/springai/memory/ChatController.java
rename to spring-ai-modules/spring-ai-conversational/src/main/java/com/baeldung/springai/memory/ChatController.java
index f860eea77ca0..ea3edcace3da 100644
--- a/spring-ai-4/src/main/java/com/baeldung/springai/memory/ChatController.java
+++ b/spring-ai-modules/spring-ai-conversational/src/main/java/com/baeldung/springai/memory/ChatController.java
@@ -1,12 +1,12 @@
package com.baeldung.springai.memory;
+import javax.validation.Valid;
+
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RestController;
-import javax.validation.Valid;
-
@RestController
public class ChatController {
diff --git a/spring-ai-4/src/main/java/com/baeldung/springai/memory/ChatRequest.java b/spring-ai-modules/spring-ai-conversational/src/main/java/com/baeldung/springai/memory/ChatRequest.java
similarity index 100%
rename from spring-ai-4/src/main/java/com/baeldung/springai/memory/ChatRequest.java
rename to spring-ai-modules/spring-ai-conversational/src/main/java/com/baeldung/springai/memory/ChatRequest.java
diff --git a/spring-ai-4/src/main/java/com/baeldung/springai/memory/ChatService.java b/spring-ai-modules/spring-ai-conversational/src/main/java/com/baeldung/springai/memory/ChatService.java
similarity index 82%
rename from spring-ai-4/src/main/java/com/baeldung/springai/memory/ChatService.java
rename to spring-ai-modules/spring-ai-conversational/src/main/java/com/baeldung/springai/memory/ChatService.java
index 64fc63acca79..ceab952a709e 100644
--- a/spring-ai-4/src/main/java/com/baeldung/springai/memory/ChatService.java
+++ b/spring-ai-modules/spring-ai-conversational/src/main/java/com/baeldung/springai/memory/ChatService.java
@@ -1,14 +1,16 @@
package com.baeldung.springai.memory;
+import java.util.UUID;
+
import org.springframework.ai.chat.client.ChatClient;
+import org.springframework.ai.chat.client.advisor.AbstractChatMemoryAdvisor;
import org.springframework.ai.chat.client.advisor.MessageChatMemoryAdvisor;
+import org.springframework.ai.chat.memory.ChatMemory.*;
import org.springframework.ai.chat.memory.ChatMemory;
import org.springframework.ai.chat.model.ChatModel;
import org.springframework.stereotype.Component;
import org.springframework.web.context.annotation.SessionScope;
-import java.util.UUID;
-
@Component
@SessionScope
public class ChatService {
@@ -30,7 +32,7 @@ public String getConversationId() {
public String chat(String prompt) {
return chatClient.prompt()
.user(userMessage -> userMessage.text(prompt))
- .advisors(a -> a.param(ChatMemory.CONVERSATION_ID, conversationId))
+ .advisors(a -> a.param(AbstractChatMemoryAdvisor.CHAT_MEMORY_CONVERSATION_ID_KEY, conversationId))
.call()
.content();
}
diff --git a/spring-ai-2/src/main/java/com/baeldung/ollamachatbot/ChatBotApplication.java b/spring-ai-modules/spring-ai-conversational/src/main/java/com/baeldung/springai/ollamachatbot/ChatBotApplication.java
similarity index 86%
rename from spring-ai-2/src/main/java/com/baeldung/ollamachatbot/ChatBotApplication.java
rename to spring-ai-modules/spring-ai-conversational/src/main/java/com/baeldung/springai/ollamachatbot/ChatBotApplication.java
index e715e34bbf4f..39b930846a62 100644
--- a/spring-ai-2/src/main/java/com/baeldung/ollamachatbot/ChatBotApplication.java
+++ b/spring-ai-modules/spring-ai-conversational/src/main/java/com/baeldung/springai/ollamachatbot/ChatBotApplication.java
@@ -1,4 +1,4 @@
-package com.baeldung.ollamachatbot;
+package com.baeldung.springai.ollamachatbot;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
diff --git a/spring-ai-2/src/main/java/com/baeldung/ollamachatbot/controller/HelpDeskController.java b/spring-ai-modules/spring-ai-conversational/src/main/java/com/baeldung/springai/ollamachatbot/controller/HelpDeskController.java
similarity index 79%
rename from spring-ai-2/src/main/java/com/baeldung/ollamachatbot/controller/HelpDeskController.java
rename to spring-ai-modules/spring-ai-conversational/src/main/java/com/baeldung/springai/ollamachatbot/controller/HelpDeskController.java
index 9afbb25d603d..8ae520c5f0dd 100644
--- a/spring-ai-2/src/main/java/com/baeldung/ollamachatbot/controller/HelpDeskController.java
+++ b/spring-ai-modules/spring-ai-conversational/src/main/java/com/baeldung/springai/ollamachatbot/controller/HelpDeskController.java
@@ -1,4 +1,4 @@
-package com.baeldung.ollamachatbot.controller;
+package com.baeldung.springai.ollamachatbot.controller;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
@@ -7,9 +7,9 @@
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
-import com.baeldung.ollamachatbot.model.HelpDeskResponse;
-import com.baeldung.ollamachatbot.service.HelpDeskChatbotAgentService;
-import com.baeldung.ollamachatbot.model.HelpDeskRequest;
+import com.baeldung.springai.ollamachatbot.model.HelpDeskRequest;
+import com.baeldung.springai.ollamachatbot.model.HelpDeskResponse;
+import com.baeldung.springai.ollamachatbot.service.HelpDeskChatbotAgentService;
@RestController
@RequestMapping("/helpdesk")
diff --git a/spring-ai-2/src/main/java/com/baeldung/ollamachatbot/model/HelpDeskRequest.java b/spring-ai-modules/spring-ai-conversational/src/main/java/com/baeldung/springai/ollamachatbot/model/HelpDeskRequest.java
similarity index 90%
rename from spring-ai-2/src/main/java/com/baeldung/ollamachatbot/model/HelpDeskRequest.java
rename to spring-ai-modules/spring-ai-conversational/src/main/java/com/baeldung/springai/ollamachatbot/model/HelpDeskRequest.java
index 27b1a58d9fc7..7db557711652 100644
--- a/spring-ai-2/src/main/java/com/baeldung/ollamachatbot/model/HelpDeskRequest.java
+++ b/spring-ai-modules/spring-ai-conversational/src/main/java/com/baeldung/springai/ollamachatbot/model/HelpDeskRequest.java
@@ -1,4 +1,4 @@
-package com.baeldung.ollamachatbot.model;
+package com.baeldung.springai.ollamachatbot.model;
import com.fasterxml.jackson.annotation.JsonProperty;
diff --git a/spring-ai-2/src/main/java/com/baeldung/ollamachatbot/model/HelpDeskResponse.java b/spring-ai-modules/spring-ai-conversational/src/main/java/com/baeldung/springai/ollamachatbot/model/HelpDeskResponse.java
similarity index 72%
rename from spring-ai-2/src/main/java/com/baeldung/ollamachatbot/model/HelpDeskResponse.java
rename to spring-ai-modules/spring-ai-conversational/src/main/java/com/baeldung/springai/ollamachatbot/model/HelpDeskResponse.java
index 72b9c99c42ca..717ee9132a09 100644
--- a/spring-ai-2/src/main/java/com/baeldung/ollamachatbot/model/HelpDeskResponse.java
+++ b/spring-ai-modules/spring-ai-conversational/src/main/java/com/baeldung/springai/ollamachatbot/model/HelpDeskResponse.java
@@ -1,4 +1,4 @@
-package com.baeldung.ollamachatbot.model;
+package com.baeldung.springai.ollamachatbot.model;
public class HelpDeskResponse {
String result;
diff --git a/spring-ai-2/src/main/java/com/baeldung/ollamachatbot/model/HistoryEntry.java b/spring-ai-modules/spring-ai-conversational/src/main/java/com/baeldung/springai/ollamachatbot/model/HistoryEntry.java
similarity index 95%
rename from spring-ai-2/src/main/java/com/baeldung/ollamachatbot/model/HistoryEntry.java
rename to spring-ai-modules/spring-ai-conversational/src/main/java/com/baeldung/springai/ollamachatbot/model/HistoryEntry.java
index a598c11cbd36..201df36507da 100644
--- a/spring-ai-2/src/main/java/com/baeldung/ollamachatbot/model/HistoryEntry.java
+++ b/spring-ai-modules/spring-ai-conversational/src/main/java/com/baeldung/springai/ollamachatbot/model/HistoryEntry.java
@@ -1,4 +1,4 @@
-package com.baeldung.ollamachatbot.model;
+package com.baeldung.springai.ollamachatbot.model;
import java.util.Objects;
diff --git a/spring-ai-2/src/main/java/com/baeldung/ollamachatbot/service/HelpDeskChatbotAgentService.java b/spring-ai-modules/spring-ai-conversational/src/main/java/com/baeldung/springai/ollamachatbot/service/HelpDeskChatbotAgentService.java
similarity index 97%
rename from spring-ai-2/src/main/java/com/baeldung/ollamachatbot/service/HelpDeskChatbotAgentService.java
rename to spring-ai-modules/spring-ai-conversational/src/main/java/com/baeldung/springai/ollamachatbot/service/HelpDeskChatbotAgentService.java
index df87bcdbb5d3..02e3670dfb60 100644
--- a/spring-ai-2/src/main/java/com/baeldung/ollamachatbot/service/HelpDeskChatbotAgentService.java
+++ b/spring-ai-modules/spring-ai-conversational/src/main/java/com/baeldung/springai/ollamachatbot/service/HelpDeskChatbotAgentService.java
@@ -1,4 +1,4 @@
-package com.baeldung.ollamachatbot.service;
+package com.baeldung.springai.ollamachatbot.service;
import java.util.ArrayList;
import java.util.HashMap;
@@ -12,7 +12,7 @@
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.stereotype.Service;
-import com.baeldung.ollamachatbot.model.HistoryEntry;
+import com.baeldung.springai.ollamachatbot.model.HistoryEntry;
@Service
public class HelpDeskChatbotAgentService {
diff --git a/spring-ai-2/src/main/java/com/baeldung/spring/ai/om/OmAiAssistantConfiguration.java b/spring-ai-modules/spring-ai-conversational/src/main/java/com/baeldung/springai/om/OmAiAssistantConfiguration.java
similarity index 93%
rename from spring-ai-2/src/main/java/com/baeldung/spring/ai/om/OmAiAssistantConfiguration.java
rename to spring-ai-modules/spring-ai-conversational/src/main/java/com/baeldung/springai/om/OmAiAssistantConfiguration.java
index 394aae34d02c..0fca1728929c 100644
--- a/spring-ai-2/src/main/java/com/baeldung/spring/ai/om/OmAiAssistantConfiguration.java
+++ b/spring-ai-modules/spring-ai-conversational/src/main/java/com/baeldung/springai/om/OmAiAssistantConfiguration.java
@@ -8,6 +8,9 @@
import org.springframework.context.annotation.Description;
import org.springframework.context.annotation.Profile;
+import com.baeldung.springai.om.OrderInfo;
+import com.baeldung.springai.om.OrderManagementService;
+
@Configuration
@Profile("aiassistant")
public class OmAiAssistantConfiguration {
diff --git a/spring-ai-2/src/main/java/com/baeldung/spring/ai/om/OrderInfo.java b/spring-ai-modules/spring-ai-conversational/src/main/java/com/baeldung/springai/om/OrderInfo.java
similarity index 96%
rename from spring-ai-2/src/main/java/com/baeldung/spring/ai/om/OrderInfo.java
rename to spring-ai-modules/spring-ai-conversational/src/main/java/com/baeldung/springai/om/OrderInfo.java
index 2b3c29af273d..a588186dca2e 100644
--- a/spring-ai-2/src/main/java/com/baeldung/spring/ai/om/OrderInfo.java
+++ b/spring-ai-modules/spring-ai-conversational/src/main/java/com/baeldung/springai/om/OrderInfo.java
@@ -1,4 +1,4 @@
-package com.baeldung.spring.ai.om;
+package com.baeldung.springai.om;
import jakarta.persistence.Column;
import jakarta.persistence.Entity;
diff --git a/spring-ai-2/src/main/java/com/baeldung/spring/ai/om/OrderManagementAIAssistant.java b/spring-ai-modules/spring-ai-conversational/src/main/java/com/baeldung/springai/om/OrderManagementAIAssistant.java
similarity index 95%
rename from spring-ai-2/src/main/java/com/baeldung/spring/ai/om/OrderManagementAIAssistant.java
rename to spring-ai-modules/spring-ai-conversational/src/main/java/com/baeldung/springai/om/OrderManagementAIAssistant.java
index 8596d0f26681..3629b33b3895 100644
--- a/spring-ai-2/src/main/java/com/baeldung/spring/ai/om/OrderManagementAIAssistant.java
+++ b/spring-ai-modules/spring-ai-conversational/src/main/java/com/baeldung/springai/om/OrderManagementAIAssistant.java
@@ -1,6 +1,7 @@
-package com.baeldung.spring.ai.om;
+package com.baeldung.springai.om;
import java.util.Set;
+
import org.springframework.ai.chat.model.ChatModel;
import org.springframework.ai.chat.model.ChatResponse;
import org.springframework.ai.chat.prompt.Prompt;
diff --git a/spring-ai-2/src/main/java/com/baeldung/spring/ai/om/OrderManagementApplication.java b/spring-ai-modules/spring-ai-conversational/src/main/java/com/baeldung/springai/om/OrderManagementApplication.java
similarity index 97%
rename from spring-ai-2/src/main/java/com/baeldung/spring/ai/om/OrderManagementApplication.java
rename to spring-ai-modules/spring-ai-conversational/src/main/java/com/baeldung/springai/om/OrderManagementApplication.java
index 0675b4324dc4..35d33fa87bfb 100644
--- a/spring-ai-2/src/main/java/com/baeldung/spring/ai/om/OrderManagementApplication.java
+++ b/spring-ai-modules/spring-ai-conversational/src/main/java/com/baeldung/springai/om/OrderManagementApplication.java
@@ -1,4 +1,4 @@
-package com.baeldung.spring.ai.om;
+package com.baeldung.springai.om;
import org.springframework.ai.autoconfigure.anthropic.AnthropicAutoConfiguration;
import org.springframework.ai.autoconfigure.bedrock.converse.BedrockConverseProxyChatAutoConfiguration;
diff --git a/spring-ai-2/src/main/java/com/baeldung/spring/ai/om/OrderManagementService.java b/spring-ai-modules/spring-ai-conversational/src/main/java/com/baeldung/springai/om/OrderManagementService.java
similarity index 93%
rename from spring-ai-2/src/main/java/com/baeldung/spring/ai/om/OrderManagementService.java
rename to spring-ai-modules/spring-ai-conversational/src/main/java/com/baeldung/springai/om/OrderManagementService.java
index 0b528a3183ce..537655b2e7f2 100644
--- a/spring-ai-2/src/main/java/com/baeldung/spring/ai/om/OrderManagementService.java
+++ b/spring-ai-modules/spring-ai-conversational/src/main/java/com/baeldung/springai/om/OrderManagementService.java
@@ -1,4 +1,4 @@
-package com.baeldung.spring.ai.om;
+package com.baeldung.springai.om;
import java.util.List;
import java.util.Optional;
diff --git a/spring-ai-2/src/main/java/com/baeldung/spring/ai/om/OrderRepository.java b/spring-ai-modules/spring-ai-conversational/src/main/java/com/baeldung/springai/om/OrderRepository.java
similarity index 91%
rename from spring-ai-2/src/main/java/com/baeldung/spring/ai/om/OrderRepository.java
rename to spring-ai-modules/spring-ai-conversational/src/main/java/com/baeldung/springai/om/OrderRepository.java
index d345868dcdb9..30da16a47fce 100644
--- a/spring-ai-2/src/main/java/com/baeldung/spring/ai/om/OrderRepository.java
+++ b/spring-ai-modules/spring-ai-conversational/src/main/java/com/baeldung/springai/om/OrderRepository.java
@@ -1,4 +1,4 @@
-package com.baeldung.spring.ai.om;
+package com.baeldung.springai.om;
import java.util.List;
import java.util.Optional;
diff --git a/spring-ai-2/src/main/resources/application-aiassistant.properties b/spring-ai-modules/spring-ai-conversational/src/main/resources/application-aiassistant.properties
similarity index 100%
rename from spring-ai-2/src/main/resources/application-aiassistant.properties
rename to spring-ai-modules/spring-ai-conversational/src/main/resources/application-aiassistant.properties
diff --git a/spring-ai-4/src/main/resources/application-memory.yml b/spring-ai-modules/spring-ai-conversational/src/main/resources/application-memory.yml
similarity index 100%
rename from spring-ai-4/src/main/resources/application-memory.yml
rename to spring-ai-modules/spring-ai-conversational/src/main/resources/application-memory.yml
diff --git a/spring-ai-2/src/main/resources/application.yml b/spring-ai-modules/spring-ai-conversational/src/main/resources/application.yml
similarity index 100%
rename from spring-ai-2/src/main/resources/application.yml
rename to spring-ai-modules/spring-ai-conversational/src/main/resources/application.yml
diff --git a/spring-ai-modules/spring-ai-conversational/src/main/resources/logback-spring.xml b/spring-ai-modules/spring-ai-conversational/src/main/resources/logback-spring.xml
new file mode 100644
index 000000000000..6769a348700b
--- /dev/null
+++ b/spring-ai-modules/spring-ai-conversational/src/main/resources/logback-spring.xml
@@ -0,0 +1,20 @@
+
+
+
+
+
+ [%d{yyyy-MM-dd HH:mm:ss}] [%p] [%c{1}] - %m%n
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/spring-ai-2/src/main/resources/puml/function_calling_sequence.puml b/spring-ai-modules/spring-ai-conversational/src/main/resources/puml/function_calling_sequence.puml
similarity index 100%
rename from spring-ai-2/src/main/resources/puml/function_calling_sequence.puml
rename to spring-ai-modules/spring-ai-conversational/src/main/resources/puml/function_calling_sequence.puml
diff --git a/spring-ai-2/src/main/resources/puml/om-legacy-cld.puml b/spring-ai-modules/spring-ai-conversational/src/main/resources/puml/om-legacy-cld.puml
similarity index 100%
rename from spring-ai-2/src/main/resources/puml/om-legacy-cld.puml
rename to spring-ai-modules/spring-ai-conversational/src/main/resources/puml/om-legacy-cld.puml
diff --git a/spring-ai-2/src/main/resources/puml/om_function_calling_cld.puml b/spring-ai-modules/spring-ai-conversational/src/main/resources/puml/om_function_calling_cld.puml
similarity index 100%
rename from spring-ai-2/src/main/resources/puml/om_function_calling_cld.puml
rename to spring-ai-modules/spring-ai-conversational/src/main/resources/puml/om_function_calling_cld.puml
diff --git a/spring-ai-4/src/test/java/com/baeldung/springai/memory/ChatServiceLiveTest.java b/spring-ai-modules/spring-ai-conversational/src/test/java/com/baeldung/springai/memory/ChatServiceLiveTest.java
similarity index 89%
rename from spring-ai-4/src/test/java/com/baeldung/springai/memory/ChatServiceLiveTest.java
rename to spring-ai-modules/spring-ai-conversational/src/test/java/com/baeldung/springai/memory/ChatServiceLiveTest.java
index c96024846a92..cdfb5a0aa81a 100644
--- a/spring-ai-4/src/test/java/com/baeldung/springai/memory/ChatServiceLiveTest.java
+++ b/spring-ai-modules/spring-ai-conversational/src/test/java/com/baeldung/springai/memory/ChatServiceLiveTest.java
@@ -1,13 +1,13 @@
package com.baeldung.springai.memory;
+import static org.assertj.core.api.Assertions.assertThat;
+
import org.junit.jupiter.api.Test;
import org.springframework.ai.chat.memory.ChatMemory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.ActiveProfiles;
-import static org.assertj.core.api.Assertions.assertThat;
-
@SpringBootTest
@ActiveProfiles("memory")
class ChatServiceLiveTest {
@@ -28,12 +28,12 @@ void whenChatServiceIsCalledTwice_thenChatMemoryHasCorrectNumberOfEntries() {
// 1st request
String response1 = chatService.chat(PROMPT_1ST);
assertThat(response1).isNotEmpty();
- assertThat(chatMemory.get(conversationId)).hasSize(2);
+ assertThat(chatMemory.get(conversationId,-1)).hasSize(2);
// 2nd request
String response2 = chatService.chat(PROMPT_2ND);
assertThat(response2).isNotEmpty();
- assertThat(chatMemory.get(conversationId)).hasSize(4);
+ assertThat(chatMemory.get(conversationId,-1)).hasSize(4);
}
}
\ No newline at end of file
diff --git a/spring-ai-2/src/test/java/com/baeldung/ollamachatbot/HelpDeskControllerLiveTest.java b/spring-ai-modules/spring-ai-conversational/src/test/java/com/baeldung/springai/ollamachatbot/HelpDeskControllerLiveTest.java
similarity index 92%
rename from spring-ai-2/src/test/java/com/baeldung/ollamachatbot/HelpDeskControllerLiveTest.java
rename to spring-ai-modules/spring-ai-conversational/src/test/java/com/baeldung/springai/ollamachatbot/HelpDeskControllerLiveTest.java
index f2565fb0a67c..38b7c38d5191 100644
--- a/spring-ai-2/src/test/java/com/baeldung/ollamachatbot/HelpDeskControllerLiveTest.java
+++ b/spring-ai-modules/spring-ai-conversational/src/test/java/com/baeldung/springai/ollamachatbot/HelpDeskControllerLiveTest.java
@@ -1,4 +1,4 @@
-package com.baeldung.ollamachatbot;
+package com.baeldung.springai.ollamachatbot;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotNull;
@@ -18,9 +18,9 @@
import org.springframework.test.context.junit4.SpringRunner;
import org.springframework.test.web.servlet.MockMvc;
-import com.baeldung.ollamachatbot.model.HelpDeskRequest;
-import com.baeldung.ollamachatbot.model.HistoryEntry;
-import com.baeldung.ollamachatbot.service.HelpDeskChatbotAgentService;
+import com.baeldung.springai.ollamachatbot.model.HelpDeskRequest;
+import com.baeldung.springai.ollamachatbot.model.HistoryEntry;
+import com.baeldung.springai.ollamachatbot.service.HelpDeskChatbotAgentService;
import com.fasterxml.jackson.databind.ObjectMapper;
@AutoConfigureMockMvc
diff --git a/spring-ai-2/src/test/java/com/baeldung/spring/ai/om/AiOrderManagementLiveTest.java b/spring-ai-modules/spring-ai-conversational/src/test/java/com/baeldung/springai/om/AiOrderManagementLiveTest.java
similarity index 99%
rename from spring-ai-2/src/test/java/com/baeldung/spring/ai/om/AiOrderManagementLiveTest.java
rename to spring-ai-modules/spring-ai-conversational/src/test/java/com/baeldung/springai/om/AiOrderManagementLiveTest.java
index 7eaf6d8ee886..a68273fef0c7 100644
--- a/spring-ai-2/src/test/java/com/baeldung/spring/ai/om/AiOrderManagementLiveTest.java
+++ b/spring-ai-modules/spring-ai-conversational/src/test/java/com/baeldung/springai/om/AiOrderManagementLiveTest.java
@@ -1,4 +1,4 @@
-package com.baeldung.spring.ai.om;
+package com.baeldung.springai.om;
import static org.springframework.test.context.jdbc.Sql.ExecutionPhase.BEFORE_TEST_CLASS;
diff --git a/spring-ai/src/test/resources/application-integrationtest.yml b/spring-ai-modules/spring-ai-conversational/src/test/resources/application-integrationtest.yml
similarity index 100%
rename from spring-ai/src/test/resources/application-integrationtest.yml
rename to spring-ai-modules/spring-ai-conversational/src/test/resources/application-integrationtest.yml
diff --git a/spring-ai-2/src/test/resources/order_mgmt.sql b/spring-ai-modules/spring-ai-conversational/src/test/resources/order_mgmt.sql
similarity index 100%
rename from spring-ai-2/src/test/resources/order_mgmt.sql
rename to spring-ai-modules/spring-ai-conversational/src/test/resources/order_mgmt.sql
diff --git a/spring-ai-modules/spring-ai-core/pom.xml b/spring-ai-modules/spring-ai-core/pom.xml
new file mode 100644
index 000000000000..4be96433909f
--- /dev/null
+++ b/spring-ai-modules/spring-ai-core/pom.xml
@@ -0,0 +1,128 @@
+
+
+ 4.0.0
+ spring-ai-core
+ spring-ai-core
+ war
+
+
+ com.baeldung
+ spring-ai-modules
+ 0.0.1
+ ../pom.xml
+
+
+
+
+ spring-snapshots
+ Spring Snapshots
+ https://repo.spring.io/snapshot
+
+ false
+
+
+
+ Central Portal Snapshots
+ central-portal-snapshots
+ https://central.sonatype.com/repository/maven-snapshots/
+
+ false
+
+
+ true
+
+
+
+
+
+
+
+ org.springframework.boot
+ spring-boot-dependencies
+ ${spring-boot.version}
+ pom
+ import
+
+
+ org.springframework.ai
+ spring-ai-bom
+ ${spring-ai.version}
+ pom
+ import
+
+
+
+
+
+
+ org.springframework.boot
+ spring-boot-starter-web
+
+
+ org.springframework.ai
+ spring-ai-openai-spring-boot-starter
+
+
+ org.springframework.ai
+ spring-ai-mistral-ai-spring-boot-starter
+
+
+ org.springframework.ai
+ spring-ai-redis-store-spring-boot-starter
+
+
+ org.springframework.ai
+ spring-ai-transformers-spring-boot-starter
+
+
+ org.springframework.ai
+ spring-ai-ollama-spring-boot-starter
+
+
+ org.springframework.ai
+ spring-ai-pgvector-store-spring-boot-starter
+
+
+ org.springframework.boot
+ spring-boot-docker-compose
+
+
+ org.springframework.ai
+ spring-ai-bedrock-converse-spring-boot-starter
+
+
+
+
+
+
+
+ org.springframework.boot
+ spring-boot-maven-plugin
+
+ com.baeldung.spring.ai.SpringAIProjectApplication
+ JAR
+
+
+
+ org.apache.maven.plugins
+ maven-compiler-plugin
+
+ 17
+ 17
+
+ **/*ManualTest.java
+
+
+
+
+
+
+
+ 1.0.0-M6
+ 5.9.0
+
+
+
+
\ No newline at end of file
diff --git a/spring-ai/postman/Spring_AI_Poetry.postman_environment.json b/spring-ai-modules/spring-ai-core/postman/Spring_AI_Poetry.postman_environment.json
similarity index 100%
rename from spring-ai/postman/Spring_AI_Poetry.postman_environment.json
rename to spring-ai-modules/spring-ai-core/postman/Spring_AI_Poetry.postman_environment.json
diff --git a/spring-ai/postman/chat-client.http b/spring-ai-modules/spring-ai-core/postman/chat-client.http
similarity index 100%
rename from spring-ai/postman/chat-client.http
rename to spring-ai-modules/spring-ai-core/postman/chat-client.http
diff --git a/spring-ai/postman/spring-ai.postman_collection.json b/spring-ai-modules/spring-ai-core/postman/spring-ai.postman_collection.json
similarity index 100%
rename from spring-ai/postman/spring-ai.postman_collection.json
rename to spring-ai-modules/spring-ai-core/postman/spring-ai.postman_collection.json
diff --git a/spring-ai/src/main/java/com/baeldung/SpringAIProjectApplication.java b/spring-ai-modules/spring-ai-core/src/main/java/com/baeldung/SpringAIProjectApplication.java
similarity index 100%
rename from spring-ai/src/main/java/com/baeldung/SpringAIProjectApplication.java
rename to spring-ai-modules/spring-ai-core/src/main/java/com/baeldung/SpringAIProjectApplication.java
diff --git a/spring-ai/src/main/java/com/baeldung/springai/chatclient/ChatClientApplication.java b/spring-ai-modules/spring-ai-core/src/main/java/com/baeldung/chatclient/ChatClientApplication.java
similarity index 94%
rename from spring-ai/src/main/java/com/baeldung/springai/chatclient/ChatClientApplication.java
rename to spring-ai-modules/spring-ai-core/src/main/java/com/baeldung/chatclient/ChatClientApplication.java
index 6cecb909283d..0536f340fe3a 100644
--- a/spring-ai/src/main/java/com/baeldung/springai/chatclient/ChatClientApplication.java
+++ b/spring-ai-modules/spring-ai-core/src/main/java/com/baeldung/chatclient/ChatClientApplication.java
@@ -1,4 +1,4 @@
-package com.baeldung.springai.chatclient;
+package com.baeldung.chatclient;
import org.springframework.ai.autoconfigure.mistralai.MistralAiAutoConfiguration;
import org.springframework.ai.autoconfigure.vectorstore.mongo.MongoDBAtlasVectorStoreAutoConfiguration;
diff --git a/spring-ai-3/src/main/java/com/baeldung/springai/chatclient/rest/BlogsController.java b/spring-ai-modules/spring-ai-core/src/main/java/com/baeldung/chatclient/rest/BlogsController.java
similarity index 98%
rename from spring-ai-3/src/main/java/com/baeldung/springai/chatclient/rest/BlogsController.java
rename to spring-ai-modules/spring-ai-core/src/main/java/com/baeldung/chatclient/rest/BlogsController.java
index 8e2fe6fdffdc..dedb674ec41c 100644
--- a/spring-ai-3/src/main/java/com/baeldung/springai/chatclient/rest/BlogsController.java
+++ b/spring-ai-modules/spring-ai-core/src/main/java/com/baeldung/chatclient/rest/BlogsController.java
@@ -1,4 +1,4 @@
-package com.baeldung.springai.chatclient.rest;
+package com.baeldung.chatclient.rest;
import java.io.IOException;
import java.nio.file.Files;
diff --git a/spring-ai/src/main/java/com/baeldung/springai/dto/PoetryDto.java b/spring-ai-modules/spring-ai-core/src/main/java/com/baeldung/springai/dto/PoetryDto.java
similarity index 100%
rename from spring-ai/src/main/java/com/baeldung/springai/dto/PoetryDto.java
rename to spring-ai-modules/spring-ai-core/src/main/java/com/baeldung/springai/dto/PoetryDto.java
diff --git a/spring-ai/src/main/java/com/baeldung/springai/service/PoetryService.java b/spring-ai-modules/spring-ai-core/src/main/java/com/baeldung/springai/service/PoetryService.java
similarity index 100%
rename from spring-ai/src/main/java/com/baeldung/springai/service/PoetryService.java
rename to spring-ai-modules/spring-ai-core/src/main/java/com/baeldung/springai/service/PoetryService.java
diff --git a/spring-ai/src/main/java/com/baeldung/springai/service/impl/PoetryServiceImpl.java b/spring-ai-modules/spring-ai-core/src/main/java/com/baeldung/springai/service/impl/PoetryServiceImpl.java
similarity index 100%
rename from spring-ai/src/main/java/com/baeldung/springai/service/impl/PoetryServiceImpl.java
rename to spring-ai-modules/spring-ai-core/src/main/java/com/baeldung/springai/service/impl/PoetryServiceImpl.java
diff --git a/spring-ai/src/main/java/com/baeldung/springai/web/ExceptionTranslator.java b/spring-ai-modules/spring-ai-core/src/main/java/com/baeldung/springai/web/ExceptionTranslator.java
similarity index 100%
rename from spring-ai/src/main/java/com/baeldung/springai/web/ExceptionTranslator.java
rename to spring-ai-modules/spring-ai-core/src/main/java/com/baeldung/springai/web/ExceptionTranslator.java
diff --git a/spring-ai/src/main/java/com/baeldung/springai/web/PoetryController.java b/spring-ai-modules/spring-ai-core/src/main/java/com/baeldung/springai/web/PoetryController.java
similarity index 100%
rename from spring-ai/src/main/java/com/baeldung/springai/web/PoetryController.java
rename to spring-ai-modules/spring-ai-core/src/main/java/com/baeldung/springai/web/PoetryController.java
diff --git a/spring-ai-3/src/main/java/com/baeldung/springaistructuredoutput/DemoApplication.java b/spring-ai-modules/spring-ai-core/src/main/java/com/baeldung/springaistructuredoutput/DemoApplication.java
similarity index 100%
rename from spring-ai-3/src/main/java/com/baeldung/springaistructuredoutput/DemoApplication.java
rename to spring-ai-modules/spring-ai-core/src/main/java/com/baeldung/springaistructuredoutput/DemoApplication.java
diff --git a/spring-ai-3/src/main/java/com/baeldung/springaistructuredoutput/controller/CharacterController.java b/spring-ai-modules/spring-ai-core/src/main/java/com/baeldung/springaistructuredoutput/controller/CharacterController.java
similarity index 99%
rename from spring-ai-3/src/main/java/com/baeldung/springaistructuredoutput/controller/CharacterController.java
rename to spring-ai-modules/spring-ai-core/src/main/java/com/baeldung/springaistructuredoutput/controller/CharacterController.java
index b162e3546e05..44db8fbacb25 100644
--- a/spring-ai-3/src/main/java/com/baeldung/springaistructuredoutput/controller/CharacterController.java
+++ b/spring-ai-modules/spring-ai-core/src/main/java/com/baeldung/springaistructuredoutput/controller/CharacterController.java
@@ -1,14 +1,15 @@
package com.baeldung.springaistructuredoutput.controller;
-import com.baeldung.springaistructuredoutput.service.CharacterService;
+import java.util.List;
+import java.util.Map;
+
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
-import java.util.List;
-import java.util.Map;
+import com.baeldung.springaistructuredoutput.service.CharacterService;
@RestController
@RequestMapping("/character")
diff --git a/spring-ai-3/src/main/java/com/baeldung/springaistructuredoutput/converters/GenericMapOutputConverter.java b/spring-ai-modules/spring-ai-core/src/main/java/com/baeldung/springaistructuredoutput/converters/GenericMapOutputConverter.java
similarity index 90%
rename from spring-ai-3/src/main/java/com/baeldung/springaistructuredoutput/converters/GenericMapOutputConverter.java
rename to spring-ai-modules/spring-ai-core/src/main/java/com/baeldung/springaistructuredoutput/converters/GenericMapOutputConverter.java
index fb082566c8a9..83aa50ad2475 100644
--- a/spring-ai-3/src/main/java/com/baeldung/springaistructuredoutput/converters/GenericMapOutputConverter.java
+++ b/spring-ai-modules/spring-ai-core/src/main/java/com/baeldung/springaistructuredoutput/converters/GenericMapOutputConverter.java
@@ -1,5 +1,11 @@
package com.baeldung.springaistructuredoutput.converters;
+import java.util.HashMap;
+import java.util.Map;
+
+import org.springframework.ai.converter.StructuredOutputConverter;
+import org.springframework.lang.NonNull;
+
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.core.type.TypeReference;
import com.fasterxml.jackson.core.util.DefaultIndenter;
@@ -9,13 +15,12 @@
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.ObjectWriter;
import com.fasterxml.jackson.databind.json.JsonMapper;
-import com.github.victools.jsonschema.generator.*;
+import com.github.victools.jsonschema.generator.OptionPreset;
+import com.github.victools.jsonschema.generator.SchemaGenerator;
+import com.github.victools.jsonschema.generator.SchemaGeneratorConfig;
+import com.github.victools.jsonschema.generator.SchemaGeneratorConfigBuilder;
+import com.github.victools.jsonschema.generator.SchemaVersion;
import com.github.victools.jsonschema.module.jackson.JacksonModule;
-import org.springframework.ai.converter.StructuredOutputConverter;
-import org.springframework.lang.NonNull;
-
-import java.util.HashMap;
-import java.util.Map;
public class GenericMapOutputConverter implements StructuredOutputConverter