diff --git a/models/spring-ai-openai/src/test/java/org/springframework/ai/openai/transformer/MetadataTransformerIT.java b/models/spring-ai-openai/src/test/java/org/springframework/ai/openai/transformer/MetadataTransformerIT.java
index 5fa3e0a1d..15f588fa5 100644
--- a/models/spring-ai-openai/src/test/java/org/springframework/ai/openai/transformer/MetadataTransformerIT.java
+++ b/models/spring-ai-openai/src/test/java/org/springframework/ai/openai/transformer/MetadataTransformerIT.java
@@ -24,8 +24,8 @@ import java.util.Map;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.condition.EnabledIfEnvironmentVariable;
-import org.springframework.ai.chat.transformer.KeywordMetadataEnricher;
-import org.springframework.ai.chat.transformer.SummaryMetadataEnricher;
+import org.springframework.ai.model.transformer.KeywordMetadataEnricher;
+import org.springframework.ai.model.transformer.SummaryMetadataEnricher;
import org.springframework.ai.document.DefaultContentFormatter;
import org.springframework.ai.document.Document;
import org.springframework.ai.openai.OpenAiChatModel;
diff --git a/spring-ai-client-chat/pom.xml b/spring-ai-client-chat/pom.xml
index ed6faabf6..b339ba716 100644
--- a/spring-ai-client-chat/pom.xml
+++ b/spring-ai-client-chat/pom.xml
@@ -73,12 +73,6 @@
spring-context
-
-
- org.springframework
- spring-messaging
-
-
com.knuddels
jtokkit
@@ -91,22 +85,6 @@
${jsonschema.version}
-
- com.github.victools
- jsonschema-module-jackson
- ${jsonschema.version}
-
-
-
- com.fasterxml.jackson.core
- jackson-databind
-
-
-
- com.fasterxml.jackson.datatype
- jackson-datatype-jsr310
-
-
org.jetbrains.kotlin
kotlin-stdlib
diff --git a/spring-ai-client-chat/src/main/java/org/springframework/ai/evaluation/FactCheckingEvaluator.java b/spring-ai-client-chat/src/main/java/org/springframework/ai/chat/evaluation/FactCheckingEvaluator.java
similarity index 96%
rename from spring-ai-client-chat/src/main/java/org/springframework/ai/evaluation/FactCheckingEvaluator.java
rename to spring-ai-client-chat/src/main/java/org/springframework/ai/chat/evaluation/FactCheckingEvaluator.java
index 7da77ff15..870b87663 100644
--- a/spring-ai-client-chat/src/main/java/org/springframework/ai/evaluation/FactCheckingEvaluator.java
+++ b/spring-ai-client-chat/src/main/java/org/springframework/ai/chat/evaluation/FactCheckingEvaluator.java
@@ -14,11 +14,14 @@
* limitations under the License.
*/
-package org.springframework.ai.evaluation;
+package org.springframework.ai.chat.evaluation;
import java.util.Collections;
import org.springframework.ai.chat.client.ChatClient;
+import org.springframework.ai.evaluation.EvaluationRequest;
+import org.springframework.ai.evaluation.EvaluationResponse;
+import org.springframework.ai.evaluation.Evaluator;
/**
* Implementation of {@link Evaluator} used to evaluate the factual accuracy of Large
diff --git a/spring-ai-client-chat/src/main/java/org/springframework/ai/evaluation/RelevancyEvaluator.java b/spring-ai-client-chat/src/main/java/org/springframework/ai/chat/evaluation/RelevancyEvaluator.java
similarity index 90%
rename from spring-ai-client-chat/src/main/java/org/springframework/ai/evaluation/RelevancyEvaluator.java
rename to spring-ai-client-chat/src/main/java/org/springframework/ai/chat/evaluation/RelevancyEvaluator.java
index b85591333..5ae2c4393 100644
--- a/spring-ai-client-chat/src/main/java/org/springframework/ai/evaluation/RelevancyEvaluator.java
+++ b/spring-ai-client-chat/src/main/java/org/springframework/ai/chat/evaluation/RelevancyEvaluator.java
@@ -14,11 +14,14 @@
* limitations under the License.
*/
-package org.springframework.ai.evaluation;
+package org.springframework.ai.chat.evaluation;
import java.util.Collections;
import org.springframework.ai.chat.client.ChatClient;
+import org.springframework.ai.evaluation.EvaluationRequest;
+import org.springframework.ai.evaluation.EvaluationResponse;
+import org.springframework.ai.evaluation.Evaluator;
public class RelevancyEvaluator implements Evaluator {
diff --git a/spring-ai-client-chat/src/main/java/org/springframework/ai/evaluation/EvaluationRequest.java b/spring-ai-commons/src/main/java/org/springframework/ai/evaluation/EvaluationRequest.java
similarity index 100%
rename from spring-ai-client-chat/src/main/java/org/springframework/ai/evaluation/EvaluationRequest.java
rename to spring-ai-commons/src/main/java/org/springframework/ai/evaluation/EvaluationRequest.java
diff --git a/spring-ai-client-chat/src/main/java/org/springframework/ai/evaluation/EvaluationResponse.java b/spring-ai-commons/src/main/java/org/springframework/ai/evaluation/EvaluationResponse.java
similarity index 100%
rename from spring-ai-client-chat/src/main/java/org/springframework/ai/evaluation/EvaluationResponse.java
rename to spring-ai-commons/src/main/java/org/springframework/ai/evaluation/EvaluationResponse.java
diff --git a/spring-ai-client-chat/src/main/java/org/springframework/ai/evaluation/Evaluator.java b/spring-ai-commons/src/main/java/org/springframework/ai/evaluation/Evaluator.java
similarity index 100%
rename from spring-ai-client-chat/src/main/java/org/springframework/ai/evaluation/Evaluator.java
rename to spring-ai-commons/src/main/java/org/springframework/ai/evaluation/Evaluator.java
diff --git a/spring-ai-docs/src/main/antora/modules/ROOT/pages/upgrade-notes.adoc b/spring-ai-docs/src/main/antora/modules/ROOT/pages/upgrade-notes.adoc
index cf40ce4b9..c1a075d23 100644
--- a/spring-ai-docs/src/main/antora/modules/ROOT/pages/upgrade-notes.adoc
+++ b/spring-ai-docs/src/main/antora/modules/ROOT/pages/upgrade-notes.adoc
@@ -200,6 +200,23 @@ QuestionAnswerAdvisor newAdvisor = QuestionAnswerAdvisor.builder(vectorStore)
* The `PromptTemplate` API has been redesigned to support a more flexible and extensible way of templating prompts, relying on a new `TemplateRenderer` API. As part of this change, the `getInputVariables()` and `validate()` methods have been deprecated and will throw an `UnsupportedOperationException` if called. Any logic specific to a template engine should be available through the `TemplateRenderer` API.
+=== Class Package Refactoring
+
+Several classes have been moved to different modules and packages for better organization:
+
+* Evaluation classes moved:
+** `org.springframework.ai.evaluation.FactCheckingEvaluator` moved to `org.springframework.ai.chat.evaluation` package within `spring-ai-client-chat`.
+** `org.springframework.ai.evaluation.RelevancyEvaluator` moved to `org.springframework.ai.chat.evaluation` package within `spring-ai-client-chat`.
+** `org.springframework.ai.evaluation.EvaluationRequest`, `EvaluationResponse`, and `Evaluator` moved from `spring-ai-client-chat` to `spring-ai-commons` under the `org.springframework.ai.evaluation` package.
+* Output converter classes moved:
+** Classes within `org.springframework.ai.converter` (e.g., `BeanOutputConverter`, `ListOutputConverter`, `MapOutputConverter`, `StructuredOutputConverter`, etc.) moved from `spring-ai-client-chat` to `spring-ai-model`.
+* Transformer classes moved:
+** `org.springframework.ai.chat.transformer.KeywordMetadataEnricher` moved to `org.springframework.ai.model.transformer.KeywordMetadataEnricher` in `spring-ai-model`.
+** `org.springframework.ai.chat.transformer.SummaryMetadataEnricher` moved to `org.springframework.ai.model.transformer.SummaryMetadataEnricher` in `spring-ai-model`.
+* Utility classes moved:
+** `org.springframework.ai.util.PromptAssert` moved from `spring-ai-client-chat` to `org.springframework.ai.rag.util.PromptAssert` in `spring-ai-rag`.
+
+Please update your imports accordingly.
=== Observability
diff --git a/spring-ai-integration-tests/src/test/java/org/springframework/ai/integration/tests/client/advisor/QuestionAnswerAdvisorIT.java b/spring-ai-integration-tests/src/test/java/org/springframework/ai/integration/tests/client/advisor/QuestionAnswerAdvisorIT.java
index 8f7530b44..05893ebd1 100644
--- a/spring-ai-integration-tests/src/test/java/org/springframework/ai/integration/tests/client/advisor/QuestionAnswerAdvisorIT.java
+++ b/spring-ai-integration-tests/src/test/java/org/springframework/ai/integration/tests/client/advisor/QuestionAnswerAdvisorIT.java
@@ -28,7 +28,7 @@ import org.springframework.ai.document.Document;
import org.springframework.ai.document.DocumentReader;
import org.springframework.ai.evaluation.EvaluationRequest;
import org.springframework.ai.evaluation.EvaluationResponse;
-import org.springframework.ai.evaluation.RelevancyEvaluator;
+import org.springframework.ai.chat.evaluation.RelevancyEvaluator;
import org.springframework.ai.integration.tests.TestApplication;
import org.springframework.ai.openai.OpenAiChatModel;
import org.springframework.ai.reader.markdown.MarkdownDocumentReader;
diff --git a/spring-ai-integration-tests/src/test/java/org/springframework/ai/integration/tests/client/advisor/RetrievalAugmentationAdvisorIT.java b/spring-ai-integration-tests/src/test/java/org/springframework/ai/integration/tests/client/advisor/RetrievalAugmentationAdvisorIT.java
index a901b772a..b72c77eff 100644
--- a/spring-ai-integration-tests/src/test/java/org/springframework/ai/integration/tests/client/advisor/RetrievalAugmentationAdvisorIT.java
+++ b/spring-ai-integration-tests/src/test/java/org/springframework/ai/integration/tests/client/advisor/RetrievalAugmentationAdvisorIT.java
@@ -32,7 +32,7 @@ import org.springframework.ai.document.Document;
import org.springframework.ai.document.DocumentReader;
import org.springframework.ai.evaluation.EvaluationRequest;
import org.springframework.ai.evaluation.EvaluationResponse;
-import org.springframework.ai.evaluation.RelevancyEvaluator;
+import org.springframework.ai.chat.evaluation.RelevancyEvaluator;
import org.springframework.ai.integration.tests.TestApplication;
import org.springframework.ai.openai.OpenAiChatModel;
import org.springframework.ai.rag.advisor.RetrievalAugmentationAdvisor;
diff --git a/spring-ai-model/pom.xml b/spring-ai-model/pom.xml
index fa2ef330e..167d12735 100644
--- a/spring-ai-model/pom.xml
+++ b/spring-ai-model/pom.xml
@@ -64,6 +64,12 @@
true
+
+
+ org.springframework
+ spring-messaging
+
+
io.projectreactor
reactor-core
@@ -88,6 +94,17 @@
${jsonschema.version}
+
+ com.fasterxml.jackson.core
+ jackson-databind
+
+
+
+ com.fasterxml.jackson.datatype
+ jackson-datatype-jsr310
+
+
+
com.github.victools
jsonschema-module-swagger-2
diff --git a/spring-ai-client-chat/src/main/java/org/springframework/ai/converter/AbstractConversionServiceOutputConverter.java b/spring-ai-model/src/main/java/org/springframework/ai/converter/AbstractConversionServiceOutputConverter.java
similarity index 100%
rename from spring-ai-client-chat/src/main/java/org/springframework/ai/converter/AbstractConversionServiceOutputConverter.java
rename to spring-ai-model/src/main/java/org/springframework/ai/converter/AbstractConversionServiceOutputConverter.java
diff --git a/spring-ai-client-chat/src/main/java/org/springframework/ai/converter/AbstractMessageOutputConverter.java b/spring-ai-model/src/main/java/org/springframework/ai/converter/AbstractMessageOutputConverter.java
similarity index 100%
rename from spring-ai-client-chat/src/main/java/org/springframework/ai/converter/AbstractMessageOutputConverter.java
rename to spring-ai-model/src/main/java/org/springframework/ai/converter/AbstractMessageOutputConverter.java
diff --git a/spring-ai-client-chat/src/main/java/org/springframework/ai/converter/BeanOutputConverter.java b/spring-ai-model/src/main/java/org/springframework/ai/converter/BeanOutputConverter.java
similarity index 100%
rename from spring-ai-client-chat/src/main/java/org/springframework/ai/converter/BeanOutputConverter.java
rename to spring-ai-model/src/main/java/org/springframework/ai/converter/BeanOutputConverter.java
diff --git a/spring-ai-client-chat/src/main/java/org/springframework/ai/converter/FormatProvider.java b/spring-ai-model/src/main/java/org/springframework/ai/converter/FormatProvider.java
similarity index 100%
rename from spring-ai-client-chat/src/main/java/org/springframework/ai/converter/FormatProvider.java
rename to spring-ai-model/src/main/java/org/springframework/ai/converter/FormatProvider.java
diff --git a/spring-ai-client-chat/src/main/java/org/springframework/ai/converter/ListOutputConverter.java b/spring-ai-model/src/main/java/org/springframework/ai/converter/ListOutputConverter.java
similarity index 100%
rename from spring-ai-client-chat/src/main/java/org/springframework/ai/converter/ListOutputConverter.java
rename to spring-ai-model/src/main/java/org/springframework/ai/converter/ListOutputConverter.java
diff --git a/spring-ai-client-chat/src/main/java/org/springframework/ai/converter/MapOutputConverter.java b/spring-ai-model/src/main/java/org/springframework/ai/converter/MapOutputConverter.java
similarity index 100%
rename from spring-ai-client-chat/src/main/java/org/springframework/ai/converter/MapOutputConverter.java
rename to spring-ai-model/src/main/java/org/springframework/ai/converter/MapOutputConverter.java
diff --git a/spring-ai-client-chat/src/main/java/org/springframework/ai/converter/README.md b/spring-ai-model/src/main/java/org/springframework/ai/converter/README.md
similarity index 100%
rename from spring-ai-client-chat/src/main/java/org/springframework/ai/converter/README.md
rename to spring-ai-model/src/main/java/org/springframework/ai/converter/README.md
diff --git a/spring-ai-client-chat/src/main/java/org/springframework/ai/converter/StructuredOutputConverter.java b/spring-ai-model/src/main/java/org/springframework/ai/converter/StructuredOutputConverter.java
similarity index 100%
rename from spring-ai-client-chat/src/main/java/org/springframework/ai/converter/StructuredOutputConverter.java
rename to spring-ai-model/src/main/java/org/springframework/ai/converter/StructuredOutputConverter.java
diff --git a/spring-ai-client-chat/src/main/java/org/springframework/ai/chat/transformer/KeywordMetadataEnricher.java b/spring-ai-model/src/main/java/org/springframework/ai/model/transformer/KeywordMetadataEnricher.java
similarity index 97%
rename from spring-ai-client-chat/src/main/java/org/springframework/ai/chat/transformer/KeywordMetadataEnricher.java
rename to spring-ai-model/src/main/java/org/springframework/ai/model/transformer/KeywordMetadataEnricher.java
index 104c3db37..838fc9fe5 100644
--- a/spring-ai-client-chat/src/main/java/org/springframework/ai/chat/transformer/KeywordMetadataEnricher.java
+++ b/spring-ai-model/src/main/java/org/springframework/ai/model/transformer/KeywordMetadataEnricher.java
@@ -14,7 +14,7 @@
* limitations under the License.
*/
-package org.springframework.ai.chat.transformer;
+package org.springframework.ai.model.transformer;
import java.util.List;
import java.util.Map;
diff --git a/spring-ai-client-chat/src/main/java/org/springframework/ai/chat/transformer/SummaryMetadataEnricher.java b/spring-ai-model/src/main/java/org/springframework/ai/model/transformer/SummaryMetadataEnricher.java
similarity index 98%
rename from spring-ai-client-chat/src/main/java/org/springframework/ai/chat/transformer/SummaryMetadataEnricher.java
rename to spring-ai-model/src/main/java/org/springframework/ai/model/transformer/SummaryMetadataEnricher.java
index 736a56c63..5f9410517 100644
--- a/spring-ai-client-chat/src/main/java/org/springframework/ai/chat/transformer/SummaryMetadataEnricher.java
+++ b/spring-ai-model/src/main/java/org/springframework/ai/model/transformer/SummaryMetadataEnricher.java
@@ -14,7 +14,7 @@
* limitations under the License.
*/
-package org.springframework.ai.chat.transformer;
+package org.springframework.ai.model.transformer;
import java.util.ArrayList;
import java.util.HashMap;
diff --git a/spring-ai-client-chat/src/test/java/org/springframework/ai/converter/BeanOutputConverterTest.java b/spring-ai-model/src/test/java/org/springframework/ai/converter/BeanOutputConverterTest.java
similarity index 100%
rename from spring-ai-client-chat/src/test/java/org/springframework/ai/converter/BeanOutputConverterTest.java
rename to spring-ai-model/src/test/java/org/springframework/ai/converter/BeanOutputConverterTest.java
diff --git a/spring-ai-client-chat/src/test/java/org/springframework/ai/converter/ListOutputConverterTest.java b/spring-ai-model/src/test/java/org/springframework/ai/converter/ListOutputConverterTest.java
similarity index 100%
rename from spring-ai-client-chat/src/test/java/org/springframework/ai/converter/ListOutputConverterTest.java
rename to spring-ai-model/src/test/java/org/springframework/ai/converter/ListOutputConverterTest.java
diff --git a/spring-ai-rag/src/main/java/org/springframework/ai/rag/generation/augmentation/ContextualQueryAugmenter.java b/spring-ai-rag/src/main/java/org/springframework/ai/rag/generation/augmentation/ContextualQueryAugmenter.java
index de56d5b9e..e49183895 100644
--- a/spring-ai-rag/src/main/java/org/springframework/ai/rag/generation/augmentation/ContextualQueryAugmenter.java
+++ b/spring-ai-rag/src/main/java/org/springframework/ai/rag/generation/augmentation/ContextualQueryAugmenter.java
@@ -27,7 +27,7 @@ import org.slf4j.LoggerFactory;
import org.springframework.ai.chat.prompt.PromptTemplate;
import org.springframework.ai.document.Document;
import org.springframework.ai.rag.Query;
-import org.springframework.ai.util.PromptAssert;
+import org.springframework.ai.rag.util.PromptAssert;
import org.springframework.lang.Nullable;
import org.springframework.util.Assert;
diff --git a/spring-ai-rag/src/main/java/org/springframework/ai/rag/preretrieval/query/expansion/MultiQueryExpander.java b/spring-ai-rag/src/main/java/org/springframework/ai/rag/preretrieval/query/expansion/MultiQueryExpander.java
index aa64f46cf..314a455ba 100644
--- a/spring-ai-rag/src/main/java/org/springframework/ai/rag/preretrieval/query/expansion/MultiQueryExpander.java
+++ b/spring-ai-rag/src/main/java/org/springframework/ai/rag/preretrieval/query/expansion/MultiQueryExpander.java
@@ -26,7 +26,7 @@ import org.slf4j.LoggerFactory;
import org.springframework.ai.chat.client.ChatClient;
import org.springframework.ai.chat.prompt.PromptTemplate;
import org.springframework.ai.rag.Query;
-import org.springframework.ai.util.PromptAssert;
+import org.springframework.ai.rag.util.PromptAssert;
import org.springframework.lang.Nullable;
import org.springframework.util.Assert;
import org.springframework.util.CollectionUtils;
diff --git a/spring-ai-rag/src/main/java/org/springframework/ai/rag/preretrieval/query/transformation/CompressionQueryTransformer.java b/spring-ai-rag/src/main/java/org/springframework/ai/rag/preretrieval/query/transformation/CompressionQueryTransformer.java
index 7795dcf90..dc0dff576 100644
--- a/spring-ai-rag/src/main/java/org/springframework/ai/rag/preretrieval/query/transformation/CompressionQueryTransformer.java
+++ b/spring-ai-rag/src/main/java/org/springframework/ai/rag/preretrieval/query/transformation/CompressionQueryTransformer.java
@@ -28,7 +28,7 @@ import org.springframework.ai.chat.messages.MessageType;
import org.springframework.ai.chat.prompt.ChatOptions;
import org.springframework.ai.chat.prompt.PromptTemplate;
import org.springframework.ai.rag.Query;
-import org.springframework.ai.util.PromptAssert;
+import org.springframework.ai.rag.util.PromptAssert;
import org.springframework.lang.Nullable;
import org.springframework.util.Assert;
import org.springframework.util.StringUtils;
diff --git a/spring-ai-rag/src/main/java/org/springframework/ai/rag/preretrieval/query/transformation/RewriteQueryTransformer.java b/spring-ai-rag/src/main/java/org/springframework/ai/rag/preretrieval/query/transformation/RewriteQueryTransformer.java
index 861df1a8e..e292f120a 100644
--- a/spring-ai-rag/src/main/java/org/springframework/ai/rag/preretrieval/query/transformation/RewriteQueryTransformer.java
+++ b/spring-ai-rag/src/main/java/org/springframework/ai/rag/preretrieval/query/transformation/RewriteQueryTransformer.java
@@ -23,7 +23,7 @@ import org.springframework.ai.chat.client.ChatClient;
import org.springframework.ai.chat.prompt.ChatOptions;
import org.springframework.ai.chat.prompt.PromptTemplate;
import org.springframework.ai.rag.Query;
-import org.springframework.ai.util.PromptAssert;
+import org.springframework.ai.rag.util.PromptAssert;
import org.springframework.lang.Nullable;
import org.springframework.util.Assert;
import org.springframework.util.StringUtils;
diff --git a/spring-ai-rag/src/main/java/org/springframework/ai/rag/preretrieval/query/transformation/TranslationQueryTransformer.java b/spring-ai-rag/src/main/java/org/springframework/ai/rag/preretrieval/query/transformation/TranslationQueryTransformer.java
index 6c77cffdd..a9d77365f 100644
--- a/spring-ai-rag/src/main/java/org/springframework/ai/rag/preretrieval/query/transformation/TranslationQueryTransformer.java
+++ b/spring-ai-rag/src/main/java/org/springframework/ai/rag/preretrieval/query/transformation/TranslationQueryTransformer.java
@@ -23,7 +23,7 @@ import org.springframework.ai.chat.client.ChatClient;
import org.springframework.ai.chat.prompt.ChatOptions;
import org.springframework.ai.chat.prompt.PromptTemplate;
import org.springframework.ai.rag.Query;
-import org.springframework.ai.util.PromptAssert;
+import org.springframework.ai.rag.util.PromptAssert;
import org.springframework.lang.Nullable;
import org.springframework.util.Assert;
import org.springframework.util.StringUtils;
diff --git a/spring-ai-client-chat/src/main/java/org/springframework/ai/util/PromptAssert.java b/spring-ai-rag/src/main/java/org/springframework/ai/rag/util/PromptAssert.java
similarity index 97%
rename from spring-ai-client-chat/src/main/java/org/springframework/ai/util/PromptAssert.java
rename to spring-ai-rag/src/main/java/org/springframework/ai/rag/util/PromptAssert.java
index 6ebe362c1..adc7e3bdf 100644
--- a/spring-ai-client-chat/src/main/java/org/springframework/ai/util/PromptAssert.java
+++ b/spring-ai-rag/src/main/java/org/springframework/ai/rag/util/PromptAssert.java
@@ -14,7 +14,7 @@
* limitations under the License.
*/
-package org.springframework.ai.util;
+package org.springframework.ai.rag.util;
import java.util.ArrayList;
import java.util.List;
diff --git a/spring-ai-client-chat/src/test/java/org/springframework/ai/util/PromptAssertTests.java b/spring-ai-rag/src/test/java/org/springframework/ai/rag/util/PromptAssertTests.java
similarity index 98%
rename from spring-ai-client-chat/src/test/java/org/springframework/ai/util/PromptAssertTests.java
rename to spring-ai-rag/src/test/java/org/springframework/ai/rag/util/PromptAssertTests.java
index 28a50cf29..c182a8f49 100644
--- a/spring-ai-client-chat/src/test/java/org/springframework/ai/util/PromptAssertTests.java
+++ b/spring-ai-rag/src/test/java/org/springframework/ai/rag/util/PromptAssertTests.java
@@ -14,7 +14,7 @@
* limitations under the License.
*/
-package org.springframework.ai.util;
+package org.springframework.ai.rag.util;
import org.junit.jupiter.api.Test;