getHeaders() {
+ return this.headers;
+ }
+
+ String getCompletionsPath() {
+ return this.completionsPath;
+ }
+
+ String getEmbeddingsPath() {
+ return this.embeddingsPath;
+ }
+
+ ResponseErrorHandler getResponseErrorHandler() {
+ return this.responseErrorHandler;
+ }
+
/**
* OpenAI Chat Completion Models.
*
@@ -1193,7 +1218,7 @@ public record StreamOptions(
*/
@JsonInclude(Include.NON_NULL)
public record WebSearchOptions(@JsonProperty("search_context_size") SearchContextSize searchContextSize,
- @JsonProperty("user_location") UserLocation userLocation) {
+ @JsonProperty("user_location") UserLocation userLocation) {
/**
* High level guidance for the amount of context window space to use for the
@@ -1229,11 +1254,11 @@ public enum SearchContextSize {
*/
@JsonInclude(Include.NON_NULL)
public record UserLocation(@JsonProperty("type") String type,
- @JsonProperty("approximate") Approximate approximate) {
+ @JsonProperty("approximate") Approximate approximate) {
@JsonInclude(Include.NON_NULL)
public record Approximate(@JsonProperty("city") String city, @JsonProperty("country") String country,
- @JsonProperty("region") String region, @JsonProperty("timezone") String timezone) {
+ @JsonProperty("region") String region, @JsonProperty("timezone") String timezone) {
}
}
@@ -1891,29 +1916,4 @@ public OpenAiApi build() {
}
- // Package-private getters for mutate/copy
- String getBaseUrl() {
- return this.baseUrl;
- }
-
- ApiKey getApiKey() {
- return this.apiKey;
- }
-
- MultiValueMap getHeaders() {
- return this.headers;
- }
-
- String getCompletionsPath() {
- return this.completionsPath;
- }
-
- String getEmbeddingsPath() {
- return this.embeddingsPath;
- }
-
- ResponseErrorHandler getResponseErrorHandler() {
- return this.responseErrorHandler;
- }
-
}
diff --git a/models/spring-ai-openai/src/test/java/org/springframework/ai/openai/api/OpenAiChatModelMutateTests.java b/models/spring-ai-openai/src/test/java/org/springframework/ai/openai/api/OpenAiChatModelMutateTests.java
index 251b3d6a10f..1dc869b1593 100644
--- a/models/spring-ai-openai/src/test/java/org/springframework/ai/openai/api/OpenAiChatModelMutateTests.java
+++ b/models/spring-ai-openai/src/test/java/org/springframework/ai/openai/api/OpenAiChatModelMutateTests.java
@@ -36,26 +36,29 @@ class OpenAiChatModelMutateTests {
private final OpenAiApi baseApi = OpenAiApi.builder().baseUrl("https://api.openai.com").apiKey("base-key").build();
private final OpenAiChatModel baseModel = OpenAiChatModel.builder()
- .openAiApi(baseApi)
+ .openAiApi(this.baseApi)
.defaultOptions(OpenAiChatOptions.builder().model("gpt-3.5-turbo").build())
.build();
@Test
void testMutateCreatesDistinctClientsWithDifferentEndpointsAndModels() {
// Mutate for GPT-4
- OpenAiApi gpt4Api = baseApi.mutate().baseUrl("https://api.openai.com").apiKey("your-api-key-for-gpt4").build();
- OpenAiChatModel gpt4Model = baseModel.mutate()
+ OpenAiApi gpt4Api = this.baseApi.mutate()
+ .baseUrl("https://api.openai.com")
+ .apiKey("your-api-key-for-gpt4")
+ .build();
+ OpenAiChatModel gpt4Model = this.baseModel.mutate()
.openAiApi(gpt4Api)
.defaultOptions(OpenAiChatOptions.builder().model("gpt-4").temperature(0.7).build())
.build();
ChatClient gpt4Client = ChatClient.builder(gpt4Model).build();
// Mutate for Llama
- OpenAiApi llamaApi = baseApi.mutate()
+ OpenAiApi llamaApi = this.baseApi.mutate()
.baseUrl("https://your-custom-endpoint.com")
.apiKey("your-api-key-for-llama")
.build();
- OpenAiChatModel llamaModel = baseModel.mutate()
+ OpenAiChatModel llamaModel = this.baseModel.mutate()
.openAiApi(llamaApi)
.defaultOptions(OpenAiChatOptions.builder().model("llama-70b").temperature(0.5).build())
.build();
@@ -72,29 +75,29 @@ void testMutateCreatesDistinctClientsWithDifferentEndpointsAndModels() {
@Test
void testCloneCreatesDeepCopy() {
- OpenAiChatModel clone = baseModel.clone();
- assertThat(clone).isNotSameAs(baseModel);
- assertThat(clone.toString()).isEqualTo(baseModel.toString());
+ OpenAiChatModel clone = this.baseModel.clone();
+ assertThat(clone).isNotSameAs(this.baseModel);
+ assertThat(clone.toString()).isEqualTo(this.baseModel.toString());
}
@Test
void mutateDoesNotAffectOriginal() {
- OpenAiChatModel mutated = baseModel.mutate()
+ OpenAiChatModel mutated = this.baseModel.mutate()
.defaultOptions(OpenAiChatOptions.builder().model("gpt-4").build())
.build();
- assertThat(mutated).isNotSameAs(baseModel);
+ assertThat(mutated).isNotSameAs(this.baseModel);
assertThat(mutated.getDefaultOptions().getModel()).isEqualTo("gpt-4");
- assertThat(baseModel.getDefaultOptions().getModel()).isEqualTo("gpt-3.5-turbo");
+ assertThat(this.baseModel.getDefaultOptions().getModel()).isEqualTo("gpt-3.5-turbo");
}
@Test
void mutateHeadersCreatesDistinctHeaders() {
- OpenAiApi mutatedApi = baseApi.mutate()
+ OpenAiApi mutatedApi = this.baseApi.mutate()
.headers(new LinkedMultiValueMap<>(java.util.Map.of("X-Test", java.util.List.of("value"))))
.build();
assertThat(mutatedApi.getHeaders()).containsKey("X-Test");
- assertThat(baseApi.getHeaders()).doesNotContainKey("X-Test");
+ assertThat(this.baseApi.getHeaders()).doesNotContainKey("X-Test");
}
@Test
@@ -108,7 +111,9 @@ void mutateHandlesNullAndDefaults() {
@Test
void multipleSequentialMutationsProduceDistinctInstances() {
- OpenAiChatModel m1 = baseModel.mutate().defaultOptions(OpenAiChatOptions.builder().model("m1").build()).build();
+ OpenAiChatModel m1 = this.baseModel.mutate()
+ .defaultOptions(OpenAiChatOptions.builder().model("m1").build())
+ .build();
OpenAiChatModel m2 = m1.mutate().defaultOptions(OpenAiChatOptions.builder().model("m2").build()).build();
OpenAiChatModel m3 = m2.mutate().defaultOptions(OpenAiChatOptions.builder().model("m3").build()).build();
assertThat(m1).isNotSameAs(m2);
@@ -120,8 +125,8 @@ void multipleSequentialMutationsProduceDistinctInstances() {
@Test
void mutateAndCloneAreEquivalent() {
- OpenAiChatModel mutated = baseModel.mutate().build();
- OpenAiChatModel cloned = baseModel.clone();
+ OpenAiChatModel mutated = this.baseModel.mutate().build();
+ OpenAiChatModel cloned = this.baseModel.clone();
assertThat(mutated.toString()).isEqualTo(cloned.toString());
assertThat(mutated).isNotSameAs(cloned);
}
diff --git a/models/spring-ai-openai/src/test/java/org/springframework/ai/openai/chat/MessageTypeContentTests.java b/models/spring-ai-openai/src/test/java/org/springframework/ai/openai/chat/MessageTypeContentTests.java
index df4a6fa8bbf..f24b71f62d1 100644
--- a/models/spring-ai-openai/src/test/java/org/springframework/ai/openai/chat/MessageTypeContentTests.java
+++ b/models/spring-ai-openai/src/test/java/org/springframework/ai/openai/chat/MessageTypeContentTests.java
@@ -18,7 +18,6 @@
import java.net.MalformedURLException;
import java.net.URI;
-import java.net.URL;
import java.util.List;
import java.util.Map;
diff --git a/models/spring-ai-openai/src/test/java/org/springframework/ai/openai/chat/OpenAiChatModelIT.java b/models/spring-ai-openai/src/test/java/org/springframework/ai/openai/chat/OpenAiChatModelIT.java
index 747f7d7caec..108e1d31bfa 100644
--- a/models/spring-ai-openai/src/test/java/org/springframework/ai/openai/chat/OpenAiChatModelIT.java
+++ b/models/spring-ai-openai/src/test/java/org/springframework/ai/openai/chat/OpenAiChatModelIT.java
@@ -643,14 +643,14 @@ void chatMemory() {
UserMessage userMessage1 = new UserMessage("My name is James Bond");
memory.add(conversationId, userMessage1);
- ChatResponse response1 = chatModel.call(new Prompt(memory.get(conversationId)));
+ ChatResponse response1 = this.chatModel.call(new Prompt(memory.get(conversationId)));
assertThat(response1).isNotNull();
memory.add(conversationId, response1.getResult().getOutput());
UserMessage userMessage2 = new UserMessage("What is my name?");
memory.add(conversationId, userMessage2);
- ChatResponse response2 = chatModel.call(new Prompt(memory.get(conversationId)));
+ ChatResponse response2 = this.chatModel.call(new Prompt(memory.get(conversationId)));
assertThat(response2).isNotNull();
memory.add(conversationId, response2.getResult().getOutput());
@@ -675,7 +675,7 @@ void chatMemoryWithTools() {
chatMemory.add(conversationId, prompt.getInstructions());
Prompt promptWithMemory = new Prompt(chatMemory.get(conversationId), chatOptions);
- ChatResponse chatResponse = chatModel.call(promptWithMemory);
+ ChatResponse chatResponse = this.chatModel.call(promptWithMemory);
chatMemory.add(conversationId, chatResponse.getResult().getOutput());
while (chatResponse.hasToolCalls()) {
@@ -684,7 +684,7 @@ void chatMemoryWithTools() {
chatMemory.add(conversationId, toolExecutionResult.conversationHistory()
.get(toolExecutionResult.conversationHistory().size() - 1));
promptWithMemory = new Prompt(chatMemory.get(conversationId), chatOptions);
- chatResponse = chatModel.call(promptWithMemory);
+ chatResponse = this.chatModel.call(promptWithMemory);
chatMemory.add(conversationId, chatResponse.getResult().getOutput());
}
@@ -694,21 +694,12 @@ void chatMemoryWithTools() {
UserMessage newUserMessage = new UserMessage("What did I ask you earlier?");
chatMemory.add(conversationId, newUserMessage);
- ChatResponse newResponse = chatModel.call(new Prompt(chatMemory.get(conversationId)));
+ ChatResponse newResponse = this.chatModel.call(new Prompt(chatMemory.get(conversationId)));
assertThat(newResponse).isNotNull();
assertThat(newResponse.getResult().getOutput().getText()).contains("6").contains("8");
}
- static class MathTools {
-
- @Tool(description = "Multiply the two numbers")
- double multiply(double a, double b) {
- return a * b;
- }
-
- }
-
@Test
void webSearchAnnotationsTest() {
UserMessage userMessage = new UserMessage("What is the latest news on the Mars rover?");
@@ -779,4 +770,13 @@ record ActorsFilmsRecord(String actor, List movies) {
}
+ static class MathTools {
+
+ @Tool(description = "Multiply the two numbers")
+ double multiply(double a, double b) {
+ return a * b;
+ }
+
+ }
+
}
diff --git a/models/spring-ai-openai/src/test/java/org/springframework/ai/openai/chat/OpenAiPaymentTransactionIT.java b/models/spring-ai-openai/src/test/java/org/springframework/ai/openai/chat/OpenAiPaymentTransactionIT.java
index b3b3a876192..d2cee2e2eae 100644
--- a/models/spring-ai-openai/src/test/java/org/springframework/ai/openai/chat/OpenAiPaymentTransactionIT.java
+++ b/models/spring-ai-openai/src/test/java/org/springframework/ai/openai/chat/OpenAiPaymentTransactionIT.java
@@ -28,10 +28,10 @@
import org.junit.jupiter.params.provider.ValueSource;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
-import org.springframework.ai.chat.client.advisor.SimpleLoggerAdvisor;
import reactor.core.publisher.Flux;
import org.springframework.ai.chat.client.ChatClient;
+import org.springframework.ai.chat.client.advisor.SimpleLoggerAdvisor;
import org.springframework.ai.converter.BeanOutputConverter;
import org.springframework.ai.model.tool.ToolCallingManager;
import org.springframework.ai.openai.OpenAiChatModel;
diff --git a/models/spring-ai-openai/src/test/java/org/springframework/ai/openai/chat/client/OpenAiChatClientMemoryAdvisorReproIT.java b/models/spring-ai-openai/src/test/java/org/springframework/ai/openai/chat/client/OpenAiChatClientMemoryAdvisorReproIT.java
index 6db48a15baa..30a75f1b6dc 100644
--- a/models/spring-ai-openai/src/test/java/org/springframework/ai/openai/chat/client/OpenAiChatClientMemoryAdvisorReproIT.java
+++ b/models/spring-ai-openai/src/test/java/org/springframework/ai/openai/chat/client/OpenAiChatClientMemoryAdvisorReproIT.java
@@ -1,3 +1,19 @@
+/*
+ * Copyright 2025-2025 the original author or authors.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * https://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
package org.springframework.ai.openai.chat.client;
import java.util.List;
@@ -41,7 +57,7 @@ void messageChatMemoryAdvisor_withPromptMessages_throwsException() {
.build();
MessageChatMemoryAdvisor advisor = MessageChatMemoryAdvisor.builder(chatMemory).build();
- ChatClient chatClient = ChatClient.builder(chatModel).defaultAdvisors(advisor).build();
+ ChatClient chatClient = ChatClient.builder(this.chatModel).defaultAdvisors(advisor).build();
// Act: call should succeed without exception (issue #2339 is fixed)
chatClient.prompt(prompt).call().chatResponse(); // Should not throw
diff --git a/models/spring-ai-openai/src/test/java/org/springframework/ai/openai/chat/client/ReReadingAdvisor.java b/models/spring-ai-openai/src/test/java/org/springframework/ai/openai/chat/client/ReReadingAdvisor.java
index cdd92d07b04..d4d8c94f9b9 100644
--- a/models/spring-ai-openai/src/test/java/org/springframework/ai/openai/chat/client/ReReadingAdvisor.java
+++ b/models/spring-ai-openai/src/test/java/org/springframework/ai/openai/chat/client/ReReadingAdvisor.java
@@ -57,7 +57,7 @@ public ReReadingAdvisor(String re2AdviseTemplate) {
@Override
public ChatClientRequest before(ChatClientRequest chatClientRequest, AdvisorChain advisorChain) {
String augmentedUserText = PromptTemplate.builder()
- .template(re2AdviseTemplate)
+ .template(this.re2AdviseTemplate)
.variables(Map.of("re2_input_query", chatClientRequest.prompt().getUserMessage().getText()))
.build()
.render();
diff --git a/models/spring-ai-openai/src/test/java/org/springframework/ai/openai/chat/client/advisor/AbstractChatMemoryAdvisorIT.java b/models/spring-ai-openai/src/test/java/org/springframework/ai/openai/chat/client/advisor/AbstractChatMemoryAdvisorIT.java
index 238ceb171ac..1b7105e7ba5 100644
--- a/models/spring-ai-openai/src/test/java/org/springframework/ai/openai/chat/client/advisor/AbstractChatMemoryAdvisorIT.java
+++ b/models/spring-ai-openai/src/test/java/org/springframework/ai/openai/chat/client/advisor/AbstractChatMemoryAdvisorIT.java
@@ -81,7 +81,7 @@ protected void testMultipleUserMessagesInPrompt() {
var advisor = createAdvisor(chatMemory);
- ChatClient chatClient = ChatClient.builder(chatModel).defaultAdvisors(advisor).build();
+ ChatClient chatClient = ChatClient.builder(this.chatModel).defaultAdvisors(advisor).build();
// Create a prompt with multiple user messages
List messages = new ArrayList<>();
@@ -131,7 +131,7 @@ protected void testMultipleUserMessagesInSamePrompt() {
// Create advisor with the conversation ID
var advisor = createAdvisor(chatMemory);
- ChatClient chatClient = ChatClient.builder(chatModel).defaultAdvisors(advisor).build();
+ ChatClient chatClient = ChatClient.builder(this.chatModel).defaultAdvisors(advisor).build();
// Act - Create a list of messages for the prompt
List messages = new ArrayList<>();
@@ -193,7 +193,7 @@ protected void testUseCustomConversationId() {
// Create advisor without a default conversation ID
var advisor = createAdvisor(chatMemory);
- ChatClient chatClient = ChatClient.builder(chatModel).defaultAdvisors(advisor).build();
+ ChatClient chatClient = ChatClient.builder(this.chatModel).defaultAdvisors(advisor).build();
String question = "What is the capital of Germany?";
@@ -231,7 +231,7 @@ protected void testMaintainSeparateConversations() {
// Create advisor without a default conversation ID
var advisor = createAdvisor(chatMemory);
- ChatClient chatClient = ChatClient.builder(chatModel).defaultAdvisors(advisor).build();
+ ChatClient chatClient = ChatClient.builder(this.chatModel).defaultAdvisors(advisor).build();
// Act - First conversation
String answer1 = chatClient.prompt()
@@ -316,7 +316,7 @@ protected void testHandleNonExistentConversation() {
// Create advisor without a default conversation ID
var advisor = createAdvisor(chatMemory);
- ChatClient chatClient = ChatClient.builder(chatModel).defaultAdvisors(advisor).build();
+ ChatClient chatClient = ChatClient.builder(this.chatModel).defaultAdvisors(advisor).build();
// Act - Send a question to a non-existent conversation
String question = "Do you remember our previous conversation?";
@@ -375,7 +375,7 @@ protected void testHandleMultipleMessagesInReactiveMode() {
var advisor = createAdvisor(chatMemory);
- ChatClient chatClient = ChatClient.builder(chatModel).defaultAdvisors(advisor).build();
+ ChatClient chatClient = ChatClient.builder(this.chatModel).defaultAdvisors(advisor).build();
List responseList = new ArrayList<>();
for (String message : List.of("My name is Charlie.", "I am 30 years old.", "I live in London.")) {
diff --git a/models/spring-ai-openai/src/test/java/org/springframework/ai/openai/chat/client/advisor/MessageChatMemoryAdvisorIT.java b/models/spring-ai-openai/src/test/java/org/springframework/ai/openai/chat/client/advisor/MessageChatMemoryAdvisorIT.java
index 45f63ac714b..06e2e994eb1 100644
--- a/models/spring-ai-openai/src/test/java/org/springframework/ai/openai/chat/client/advisor/MessageChatMemoryAdvisorIT.java
+++ b/models/spring-ai-openai/src/test/java/org/springframework/ai/openai/chat/client/advisor/MessageChatMemoryAdvisorIT.java
@@ -91,7 +91,7 @@ void shouldHandleMultipleUserMessagesInPrompt() {
.conversationId(conversationId)
.build();
- ChatClient chatClient = ChatClient.builder(chatModel).defaultAdvisors(advisor).build();
+ ChatClient chatClient = ChatClient.builder(this.chatModel).defaultAdvisors(advisor).build();
// Create a prompt with multiple user messages
List messages = new ArrayList<>();
@@ -151,7 +151,7 @@ void shouldStoreCompleteContentInStreamingMode() {
.conversationId(conversationId)
.build();
- ChatClient chatClient = ChatClient.builder(chatModel).defaultAdvisors(advisor).build();
+ ChatClient chatClient = ChatClient.builder(this.chatModel).defaultAdvisors(advisor).build();
// Act - Use streaming API
String userInput = "Tell me a short joke about programming";
diff --git a/models/spring-ai-openai/src/test/java/org/springframework/ai/openai/chat/proxy/MultiOpenAiClientIT.java b/models/spring-ai-openai/src/test/java/org/springframework/ai/openai/chat/proxy/MultiOpenAiClientIT.java
index 15a49d40afe..af3e0eaa55c 100644
--- a/models/spring-ai-openai/src/test/java/org/springframework/ai/openai/chat/proxy/MultiOpenAiClientIT.java
+++ b/models/spring-ai-openai/src/test/java/org/springframework/ai/openai/chat/proxy/MultiOpenAiClientIT.java
@@ -50,25 +50,25 @@ class MultiOpenAiClientIT {
@Test
void multiClientFlow() {
// Derive a new OpenAiApi for Groq (Llama3)
- OpenAiApi groqApi = baseOpenAiApi.mutate()
+ OpenAiApi groqApi = this.baseOpenAiApi.mutate()
.baseUrl("https://api.groq.com/openai")
.apiKey(System.getenv("GROQ_API_KEY"))
.build();
// Derive a new OpenAiApi for OpenAI GPT-4
- OpenAiApi gpt4Api = baseOpenAiApi.mutate()
+ OpenAiApi gpt4Api = this.baseOpenAiApi.mutate()
.baseUrl("https://api.openai.com")
.apiKey(System.getenv("OPENAI_API_KEY"))
.build();
// Derive a new OpenAiChatModel for Groq
- OpenAiChatModel groqModel = baseChatModel.mutate()
+ OpenAiChatModel groqModel = this.baseChatModel.mutate()
.openAiApi(groqApi)
.defaultOptions(OpenAiChatOptions.builder().model("llama3-70b-8192").temperature(0.5).build())
.build();
// Derive a new OpenAiChatModel for GPT-4
- OpenAiChatModel gpt4Model = baseChatModel.mutate()
+ OpenAiChatModel gpt4Model = this.baseChatModel.mutate()
.openAiApi(gpt4Api)
.defaultOptions(OpenAiChatOptions.builder().model("gpt-4").temperature(0.7).build())
.build();
diff --git a/models/spring-ai-openai/src/test/java/org/springframework/ai/openai/chat/proxy/VertexAIGeminiWithOpenAiChatModelIT.java b/models/spring-ai-openai/src/test/java/org/springframework/ai/openai/chat/proxy/VertexAIGeminiWithOpenAiChatModelIT.java
index 7b3ed862f5e..d25c3190f9c 100644
--- a/models/spring-ai-openai/src/test/java/org/springframework/ai/openai/chat/proxy/VertexAIGeminiWithOpenAiChatModelIT.java
+++ b/models/spring-ai-openai/src/test/java/org/springframework/ai/openai/chat/proxy/VertexAIGeminiWithOpenAiChatModelIT.java
@@ -16,8 +16,14 @@
package org.springframework.ai.openai.chat.proxy;
+import java.util.List;
+import java.util.Map;
+import java.util.stream.Collectors;
+
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.condition.EnabledIfEnvironmentVariable;
+import reactor.core.publisher.Flux;
+
import org.springframework.ai.chat.messages.AssistantMessage;
import org.springframework.ai.chat.messages.Message;
import org.springframework.ai.chat.messages.UserMessage;
@@ -36,11 +42,6 @@
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.context.annotation.Bean;
import org.springframework.core.io.Resource;
-import reactor.core.publisher.Flux;
-
-import java.util.List;
-import java.util.Map;
-import java.util.stream.Collectors;
import static org.assertj.core.api.Assertions.assertThat;
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 15f588fa532..cec72f2d3ef 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,10 +24,10 @@
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.condition.EnabledIfEnvironmentVariable;
-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.model.transformer.KeywordMetadataEnricher;
+import org.springframework.ai.model.transformer.SummaryMetadataEnricher;
import org.springframework.ai.openai.OpenAiChatModel;
import org.springframework.ai.openai.api.OpenAiApi;
import org.springframework.ai.transformer.ContentFormatTransformer;
diff --git a/models/spring-ai-vertex-ai-embedding/src/test/java/org/springframework/ai/vertexai/embedding/text/VertexAiTextEmbeddingModelIT.java b/models/spring-ai-vertex-ai-embedding/src/test/java/org/springframework/ai/vertexai/embedding/text/VertexAiTextEmbeddingModelIT.java
index 40b7ffd881b..fc7105807af 100644
--- a/models/spring-ai-vertex-ai-embedding/src/test/java/org/springframework/ai/vertexai/embedding/text/VertexAiTextEmbeddingModelIT.java
+++ b/models/spring-ai-vertex-ai-embedding/src/test/java/org/springframework/ai/vertexai/embedding/text/VertexAiTextEmbeddingModelIT.java
@@ -37,7 +37,6 @@
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.context.annotation.Bean;
-import static java.util.stream.Collectors.toList;
import static org.assertj.core.api.Assertions.assertThat;
@SpringBootTest(classes = VertexAiTextEmbeddingModelIT.Config.class)
@@ -169,7 +168,7 @@ private float[] getEmbeddingUsingGoogleSdk(String text, String taskType) {
.stream()
.map(Value::getNumberValue)
.map(Double::floatValue)
- .collect(toList());
+ .toList();
float[] floatArray = new float[floatList.size()];
for (int i = 0; i < floatList.size(); i++) {
diff --git a/models/spring-ai-vertex-ai-gemini/src/main/java/org/springframework/ai/vertexai/gemini/VertexAiGeminiChatModel.java b/models/spring-ai-vertex-ai-gemini/src/main/java/org/springframework/ai/vertexai/gemini/VertexAiGeminiChatModel.java
index a228d345a95..01ab8b96c02 100644
--- a/models/spring-ai-vertex-ai-gemini/src/main/java/org/springframework/ai/vertexai/gemini/VertexAiGeminiChatModel.java
+++ b/models/spring-ai-vertex-ai-gemini/src/main/java/org/springframework/ai/vertexai/gemini/VertexAiGeminiChatModel.java
@@ -63,7 +63,6 @@
import org.springframework.ai.chat.metadata.DefaultUsage;
import org.springframework.ai.chat.metadata.EmptyUsage;
import org.springframework.ai.chat.metadata.Usage;
-import org.springframework.ai.support.UsageCalculator;
import org.springframework.ai.chat.model.ChatModel;
import org.springframework.ai.chat.model.ChatResponse;
import org.springframework.ai.chat.model.Generation;
@@ -83,6 +82,7 @@
import org.springframework.ai.model.tool.ToolExecutionEligibilityPredicate;
import org.springframework.ai.model.tool.ToolExecutionResult;
import org.springframework.ai.retry.RetryUtils;
+import org.springframework.ai.support.UsageCalculator;
import org.springframework.ai.tool.definition.ToolDefinition;
import org.springframework.ai.vertexai.gemini.common.VertexAiGeminiConstants;
import org.springframework.ai.vertexai.gemini.common.VertexAiGeminiSafetySetting;
diff --git a/models/spring-ai-vertex-ai-gemini/src/test/java/org/springframework/ai/vertexai/gemini/CreateGeminiRequestTests.java b/models/spring-ai-vertex-ai-gemini/src/test/java/org/springframework/ai/vertexai/gemini/CreateGeminiRequestTests.java
index 37d68bcf613..bcb32a748fa 100644
--- a/models/spring-ai-vertex-ai-gemini/src/test/java/org/springframework/ai/vertexai/gemini/CreateGeminiRequestTests.java
+++ b/models/spring-ai-vertex-ai-gemini/src/test/java/org/springframework/ai/vertexai/gemini/CreateGeminiRequestTests.java
@@ -18,7 +18,6 @@
import java.net.MalformedURLException;
import java.net.URI;
-import java.net.URL;
import java.util.List;
import com.google.cloud.vertexai.VertexAI;
diff --git a/models/spring-ai-vertex-ai-gemini/src/test/java/org/springframework/ai/vertexai/gemini/tool/VertexAiGeminiPaymentTransactionIT.java b/models/spring-ai-vertex-ai-gemini/src/test/java/org/springframework/ai/vertexai/gemini/tool/VertexAiGeminiPaymentTransactionIT.java
index b5901439bb0..71d9311e56e 100644
--- a/models/spring-ai-vertex-ai-gemini/src/test/java/org/springframework/ai/vertexai/gemini/tool/VertexAiGeminiPaymentTransactionIT.java
+++ b/models/spring-ai-vertex-ai-gemini/src/test/java/org/springframework/ai/vertexai/gemini/tool/VertexAiGeminiPaymentTransactionIT.java
@@ -29,10 +29,10 @@
import org.junit.jupiter.api.condition.EnabledIfEnvironmentVariable;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
-import org.springframework.ai.chat.client.advisor.SimpleLoggerAdvisor;
import reactor.core.publisher.Flux;
import org.springframework.ai.chat.client.ChatClient;
+import org.springframework.ai.chat.client.advisor.SimpleLoggerAdvisor;
import org.springframework.ai.model.tool.ToolCallingManager;
import org.springframework.ai.tool.ToolCallback;
import org.springframework.ai.tool.execution.DefaultToolExecutionExceptionProcessor;
diff --git a/models/spring-ai-vertex-ai-gemini/src/test/java/org/springframework/ai/vertexai/gemini/tool/VertexAiGeminiPaymentTransactionMethodIT.java b/models/spring-ai-vertex-ai-gemini/src/test/java/org/springframework/ai/vertexai/gemini/tool/VertexAiGeminiPaymentTransactionMethodIT.java
index 128800abf39..2b2635d8ba4 100644
--- a/models/spring-ai-vertex-ai-gemini/src/test/java/org/springframework/ai/vertexai/gemini/tool/VertexAiGeminiPaymentTransactionMethodIT.java
+++ b/models/spring-ai-vertex-ai-gemini/src/test/java/org/springframework/ai/vertexai/gemini/tool/VertexAiGeminiPaymentTransactionMethodIT.java
@@ -29,14 +29,14 @@
import org.junit.jupiter.api.condition.EnabledIfEnvironmentVariable;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
-import org.springframework.ai.chat.client.advisor.SimpleLoggerAdvisor;
import reactor.core.publisher.Flux;
import org.springframework.ai.chat.client.ChatClient;
+import org.springframework.ai.chat.client.advisor.SimpleLoggerAdvisor;
import org.springframework.ai.model.tool.ToolCallingManager;
+import org.springframework.ai.support.ToolCallbacks;
import org.springframework.ai.tool.ToolCallback;
import org.springframework.ai.tool.ToolCallbackProvider;
-import org.springframework.ai.support.ToolCallbacks;
import org.springframework.ai.tool.annotation.Tool;
import org.springframework.ai.tool.execution.DefaultToolExecutionExceptionProcessor;
import org.springframework.ai.tool.resolution.DelegatingToolCallbackResolver;
diff --git a/models/spring-ai-vertex-ai-gemini/src/test/java/org/springframework/ai/vertexai/gemini/tool/VertexAiGeminiPaymentTransactionToolsIT.java b/models/spring-ai-vertex-ai-gemini/src/test/java/org/springframework/ai/vertexai/gemini/tool/VertexAiGeminiPaymentTransactionToolsIT.java
index ba905754299..5832839b5de 100644
--- a/models/spring-ai-vertex-ai-gemini/src/test/java/org/springframework/ai/vertexai/gemini/tool/VertexAiGeminiPaymentTransactionToolsIT.java
+++ b/models/spring-ai-vertex-ai-gemini/src/test/java/org/springframework/ai/vertexai/gemini/tool/VertexAiGeminiPaymentTransactionToolsIT.java
@@ -28,10 +28,10 @@
import org.junit.jupiter.api.condition.EnabledIfEnvironmentVariable;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
-import org.springframework.ai.chat.client.advisor.SimpleLoggerAdvisor;
import reactor.core.publisher.Flux;
import org.springframework.ai.chat.client.ChatClient;
+import org.springframework.ai.chat.client.advisor.SimpleLoggerAdvisor;
import org.springframework.ai.model.tool.ToolCallingManager;
import org.springframework.ai.tool.ToolCallback;
import org.springframework.ai.tool.annotation.Tool;
diff --git a/models/spring-ai-zhipuai/src/test/java/org/springframework/ai/zhipuai/chat/ZhiPuAiChatModelIT.java b/models/spring-ai-zhipuai/src/test/java/org/springframework/ai/zhipuai/chat/ZhiPuAiChatModelIT.java
index 1792c015c73..c18e22c0e0a 100644
--- a/models/spring-ai-zhipuai/src/test/java/org/springframework/ai/zhipuai/chat/ZhiPuAiChatModelIT.java
+++ b/models/spring-ai-zhipuai/src/test/java/org/springframework/ai/zhipuai/chat/ZhiPuAiChatModelIT.java
@@ -18,7 +18,6 @@
import java.io.IOException;
import java.net.URI;
-import java.net.URL;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
diff --git a/pom.xml b/pom.xml
index 6c45eb4d619..bc24b6641f3 100644
--- a/pom.xml
+++ b/pom.xml
@@ -337,7 +337,7 @@
true
9.3
- true
+ false
diff --git a/spring-ai-bom/pom.xml b/spring-ai-bom/pom.xml
index 38f3c6b86be..ca1a57cf65b 100644
--- a/spring-ai-bom/pom.xml
+++ b/spring-ai-bom/pom.xml
@@ -82,11 +82,6 @@
4.0.0-M13
3.3.0
3.1.1
- 3.5.0
- true
- true
- 9.3
- true
@@ -1145,51 +1140,6 @@
-
- org.apache.maven.plugins
- maven-checkstyle-plugin
- ${maven-checkstyle-plugin.version}
-
-
- com.puppycrawl.tools
- checkstyle
- ${puppycrawl-tools-checkstyle.version}
-
-
- io.spring.javaformat
- spring-javaformat-checkstyle
- 0.0.43
-
-
-
-
- checkstyle-validation
- validate
- true
-
- ${disable.checks}
- src/checkstyle/checkstyle.xml
- src/checkstyle/checkstyle-header.txt
- true
-
- checkstyle.build.directory=${project.build.directory}
- checkstyle.suppressions.file=${project.basedir}/src/checkstyle/checkstyle-suppressions.xml
- checkstyle.additional.suppressions.file=${project.basedir}/src/checkstyle/checkstyle-suppressions.xml
- checkstyle.header.file=${project.basedir}/src/checkstyle/checkstyle-header.txt
-
- true
- ${maven-checkstyle-plugin.failsOnError}
-
-
- ${maven-checkstyle-plugin.failOnViolation}
-
-
-
- check
-
-
-
-
org.apache.maven.plugins
maven-site-plugin
diff --git a/spring-ai-client-chat/src/main/java/org/springframework/ai/chat/client/ChatClientAttributes.java b/spring-ai-client-chat/src/main/java/org/springframework/ai/chat/client/ChatClientAttributes.java
index b7a967c3a3b..c0c6fe22525 100644
--- a/spring-ai-client-chat/src/main/java/org/springframework/ai/chat/client/ChatClientAttributes.java
+++ b/spring-ai-client-chat/src/main/java/org/springframework/ai/chat/client/ChatClientAttributes.java
@@ -37,7 +37,7 @@ public enum ChatClientAttributes {
}
public String getKey() {
- return key;
+ return this.key;
}
}
diff --git a/spring-ai-client-chat/src/main/java/org/springframework/ai/chat/client/ChatClientRequest.java b/spring-ai-client-chat/src/main/java/org/springframework/ai/chat/client/ChatClientRequest.java
index 958cde32cb0..5a04db360c7 100644
--- a/spring-ai-client-chat/src/main/java/org/springframework/ai/chat/client/ChatClientRequest.java
+++ b/spring-ai-client-chat/src/main/java/org/springframework/ai/chat/client/ChatClientRequest.java
@@ -16,12 +16,12 @@
package org.springframework.ai.chat.client;
-import org.springframework.ai.chat.prompt.Prompt;
-import org.springframework.util.Assert;
-
import java.util.HashMap;
import java.util.Map;
+import org.springframework.ai.chat.prompt.Prompt;
+import org.springframework.util.Assert;
+
/**
* Represents a request processed by a {@link ChatClient} that ultimately is used to build
* a {@link Prompt} to be sent to an AI model.
@@ -79,7 +79,7 @@ public Builder context(String key, Object value) {
}
public ChatClientRequest build() {
- return new ChatClientRequest(prompt, context);
+ return new ChatClientRequest(this.prompt, this.context);
}
}
diff --git a/spring-ai-client-chat/src/main/java/org/springframework/ai/chat/client/ChatClientResponse.java b/spring-ai-client-chat/src/main/java/org/springframework/ai/chat/client/ChatClientResponse.java
index 9a0db3ae419..a069702356b 100644
--- a/spring-ai-client-chat/src/main/java/org/springframework/ai/chat/client/ChatClientResponse.java
+++ b/spring-ai-client-chat/src/main/java/org/springframework/ai/chat/client/ChatClientResponse.java
@@ -16,13 +16,13 @@
package org.springframework.ai.chat.client;
+import java.util.HashMap;
+import java.util.Map;
+
import org.springframework.ai.chat.model.ChatResponse;
import org.springframework.lang.Nullable;
import org.springframework.util.Assert;
-import java.util.HashMap;
-import java.util.Map;
-
/**
* Represents a response returned by a {@link ChatClient}.
*
@@ -50,7 +50,7 @@ public static Builder builder() {
return new Builder();
}
- public static class Builder {
+ public static final class Builder {
private ChatResponse chatResponse;
diff --git a/spring-ai-client-chat/src/main/java/org/springframework/ai/chat/client/DefaultChatClient.java b/spring-ai-client-chat/src/main/java/org/springframework/ai/chat/client/DefaultChatClient.java
index 82327f43981..f5a1e8cd11a 100644
--- a/spring-ai-client-chat/src/main/java/org/springframework/ai/chat/client/DefaultChatClient.java
+++ b/spring-ai-client-chat/src/main/java/org/springframework/ai/chat/client/DefaultChatClient.java
@@ -52,11 +52,11 @@
import org.springframework.ai.content.Media;
import org.springframework.ai.converter.BeanOutputConverter;
import org.springframework.ai.converter.StructuredOutputConverter;
+import org.springframework.ai.support.ToolCallbacks;
import org.springframework.ai.template.TemplateRenderer;
import org.springframework.ai.template.st.StTemplateRenderer;
import org.springframework.ai.tool.ToolCallback;
import org.springframework.ai.tool.ToolCallbackProvider;
-import org.springframework.ai.support.ToolCallbacks;
import org.springframework.core.ParameterizedTypeReference;
import org.springframework.core.io.Resource;
import org.springframework.lang.Nullable;
@@ -455,17 +455,20 @@ private ChatClientResponse doGetObservableChatClientResponse(ChatClientRequest c
ChatClientObservationContext observationContext = ChatClientObservationContext.builder()
.request(chatClientRequest)
- .advisors(advisorChain.getCallAdvisors())
+ .advisors(this.advisorChain.getCallAdvisors())
.stream(false)
.format(outputFormat)
.build();
- var observation = ChatClientObservationDocumentation.AI_CHAT_CLIENT.observation(observationConvention,
- DEFAULT_CHAT_CLIENT_OBSERVATION_CONVENTION, () -> observationContext, observationRegistry);
+ var observation = ChatClientObservationDocumentation.AI_CHAT_CLIENT.observation(this.observationConvention,
+ DEFAULT_CHAT_CLIENT_OBSERVATION_CONVENTION, () -> observationContext, this.observationRegistry);
+
+ // CHECKSTYLE:OFF
var chatClientResponse = observation.observe(() -> {
// Apply the advisor chain that terminates with the ChatModelCallAdvisor.
- return advisorChain.nextCall(chatClientRequest);
+ return this.advisorChain.nextCall(chatClientRequest);
});
+ // CHECKSTYLE:ON
return chatClientResponse != null ? chatClientResponse : ChatClientResponse.builder().build();
}
@@ -508,20 +511,20 @@ private Flux doGetObservableFluxChatResponse(ChatClientReque
ChatClientObservationContext observationContext = ChatClientObservationContext.builder()
.request(chatClientRequest)
- .advisors(advisorChain.getStreamAdvisors())
+ .advisors(this.advisorChain.getStreamAdvisors())
.stream(true)
.build();
Observation observation = ChatClientObservationDocumentation.AI_CHAT_CLIENT.observation(
- observationConvention, DEFAULT_CHAT_CLIENT_OBSERVATION_CONVENTION, () -> observationContext,
- observationRegistry);
+ this.observationConvention, DEFAULT_CHAT_CLIENT_OBSERVATION_CONVENTION,
+ () -> observationContext, this.observationRegistry);
observation.parentObservation(contextView.getOrDefault(ObservationThreadLocalAccessor.KEY, null))
.start();
// @formatter:off
// Apply the advisor chain that terminates with the ChatModelStreamAdvisor.
- return advisorChain.nextStream(chatClientRequest)
+ return this.advisorChain.nextStream(chatClientRequest)
.doOnError(observation::error)
.doFinally(s -> observation.stop())
.contextWrite(ctx -> ctx.put(ObservationThreadLocalAccessor.KEY, observation));
@@ -900,13 +903,13 @@ public ChatClientRequestSpec templateRenderer(TemplateRenderer templateRenderer)
public CallResponseSpec call() {
BaseAdvisorChain advisorChain = buildAdvisorChain();
return new DefaultCallResponseSpec(DefaultChatClientUtils.toChatClientRequest(this), advisorChain,
- observationRegistry, observationConvention);
+ this.observationRegistry, this.observationConvention);
}
public StreamResponseSpec stream() {
BaseAdvisorChain advisorChain = buildAdvisorChain();
return new DefaultStreamResponseSpec(DefaultChatClientUtils.toChatClientRequest(this), advisorChain,
- observationRegistry, observationConvention);
+ this.observationRegistry, this.observationConvention);
}
private BaseAdvisorChain buildAdvisorChain() {
diff --git a/spring-ai-client-chat/src/main/java/org/springframework/ai/chat/client/DefaultChatClientUtils.java b/spring-ai-client-chat/src/main/java/org/springframework/ai/chat/client/DefaultChatClientUtils.java
index 3b793d6a99a..10f623e2b70 100644
--- a/spring-ai-client-chat/src/main/java/org/springframework/ai/chat/client/DefaultChatClientUtils.java
+++ b/spring-ai-client-chat/src/main/java/org/springframework/ai/chat/client/DefaultChatClientUtils.java
@@ -16,6 +16,13 @@
package org.springframework.ai.chat.client;
+import java.util.ArrayList;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+import java.util.concurrent.ConcurrentHashMap;
+
import org.springframework.ai.chat.messages.Message;
import org.springframework.ai.chat.messages.SystemMessage;
import org.springframework.ai.chat.messages.UserMessage;
@@ -28,20 +35,17 @@
import org.springframework.util.CollectionUtils;
import org.springframework.util.StringUtils;
-import java.util.ArrayList;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-import java.util.concurrent.ConcurrentHashMap;
-
/**
* Utilities for supporting the {@link DefaultChatClient} implementation.
*
* @author Thomas Vitale
* @since 1.0.0
*/
-class DefaultChatClientUtils {
+final class DefaultChatClientUtils {
+
+ private DefaultChatClientUtils() {
+ // prevents instantiation
+ }
static ChatClientRequest toChatClientRequest(DefaultChatClient.DefaultChatClientRequestSpec inputRequest) {
Assert.notNull(inputRequest, "inputRequest cannot be null");
diff --git a/spring-ai-client-chat/src/main/java/org/springframework/ai/chat/client/advisor/AdvisorUtils.java b/spring-ai-client-chat/src/main/java/org/springframework/ai/chat/client/advisor/AdvisorUtils.java
index 2059ceda57c..172484dd7ed 100644
--- a/spring-ai-client-chat/src/main/java/org/springframework/ai/chat/client/advisor/AdvisorUtils.java
+++ b/spring-ai-client-chat/src/main/java/org/springframework/ai/chat/client/advisor/AdvisorUtils.java
@@ -16,12 +16,12 @@
package org.springframework.ai.chat.client.advisor;
+import java.util.function.Predicate;
+
import org.springframework.ai.chat.client.ChatClientResponse;
import org.springframework.ai.chat.model.ChatResponse;
import org.springframework.util.StringUtils;
-import java.util.function.Predicate;
-
/**
* Utilities to work with advisors.
*/
diff --git a/spring-ai-client-chat/src/main/java/org/springframework/ai/chat/client/advisor/ChatModelCallAdvisor.java b/spring-ai-client-chat/src/main/java/org/springframework/ai/chat/client/advisor/ChatModelCallAdvisor.java
index 390208c675f..051cbdd808c 100644
--- a/spring-ai-client-chat/src/main/java/org/springframework/ai/chat/client/advisor/ChatModelCallAdvisor.java
+++ b/spring-ai-client-chat/src/main/java/org/springframework/ai/chat/client/advisor/ChatModelCallAdvisor.java
@@ -16,6 +16,8 @@
package org.springframework.ai.chat.client.advisor;
+import java.util.Map;
+
import org.springframework.ai.chat.client.ChatClientAttributes;
import org.springframework.ai.chat.client.ChatClientRequest;
import org.springframework.ai.chat.client.ChatClientResponse;
@@ -28,8 +30,6 @@
import org.springframework.util.Assert;
import org.springframework.util.StringUtils;
-import java.util.Map;
-
/**
* A {@link CallAdvisor} that uses a {@link ChatModel} to generate a response.
*
@@ -51,7 +51,7 @@ public ChatClientResponse adviseCall(ChatClientRequest chatClientRequest, CallAd
ChatClientRequest formattedChatClientRequest = augmentWithFormatInstructions(chatClientRequest);
- ChatResponse chatResponse = chatModel.call(formattedChatClientRequest.prompt());
+ ChatResponse chatResponse = this.chatModel.call(formattedChatClientRequest.prompt());
return ChatClientResponse.builder()
.chatResponse(chatResponse)
.context(Map.copyOf(formattedChatClientRequest.context()))
@@ -90,7 +90,7 @@ public static Builder builder() {
return new Builder();
}
- public static class Builder {
+ public static final class Builder {
private ChatModel chatModel;
diff --git a/spring-ai-client-chat/src/main/java/org/springframework/ai/chat/client/advisor/ChatModelStreamAdvisor.java b/spring-ai-client-chat/src/main/java/org/springframework/ai/chat/client/advisor/ChatModelStreamAdvisor.java
index 9bec78fc4d9..de691318df1 100644
--- a/spring-ai-client-chat/src/main/java/org/springframework/ai/chat/client/advisor/ChatModelStreamAdvisor.java
+++ b/spring-ai-client-chat/src/main/java/org/springframework/ai/chat/client/advisor/ChatModelStreamAdvisor.java
@@ -16,16 +16,18 @@
package org.springframework.ai.chat.client.advisor;
+import java.util.Map;
+
+import reactor.core.publisher.Flux;
+import reactor.core.scheduler.Schedulers;
+
import org.springframework.ai.chat.client.ChatClientRequest;
import org.springframework.ai.chat.client.ChatClientResponse;
-import org.springframework.ai.chat.client.advisor.api.*;
+import org.springframework.ai.chat.client.advisor.api.StreamAdvisor;
+import org.springframework.ai.chat.client.advisor.api.StreamAdvisorChain;
import org.springframework.ai.chat.model.ChatModel;
import org.springframework.core.Ordered;
import org.springframework.util.Assert;
-import reactor.core.publisher.Flux;
-import reactor.core.scheduler.Schedulers;
-
-import java.util.Map;
/**
* A {@link StreamAdvisor} that uses a {@link ChatModel} to generate a streaming response.
@@ -47,7 +49,7 @@ public Flux adviseStream(ChatClientRequest chatClientRequest
StreamAdvisorChain streamAdvisorChain) {
Assert.notNull(chatClientRequest, "the chatClientRequest cannot be null");
- return chatModel.stream(chatClientRequest.prompt())
+ return this.chatModel.stream(chatClientRequest.prompt())
.map(chatResponse -> ChatClientResponse.builder()
.chatResponse(chatResponse)
.context(Map.copyOf(chatClientRequest.context()))
@@ -69,7 +71,7 @@ public static Builder builder() {
return new Builder();
}
- public static class Builder {
+ public static final class Builder {
private ChatModel chatModel;
diff --git a/spring-ai-client-chat/src/main/java/org/springframework/ai/chat/client/advisor/DefaultAroundAdvisorChain.java b/spring-ai-client-chat/src/main/java/org/springframework/ai/chat/client/advisor/DefaultAroundAdvisorChain.java
index 838b8cbc5b6..e9d1a1d2066 100644
--- a/spring-ai-client-chat/src/main/java/org/springframework/ai/chat/client/advisor/DefaultAroundAdvisorChain.java
+++ b/spring-ai-client-chat/src/main/java/org/springframework/ai/chat/client/advisor/DefaultAroundAdvisorChain.java
@@ -23,22 +23,22 @@
import io.micrometer.observation.ObservationRegistry;
import io.micrometer.observation.contextpropagation.ObservationThreadLocalAccessor;
+import reactor.core.publisher.Flux;
+
import org.springframework.ai.chat.client.ChatClientRequest;
import org.springframework.ai.chat.client.ChatClientResponse;
import org.springframework.ai.chat.client.advisor.api.Advisor;
import org.springframework.ai.chat.client.advisor.api.BaseAdvisorChain;
import org.springframework.ai.chat.client.advisor.api.CallAdvisor;
import org.springframework.ai.chat.client.advisor.api.StreamAdvisor;
-import org.springframework.ai.template.TemplateRenderer;
-import org.springframework.ai.template.st.StTemplateRenderer;
-import org.springframework.lang.Nullable;
-import reactor.core.publisher.Flux;
-
import org.springframework.ai.chat.client.advisor.observation.AdvisorObservationContext;
import org.springframework.ai.chat.client.advisor.observation.AdvisorObservationConvention;
import org.springframework.ai.chat.client.advisor.observation.AdvisorObservationDocumentation;
import org.springframework.ai.chat.client.advisor.observation.DefaultAdvisorObservationConvention;
+import org.springframework.ai.template.TemplateRenderer;
+import org.springframework.ai.template.st.StTemplateRenderer;
import org.springframework.core.OrderComparator;
+import org.springframework.lang.Nullable;
import org.springframework.util.Assert;
import org.springframework.util.CollectionUtils;
diff --git a/spring-ai-client-chat/src/main/java/org/springframework/ai/chat/client/advisor/MessageChatMemoryAdvisor.java b/spring-ai-client-chat/src/main/java/org/springframework/ai/chat/client/advisor/MessageChatMemoryAdvisor.java
index 835beb8aab1..1b8bbea84e9 100644
--- a/spring-ai-client-chat/src/main/java/org/springframework/ai/chat/client/advisor/MessageChatMemoryAdvisor.java
+++ b/spring-ai-client-chat/src/main/java/org/springframework/ai/chat/client/advisor/MessageChatMemoryAdvisor.java
@@ -19,7 +19,6 @@
import java.util.ArrayList;
import java.util.List;
-import org.springframework.util.Assert;
import reactor.core.publisher.Flux;
import reactor.core.publisher.Mono;
import reactor.core.scheduler.Scheduler;
@@ -35,6 +34,7 @@
import org.springframework.ai.chat.memory.ChatMemory;
import org.springframework.ai.chat.messages.Message;
import org.springframework.ai.chat.messages.UserMessage;
+import org.springframework.util.Assert;
/**
* Memory is retrieved added as a collection of messages to the prompt
@@ -44,7 +44,7 @@
* @author Thomas Vitale
* @since 1.0.0
*/
-public class MessageChatMemoryAdvisor implements BaseChatMemoryAdvisor {
+public final class MessageChatMemoryAdvisor implements BaseChatMemoryAdvisor {
private final ChatMemory chatMemory;
@@ -67,7 +67,7 @@ private MessageChatMemoryAdvisor(ChatMemory chatMemory, String defaultConversati
@Override
public int getOrder() {
- return order;
+ return this.order;
}
@Override
@@ -132,7 +132,7 @@ public static Builder builder(ChatMemory chatMemory) {
return new Builder(chatMemory);
}
- public static class Builder {
+ public static final class Builder {
private String conversationId = ChatMemory.DEFAULT_CONVERSATION_ID;
diff --git a/spring-ai-client-chat/src/main/java/org/springframework/ai/chat/client/advisor/PromptChatMemoryAdvisor.java b/spring-ai-client-chat/src/main/java/org/springframework/ai/chat/client/advisor/PromptChatMemoryAdvisor.java
index bd5f6b0bdc9..5ae3c9459d0 100644
--- a/spring-ai-client-chat/src/main/java/org/springframework/ai/chat/client/advisor/PromptChatMemoryAdvisor.java
+++ b/spring-ai-client-chat/src/main/java/org/springframework/ai/chat/client/advisor/PromptChatMemoryAdvisor.java
@@ -23,7 +23,6 @@
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
-import org.springframework.util.Assert;
import reactor.core.publisher.Flux;
import reactor.core.publisher.Mono;
import reactor.core.scheduler.Scheduler;
@@ -42,6 +41,7 @@
import org.springframework.ai.chat.messages.SystemMessage;
import org.springframework.ai.chat.messages.UserMessage;
import org.springframework.ai.chat.prompt.PromptTemplate;
+import org.springframework.util.Assert;
/**
* Memory is retrieved added into the prompt's system text.
@@ -52,7 +52,7 @@
* @author Mark Pollack
* @since 1.0.0
*/
-public class PromptChatMemoryAdvisor implements BaseChatMemoryAdvisor {
+public final class PromptChatMemoryAdvisor implements BaseChatMemoryAdvisor {
private static final Logger logger = LoggerFactory.getLogger(PromptChatMemoryAdvisor.class);
@@ -97,7 +97,7 @@ public static Builder builder(ChatMemory chatMemory) {
@Override
public int getOrder() {
- return order;
+ return this.order;
}
@Override
@@ -186,7 +186,7 @@ public Flux adviseStream(ChatClientRequest chatClientRequest
/**
* Builder for PromptChatMemoryAdvisor.
*/
- public static class Builder {
+ public static final class Builder {
private PromptTemplate systemPromptTemplate = DEFAULT_SYSTEM_PROMPT_TEMPLATE;
diff --git a/spring-ai-client-chat/src/main/java/org/springframework/ai/chat/client/advisor/SimpleLoggerAdvisor.java b/spring-ai-client-chat/src/main/java/org/springframework/ai/chat/client/advisor/SimpleLoggerAdvisor.java
index 0160e3155a0..be2693c52cd 100644
--- a/spring-ai-client-chat/src/main/java/org/springframework/ai/chat/client/advisor/SimpleLoggerAdvisor.java
+++ b/spring-ai-client-chat/src/main/java/org/springframework/ai/chat/client/advisor/SimpleLoggerAdvisor.java
@@ -115,7 +115,7 @@ public static Builder builder() {
return new Builder();
}
- public static class Builder {
+ public static final class Builder {
private Function requestToString;
@@ -142,7 +142,7 @@ public Builder order(int order) {
}
public SimpleLoggerAdvisor build() {
- return new SimpleLoggerAdvisor(requestToString, responseToString, order);
+ return new SimpleLoggerAdvisor(this.requestToString, this.responseToString, this.order);
}
}
diff --git a/spring-ai-client-chat/src/main/java/org/springframework/ai/chat/client/advisor/api/BaseChatMemoryAdvisor.java b/spring-ai-client-chat/src/main/java/org/springframework/ai/chat/client/advisor/api/BaseChatMemoryAdvisor.java
index b05cc09639b..e5559d42530 100644
--- a/spring-ai-client-chat/src/main/java/org/springframework/ai/chat/client/advisor/api/BaseChatMemoryAdvisor.java
+++ b/spring-ai-client-chat/src/main/java/org/springframework/ai/chat/client/advisor/api/BaseChatMemoryAdvisor.java
@@ -1,11 +1,11 @@
/*
- * Copyright 2024 - 2025 the original author or authors.
+ * Copyright 2024-2025 the original author or authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
- * https://www.apache.org/licenses/LICENSE-2.0
+ * https://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
@@ -13,6 +13,7 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
+
package org.springframework.ai.chat.client.advisor.api;
import java.util.Map;
diff --git a/spring-ai-client-chat/src/main/java/org/springframework/ai/chat/client/advisor/api/CallAdvisorChain.java b/spring-ai-client-chat/src/main/java/org/springframework/ai/chat/client/advisor/api/CallAdvisorChain.java
index 13624abce93..cfb009b2fb8 100644
--- a/spring-ai-client-chat/src/main/java/org/springframework/ai/chat/client/advisor/api/CallAdvisorChain.java
+++ b/spring-ai-client-chat/src/main/java/org/springframework/ai/chat/client/advisor/api/CallAdvisorChain.java
@@ -16,11 +16,11 @@
package org.springframework.ai.chat.client.advisor.api;
+import java.util.List;
+
import org.springframework.ai.chat.client.ChatClientRequest;
import org.springframework.ai.chat.client.ChatClientResponse;
-import java.util.List;
-
/**
* A chain of {@link CallAdvisor} instances orchestrating the execution of a
* {@link ChatClientRequest} on the next {@link CallAdvisor} in the chain.
diff --git a/spring-ai-client-chat/src/main/java/org/springframework/ai/chat/client/advisor/api/StreamAdvisor.java b/spring-ai-client-chat/src/main/java/org/springframework/ai/chat/client/advisor/api/StreamAdvisor.java
index a5e3becfff9..aef13fc1187 100644
--- a/spring-ai-client-chat/src/main/java/org/springframework/ai/chat/client/advisor/api/StreamAdvisor.java
+++ b/spring-ai-client-chat/src/main/java/org/springframework/ai/chat/client/advisor/api/StreamAdvisor.java
@@ -16,9 +16,10 @@
package org.springframework.ai.chat.client.advisor.api;
+import reactor.core.publisher.Flux;
+
import org.springframework.ai.chat.client.ChatClientRequest;
import org.springframework.ai.chat.client.ChatClientResponse;
-import reactor.core.publisher.Flux;
/**
* Advisor for execution flows ultimately resulting in a streaming call to an AI model.
diff --git a/spring-ai-client-chat/src/main/java/org/springframework/ai/chat/client/advisor/api/StreamAdvisorChain.java b/spring-ai-client-chat/src/main/java/org/springframework/ai/chat/client/advisor/api/StreamAdvisorChain.java
index 2b99dc47a24..230192de3aa 100644
--- a/spring-ai-client-chat/src/main/java/org/springframework/ai/chat/client/advisor/api/StreamAdvisorChain.java
+++ b/spring-ai-client-chat/src/main/java/org/springframework/ai/chat/client/advisor/api/StreamAdvisorChain.java
@@ -16,11 +16,12 @@
package org.springframework.ai.chat.client.advisor.api;
-import org.springframework.ai.chat.client.ChatClientRequest;
-import org.springframework.ai.chat.client.ChatClientResponse;
+import java.util.List;
+
import reactor.core.publisher.Flux;
-import java.util.List;
+import org.springframework.ai.chat.client.ChatClientRequest;
+import org.springframework.ai.chat.client.ChatClientResponse;
/**
* A chain of {@link StreamAdvisor} instances orchestrating the execution of a
diff --git a/spring-ai-client-chat/src/main/java/org/springframework/ai/chat/client/observation/ChatClientObservationContext.java b/spring-ai-client-chat/src/main/java/org/springframework/ai/chat/client/observation/ChatClientObservationContext.java
index f12de8feac0..df750398a0f 100644
--- a/spring-ai-client-chat/src/main/java/org/springframework/ai/chat/client/observation/ChatClientObservationContext.java
+++ b/spring-ai-client-chat/src/main/java/org/springframework/ai/chat/client/observation/ChatClientObservationContext.java
@@ -16,6 +16,8 @@
package org.springframework.ai.chat.client.observation;
+import java.util.List;
+
import io.micrometer.observation.Observation;
import org.springframework.ai.chat.client.ChatClientAttributes;
@@ -28,8 +30,6 @@
import org.springframework.util.Assert;
import org.springframework.util.StringUtils;
-import java.util.List;
-
/**
* Context used to store metadata for chat client workflows.
*
@@ -121,8 +121,8 @@ public Builder stream(boolean isStream) {
}
public ChatClientObservationContext build() {
- if (StringUtils.hasText(format)) {
- this.chatClientRequest.context().put(ChatClientAttributes.OUTPUT_FORMAT.getKey(), format);
+ if (StringUtils.hasText(this.format)) {
+ this.chatClientRequest.context().put(ChatClientAttributes.OUTPUT_FORMAT.getKey(), this.format);
}
return new ChatClientObservationContext(this.chatClientRequest, this.advisors, this.isStream);
}
diff --git a/spring-ai-client-chat/src/main/java/org/springframework/ai/chat/client/observation/ChatClientPromptContentObservationHandler.java b/spring-ai-client-chat/src/main/java/org/springframework/ai/chat/client/observation/ChatClientPromptContentObservationHandler.java
index dcd3711e8b9..ddf276b6886 100644
--- a/spring-ai-client-chat/src/main/java/org/springframework/ai/chat/client/observation/ChatClientPromptContentObservationHandler.java
+++ b/spring-ai-client-chat/src/main/java/org/springframework/ai/chat/client/observation/ChatClientPromptContentObservationHandler.java
@@ -16,16 +16,17 @@
package org.springframework.ai.chat.client.observation;
+import java.util.HashMap;
+import java.util.Map;
+
import io.micrometer.observation.Observation;
import io.micrometer.observation.ObservationHandler;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
+
import org.springframework.ai.observation.ObservabilityHelper;
import org.springframework.util.CollectionUtils;
-import java.util.HashMap;
-import java.util.Map;
-
/**
* Handler for emitting the chat client prompt content to logs.
*
diff --git a/spring-ai-client-chat/src/main/java/org/springframework/ai/chat/client/observation/DefaultChatClientObservationConvention.java b/spring-ai-client-chat/src/main/java/org/springframework/ai/chat/client/observation/DefaultChatClientObservationConvention.java
index b573c4bcf23..cfbe797b4d5 100644
--- a/spring-ai-client-chat/src/main/java/org/springframework/ai/chat/client/observation/DefaultChatClientObservationConvention.java
+++ b/spring-ai-client-chat/src/main/java/org/springframework/ai/chat/client/observation/DefaultChatClientObservationConvention.java
@@ -16,6 +16,8 @@
package org.springframework.ai.chat.client.observation;
+import java.util.ArrayList;
+
import io.micrometer.common.KeyValue;
import io.micrometer.common.KeyValues;
@@ -30,8 +32,6 @@
import org.springframework.util.CollectionUtils;
import org.springframework.util.StringUtils;
-import java.util.ArrayList;
-
/**
* Default conventions to populate observations for chat client workflows.
*
diff --git a/spring-ai-client-chat/src/test/java/org/springframework/ai/chat/client/ChatClientRequestTests.java b/spring-ai-client-chat/src/test/java/org/springframework/ai/chat/client/ChatClientRequestTests.java
index 708f86a51f9..8678b6b1961 100644
--- a/spring-ai-client-chat/src/test/java/org/springframework/ai/chat/client/ChatClientRequestTests.java
+++ b/spring-ai-client-chat/src/test/java/org/springframework/ai/chat/client/ChatClientRequestTests.java
@@ -16,12 +16,13 @@
package org.springframework.ai.chat.client;
-import org.junit.jupiter.api.Test;
-import org.springframework.ai.chat.prompt.Prompt;
-
import java.util.HashMap;
import java.util.Map;
+import org.junit.jupiter.api.Test;
+
+import org.springframework.ai.chat.prompt.Prompt;
+
import static org.assertj.core.api.Assertions.assertThat;
import static org.assertj.core.api.Assertions.assertThatThrownBy;
diff --git a/spring-ai-client-chat/src/test/java/org/springframework/ai/chat/client/ChatClientResponseTests.java b/spring-ai-client-chat/src/test/java/org/springframework/ai/chat/client/ChatClientResponseTests.java
index d4a3c96ba90..234309a02c8 100644
--- a/spring-ai-client-chat/src/test/java/org/springframework/ai/chat/client/ChatClientResponseTests.java
+++ b/spring-ai-client-chat/src/test/java/org/springframework/ai/chat/client/ChatClientResponseTests.java
@@ -16,11 +16,11 @@
package org.springframework.ai.chat.client;
-import org.junit.jupiter.api.Test;
-
import java.util.HashMap;
import java.util.Map;
+import org.junit.jupiter.api.Test;
+
import static org.assertj.core.api.Assertions.assertThat;
import static org.assertj.core.api.Assertions.assertThatThrownBy;
diff --git a/spring-ai-client-chat/src/test/java/org/springframework/ai/chat/client/DefaultChatClientUtilsTests.java b/spring-ai-client-chat/src/test/java/org/springframework/ai/chat/client/DefaultChatClientUtilsTests.java
index a14f5d3fdce..9d4d4962069 100644
--- a/spring-ai-client-chat/src/test/java/org/springframework/ai/chat/client/DefaultChatClientUtilsTests.java
+++ b/spring-ai-client-chat/src/test/java/org/springframework/ai/chat/client/DefaultChatClientUtilsTests.java
@@ -16,7 +16,12 @@
package org.springframework.ai.chat.client;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+
import org.junit.jupiter.api.Test;
+
import org.springframework.ai.chat.messages.Message;
import org.springframework.ai.chat.messages.SystemMessage;
import org.springframework.ai.chat.messages.UserMessage;
@@ -30,10 +35,6 @@
import org.springframework.ai.tool.definition.ToolDefinition;
import org.springframework.ai.tool.metadata.ToolMetadata;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-
import static org.assertj.core.api.Assertions.assertThat;
import static org.assertj.core.api.Assertions.assertThatThrownBy;
import static org.mockito.Mockito.mock;
diff --git a/spring-ai-client-chat/src/test/java/org/springframework/ai/chat/client/advisor/AdvisorUtilsTests.java b/spring-ai-client-chat/src/test/java/org/springframework/ai/chat/client/advisor/AdvisorUtilsTests.java
index a9878c1b1d0..f5aaa9ea115 100644
--- a/spring-ai-client-chat/src/test/java/org/springframework/ai/chat/client/advisor/AdvisorUtilsTests.java
+++ b/spring-ai-client-chat/src/test/java/org/springframework/ai/chat/client/advisor/AdvisorUtilsTests.java
@@ -16,16 +16,17 @@
package org.springframework.ai.chat.client.advisor;
+import java.util.List;
+
import org.junit.jupiter.api.Nested;
import org.junit.jupiter.api.Test;
+
import org.springframework.ai.chat.client.ChatClientResponse;
import org.springframework.ai.chat.messages.AssistantMessage;
import org.springframework.ai.chat.metadata.ChatGenerationMetadata;
import org.springframework.ai.chat.model.ChatResponse;
import org.springframework.ai.chat.model.Generation;
-import java.util.List;
-
import static org.junit.jupiter.api.Assertions.assertFalse;
import static org.junit.jupiter.api.Assertions.assertTrue;
import static org.mockito.BDDMockito.given;
diff --git a/spring-ai-client-chat/src/test/java/org/springframework/ai/chat/client/advisor/DefaultAroundAdvisorChainTests.java b/spring-ai-client-chat/src/test/java/org/springframework/ai/chat/client/advisor/DefaultAroundAdvisorChainTests.java
index 4b9e14e67a4..ed00537f716 100644
--- a/spring-ai-client-chat/src/test/java/org/springframework/ai/chat/client/advisor/DefaultAroundAdvisorChainTests.java
+++ b/spring-ai-client-chat/src/test/java/org/springframework/ai/chat/client/advisor/DefaultAroundAdvisorChainTests.java
@@ -16,16 +16,22 @@
package org.springframework.ai.chat.client.advisor;
+import java.util.ArrayList;
+import java.util.List;
+
import io.micrometer.observation.ObservationRegistry;
import org.junit.jupiter.api.Test;
+import reactor.core.publisher.Flux;
+
import org.springframework.ai.chat.client.ChatClientRequest;
import org.springframework.ai.chat.client.ChatClientResponse;
-import org.springframework.ai.chat.client.advisor.api.*;
+import org.springframework.ai.chat.client.advisor.api.Advisor;
+import org.springframework.ai.chat.client.advisor.api.AdvisorChain;
+import org.springframework.ai.chat.client.advisor.api.CallAdvisor;
+import org.springframework.ai.chat.client.advisor.api.CallAdvisorChain;
+import org.springframework.ai.chat.client.advisor.api.StreamAdvisor;
+import org.springframework.ai.chat.client.advisor.api.StreamAdvisorChain;
import org.springframework.ai.chat.prompt.Prompt;
-import reactor.core.publisher.Flux;
-
-import java.util.ArrayList;
-import java.util.List;
import static org.assertj.core.api.Assertions.assertThat;
import static org.assertj.core.api.Assertions.assertThatThrownBy;
diff --git a/spring-ai-client-chat/src/test/java/org/springframework/ai/chat/client/advisor/MessageChatMemoryAdvisorTests.java b/spring-ai-client-chat/src/test/java/org/springframework/ai/chat/client/advisor/MessageChatMemoryAdvisorTests.java
index 4e1125aa74e..52ec1c00a98 100644
--- a/spring-ai-client-chat/src/test/java/org/springframework/ai/chat/client/advisor/MessageChatMemoryAdvisorTests.java
+++ b/spring-ai-client-chat/src/test/java/org/springframework/ai/chat/client/advisor/MessageChatMemoryAdvisorTests.java
@@ -17,11 +17,12 @@
package org.springframework.ai.chat.client.advisor;
import org.junit.jupiter.api.Test;
+import reactor.core.scheduler.Schedulers;
+
import org.springframework.ai.chat.client.advisor.api.Advisor;
import org.springframework.ai.chat.memory.ChatMemory;
import org.springframework.ai.chat.memory.InMemoryChatMemoryRepository;
import org.springframework.ai.chat.memory.MessageWindowChatMemory;
-import reactor.core.scheduler.Schedulers;
import static org.assertj.core.api.Assertions.assertThat;
import static org.assertj.core.api.Assertions.assertThatThrownBy;
diff --git a/spring-ai-client-chat/src/test/java/org/springframework/ai/chat/client/advisor/PromptChatMemoryAdvisorTests.java b/spring-ai-client-chat/src/test/java/org/springframework/ai/chat/client/advisor/PromptChatMemoryAdvisorTests.java
index dbfb380a151..f875a7bf803 100644
--- a/spring-ai-client-chat/src/test/java/org/springframework/ai/chat/client/advisor/PromptChatMemoryAdvisorTests.java
+++ b/spring-ai-client-chat/src/test/java/org/springframework/ai/chat/client/advisor/PromptChatMemoryAdvisorTests.java
@@ -17,12 +17,13 @@
package org.springframework.ai.chat.client.advisor;
import org.junit.jupiter.api.Test;
+import reactor.core.scheduler.Schedulers;
+
import org.springframework.ai.chat.client.advisor.api.Advisor;
import org.springframework.ai.chat.memory.ChatMemory;
import org.springframework.ai.chat.memory.InMemoryChatMemoryRepository;
import org.springframework.ai.chat.memory.MessageWindowChatMemory;
import org.springframework.ai.chat.prompt.PromptTemplate;
-import reactor.core.scheduler.Schedulers;
import static org.assertj.core.api.Assertions.assertThat;
import static org.assertj.core.api.Assertions.assertThatThrownBy;
diff --git a/spring-ai-client-chat/src/test/java/org/springframework/ai/chat/client/advisor/observation/AdvisorObservationContextTests.java b/spring-ai-client-chat/src/test/java/org/springframework/ai/chat/client/advisor/observation/AdvisorObservationContextTests.java
index 06c4f66368a..b100f33d221 100644
--- a/spring-ai-client-chat/src/test/java/org/springframework/ai/chat/client/advisor/observation/AdvisorObservationContextTests.java
+++ b/spring-ai-client-chat/src/test/java/org/springframework/ai/chat/client/advisor/observation/AdvisorObservationContextTests.java
@@ -17,6 +17,7 @@
package org.springframework.ai.chat.client.advisor.observation;
import org.junit.jupiter.api.Test;
+
import org.springframework.ai.chat.client.ChatClientRequest;
import org.springframework.ai.chat.prompt.Prompt;
diff --git a/spring-ai-client-chat/src/test/java/org/springframework/ai/chat/client/observation/ChatClientObservationContextTests.java b/spring-ai-client-chat/src/test/java/org/springframework/ai/chat/client/observation/ChatClientObservationContextTests.java
index 66efa14c4ac..c03312a7408 100644
--- a/spring-ai-client-chat/src/test/java/org/springframework/ai/chat/client/observation/ChatClientObservationContextTests.java
+++ b/spring-ai-client-chat/src/test/java/org/springframework/ai/chat/client/observation/ChatClientObservationContextTests.java
@@ -16,6 +16,9 @@
package org.springframework.ai.chat.client.observation;
+import java.util.ArrayList;
+import java.util.List;
+
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.ExtendWith;
import org.mockito.Mock;
@@ -26,9 +29,6 @@
import org.springframework.ai.chat.model.ChatModel;
import org.springframework.ai.chat.prompt.Prompt;
-import java.util.ArrayList;
-import java.util.List;
-
import static org.assertj.core.api.Assertions.assertThat;
import static org.assertj.core.api.Assertions.assertThatThrownBy;
import static org.mockito.Mockito.mock;
diff --git a/spring-ai-client-chat/src/test/java/org/springframework/ai/chat/client/observation/ChatClientPromptContentObservationHandlerTests.java b/spring-ai-client-chat/src/test/java/org/springframework/ai/chat/client/observation/ChatClientPromptContentObservationHandlerTests.java
index 616dba0e1c3..b6e24c6cbfb 100644
--- a/spring-ai-client-chat/src/test/java/org/springframework/ai/chat/client/observation/ChatClientPromptContentObservationHandlerTests.java
+++ b/spring-ai-client-chat/src/test/java/org/springframework/ai/chat/client/observation/ChatClientPromptContentObservationHandlerTests.java
@@ -16,9 +16,12 @@
package org.springframework.ai.chat.client.observation;
+import java.util.List;
+
import io.micrometer.observation.Observation;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.ExtendWith;
+
import org.springframework.ai.chat.client.ChatClientRequest;
import org.springframework.ai.chat.messages.SystemMessage;
import org.springframework.ai.chat.messages.UserMessage;
@@ -26,8 +29,6 @@
import org.springframework.boot.test.system.CapturedOutput;
import org.springframework.boot.test.system.OutputCaptureExtension;
-import java.util.List;
-
import static org.assertj.core.api.Assertions.assertThat;
/**
@@ -60,7 +61,7 @@ void whenEmptyPromptThenOutputNothing(CapturedOutput output) {
var context = ChatClientObservationContext.builder()
.request(ChatClientRequest.builder().prompt(new Prompt(List.of())).build())
.build();
- observationHandler.onStop(context);
+ this.observationHandler.onStop(context);
assertThat(output).contains("""
Chat Client Prompt Content:
[]
@@ -72,7 +73,7 @@ void whenPromptWithTextThenOutputIt(CapturedOutput output) {
var context = ChatClientObservationContext.builder()
.request(ChatClientRequest.builder().prompt(new Prompt("supercalifragilisticexpialidocious")).build())
.build();
- observationHandler.onStop(context);
+ this.observationHandler.onStop(context);
assertThat(output).contains("""
Chat Client Prompt Content:
["user":"supercalifragilisticexpialidocious"]
@@ -87,7 +88,7 @@ void whenPromptWithMessagesThenOutputIt(CapturedOutput output) {
new UserMessage("supercalifragilisticexpialidocious"))))
.build())
.build();
- observationHandler.onStop(context);
+ this.observationHandler.onStop(context);
assertThat(output).contains("""
Chat Client Prompt Content:
["system":"you're a chimney sweep", "user":"supercalifragilisticexpialidocious"]
diff --git a/spring-ai-commons/src/main/java/org/springframework/ai/observation/TracingAwareLoggingObservationHandler.java b/spring-ai-commons/src/main/java/org/springframework/ai/observation/TracingAwareLoggingObservationHandler.java
index 6826b2a96f6..1edec284894 100644
--- a/spring-ai-commons/src/main/java/org/springframework/ai/observation/TracingAwareLoggingObservationHandler.java
+++ b/spring-ai-commons/src/main/java/org/springframework/ai/observation/TracingAwareLoggingObservationHandler.java
@@ -85,7 +85,8 @@ public void onStop(T context) {
.getRequired(TracingObservationHandler.TracingContext.class);
Span currentSpan = tracingContext.getSpan();
if (currentSpan != null) {
- try (CurrentTraceContext.Scope ignored = tracer.currentTraceContext().maybeScope(currentSpan.context())) {
+ try (CurrentTraceContext.Scope ignored = this.tracer.currentTraceContext()
+ .maybeScope(currentSpan.context())) {
this.delegate.onStop(context);
}
}
diff --git a/spring-ai-commons/src/main/java/org/springframework/ai/template/NoOpTemplateRenderer.java b/spring-ai-commons/src/main/java/org/springframework/ai/template/NoOpTemplateRenderer.java
index 7bcf8032d2c..d4685201cf7 100644
--- a/spring-ai-commons/src/main/java/org/springframework/ai/template/NoOpTemplateRenderer.java
+++ b/spring-ai-commons/src/main/java/org/springframework/ai/template/NoOpTemplateRenderer.java
@@ -36,4 +36,4 @@ public String apply(String template, Map variables) {
return template;
}
-}
\ No newline at end of file
+}
diff --git a/spring-ai-commons/src/main/java/org/springframework/ai/template/TemplateRenderer.java b/spring-ai-commons/src/main/java/org/springframework/ai/template/TemplateRenderer.java
index 847c35bed28..96b199af43a 100644
--- a/spring-ai-commons/src/main/java/org/springframework/ai/template/TemplateRenderer.java
+++ b/spring-ai-commons/src/main/java/org/springframework/ai/template/TemplateRenderer.java
@@ -30,4 +30,4 @@ public interface TemplateRenderer extends BiFunction
@Override
String apply(String template, Map variables);
-}
\ No newline at end of file
+}
diff --git a/spring-ai-commons/src/main/java/org/springframework/ai/template/ValidationMode.java b/spring-ai-commons/src/main/java/org/springframework/ai/template/ValidationMode.java
index 363178b6df8..548e32a7cf7 100644
--- a/spring-ai-commons/src/main/java/org/springframework/ai/template/ValidationMode.java
+++ b/spring-ai-commons/src/main/java/org/springframework/ai/template/ValidationMode.java
@@ -38,6 +38,6 @@ public enum ValidationMode {
/**
* No validation is performed.
*/
- NONE;
+ NONE
-}
\ No newline at end of file
+}
diff --git a/spring-ai-commons/src/test/java/org/springframework/ai/document/DocumentTests.java b/spring-ai-commons/src/test/java/org/springframework/ai/document/DocumentTests.java
index 44fc2be542c..1845710b617 100644
--- a/spring-ai-commons/src/test/java/org/springframework/ai/document/DocumentTests.java
+++ b/spring-ai-commons/src/test/java/org/springframework/ai/document/DocumentTests.java
@@ -16,9 +16,7 @@
package org.springframework.ai.document;
-import java.net.MalformedURLException;
import java.net.URI;
-import java.net.URL;
import java.util.HashMap;
import java.util.Map;
diff --git a/spring-ai-commons/src/test/java/org/springframework/ai/document/TextBlockAssertion.java b/spring-ai-commons/src/test/java/org/springframework/ai/document/TextBlockAssertion.java
index d85721426ed..0490cd7a6d0 100644
--- a/spring-ai-commons/src/test/java/org/springframework/ai/document/TextBlockAssertion.java
+++ b/spring-ai-commons/src/test/java/org/springframework/ai/document/TextBlockAssertion.java
@@ -1,11 +1,11 @@
/*
- * Copyright 2024-2025 the original author or authors.
+ * Copyright 2023-2024 the original author or authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
- * https://www.apache.org/licenses/LICENSE-2.0
+ * https://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
diff --git a/spring-ai-commons/src/test/java/org/springframework/ai/observation/ObservabilityHelperTests.java b/spring-ai-commons/src/test/java/org/springframework/ai/observation/ObservabilityHelperTests.java
index dcbbe53e47b..5fed20b442e 100644
--- a/spring-ai-commons/src/test/java/org/springframework/ai/observation/ObservabilityHelperTests.java
+++ b/spring-ai-commons/src/test/java/org/springframework/ai/observation/ObservabilityHelperTests.java
@@ -16,12 +16,12 @@
package org.springframework.ai.observation;
-import org.junit.jupiter.api.Test;
-
import java.util.List;
import java.util.Map;
import java.util.TreeMap;
+import org.junit.jupiter.api.Test;
+
import static org.assertj.core.api.AssertionsForClassTypes.assertThat;
/**
diff --git a/spring-ai-commons/src/test/java/org/springframework/ai/observation/TracingAwareLoggingObservationHandlerTests.java b/spring-ai-commons/src/test/java/org/springframework/ai/observation/TracingAwareLoggingObservationHandlerTests.java
index f3c433384db..e324dfef134 100644
--- a/spring-ai-commons/src/test/java/org/springframework/ai/observation/TracingAwareLoggingObservationHandlerTests.java
+++ b/spring-ai-commons/src/test/java/org/springframework/ai/observation/TracingAwareLoggingObservationHandlerTests.java
@@ -29,7 +29,9 @@
import org.mockito.Mock;
import org.mockito.junit.jupiter.MockitoExtension;
-import static org.mockito.Mockito.*;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.when;
/**
* Tests for {@link TracingAwareLoggingObservationHandler}.
@@ -53,30 +55,30 @@ void callsShouldBeDelegated() {
Observation.Context context = new Observation.Context();
context.put(TracingObservationHandler.TracingContext.class, new TracingObservationHandler.TracingContext());
- handler.onStart(context);
- verify(delegate).onStart(context);
+ this.handler.onStart(context);
+ verify(this.delegate).onStart(context);
- handler.onError(context);
- verify(delegate).onError(context);
+ this.handler.onError(context);
+ verify(this.delegate).onError(context);
Observation.Event event = Observation.Event.of("test");
- handler.onEvent(event, context);
- verify(delegate).onEvent(event, context);
+ this.handler.onEvent(event, context);
+ verify(this.delegate).onEvent(event, context);
- handler.onScopeOpened(context);
- verify(delegate).onScopeOpened(context);
+ this.handler.onScopeOpened(context);
+ verify(this.delegate).onScopeOpened(context);
- handler.onStop(context);
- verify(delegate).onStop(context);
+ this.handler.onStop(context);
+ verify(this.delegate).onStop(context);
- handler.onScopeClosed(context);
- verify(delegate).onScopeClosed(context);
+ this.handler.onScopeClosed(context);
+ verify(this.delegate).onScopeClosed(context);
- handler.onScopeReset(context);
- verify(delegate).onScopeReset(context);
+ this.handler.onScopeReset(context);
+ verify(this.delegate).onScopeReset(context);
- handler.supportsContext(context);
- verify(delegate).supportsContext(context);
+ this.handler.supportsContext(context);
+ verify(this.delegate).supportsContext(context);
}
@Test
@@ -92,14 +94,14 @@ void spanShouldBeAvailableOnStop() {
CurrentTraceContext.Scope scope = mock(CurrentTraceContext.Scope.class);
when(span.context()).thenReturn(traceContext);
- when(tracer.currentTraceContext()).thenReturn(currentTraceContext);
+ when(this.tracer.currentTraceContext()).thenReturn(currentTraceContext);
when(currentTraceContext.maybeScope(traceContext)).thenReturn(scope);
- handler.onStop(observationContext);
+ this.handler.onStop(observationContext);
verify(scope).close();
verify(currentTraceContext).maybeScope(traceContext);
- verify(delegate).onStop(observationContext);
+ verify(this.delegate).onStop(observationContext);
}
}
diff --git a/spring-ai-commons/src/test/java/org/springframework/ai/template/NoOpTemplateRendererTests.java b/spring-ai-commons/src/test/java/org/springframework/ai/template/NoOpTemplateRendererTests.java
index ffbc9f2c900..caea33f01a8 100644
--- a/spring-ai-commons/src/test/java/org/springframework/ai/template/NoOpTemplateRendererTests.java
+++ b/spring-ai-commons/src/test/java/org/springframework/ai/template/NoOpTemplateRendererTests.java
@@ -16,14 +16,14 @@
package org.springframework.ai.template;
-import static org.assertj.core.api.Assertions.assertThat;
-import static org.assertj.core.api.Assertions.assertThatThrownBy;
-
import java.util.HashMap;
import java.util.Map;
import org.junit.jupiter.api.Test;
+import static org.assertj.core.api.Assertions.assertThat;
+import static org.assertj.core.api.Assertions.assertThatThrownBy;
+
/**
* Unit tests for {@link NoOpTemplateRenderer}.
*
@@ -114,4 +114,4 @@ void shouldReturnUnchangedComplexTemplate() {
assertThat(result).isEqualToNormalizingNewlines(template);
}
-}
\ No newline at end of file
+}
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 bfe9a1496bd..e27c262439e 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
@@ -16,19 +16,22 @@
package org.springframework.ai.integration.tests.client.advisor;
+import java.util.List;
+
import org.junit.jupiter.api.AfterEach;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.condition.EnabledIfEnvironmentVariable;
+
import org.springframework.ai.chat.client.ChatClient;
import org.springframework.ai.chat.client.advisor.vectorstore.QuestionAnswerAdvisor;
+import org.springframework.ai.chat.evaluation.RelevancyEvaluator;
import org.springframework.ai.chat.model.ChatResponse;
import org.springframework.ai.chat.prompt.PromptTemplate;
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.chat.evaluation.RelevancyEvaluator;
import org.springframework.ai.integration.tests.TestApplication;
import org.springframework.ai.openai.OpenAiChatModel;
import org.springframework.ai.reader.markdown.MarkdownDocumentReader;
@@ -40,8 +43,6 @@
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.core.io.Resource;
-import java.util.List;
-
import static org.assertj.core.api.Assertions.assertThat;
/**
@@ -183,9 +184,6 @@ void qaOutputConverter() {
assertThat(answer.content()).containsIgnoringCase("Highlands");
}
- private record Answer(String content) {
- }
-
private void evaluateRelevancy(String question, ChatResponse chatResponse) {
EvaluationRequest evaluationRequest = new EvaluationRequest(question,
chatResponse.getMetadata().get(QuestionAnswerAdvisor.RETRIEVED_DOCUMENTS),
@@ -195,4 +193,7 @@ private void evaluateRelevancy(String question, ChatResponse chatResponse) {
assertThat(evaluationResponse.isPass()).isTrue();
}
+ private record Answer(String content) {
+ }
+
}
diff --git a/spring-ai-integration-tests/src/test/java/org/springframework/ai/integration/tests/client/advisor/QuestionAnswerAdvisorStreamIT.java b/spring-ai-integration-tests/src/test/java/org/springframework/ai/integration/tests/client/advisor/QuestionAnswerAdvisorStreamIT.java
index 85757e4ab56..83974f383d9 100644
--- a/spring-ai-integration-tests/src/test/java/org/springframework/ai/integration/tests/client/advisor/QuestionAnswerAdvisorStreamIT.java
+++ b/spring-ai-integration-tests/src/test/java/org/springframework/ai/integration/tests/client/advisor/QuestionAnswerAdvisorStreamIT.java
@@ -16,14 +16,17 @@
package org.springframework.ai.integration.tests.client.advisor;
+import java.util.List;
+import java.util.stream.Collectors;
+
import org.junit.jupiter.api.AfterEach;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.condition.EnabledIfEnvironmentVariable;
+import reactor.core.publisher.Flux;
+
import org.springframework.ai.chat.client.ChatClient;
import org.springframework.ai.chat.client.advisor.vectorstore.QuestionAnswerAdvisor;
-import org.springframework.ai.chat.model.ChatResponse;
-import org.springframework.ai.converter.BeanOutputConverter;
import org.springframework.ai.document.Document;
import org.springframework.ai.document.DocumentReader;
import org.springframework.ai.integration.tests.TestApplication;
@@ -36,10 +39,6 @@
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.core.io.Resource;
-import reactor.core.publisher.Flux;
-
-import java.util.List;
-import java.util.stream.Collectors;
import static org.assertj.core.api.Assertions.assertThat;
diff --git a/spring-ai-model/src/main/java/org/springframework/ai/chat/memory/ChatMemory.java b/spring-ai-model/src/main/java/org/springframework/ai/chat/memory/ChatMemory.java
index 3609d59b3a2..f13a971e56f 100644
--- a/spring-ai-model/src/main/java/org/springframework/ai/chat/memory/ChatMemory.java
+++ b/spring-ai-model/src/main/java/org/springframework/ai/chat/memory/ChatMemory.java
@@ -16,11 +16,11 @@
package org.springframework.ai.chat.memory;
+import java.util.List;
+
import org.springframework.ai.chat.messages.Message;
import org.springframework.util.Assert;
-import java.util.List;
-
/**
* The contract for storing and managing the memory of chat conversations.
*
diff --git a/spring-ai-model/src/main/java/org/springframework/ai/chat/memory/ChatMemoryRepository.java b/spring-ai-model/src/main/java/org/springframework/ai/chat/memory/ChatMemoryRepository.java
index ff4b823a174..350b1ebbcf7 100644
--- a/spring-ai-model/src/main/java/org/springframework/ai/chat/memory/ChatMemoryRepository.java
+++ b/spring-ai-model/src/main/java/org/springframework/ai/chat/memory/ChatMemoryRepository.java
@@ -16,10 +16,10 @@
package org.springframework.ai.chat.memory;
-import org.springframework.ai.chat.messages.Message;
-
import java.util.List;
+import org.springframework.ai.chat.messages.Message;
+
/**
* A repository for storing and retrieving chat messages.
*
diff --git a/spring-ai-model/src/main/java/org/springframework/ai/chat/memory/InMemoryChatMemoryRepository.java b/spring-ai-model/src/main/java/org/springframework/ai/chat/memory/InMemoryChatMemoryRepository.java
index 290ccfb4174..0843af8ffa2 100644
--- a/spring-ai-model/src/main/java/org/springframework/ai/chat/memory/InMemoryChatMemoryRepository.java
+++ b/spring-ai-model/src/main/java/org/springframework/ai/chat/memory/InMemoryChatMemoryRepository.java
@@ -16,14 +16,14 @@
package org.springframework.ai.chat.memory;
-import org.springframework.ai.chat.messages.Message;
-import org.springframework.util.Assert;
-
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
+import org.springframework.ai.chat.messages.Message;
+import org.springframework.util.Assert;
+
/**
* An in-memory implementation of {@link ChatMemoryRepository}.
*
diff --git a/spring-ai-model/src/main/java/org/springframework/ai/chat/memory/MessageWindowChatMemory.java b/spring-ai-model/src/main/java/org/springframework/ai/chat/memory/MessageWindowChatMemory.java
index d9625424416..9c56c9d50bf 100644
--- a/spring-ai-model/src/main/java/org/springframework/ai/chat/memory/MessageWindowChatMemory.java
+++ b/spring-ai-model/src/main/java/org/springframework/ai/chat/memory/MessageWindowChatMemory.java
@@ -115,7 +115,7 @@ public static Builder builder() {
return new Builder();
}
- public static class Builder {
+ public static final class Builder {
private ChatMemoryRepository chatMemoryRepository;
diff --git a/spring-ai-model/src/main/java/org/springframework/ai/chat/messages/MessageUtils.java b/spring-ai-model/src/main/java/org/springframework/ai/chat/messages/MessageUtils.java
index cf732eec4c0..06d3b7c0424 100644
--- a/spring-ai-model/src/main/java/org/springframework/ai/chat/messages/MessageUtils.java
+++ b/spring-ai-model/src/main/java/org/springframework/ai/chat/messages/MessageUtils.java
@@ -16,14 +16,14 @@
package org.springframework.ai.chat.messages;
-import org.springframework.core.io.Resource;
-import org.springframework.util.Assert;
-import org.springframework.util.StreamUtils;
-
import java.io.IOException;
import java.io.InputStream;
import java.nio.charset.Charset;
+import org.springframework.core.io.Resource;
+import org.springframework.util.Assert;
+import org.springframework.util.StreamUtils;
+
/**
* Utility class for managing messages.
*
diff --git a/spring-ai-model/src/main/java/org/springframework/ai/chat/messages/SystemMessage.java b/spring-ai-model/src/main/java/org/springframework/ai/chat/messages/SystemMessage.java
index a5d2fe013e4..8a187add90e 100644
--- a/spring-ai-model/src/main/java/org/springframework/ai/chat/messages/SystemMessage.java
+++ b/spring-ai-model/src/main/java/org/springframework/ai/chat/messages/SystemMessage.java
@@ -115,11 +115,11 @@ public Builder metadata(Map metadata) {
}
public SystemMessage build() {
- if (StringUtils.hasText(textContent) && resource != null) {
+ if (StringUtils.hasText(this.textContent) && this.resource != null) {
throw new IllegalArgumentException("textContent and resource cannot be set at the same time");
}
- else if (resource != null) {
- this.textContent = MessageUtils.readResource(resource);
+ else if (this.resource != null) {
+ this.textContent = MessageUtils.readResource(this.resource);
}
return new SystemMessage(this.textContent, this.metadata);
}
diff --git a/spring-ai-model/src/main/java/org/springframework/ai/chat/messages/UserMessage.java b/spring-ai-model/src/main/java/org/springframework/ai/chat/messages/UserMessage.java
index 499949153f6..2495e09e975 100644
--- a/spring-ai-model/src/main/java/org/springframework/ai/chat/messages/UserMessage.java
+++ b/spring-ai-model/src/main/java/org/springframework/ai/chat/messages/UserMessage.java
@@ -124,11 +124,11 @@ public Builder metadata(Map metadata) {
}
public UserMessage build() {
- if (StringUtils.hasText(textContent) && resource != null) {
+ if (StringUtils.hasText(this.textContent) && this.resource != null) {
throw new IllegalArgumentException("textContent and resource cannot be set at the same time");
}
- else if (resource != null) {
- this.textContent = MessageUtils.readResource(resource);
+ else if (this.resource != null) {
+ this.textContent = MessageUtils.readResource(this.resource);
}
return new UserMessage(this.textContent, this.media, this.metadata);
}
diff --git a/spring-ai-model/src/main/java/org/springframework/ai/chat/observation/ChatModelCompletionObservationHandler.java b/spring-ai-model/src/main/java/org/springframework/ai/chat/observation/ChatModelCompletionObservationHandler.java
index c3c4ab348ff..597ce0a1f2f 100644
--- a/spring-ai-model/src/main/java/org/springframework/ai/chat/observation/ChatModelCompletionObservationHandler.java
+++ b/spring-ai-model/src/main/java/org/springframework/ai/chat/observation/ChatModelCompletionObservationHandler.java
@@ -16,16 +16,17 @@
package org.springframework.ai.chat.observation;
+import java.util.List;
+
import io.micrometer.observation.Observation;
import io.micrometer.observation.ObservationHandler;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
+
import org.springframework.ai.observation.ObservabilityHelper;
import org.springframework.util.CollectionUtils;
import org.springframework.util.StringUtils;
-import java.util.List;
-
/**
* Handler for emitting the chat completion content to logs.
*
diff --git a/spring-ai-model/src/main/java/org/springframework/ai/chat/observation/ChatModelObservationContext.java b/spring-ai-model/src/main/java/org/springframework/ai/chat/observation/ChatModelObservationContext.java
index 819edec419f..2aa46628ff6 100644
--- a/spring-ai-model/src/main/java/org/springframework/ai/chat/observation/ChatModelObservationContext.java
+++ b/spring-ai-model/src/main/java/org/springframework/ai/chat/observation/ChatModelObservationContext.java
@@ -17,12 +17,10 @@
package org.springframework.ai.chat.observation;
import org.springframework.ai.chat.model.ChatResponse;
-import org.springframework.ai.chat.prompt.ChatOptions;
import org.springframework.ai.chat.prompt.Prompt;
import org.springframework.ai.model.observation.ModelObservationContext;
import org.springframework.ai.observation.AiOperationMetadata;
import org.springframework.ai.observation.conventions.AiOperationType;
-import org.springframework.util.Assert;
/**
* Context used to store metadata for chat model exchanges.
diff --git a/spring-ai-model/src/main/java/org/springframework/ai/chat/observation/ChatModelObservationDocumentation.java b/spring-ai-model/src/main/java/org/springframework/ai/chat/observation/ChatModelObservationDocumentation.java
index e25cddf69a4..29840ef4aaa 100644
--- a/spring-ai-model/src/main/java/org/springframework/ai/chat/observation/ChatModelObservationDocumentation.java
+++ b/spring-ai-model/src/main/java/org/springframework/ai/chat/observation/ChatModelObservationDocumentation.java
@@ -20,6 +20,7 @@
import io.micrometer.observation.Observation;
import io.micrometer.observation.ObservationConvention;
import io.micrometer.observation.docs.ObservationDocumentation;
+
import org.springframework.ai.observation.conventions.AiObservationAttributes;
/**
diff --git a/spring-ai-model/src/main/java/org/springframework/ai/chat/observation/ChatModelPromptContentObservationHandler.java b/spring-ai-model/src/main/java/org/springframework/ai/chat/observation/ChatModelPromptContentObservationHandler.java
index 067b7514260..88b353b68d8 100644
--- a/spring-ai-model/src/main/java/org/springframework/ai/chat/observation/ChatModelPromptContentObservationHandler.java
+++ b/spring-ai-model/src/main/java/org/springframework/ai/chat/observation/ChatModelPromptContentObservationHandler.java
@@ -16,16 +16,17 @@
package org.springframework.ai.chat.observation;
+import java.util.List;
+
import io.micrometer.observation.Observation;
import io.micrometer.observation.ObservationHandler;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
+
import org.springframework.ai.content.Content;
import org.springframework.ai.observation.ObservabilityHelper;
import org.springframework.util.CollectionUtils;
-import java.util.List;
-
/**
* Handler for emitting the chat prompt content to logs.
*
diff --git a/spring-ai-model/src/main/java/org/springframework/ai/chat/prompt/PromptTemplate.java b/spring-ai-model/src/main/java/org/springframework/ai/chat/prompt/PromptTemplate.java
index 6cc10e50de3..9e33506399d 100644
--- a/spring-ai-model/src/main/java/org/springframework/ai/chat/prompt/PromptTemplate.java
+++ b/spring-ai-model/src/main/java/org/springframework/ai/chat/prompt/PromptTemplate.java
@@ -24,22 +24,20 @@
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
-import java.util.Set;
-import org.springframework.ai.template.TemplateRenderer;
-import org.springframework.ai.template.st.StTemplateRenderer;
-import org.springframework.util.Assert;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
import org.springframework.ai.chat.messages.Message;
import org.springframework.ai.chat.messages.UserMessage;
import org.springframework.ai.content.Media;
-import org.springframework.core.io.Resource;
+import org.springframework.ai.template.TemplateRenderer;
+import org.springframework.ai.template.st.StTemplateRenderer;
import org.springframework.core.io.ByteArrayResource;
+import org.springframework.core.io.Resource;
+import org.springframework.util.Assert;
import org.springframework.util.StreamUtils;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
/**
* A template for creating prompts. It allows you to define a template string with
* placeholders for variables, and then render the template with specific values for those
@@ -89,7 +87,7 @@ public PromptTemplate(String template) {
try (InputStream inputStream = resource.getInputStream()) {
this.template = StreamUtils.copyToString(inputStream, Charset.defaultCharset());
- Assert.hasText(template, "template cannot be null or empty");
+ Assert.hasText(this.template, "template cannot be null or empty");
}
catch (IOException ex) {
throw new RuntimeException("Failed to read resource", ex);
@@ -120,7 +118,7 @@ public String render() {
processedVariables.put(entry.getKey(), entry.getValue());
}
}
- return this.renderer.apply(template, processedVariables);
+ return this.renderer.apply(this.template, processedVariables);
}
@Override
@@ -136,7 +134,7 @@ public String render(Map additionalVariables) {
}
}
- return this.renderer.apply(template, combinedVariables);
+ return this.renderer.apply(this.template, combinedVariables);
}
private String renderResource(Resource resource) {
@@ -211,7 +209,7 @@ public static Builder builder() {
return new Builder();
}
- public static class Builder {
+ public static final class Builder {
private String template;
diff --git a/spring-ai-model/src/main/java/org/springframework/ai/embedding/observation/EmbeddingModelObservationContext.java b/spring-ai-model/src/main/java/org/springframework/ai/embedding/observation/EmbeddingModelObservationContext.java
index bc35c72533b..f076366df86 100644
--- a/spring-ai-model/src/main/java/org/springframework/ai/embedding/observation/EmbeddingModelObservationContext.java
+++ b/spring-ai-model/src/main/java/org/springframework/ai/embedding/observation/EmbeddingModelObservationContext.java
@@ -16,7 +16,6 @@
package org.springframework.ai.embedding.observation;
-import org.springframework.ai.embedding.EmbeddingOptions;
import org.springframework.ai.embedding.EmbeddingRequest;
import org.springframework.ai.embedding.EmbeddingResponse;
import org.springframework.ai.model.observation.ModelObservationContext;
diff --git a/spring-ai-model/src/main/java/org/springframework/ai/image/observation/ImageModelObservationContext.java b/spring-ai-model/src/main/java/org/springframework/ai/image/observation/ImageModelObservationContext.java
index d65ea7970ae..f40d68481f2 100644
--- a/spring-ai-model/src/main/java/org/springframework/ai/image/observation/ImageModelObservationContext.java
+++ b/spring-ai-model/src/main/java/org/springframework/ai/image/observation/ImageModelObservationContext.java
@@ -16,7 +16,6 @@
package org.springframework.ai.image.observation;
-import org.springframework.ai.image.ImageOptions;
import org.springframework.ai.image.ImagePrompt;
import org.springframework.ai.image.ImageResponse;
import org.springframework.ai.model.observation.ModelObservationContext;
diff --git a/spring-ai-model/src/main/java/org/springframework/ai/image/observation/ImageModelObservationDocumentation.java b/spring-ai-model/src/main/java/org/springframework/ai/image/observation/ImageModelObservationDocumentation.java
index 3dd7b13ba84..d2719147e9e 100644
--- a/spring-ai-model/src/main/java/org/springframework/ai/image/observation/ImageModelObservationDocumentation.java
+++ b/spring-ai-model/src/main/java/org/springframework/ai/image/observation/ImageModelObservationDocumentation.java
@@ -20,6 +20,7 @@
import io.micrometer.observation.Observation;
import io.micrometer.observation.ObservationConvention;
import io.micrometer.observation.docs.ObservationDocumentation;
+
import org.springframework.ai.observation.conventions.AiObservationAttributes;
/**
diff --git a/spring-ai-model/src/main/java/org/springframework/ai/image/observation/ImageModelPromptContentObservationHandler.java b/spring-ai-model/src/main/java/org/springframework/ai/image/observation/ImageModelPromptContentObservationHandler.java
index e27f2fb27ca..b15d535b3f5 100644
--- a/spring-ai-model/src/main/java/org/springframework/ai/image/observation/ImageModelPromptContentObservationHandler.java
+++ b/spring-ai-model/src/main/java/org/springframework/ai/image/observation/ImageModelPromptContentObservationHandler.java
@@ -16,13 +16,14 @@
package org.springframework.ai.image.observation;
+import java.util.StringJoiner;
+
import io.micrometer.observation.Observation;
import io.micrometer.observation.ObservationHandler;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
-import org.springframework.util.CollectionUtils;
-import java.util.StringJoiner;
+import org.springframework.util.CollectionUtils;
/**
* Handler for emitting image prompt content to logs.
diff --git a/spring-ai-model/src/main/java/org/springframework/ai/moderation/CategoryScores.java b/spring-ai-model/src/main/java/org/springframework/ai/moderation/CategoryScores.java
index dd458712ac5..328e2e8682e 100644
--- a/spring-ai-model/src/main/java/org/springframework/ai/moderation/CategoryScores.java
+++ b/spring-ai-model/src/main/java/org/springframework/ai/moderation/CategoryScores.java
@@ -131,23 +131,23 @@ public double getViolence() {
}
public double getDangerousAndCriminalContent() {
- return dangerousAndCriminalContent;
+ return this.dangerousAndCriminalContent;
}
public double getHealth() {
- return health;
+ return this.health;
}
public double getFinancial() {
- return financial;
+ return this.financial;
}
public double getLaw() {
- return law;
+ return this.law;
}
public double getPii() {
- return pii;
+ return this.pii;
}
@Override
@@ -189,8 +189,8 @@ public String toString() {
+ this.hateThreatening + ", violenceGraphic=" + this.violenceGraphic + ", selfHarmIntent="
+ this.selfHarmIntent + ", selfHarmInstructions=" + this.selfHarmInstructions
+ ", harassmentThreatening=" + this.harassmentThreatening + ", violence=" + this.violence
- + ", dangerousAndCriminalContent=" + dangerousAndCriminalContent + ", health=" + health + ", financial="
- + financial + ", law=" + law + ", pii=" + pii + '}';
+ + ", dangerousAndCriminalContent=" + this.dangerousAndCriminalContent + ", health=" + this.health
+ + ", financial=" + this.financial + ", law=" + this.law + ", pii=" + this.pii + '}';
}
public static class Builder {
diff --git a/spring-ai-model/src/main/java/org/springframework/ai/tool/definition/DefaultToolDefinition.java b/spring-ai-model/src/main/java/org/springframework/ai/tool/definition/DefaultToolDefinition.java
index b38c6708d17..cafd1a70364 100644
--- a/spring-ai-model/src/main/java/org/springframework/ai/tool/definition/DefaultToolDefinition.java
+++ b/spring-ai-model/src/main/java/org/springframework/ai/tool/definition/DefaultToolDefinition.java
@@ -16,7 +16,6 @@
package org.springframework.ai.tool.definition;
-import org.springframework.ai.tool.support.ToolUtils;
import org.springframework.ai.util.ParsingUtils;
import org.springframework.util.Assert;
import org.springframework.util.StringUtils;
diff --git a/spring-ai-model/src/main/java/org/springframework/ai/tool/observation/DefaultToolCallingObservationConvention.java b/spring-ai-model/src/main/java/org/springframework/ai/tool/observation/DefaultToolCallingObservationConvention.java
index 0842ec5deec..c12ea52555f 100644
--- a/spring-ai-model/src/main/java/org/springframework/ai/tool/observation/DefaultToolCallingObservationConvention.java
+++ b/spring-ai-model/src/main/java/org/springframework/ai/tool/observation/DefaultToolCallingObservationConvention.java
@@ -18,6 +18,7 @@
import io.micrometer.common.KeyValue;
import io.micrometer.common.KeyValues;
+
import org.springframework.ai.observation.conventions.SpringAiKind;
import org.springframework.lang.Nullable;
import org.springframework.util.Assert;
diff --git a/spring-ai-model/src/main/java/org/springframework/ai/tool/observation/ToolCallingObservationContext.java b/spring-ai-model/src/main/java/org/springframework/ai/tool/observation/ToolCallingObservationContext.java
index 3ce781824a3..ea73f6fd75e 100644
--- a/spring-ai-model/src/main/java/org/springframework/ai/tool/observation/ToolCallingObservationContext.java
+++ b/spring-ai-model/src/main/java/org/springframework/ai/tool/observation/ToolCallingObservationContext.java
@@ -17,6 +17,7 @@
package org.springframework.ai.tool.observation;
import io.micrometer.observation.Observation;
+
import org.springframework.ai.observation.AiOperationMetadata;
import org.springframework.ai.observation.conventions.AiOperationType;
import org.springframework.ai.observation.conventions.AiProvider;
@@ -31,7 +32,7 @@
* @author Thomas Vitale
* @since 1.0.0
*/
-public class ToolCallingObservationContext extends Observation.Context {
+public final class ToolCallingObservationContext extends Observation.Context {
private final AiOperationMetadata operationMetadata = new AiOperationMetadata(AiOperationType.FRAMEWORK.value(),
AiProvider.SPRING_AI.value());
@@ -58,24 +59,24 @@ private ToolCallingObservationContext(ToolDefinition toolDefinition, ToolMetadat
}
public AiOperationMetadata getOperationMetadata() {
- return operationMetadata;
+ return this.operationMetadata;
}
public ToolDefinition getToolDefinition() {
- return toolDefinition;
+ return this.toolDefinition;
}
public ToolMetadata getToolMetadata() {
- return toolMetadata;
+ return this.toolMetadata;
}
public String getToolCallArguments() {
- return toolCallArguments;
+ return this.toolCallArguments;
}
@Nullable
public String getToolCallResult() {
- return toolCallResult;
+ return this.toolCallResult;
}
public void setToolCallResult(@Nullable String toolCallResult) {
@@ -86,7 +87,7 @@ public static Builder builder() {
return new Builder();
}
- public static class Builder {
+ public static final class Builder {
private ToolDefinition toolDefinition;
@@ -121,7 +122,8 @@ public Builder toolCallResult(@Nullable String toolCallResult) {
}
public ToolCallingObservationContext build() {
- return new ToolCallingObservationContext(toolDefinition, toolMetadata, toolCallArguments, toolCallResult);
+ return new ToolCallingObservationContext(this.toolDefinition, this.toolMetadata, this.toolCallArguments,
+ this.toolCallResult);
}
}
diff --git a/spring-ai-model/src/main/java/org/springframework/ai/tool/observation/ToolCallingObservationDocumentation.java b/spring-ai-model/src/main/java/org/springframework/ai/tool/observation/ToolCallingObservationDocumentation.java
index dd6447c92af..91d4d681af4 100644
--- a/spring-ai-model/src/main/java/org/springframework/ai/tool/observation/ToolCallingObservationDocumentation.java
+++ b/spring-ai-model/src/main/java/org/springframework/ai/tool/observation/ToolCallingObservationDocumentation.java
@@ -20,6 +20,7 @@
import io.micrometer.observation.Observation;
import io.micrometer.observation.ObservationConvention;
import io.micrometer.observation.docs.ObservationDocumentation;
+
import org.springframework.ai.observation.conventions.AiObservationAttributes;
/**
diff --git a/spring-ai-model/src/main/java/org/springframework/ai/tool/support/ToolDefinitions.java b/spring-ai-model/src/main/java/org/springframework/ai/tool/support/ToolDefinitions.java
index 25819ea719d..68d4646333a 100644
--- a/spring-ai-model/src/main/java/org/springframework/ai/tool/support/ToolDefinitions.java
+++ b/spring-ai-model/src/main/java/org/springframework/ai/tool/support/ToolDefinitions.java
@@ -1,11 +1,11 @@
/*
- * Copyright 2024 - 2024 the original author or authors.
+ * Copyright 2024-2025 the original author or authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
- * https://www.apache.org/licenses/LICENSE-2.0
+ * https://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
@@ -13,6 +13,7 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
+
package org.springframework.ai.tool.support;
import java.lang.reflect.Method;
@@ -34,7 +35,11 @@
* @author Mark Pollack
* @since 1.0.0
*/
-public class ToolDefinitions {
+public final class ToolDefinitions {
+
+ private ToolDefinitions() {
+ // prevents instantiation.
+ }
/**
* Create a default {@link ToolDefinition} builder from a {@link Method}.
diff --git a/spring-ai-model/src/test/java/org/springframework/ai/aot/SpringAiCoreRuntimeHintsTest.java b/spring-ai-model/src/test/java/org/springframework/ai/aot/SpringAiCoreRuntimeHintsTest.java
index 01d180686ce..ea7badcc0af 100644
--- a/spring-ai-model/src/test/java/org/springframework/ai/aot/SpringAiCoreRuntimeHintsTest.java
+++ b/spring-ai-model/src/test/java/org/springframework/ai/aot/SpringAiCoreRuntimeHintsTest.java
@@ -42,4 +42,4 @@ void core() {
assertThat(runtimeHints).matches(reflection().onType(ToolDefinition.class));
}
-}
\ No newline at end of file
+}
diff --git a/spring-ai-model/src/test/java/org/springframework/ai/chat/memory/InMemoryChatMemoryRepositoryTests.java b/spring-ai-model/src/test/java/org/springframework/ai/chat/memory/InMemoryChatMemoryRepositoryTests.java
index 6fc4315c19e..90283e3e9c2 100644
--- a/spring-ai-model/src/test/java/org/springframework/ai/chat/memory/InMemoryChatMemoryRepositoryTests.java
+++ b/spring-ai-model/src/test/java/org/springframework/ai/chat/memory/InMemoryChatMemoryRepositoryTests.java
@@ -16,15 +16,16 @@
package org.springframework.ai.chat.memory;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.UUID;
+
import org.junit.jupiter.api.Test;
+
import org.springframework.ai.chat.messages.AssistantMessage;
import org.springframework.ai.chat.messages.Message;
import org.springframework.ai.chat.messages.UserMessage;
-import java.util.ArrayList;
-import java.util.List;
-import java.util.UUID;
-
import static org.assertj.core.api.Assertions.assertThat;
import static org.assertj.core.api.Assertions.assertThatThrownBy;
@@ -44,14 +45,14 @@ void findConversationIds() {
List messages1 = List.of(new UserMessage("Hello"));
List messages2 = List.of(new AssistantMessage("Hi there"));
- chatMemoryRepository.saveAll(conversationId1, messages1);
- chatMemoryRepository.saveAll(conversationId2, messages2);
+ this.chatMemoryRepository.saveAll(conversationId1, messages1);
+ this.chatMemoryRepository.saveAll(conversationId2, messages2);
- assertThat(chatMemoryRepository.findConversationIds()).containsExactlyInAnyOrder(conversationId1,
+ assertThat(this.chatMemoryRepository.findConversationIds()).containsExactlyInAnyOrder(conversationId1,
conversationId2);
- chatMemoryRepository.deleteByConversationId(conversationId1);
- assertThat(chatMemoryRepository.findConversationIds()).containsExactlyInAnyOrder(conversationId2);
+ this.chatMemoryRepository.deleteByConversationId(conversationId1);
+ assertThat(this.chatMemoryRepository.findConversationIds()).containsExactlyInAnyOrder(conversationId2);
}
@Test
@@ -59,13 +60,13 @@ void saveMessagesAndFindMultipleMessagesInConversation() {
String conversationId = UUID.randomUUID().toString();
List messages = List.of(new AssistantMessage("I, Robot"), new UserMessage("Hello"));
- chatMemoryRepository.saveAll(conversationId, messages);
+ this.chatMemoryRepository.saveAll(conversationId, messages);
- assertThat(chatMemoryRepository.findByConversationId(conversationId)).containsAll(messages);
+ assertThat(this.chatMemoryRepository.findByConversationId(conversationId)).containsAll(messages);
- chatMemoryRepository.deleteByConversationId(conversationId);
+ this.chatMemoryRepository.deleteByConversationId(conversationId);
- assertThat(chatMemoryRepository.findByConversationId(conversationId)).isEmpty();
+ assertThat(this.chatMemoryRepository.findByConversationId(conversationId)).isEmpty();
}
@Test
@@ -74,20 +75,20 @@ void saveMessagesAndFindSingleMessageInConversation() {
Message message = new UserMessage("Hello");
List messages = List.of(message);
- chatMemoryRepository.saveAll(conversationId, messages);
+ this.chatMemoryRepository.saveAll(conversationId, messages);
- assertThat(chatMemoryRepository.findByConversationId(conversationId)).contains(message);
+ assertThat(this.chatMemoryRepository.findByConversationId(conversationId)).contains(message);
- chatMemoryRepository.deleteByConversationId(conversationId);
+ this.chatMemoryRepository.deleteByConversationId(conversationId);
- assertThat(chatMemoryRepository.findByConversationId(conversationId)).isEmpty();
+ assertThat(this.chatMemoryRepository.findByConversationId(conversationId)).isEmpty();
}
@Test
void findNonExistingConversation() {
String conversationId = UUID.randomUUID().toString();
- assertThat(chatMemoryRepository.findByConversationId(conversationId)).isEmpty();
+ assertThat(this.chatMemoryRepository.findByConversationId(conversationId)).isEmpty();
}
@Test
@@ -96,38 +97,39 @@ void subsequentSaveOverwritesPreviousVersion() {
List firstMessages = List.of(new UserMessage("Hello"));
List secondMessages = List.of(new AssistantMessage("Hi there"));
- chatMemoryRepository.saveAll(conversationId, firstMessages);
- chatMemoryRepository.saveAll(conversationId, secondMessages);
+ this.chatMemoryRepository.saveAll(conversationId, firstMessages);
+ this.chatMemoryRepository.saveAll(conversationId, secondMessages);
- assertThat(chatMemoryRepository.findByConversationId(conversationId)).containsExactlyElementsOf(secondMessages);
+ assertThat(this.chatMemoryRepository.findByConversationId(conversationId))
+ .containsExactlyElementsOf(secondMessages);
}
@Test
void nullConversationIdNotAllowed() {
- assertThatThrownBy(() -> chatMemoryRepository.saveAll(null, List.of(new UserMessage("Hello"))))
+ assertThatThrownBy(() -> this.chatMemoryRepository.saveAll(null, List.of(new UserMessage("Hello"))))
.isInstanceOf(IllegalArgumentException.class)
.hasMessageContaining("conversationId cannot be null or empty");
- assertThatThrownBy(() -> chatMemoryRepository.findByConversationId(null))
+ assertThatThrownBy(() -> this.chatMemoryRepository.findByConversationId(null))
.isInstanceOf(IllegalArgumentException.class)
.hasMessageContaining("conversationId cannot be null or empty");
- assertThatThrownBy(() -> chatMemoryRepository.deleteByConversationId(null))
+ assertThatThrownBy(() -> this.chatMemoryRepository.deleteByConversationId(null))
.isInstanceOf(IllegalArgumentException.class)
.hasMessageContaining("conversationId cannot be null or empty");
}
@Test
void emptyConversationIdNotAllowed() {
- assertThatThrownBy(() -> chatMemoryRepository.saveAll("", List.of(new UserMessage("Hello"))))
+ assertThatThrownBy(() -> this.chatMemoryRepository.saveAll("", List.of(new UserMessage("Hello"))))
.isInstanceOf(IllegalArgumentException.class)
.hasMessageContaining("conversationId cannot be null or empty");
- assertThatThrownBy(() -> chatMemoryRepository.findByConversationId(""))
+ assertThatThrownBy(() -> this.chatMemoryRepository.findByConversationId(""))
.isInstanceOf(IllegalArgumentException.class)
.hasMessageContaining("conversationId cannot be null or empty");
- assertThatThrownBy(() -> chatMemoryRepository.deleteByConversationId(""))
+ assertThatThrownBy(() -> this.chatMemoryRepository.deleteByConversationId(""))
.isInstanceOf(IllegalArgumentException.class)
.hasMessageContaining("conversationId cannot be null or empty");
}
@@ -135,7 +137,7 @@ void emptyConversationIdNotAllowed() {
@Test
void nullMessagesNotAllowed() {
String conversationId = UUID.randomUUID().toString();
- assertThatThrownBy(() -> chatMemoryRepository.saveAll(conversationId, null))
+ assertThatThrownBy(() -> this.chatMemoryRepository.saveAll(conversationId, null))
.isInstanceOf(IllegalArgumentException.class)
.hasMessageContaining("messages cannot be null");
}
@@ -146,7 +148,7 @@ void messagesWithNullElementsNotAllowed() {
List messagesWithNull = new ArrayList<>();
messagesWithNull.add(null);
- assertThatThrownBy(() -> chatMemoryRepository.saveAll(conversationId, messagesWithNull))
+ assertThatThrownBy(() -> this.chatMemoryRepository.saveAll(conversationId, messagesWithNull))
.isInstanceOf(IllegalArgumentException.class)
.hasMessageContaining("messages cannot contain null elements");
}
diff --git a/spring-ai-model/src/test/java/org/springframework/ai/chat/memory/MessageWindowChatMemoryTests.java b/spring-ai-model/src/test/java/org/springframework/ai/chat/memory/MessageWindowChatMemoryTests.java
index 6684e48d3d5..caca4fca63b 100644
--- a/spring-ai-model/src/test/java/org/springframework/ai/chat/memory/MessageWindowChatMemoryTests.java
+++ b/spring-ai-model/src/test/java/org/springframework/ai/chat/memory/MessageWindowChatMemoryTests.java
@@ -16,16 +16,17 @@
package org.springframework.ai.chat.memory;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.UUID;
+
import org.junit.jupiter.api.Test;
+
import org.springframework.ai.chat.messages.AssistantMessage;
import org.springframework.ai.chat.messages.Message;
import org.springframework.ai.chat.messages.SystemMessage;
import org.springframework.ai.chat.messages.UserMessage;
-import java.util.ArrayList;
-import java.util.List;
-import java.util.UUID;
-
import static org.assertj.core.api.Assertions.assertThat;
import static org.assertj.core.api.Assertions.assertThatThrownBy;
@@ -57,13 +58,13 @@ void handleMultipleMessagesInConversation() {
String conversationId = UUID.randomUUID().toString();
List messages = List.of(new AssistantMessage("I, Robot"), new UserMessage("Hello"));
- chatMemory.add(conversationId, messages);
+ this.chatMemory.add(conversationId, messages);
- assertThat(chatMemory.get(conversationId)).containsAll(messages);
+ assertThat(this.chatMemory.get(conversationId)).containsAll(messages);
- chatMemory.clear(conversationId);
+ this.chatMemory.clear(conversationId);
- assertThat(chatMemory.get(conversationId)).isEmpty();
+ assertThat(this.chatMemory.get(conversationId)).isEmpty();
}
@Test
@@ -71,53 +72,53 @@ void handleSingleMessageInConversation() {
String conversationId = UUID.randomUUID().toString();
Message message = new UserMessage("Hello");
- chatMemory.add(conversationId, message);
+ this.chatMemory.add(conversationId, message);
- assertThat(chatMemory.get(conversationId)).contains(message);
+ assertThat(this.chatMemory.get(conversationId)).contains(message);
- chatMemory.clear(conversationId);
+ this.chatMemory.clear(conversationId);
- assertThat(chatMemory.get(conversationId)).isEmpty();
+ assertThat(this.chatMemory.get(conversationId)).isEmpty();
}
@Test
void nullConversationIdNotAllowed() {
- assertThatThrownBy(() -> chatMemory.add(null, List.of(new UserMessage("Hello"))))
+ assertThatThrownBy(() -> this.chatMemory.add(null, List.of(new UserMessage("Hello"))))
.isInstanceOf(IllegalArgumentException.class)
.hasMessageContaining("conversationId cannot be null or empty");
- assertThatThrownBy(() -> chatMemory.add(null, new UserMessage("Hello")))
+ assertThatThrownBy(() -> this.chatMemory.add(null, new UserMessage("Hello")))
.isInstanceOf(IllegalArgumentException.class)
.hasMessageContaining("conversationId cannot be null or empty");
- assertThatThrownBy(() -> chatMemory.get(null)).isInstanceOf(IllegalArgumentException.class)
+ assertThatThrownBy(() -> this.chatMemory.get(null)).isInstanceOf(IllegalArgumentException.class)
.hasMessageContaining("conversationId cannot be null or empty");
- assertThatThrownBy(() -> chatMemory.clear(null)).isInstanceOf(IllegalArgumentException.class)
+ assertThatThrownBy(() -> this.chatMemory.clear(null)).isInstanceOf(IllegalArgumentException.class)
.hasMessageContaining("conversationId cannot be null or empty");
}
@Test
void emptyConversationIdNotAllowed() {
- assertThatThrownBy(() -> chatMemory.add("", List.of(new UserMessage("Hello"))))
+ assertThatThrownBy(() -> this.chatMemory.add("", List.of(new UserMessage("Hello"))))
.isInstanceOf(IllegalArgumentException.class)
.hasMessageContaining("conversationId cannot be null or empty");
- assertThatThrownBy(() -> chatMemory.add(null, new UserMessage("Hello")))
+ assertThatThrownBy(() -> this.chatMemory.add(null, new UserMessage("Hello")))
.isInstanceOf(IllegalArgumentException.class)
.hasMessageContaining("conversationId cannot be null or empty");
- assertThatThrownBy(() -> chatMemory.get("")).isInstanceOf(IllegalArgumentException.class)
+ assertThatThrownBy(() -> this.chatMemory.get("")).isInstanceOf(IllegalArgumentException.class)
.hasMessageContaining("conversationId cannot be null or empty");
- assertThatThrownBy(() -> chatMemory.clear("")).isInstanceOf(IllegalArgumentException.class)
+ assertThatThrownBy(() -> this.chatMemory.clear("")).isInstanceOf(IllegalArgumentException.class)
.hasMessageContaining("conversationId cannot be null or empty");
}
@Test
void nullMessagesNotAllowed() {
String conversationId = UUID.randomUUID().toString();
- assertThatThrownBy(() -> chatMemory.add(conversationId, (List) null))
+ assertThatThrownBy(() -> this.chatMemory.add(conversationId, (List) null))
.isInstanceOf(IllegalArgumentException.class)
.hasMessageContaining("messages cannot be null");
}
@@ -125,7 +126,7 @@ void nullMessagesNotAllowed() {
@Test
void nullMessageNotAllowed() {
String conversationId = UUID.randomUUID().toString();
- assertThatThrownBy(() -> chatMemory.add(conversationId, (Message) null))
+ assertThatThrownBy(() -> this.chatMemory.add(conversationId, (Message) null))
.isInstanceOf(IllegalArgumentException.class)
.hasMessageContaining("message cannot be null");
}
@@ -136,7 +137,7 @@ void messagesWithNullElementsNotAllowed() {
List messagesWithNull = new ArrayList<>();
messagesWithNull.add(null);
- assertThatThrownBy(() -> chatMemory.add(conversationId, messagesWithNull))
+ assertThatThrownBy(() -> this.chatMemory.add(conversationId, messagesWithNull))
.isInstanceOf(IllegalArgumentException.class)
.hasMessageContaining("messages cannot contain null elements");
}
diff --git a/spring-ai-model/src/test/java/org/springframework/ai/chat/messages/MessageUtilsTests.java b/spring-ai-model/src/test/java/org/springframework/ai/chat/messages/MessageUtilsTests.java
index 9fee140b12c..c60befb3443 100644
--- a/spring-ai-model/src/test/java/org/springframework/ai/chat/messages/MessageUtilsTests.java
+++ b/spring-ai-model/src/test/java/org/springframework/ai/chat/messages/MessageUtilsTests.java
@@ -16,10 +16,11 @@
package org.springframework.ai.chat.messages;
+import java.nio.charset.StandardCharsets;
+
import org.junit.jupiter.api.Test;
-import org.springframework.core.io.ClassPathResource;
-import java.nio.charset.StandardCharsets;
+import org.springframework.core.io.ClassPathResource;
import static org.assertj.core.api.Assertions.assertThat;
import static org.assertj.core.api.Assertions.assertThatThrownBy;
diff --git a/spring-ai-model/src/test/java/org/springframework/ai/chat/messages/SystemMessageTests.java b/spring-ai-model/src/test/java/org/springframework/ai/chat/messages/SystemMessageTests.java
index 188a9816617..c722e14e55b 100644
--- a/spring-ai-model/src/test/java/org/springframework/ai/chat/messages/SystemMessageTests.java
+++ b/spring-ai-model/src/test/java/org/springframework/ai/chat/messages/SystemMessageTests.java
@@ -16,14 +16,16 @@
package org.springframework.ai.chat.messages;
+import java.util.Map;
+
import org.junit.jupiter.api.Test;
+
import org.springframework.core.io.ClassPathResource;
import org.springframework.core.io.Resource;
-import java.util.Map;
-
import static org.assertj.core.api.Assertions.assertThat;
-import static org.junit.jupiter.api.Assertions.*;
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertThrows;
import static org.springframework.ai.chat.messages.AbstractMessage.MESSAGE_TYPE;
/**
diff --git a/spring-ai-model/src/test/java/org/springframework/ai/chat/messages/UserMessageTests.java b/spring-ai-model/src/test/java/org/springframework/ai/chat/messages/UserMessageTests.java
index 26bb59718bd..0887a7e4d71 100644
--- a/spring-ai-model/src/test/java/org/springframework/ai/chat/messages/UserMessageTests.java
+++ b/spring-ai-model/src/test/java/org/springframework/ai/chat/messages/UserMessageTests.java
@@ -16,14 +16,15 @@
package org.springframework.ai.chat.messages;
+import java.util.Map;
+
import org.junit.jupiter.api.Test;
+
import org.springframework.ai.content.Media;
import org.springframework.core.io.ClassPathResource;
import org.springframework.core.io.Resource;
import org.springframework.util.MimeTypeUtils;
-import java.util.Map;
-
import static org.assertj.core.api.Assertions.assertThat;
import static org.assertj.core.api.Assertions.assertThatThrownBy;
import static org.springframework.ai.chat.messages.AbstractMessage.MESSAGE_TYPE;
@@ -39,7 +40,6 @@ class UserMessageTests {
void userMessageWithNullText() {
assertThatThrownBy(() -> new UserMessage((String) null)).isInstanceOf(IllegalArgumentException.class)
.hasMessageContaining("Content must not be null for SYSTEM or USER messages");
- ;
}
@Test
@@ -55,7 +55,6 @@ void userMessageWithTextContent() {
void userMessageWithNullResource() {
assertThatThrownBy(() -> new UserMessage((Resource) null)).isInstanceOf(IllegalArgumentException.class)
.hasMessageContaining("resource cannot be null");
- ;
}
@Test
diff --git a/spring-ai-model/src/test/java/org/springframework/ai/chat/observation/ChatModelCompletionObservationHandlerTests.java b/spring-ai-model/src/test/java/org/springframework/ai/chat/observation/ChatModelCompletionObservationHandlerTests.java
index 4b204b7e5ad..69f4f902369 100644
--- a/spring-ai-model/src/test/java/org/springframework/ai/chat/observation/ChatModelCompletionObservationHandlerTests.java
+++ b/spring-ai-model/src/test/java/org/springframework/ai/chat/observation/ChatModelCompletionObservationHandlerTests.java
@@ -16,9 +16,12 @@
package org.springframework.ai.chat.observation;
+import java.util.List;
+
import io.micrometer.observation.Observation;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.ExtendWith;
+
import org.springframework.ai.chat.messages.AssistantMessage;
import org.springframework.ai.chat.model.ChatResponse;
import org.springframework.ai.chat.model.Generation;
@@ -27,8 +30,6 @@
import org.springframework.boot.test.system.CapturedOutput;
import org.springframework.boot.test.system.OutputCaptureExtension;
-import java.util.List;
-
import static org.assertj.core.api.Assertions.assertThat;
/**
@@ -63,7 +64,7 @@ void whenEmptyResponseThenOutputNothing(CapturedOutput output) {
.prompt(generatePrompt(ChatOptions.builder().model("mistral").build()))
.provider("superprovider")
.build();
- observationHandler.onStop(context);
+ this.observationHandler.onStop(context);
assertThat(output).contains("""
Chat Model Completion:
[]
@@ -77,7 +78,7 @@ void whenEmptyCompletionThenOutputNothing(CapturedOutput output) {
.provider("superprovider")
.build();
context.setResponse(new ChatResponse(List.of(new Generation(new AssistantMessage("")))));
- observationHandler.onStop(context);
+ this.observationHandler.onStop(context);
assertThat(output).contains("""
Chat Model Completion:
[]
@@ -92,7 +93,7 @@ void whenCompletionWithTextThenOutputIt(CapturedOutput output) {
.build();
context.setResponse(new ChatResponse(List.of(new Generation(new AssistantMessage("say please")),
new Generation(new AssistantMessage("seriously, say please")))));
- observationHandler.onStop(context);
+ this.observationHandler.onStop(context);
assertThat(output).contains("""
Chat Model Completion:
["say please", "seriously, say please"]
diff --git a/spring-ai-model/src/test/java/org/springframework/ai/chat/observation/ChatModelObservationContextTests.java b/spring-ai-model/src/test/java/org/springframework/ai/chat/observation/ChatModelObservationContextTests.java
index 37f3dc85836..e1b64b9dfff 100644
--- a/spring-ai-model/src/test/java/org/springframework/ai/chat/observation/ChatModelObservationContextTests.java
+++ b/spring-ai-model/src/test/java/org/springframework/ai/chat/observation/ChatModelObservationContextTests.java
@@ -22,7 +22,6 @@
import org.springframework.ai.chat.prompt.Prompt;
import static org.assertj.core.api.Assertions.assertThat;
-import static org.assertj.core.api.Assertions.assertThatThrownBy;
/**
* Unit tests for {@link ChatModelObservationContext}.
diff --git a/spring-ai-model/src/test/java/org/springframework/ai/chat/observation/ChatModelPromptContentObservationHandlerTests.java b/spring-ai-model/src/test/java/org/springframework/ai/chat/observation/ChatModelPromptContentObservationHandlerTests.java
index e48c5f729bd..dd885c397ee 100644
--- a/spring-ai-model/src/test/java/org/springframework/ai/chat/observation/ChatModelPromptContentObservationHandlerTests.java
+++ b/spring-ai-model/src/test/java/org/springframework/ai/chat/observation/ChatModelPromptContentObservationHandlerTests.java
@@ -16,9 +16,12 @@
package org.springframework.ai.chat.observation;
+import java.util.List;
+
import io.micrometer.observation.Observation;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.ExtendWith;
+
import org.springframework.ai.chat.messages.SystemMessage;
import org.springframework.ai.chat.messages.UserMessage;
import org.springframework.ai.chat.prompt.ChatOptions;
@@ -26,8 +29,6 @@
import org.springframework.boot.test.system.CapturedOutput;
import org.springframework.boot.test.system.OutputCaptureExtension;
-import java.util.List;
-
import static org.assertj.core.api.Assertions.assertThat;
/**
@@ -44,7 +45,7 @@ class ChatModelPromptContentObservationHandlerTests {
@Test
void whenNotSupportedObservationContextThenReturnFalse() {
var context = new Observation.Context();
- assertThat(observationHandler.supportsContext(context)).isFalse();
+ assertThat(this.observationHandler.supportsContext(context)).isFalse();
}
@Test
@@ -53,7 +54,7 @@ void whenSupportedObservationContextThenReturnTrue() {
.prompt(new Prompt(List.of(), ChatOptions.builder().model("mistral").build()))
.provider("superprovider")
.build();
- assertThat(observationHandler.supportsContext(context)).isTrue();
+ assertThat(this.observationHandler.supportsContext(context)).isTrue();
}
@Test
@@ -62,7 +63,7 @@ void whenEmptyPromptThenOutputNothing(CapturedOutput output) {
.prompt(new Prompt(List.of(), ChatOptions.builder().model("mistral").build()))
.provider("superprovider")
.build();
- observationHandler.onStop(context);
+ this.observationHandler.onStop(context);
assertThat(output).contains("""
Chat Model Prompt Content:
[]
@@ -75,7 +76,7 @@ void whenPromptWithTextThenOutputIt(CapturedOutput output) {
.prompt(new Prompt("supercalifragilisticexpialidocious", ChatOptions.builder().model("mistral").build()))
.provider("superprovider")
.build();
- observationHandler.onStop(context);
+ this.observationHandler.onStop(context);
assertThat(output).contains("""
Chat Model Prompt Content:
["supercalifragilisticexpialidocious"]
@@ -91,7 +92,7 @@ void whenPromptWithMessagesThenOutputIt(CapturedOutput output) {
ChatOptions.builder().model("mistral").build()))
.provider("superprovider")
.build();
- observationHandler.onStop(context);
+ this.observationHandler.onStop(context);
assertThat(output).contains("""
Chat Model Prompt Content:
["you're a chimney sweep", "supercalifragilisticexpialidocious"]
diff --git a/spring-ai-model/src/test/java/org/springframework/ai/chat/prompt/PromptTemplateBuilderTests.java b/spring-ai-model/src/test/java/org/springframework/ai/chat/prompt/PromptTemplateBuilderTests.java
index 7695647c36d..249d980c615 100644
--- a/spring-ai-model/src/test/java/org/springframework/ai/chat/prompt/PromptTemplateBuilderTests.java
+++ b/spring-ai-model/src/test/java/org/springframework/ai/chat/prompt/PromptTemplateBuilderTests.java
@@ -13,6 +13,7 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
+
package org.springframework.ai.chat.prompt;
import java.util.HashMap;
diff --git a/spring-ai-model/src/test/java/org/springframework/ai/chat/prompt/PromptTemplateTests.java b/spring-ai-model/src/test/java/org/springframework/ai/chat/prompt/PromptTemplateTests.java
index a58290ffe16..ecd33e0317d 100644
--- a/spring-ai-model/src/test/java/org/springframework/ai/chat/prompt/PromptTemplateTests.java
+++ b/spring-ai-model/src/test/java/org/springframework/ai/chat/prompt/PromptTemplateTests.java
@@ -282,18 +282,6 @@ void variablesOverwriting_Builder() {
assertThat(promptTemplate.render()).isEqualTo("Hello Overwritten Day!");
}
- // Helper Custom Renderer for testing
- private static class CustomTestRenderer implements TemplateRenderer {
-
- @Override
- public String apply(String template, Map model) {
- // Simple renderer that just appends a marker
- // Note: This simple renderer ignores the model map for test purposes.
- return template + " (Rendered by Custom)";
- }
-
- }
-
@Test
void customRenderer_Builder() {
String template = "This is a test.";
@@ -318,4 +306,16 @@ void resource_Builder() {
assertThat(promptTemplate.render()).isEqualTo("Hello Builder from Resource!");
}
+ // Helper Custom Renderer for testing
+ private static class CustomTestRenderer implements TemplateRenderer {
+
+ @Override
+ public String apply(String template, Map model) {
+ // Simple renderer that just appends a marker
+ // Note: This simple renderer ignores the model map for test purposes.
+ return template + " (Rendered by Custom)";
+ }
+
+ }
+
}
diff --git a/spring-ai-model/src/test/java/org/springframework/ai/chat/prompt/PromptTests.java b/spring-ai-model/src/test/java/org/springframework/ai/chat/prompt/PromptTests.java
index a9e8f84ecef..db88c270103 100644
--- a/spring-ai-model/src/test/java/org/springframework/ai/chat/prompt/PromptTests.java
+++ b/spring-ai-model/src/test/java/org/springframework/ai/chat/prompt/PromptTests.java
@@ -16,13 +16,14 @@
package org.springframework.ai.chat.prompt;
+import java.util.List;
+
import org.junit.jupiter.api.Test;
+
import org.springframework.ai.chat.messages.Message;
import org.springframework.ai.chat.messages.SystemMessage;
import org.springframework.ai.chat.messages.UserMessage;
-import java.util.List;
-
import static org.assertj.core.api.Assertions.assertThat;
import static org.assertj.core.api.Assertions.assertThatThrownBy;
diff --git a/spring-ai-model/src/test/java/org/springframework/ai/embedding/observation/DefaultEmbeddingModelObservationConventionTests.java b/spring-ai-model/src/test/java/org/springframework/ai/embedding/observation/DefaultEmbeddingModelObservationConventionTests.java
index ba5c6467da6..b69863d5e20 100644
--- a/spring-ai-model/src/test/java/org/springframework/ai/embedding/observation/DefaultEmbeddingModelObservationConventionTests.java
+++ b/spring-ai-model/src/test/java/org/springframework/ai/embedding/observation/DefaultEmbeddingModelObservationConventionTests.java
@@ -22,7 +22,6 @@
import io.micrometer.common.KeyValue;
import io.micrometer.observation.Observation;
-import org.jetbrains.annotations.NotNull;
import org.junit.jupiter.api.Test;
import org.springframework.ai.chat.metadata.Usage;
diff --git a/spring-ai-model/src/test/java/org/springframework/ai/embedding/observation/EmbeddingModelObservationContextTests.java b/spring-ai-model/src/test/java/org/springframework/ai/embedding/observation/EmbeddingModelObservationContextTests.java
index 780e881a43b..ff4d68cbae0 100644
--- a/spring-ai-model/src/test/java/org/springframework/ai/embedding/observation/EmbeddingModelObservationContextTests.java
+++ b/spring-ai-model/src/test/java/org/springframework/ai/embedding/observation/EmbeddingModelObservationContextTests.java
@@ -25,7 +25,6 @@
import org.springframework.ai.embedding.EmbeddingRequest;
import static org.assertj.core.api.Assertions.assertThat;
-import static org.assertj.core.api.Assertions.assertThatThrownBy;
/**
* Unit tests for {@link EmbeddingModelObservationContext}.
diff --git a/spring-ai-model/src/test/java/org/springframework/ai/image/observation/ImageModelObservationContextTests.java b/spring-ai-model/src/test/java/org/springframework/ai/image/observation/ImageModelObservationContextTests.java
index 7e45fbb401b..36b06a1f52c 100644
--- a/spring-ai-model/src/test/java/org/springframework/ai/image/observation/ImageModelObservationContextTests.java
+++ b/spring-ai-model/src/test/java/org/springframework/ai/image/observation/ImageModelObservationContextTests.java
@@ -23,7 +23,6 @@
import org.springframework.ai.image.ImagePrompt;
import static org.assertj.core.api.Assertions.assertThat;
-import static org.assertj.core.api.Assertions.assertThatThrownBy;
/**
* Unit tests for {@link ImageModelObservationContext}.
diff --git a/spring-ai-model/src/test/java/org/springframework/ai/image/observation/ImageModelPromptContentObservationHandlerTests.java b/spring-ai-model/src/test/java/org/springframework/ai/image/observation/ImageModelPromptContentObservationHandlerTests.java
index 529506012d4..f420f64bfe5 100644
--- a/spring-ai-model/src/test/java/org/springframework/ai/image/observation/ImageModelPromptContentObservationHandlerTests.java
+++ b/spring-ai-model/src/test/java/org/springframework/ai/image/observation/ImageModelPromptContentObservationHandlerTests.java
@@ -16,17 +16,18 @@
package org.springframework.ai.image.observation;
+import java.util.List;
+
import io.micrometer.observation.Observation;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.ExtendWith;
+
import org.springframework.ai.image.ImageMessage;
import org.springframework.ai.image.ImageOptionsBuilder;
import org.springframework.ai.image.ImagePrompt;
import org.springframework.boot.test.system.CapturedOutput;
import org.springframework.boot.test.system.OutputCaptureExtension;
-import java.util.List;
-
import static org.assertj.core.api.Assertions.assertThat;
/**
@@ -61,7 +62,7 @@ void whenEmptyPromptThenOutputNothing(CapturedOutput output) {
.imagePrompt(new ImagePrompt("", ImageOptionsBuilder.builder().model("mistral").build()))
.provider("superprovider")
.build();
- observationHandler.onStop(context);
+ this.observationHandler.onStop(context);
assertThat(output).contains("""
Image Model Prompt Content:
[""]
@@ -75,7 +76,7 @@ void whenPromptWithTextThenOutputIt(CapturedOutput output) {
ImageOptionsBuilder.builder().model("mistral").build()))
.provider("superprovider")
.build();
- observationHandler.onStop(context);
+ this.observationHandler.onStop(context);
assertThat(output).contains("""
Image Model Prompt Content:
["supercalifragilisticexpialidocious"]
@@ -91,7 +92,7 @@ void whenPromptWithMessagesThenOutputIt(CapturedOutput output) {
ImageOptionsBuilder.builder().model("mistral").build()))
.provider("superprovider")
.build();
- observationHandler.onStop(context);
+ this.observationHandler.onStop(context);
assertThat(output).contains("""
Image Model Prompt Content:
["you're a chimney sweep", "supercalifragilisticexpialidocious"]
diff --git a/spring-ai-model/src/test/java/org/springframework/ai/model/ModelOptionsUtilsTests.java b/spring-ai-model/src/test/java/org/springframework/ai/model/ModelOptionsUtilsTests.java
index 6235c9d12f8..8cc2b9bd87e 100644
--- a/spring-ai-model/src/test/java/org/springframework/ai/model/ModelOptionsUtilsTests.java
+++ b/spring-ai-model/src/test/java/org/springframework/ai/model/ModelOptionsUtilsTests.java
@@ -19,16 +19,15 @@
import java.util.Map;
import com.fasterxml.jackson.annotation.JsonProperty;
+import com.fasterxml.jackson.databind.DeserializationFeature;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import com.fasterxml.jackson.databind.SerializationFeature;
+import com.fasterxml.jackson.databind.json.JsonMapper;
import org.junit.jupiter.api.Test;
import static org.assertj.core.api.Assertions.assertThat;
import static org.assertj.core.api.Assertions.assertThatThrownBy;
-import com.fasterxml.jackson.databind.DeserializationFeature;
-import com.fasterxml.jackson.databind.ObjectMapper;
-import com.fasterxml.jackson.databind.json.JsonMapper;
-import com.fasterxml.jackson.databind.SerializationFeature;
-
/**
* @author Christian Tzolov
*/
@@ -170,14 +169,6 @@ public void pojo_emptyStringAsNullObject() throws Exception {
// Person.class)).isInstanceOf(Exception.class);
}
- public static class Person {
-
- public String name;
-
- public Integer age;
-
- }
-
@Test
public void getJsonPropertyValues() {
record TestRecord(@JsonProperty("field1") String fieldA, @JsonProperty("field2") String fieldB) {
@@ -187,6 +178,14 @@ record TestRecord(@JsonProperty("field1") String fieldA, @JsonProperty("field2")
assertThat(ModelOptionsUtils.getJsonPropertyValues(TestRecord.class)).containsExactly("field1", "field2");
}
+ public static class Person {
+
+ public String name;
+
+ public Integer age;
+
+ }
+
public interface TestPortableOptions extends ModelOptions {
String getName();
diff --git a/spring-ai-model/src/test/java/org/springframework/ai/model/tool/DefaultToolCallingManagerIT.java b/spring-ai-model/src/test/java/org/springframework/ai/model/tool/DefaultToolCallingManagerIT.java
index e35d5a9a8b6..d7d6dd10050 100644
--- a/spring-ai-model/src/test/java/org/springframework/ai/model/tool/DefaultToolCallingManagerIT.java
+++ b/spring-ai-model/src/test/java/org/springframework/ai/model/tool/DefaultToolCallingManagerIT.java
@@ -16,10 +16,14 @@
package org.springframework.ai.model.tool;
+import java.util.List;
+import java.util.Map;
+
import io.micrometer.observation.tck.TestObservationRegistry;
import io.micrometer.observation.tck.TestObservationRegistryAssert;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
+
import org.springframework.ai.chat.messages.AssistantMessage;
import org.springframework.ai.chat.metadata.ChatResponseMetadata;
import org.springframework.ai.chat.model.ChatResponse;
@@ -39,9 +43,6 @@
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.context.annotation.Bean;
-import java.util.List;
-import java.util.Map;
-
import static org.assertj.core.api.Assertions.assertThat;
/**
@@ -76,7 +77,7 @@ void observationForToolCall() {
List.of(new AssistantMessage.ToolCall("toolA", "function", "toolA", "{}"))))))
.build();
- ToolExecutionResult toolExecutionResult = toolCallingManager.executeToolCalls(prompt, chatResponse);
+ ToolExecutionResult toolExecutionResult = this.toolCallingManager.executeToolCalls(prompt, chatResponse);
assertThat(toolExecutionResult).isNotNull();
diff --git a/spring-ai-model/src/test/java/org/springframework/ai/tool/method/MethodToolCallbackGenericTypesTest.java b/spring-ai-model/src/test/java/org/springframework/ai/tool/method/MethodToolCallbackGenericTypesTest.java
index aaadaf5fc00..9b1baeac431 100644
--- a/spring-ai-model/src/test/java/org/springframework/ai/tool/method/MethodToolCallbackGenericTypesTest.java
+++ b/spring-ai-model/src/test/java/org/springframework/ai/tool/method/MethodToolCallbackGenericTypesTest.java
@@ -55,7 +55,7 @@ void testGenericListType() throws Exception {
// Create a JSON input with a list of strings
String toolInput = """
{
- "strings": ["one", "two", "three"]
+ "strings": ["one", "two", "three"]
}
""";
@@ -89,7 +89,7 @@ void testGenericMapType() throws Exception {
// Create a JSON input with a map of string to integer
String toolInput = """
{
- "map": {"one": 1, "two": 2, "three": 3}
+ "map": {"one": 1, "two": 2, "three": 3}
}
""";
@@ -123,10 +123,10 @@ void testNestedGenericType() throws Exception {
// Create a JSON input with a list of maps
String toolInput = """
{
- "listOfMaps": [
- {"a": 1, "b": 2},
- {"c": 3, "d": 4}
- ]
+ "listOfMaps": [
+ {"a": 1, "b": 2},
+ {"c": 3, "d": 4}
+ ]
}
""";
diff --git a/spring-ai-model/src/test/java/org/springframework/ai/tool/observation/DefaultToolCallingObservationConventionTests.java b/spring-ai-model/src/test/java/org/springframework/ai/tool/observation/DefaultToolCallingObservationConventionTests.java
index ebc71333b2e..788472384a4 100644
--- a/spring-ai-model/src/test/java/org/springframework/ai/tool/observation/DefaultToolCallingObservationConventionTests.java
+++ b/spring-ai-model/src/test/java/org/springframework/ai/tool/observation/DefaultToolCallingObservationConventionTests.java
@@ -19,6 +19,7 @@
import io.micrometer.common.KeyValue;
import io.micrometer.observation.Observation;
import org.junit.jupiter.api.Test;
+
import org.springframework.ai.observation.conventions.AiOperationType;
import org.springframework.ai.observation.conventions.AiProvider;
import org.springframework.ai.observation.conventions.SpringAiKind;
diff --git a/spring-ai-model/src/test/java/org/springframework/ai/tool/observation/ToolCallingContentObservationFilterTests.java b/spring-ai-model/src/test/java/org/springframework/ai/tool/observation/ToolCallingContentObservationFilterTests.java
index b053946a781..f64ab4010ed 100644
--- a/spring-ai-model/src/test/java/org/springframework/ai/tool/observation/ToolCallingContentObservationFilterTests.java
+++ b/spring-ai-model/src/test/java/org/springframework/ai/tool/observation/ToolCallingContentObservationFilterTests.java
@@ -19,6 +19,7 @@
import io.micrometer.common.KeyValue;
import io.micrometer.observation.Observation;
import org.junit.jupiter.api.Test;
+
import org.springframework.ai.tool.definition.ToolDefinition;
import static org.assertj.core.api.Assertions.assertThat;
diff --git a/spring-ai-model/src/test/java/org/springframework/ai/tool/observation/ToolCallingObservationContextTests.java b/spring-ai-model/src/test/java/org/springframework/ai/tool/observation/ToolCallingObservationContextTests.java
index cde5fc1fb9a..da58cb30d62 100644
--- a/spring-ai-model/src/test/java/org/springframework/ai/tool/observation/ToolCallingObservationContextTests.java
+++ b/spring-ai-model/src/test/java/org/springframework/ai/tool/observation/ToolCallingObservationContextTests.java
@@ -17,6 +17,7 @@
package org.springframework.ai.tool.observation;
import org.junit.jupiter.api.Test;
+
import org.springframework.ai.tool.definition.ToolDefinition;
import static org.assertj.core.api.Assertions.assertThat;
diff --git a/spring-ai-model/src/test/java/org/springframework/ai/util/TextBlockAssertion.java b/spring-ai-model/src/test/java/org/springframework/ai/util/TextBlockAssertion.java
index 7d6312142ec..103c000a067 100644
--- a/spring-ai-model/src/test/java/org/springframework/ai/util/TextBlockAssertion.java
+++ b/spring-ai-model/src/test/java/org/springframework/ai/util/TextBlockAssertion.java
@@ -5,7 +5,7 @@
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
- * https://www.apache.org/licenses/LICENSE-2.0
+ * https://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
@@ -33,13 +33,13 @@ public static TextBlockAssertion assertThat(String actual) {
@Override
public TextBlockAssertion isEqualTo(Object expected) {
- Assertions.assertThat(normalizedEOL(actual)).isEqualTo(normalizedEOL((String) expected));
+ Assertions.assertThat(normalizedEOL(this.actual)).isEqualTo(normalizedEOL((String) expected));
return this;
}
@Override
public TextBlockAssertion contains(CharSequence... values) {
- Assertions.assertThat(normalizedEOL(actual)).contains(normalizedEOL(values));
+ Assertions.assertThat(normalizedEOL(this.actual)).contains(normalizedEOL(values));
return this;
}
diff --git a/spring-ai-rag/src/main/java/org/springframework/ai/rag/advisor/RetrievalAugmentationAdvisor.java b/spring-ai-rag/src/main/java/org/springframework/ai/rag/advisor/RetrievalAugmentationAdvisor.java
index c2dbbb6f57a..10cfea33584 100644
--- a/spring-ai-rag/src/main/java/org/springframework/ai/rag/advisor/RetrievalAugmentationAdvisor.java
+++ b/spring-ai-rag/src/main/java/org/springframework/ai/rag/advisor/RetrievalAugmentationAdvisor.java
@@ -25,10 +25,10 @@
import reactor.core.scheduler.Scheduler;
-import org.springframework.ai.chat.client.advisor.api.BaseAdvisor;
import org.springframework.ai.chat.client.ChatClientRequest;
import org.springframework.ai.chat.client.ChatClientResponse;
import org.springframework.ai.chat.client.advisor.api.AdvisorChain;
+import org.springframework.ai.chat.client.advisor.api.BaseAdvisor;
import org.springframework.ai.chat.model.ChatResponse;
import org.springframework.ai.document.Document;
import org.springframework.ai.rag.Query;
diff --git a/spring-ai-rag/src/main/java/org/springframework/ai/rag/postretrieval/document/DocumentPostProcessor.java b/spring-ai-rag/src/main/java/org/springframework/ai/rag/postretrieval/document/DocumentPostProcessor.java
index ce78e272b26..e148d8e5d2a 100644
--- a/spring-ai-rag/src/main/java/org/springframework/ai/rag/postretrieval/document/DocumentPostProcessor.java
+++ b/spring-ai-rag/src/main/java/org/springframework/ai/rag/postretrieval/document/DocumentPostProcessor.java
@@ -16,12 +16,12 @@
package org.springframework.ai.rag.postretrieval.document;
-import org.springframework.ai.document.Document;
-import org.springframework.ai.rag.Query;
-
import java.util.List;
import java.util.function.BiFunction;
+import org.springframework.ai.document.Document;
+import org.springframework.ai.rag.Query;
+
/**
* A component for post-processing retrieved documents based on a query, addressing
* challenges such as "lost-in-the-middle", context length restrictions from the model,
diff --git a/spring-ai-template-st/src/main/java/org/springframework/ai/template/st/StTemplateRenderer.java b/spring-ai-template-st/src/main/java/org/springframework/ai/template/st/StTemplateRenderer.java
index a7f3c9c5475..3780b948a09 100644
--- a/spring-ai-template-st/src/main/java/org/springframework/ai/template/st/StTemplateRenderer.java
+++ b/spring-ai-template-st/src/main/java/org/springframework/ai/template/st/StTemplateRenderer.java
@@ -16,20 +16,21 @@
package org.springframework.ai.template.st;
+import java.util.HashSet;
+import java.util.Map;
+import java.util.Set;
+
import org.antlr.runtime.Token;
import org.antlr.runtime.TokenStream;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
-import org.springframework.ai.template.TemplateRenderer;
-import org.springframework.ai.template.ValidationMode;
-import org.springframework.util.Assert;
import org.stringtemplate.v4.ST;
import org.stringtemplate.v4.compiler.Compiler;
import org.stringtemplate.v4.compiler.STLexer;
-import java.util.HashSet;
-import java.util.Map;
-import java.util.Set;
+import org.springframework.ai.template.TemplateRenderer;
+import org.springframework.ai.template.ValidationMode;
+import org.springframework.util.Assert;
/**
* Renders a template using the StringTemplate (ST) v4 library.
@@ -103,7 +104,7 @@ public String apply(String template, Map variables) {
for (Map.Entry entry : variables.entrySet()) {
st.add(entry.getKey(), entry.getValue());
}
- if (validationMode != ValidationMode.NONE) {
+ if (this.validationMode != ValidationMode.NONE) {
validate(st, variables);
}
return st.render();
@@ -111,7 +112,7 @@ public String apply(String template, Map variables) {
private ST createST(String template) {
try {
- return new ST(template, startDelimiterToken, endDelimiterToken);
+ return new ST(template, this.startDelimiterToken, this.endDelimiterToken);
}
catch (Exception ex) {
throw new IllegalArgumentException("The template string is not valid.", ex);
@@ -132,10 +133,10 @@ private Set validate(ST st, Map templateVariables) {
missingVariables.removeAll(modelKeys);
if (!missingVariables.isEmpty()) {
- if (validationMode == ValidationMode.WARN) {
+ if (this.validationMode == ValidationMode.WARN) {
logger.warn(VALIDATION_MESSAGE.formatted(missingVariables));
}
- else if (validationMode == ValidationMode.THROW) {
+ else if (this.validationMode == ValidationMode.THROW) {
throw new IllegalStateException(VALIDATION_MESSAGE.formatted(missingVariables));
}
}
@@ -187,7 +188,7 @@ public static Builder builder() {
/**
* Builder for configuring and creating {@link StTemplateRenderer} instances.
*/
- public static class Builder {
+ public static final class Builder {
private char startDelimiterToken = DEFAULT_START_DELIMITER_TOKEN;
@@ -258,7 +259,8 @@ public Builder validateStFunctions() {
* @return A configured {@link StTemplateRenderer}.
*/
public StTemplateRenderer build() {
- return new StTemplateRenderer(startDelimiterToken, endDelimiterToken, validationMode, validateStFunctions);
+ return new StTemplateRenderer(this.startDelimiterToken, this.endDelimiterToken, this.validationMode,
+ this.validateStFunctions);
}
}
diff --git a/spring-ai-template-st/src/test/java/org/springframework/ai/template/st/StTemplateRendererEdgeTests.java b/spring-ai-template-st/src/test/java/org/springframework/ai/template/st/StTemplateRendererEdgeTests.java
index 60f310ead1c..d1176385341 100644
--- a/spring-ai-template-st/src/test/java/org/springframework/ai/template/st/StTemplateRendererEdgeTests.java
+++ b/spring-ai-template-st/src/test/java/org/springframework/ai/template/st/StTemplateRendererEdgeTests.java
@@ -16,15 +16,16 @@
package org.springframework.ai.template.st;
-import static org.assertj.core.api.Assertions.assertThat;
-
import java.util.HashMap;
import java.util.Map;
import org.junit.jupiter.api.Disabled;
import org.junit.jupiter.api.Test;
+
import org.springframework.ai.template.ValidationMode;
+import static org.assertj.core.api.Assertions.assertThat;
+
/**
* Additional edge and robustness tests for {@link StTemplateRenderer}.
*/
diff --git a/spring-ai-template-st/src/test/java/org/springframework/ai/template/st/StTemplateRendererTests.java b/spring-ai-template-st/src/test/java/org/springframework/ai/template/st/StTemplateRendererTests.java
index 7d5f86d71c6..4d4e979e869 100644
--- a/spring-ai-template-st/src/test/java/org/springframework/ai/template/st/StTemplateRendererTests.java
+++ b/spring-ai-template-st/src/test/java/org/springframework/ai/template/st/StTemplateRendererTests.java
@@ -16,15 +16,16 @@
package org.springframework.ai.template.st;
-import static org.assertj.core.api.Assertions.assertThat;
-import static org.assertj.core.api.Assertions.assertThatThrownBy;
-
import java.util.HashMap;
import java.util.Map;
import org.junit.jupiter.api.Test;
-import org.springframework.test.util.ReflectionTestUtils;
+
import org.springframework.ai.template.ValidationMode;
+import org.springframework.test.util.ReflectionTestUtils;
+
+import static org.assertj.core.api.Assertions.assertThat;
+import static org.assertj.core.api.Assertions.assertThatThrownBy;
/**
* Unit tests for {@link StTemplateRenderer}.
diff --git a/spring-ai-test/src/main/java/org/springframework/ai/test/CurlyBracketEscaper.java b/spring-ai-test/src/main/java/org/springframework/ai/test/CurlyBracketEscaper.java
index 49e7685533a..78594a214dc 100644
--- a/spring-ai-test/src/main/java/org/springframework/ai/test/CurlyBracketEscaper.java
+++ b/spring-ai-test/src/main/java/org/springframework/ai/test/CurlyBracketEscaper.java
@@ -1,18 +1,19 @@
/*
-* Copyright 2025 - 2025 the original author or authors.
-*
-* Licensed under the Apache License, Version 2.0 (the "License");
-* you may not use this file except in compliance with the License.
-* You may obtain a copy of the License at
-*
-* https://www.apache.org/licenses/LICENSE-2.0
-*
-* Unless required by applicable law or agreed to in writing, software
-* distributed under the License is distributed on an "AS IS" BASIS,
-* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-* See the License for the specific language governing permissions and
-* limitations under the License.
-*/
+ * Copyright 2025-2025 the original author or authors.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * https://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
package org.springframework.ai.test;
/**
@@ -21,7 +22,11 @@
* @author Christian Tzolov
*
*/
-public class CurlyBracketEscaper {
+public final class CurlyBracketEscaper {
+
+ private CurlyBracketEscaper() {
+ // prevents instantiation.
+ }
/**
* Escapes all curly brackets in the input string by adding a backslash before them
@@ -47,4 +52,4 @@ public static String unescapeCurlyBrackets(String input) {
return input.replace("\\{", "{").replace("\\}", "}");
}
-}
\ No newline at end of file
+}
diff --git a/spring-ai-vector-store/src/main/java/org/springframework/ai/vectorstore/observation/VectorStoreQueryResponseObservationHandler.java b/spring-ai-vector-store/src/main/java/org/springframework/ai/vectorstore/observation/VectorStoreQueryResponseObservationHandler.java
index f33f329800b..650c7c545e8 100644
--- a/spring-ai-vector-store/src/main/java/org/springframework/ai/vectorstore/observation/VectorStoreQueryResponseObservationHandler.java
+++ b/spring-ai-vector-store/src/main/java/org/springframework/ai/vectorstore/observation/VectorStoreQueryResponseObservationHandler.java
@@ -16,16 +16,17 @@
package org.springframework.ai.vectorstore.observation;
+import java.util.List;
+
import io.micrometer.observation.Observation;
import io.micrometer.observation.ObservationHandler;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
+
import org.springframework.ai.document.Document;
import org.springframework.ai.observation.ObservabilityHelper;
import org.springframework.util.CollectionUtils;
-import java.util.List;
-
/**
* Handler for emitting the query response content to logs.
*
diff --git a/spring-ai-vector-store/src/test/java/org/springframework/ai/vectorstore/observation/DefaultVectorStoreObservationConventionTests.java b/spring-ai-vector-store/src/test/java/org/springframework/ai/vectorstore/observation/DefaultVectorStoreObservationConventionTests.java
index 89d36f6c576..498d8789f81 100644
--- a/spring-ai-vector-store/src/test/java/org/springframework/ai/vectorstore/observation/DefaultVectorStoreObservationConventionTests.java
+++ b/spring-ai-vector-store/src/test/java/org/springframework/ai/vectorstore/observation/DefaultVectorStoreObservationConventionTests.java
@@ -16,17 +16,18 @@
package org.springframework.ai.vectorstore.observation;
+import java.util.List;
+
import io.micrometer.common.KeyValue;
import io.micrometer.observation.Observation;
import org.junit.jupiter.api.Test;
+
import org.springframework.ai.document.Document;
import org.springframework.ai.observation.conventions.SpringAiKind;
import org.springframework.ai.vectorstore.SearchRequest;
import org.springframework.ai.vectorstore.observation.VectorStoreObservationDocumentation.HighCardinalityKeyNames;
import org.springframework.ai.vectorstore.observation.VectorStoreObservationDocumentation.LowCardinalityKeyNames;
-import java.util.List;
-
import static org.assertj.core.api.Assertions.assertThat;
/**
diff --git a/spring-ai-vector-store/src/test/java/org/springframework/ai/vectorstore/observation/VectorStoreQueryResponseObservationHandlerTests.java b/spring-ai-vector-store/src/test/java/org/springframework/ai/vectorstore/observation/VectorStoreQueryResponseObservationHandlerTests.java
index 6ad8d5d19e7..149f8d75e2f 100644
--- a/spring-ai-vector-store/src/test/java/org/springframework/ai/vectorstore/observation/VectorStoreQueryResponseObservationHandlerTests.java
+++ b/spring-ai-vector-store/src/test/java/org/springframework/ai/vectorstore/observation/VectorStoreQueryResponseObservationHandlerTests.java
@@ -16,15 +16,16 @@
package org.springframework.ai.vectorstore.observation;
+import java.util.List;
+
import io.micrometer.observation.Observation;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.ExtendWith;
+
import org.springframework.ai.document.Document;
import org.springframework.boot.test.system.CapturedOutput;
import org.springframework.boot.test.system.OutputCaptureExtension;
-import java.util.List;
-
import static org.assertj.core.api.Assertions.assertThat;
/**
@@ -54,7 +55,7 @@ void whenSupportedObservationContextThenReturnTrue() {
@Test
void whenEmptyQueryResponseThenOutputNothing(CapturedOutput output) {
var context = VectorStoreObservationContext.builder("db", VectorStoreObservationContext.Operation.ADD).build();
- observationHandler.onStop(context);
+ this.observationHandler.onStop(context);
assertThat(output).contains("""
Vector Store Query Response:
[]
@@ -65,7 +66,7 @@ void whenEmptyQueryResponseThenOutputNothing(CapturedOutput output) {
void whenNonEmptyQueryResponseThenOutputIt(CapturedOutput output) {
var context = VectorStoreObservationContext.builder("db", VectorStoreObservationContext.Operation.ADD).build();
context.setQueryResponse(List.of(new Document("doc1"), new Document("doc2")));
- observationHandler.onStop(context);
+ this.observationHandler.onStop(context);
assertThat(output).contains("""
Vector Store Query Response:
["doc1", "doc2"]
diff --git a/src/checkstyle/checkstyle-suppressions.xml b/src/checkstyle/checkstyle-suppressions.xml
index 8569e8d4bda..1083d78182d 100644
--- a/src/checkstyle/checkstyle-suppressions.xml
+++ b/src/checkstyle/checkstyle-suppressions.xml
@@ -32,6 +32,7 @@
+
@@ -39,6 +40,7 @@
+
diff --git a/src/checkstyle/checkstyle.xml b/src/checkstyle/checkstyle.xml
index 343ae144ac9..b03fd710392 100644
--- a/src/checkstyle/checkstyle.xml
+++ b/src/checkstyle/checkstyle.xml
@@ -20,6 +20,12 @@
"https://checkstyle.org/dtds/configuration_1_3.dtd">
+
+
+
+
+
+
@@ -100,7 +106,7 @@
+ value="org.springframework.ai.chat.messages.AbstractMessage.*, org.springframework.ai.model.openai.autoconfigure.OpenAIAutoConfigurationUtil.*, org.springframework.ai.openai.api.OpenAiApi.ChatCompletionRequest.AudioParameters.Voice.*, org.springframework.ai.mistralai.api.MistralAiModerationApi.*, org.springframework.ai.util.LoggingMarkers.*, org.springframework.ai.embedding.observation.EmbeddingModelObservationDocumentation.*, org.springframework.ai.test.vectorstore.ObservationTestUtil.*, org.springframework.ai.autoconfigure.vectorstore.observation.ObservationTestUtil.*, org.awaitility.Awaitility.*, org.springframework.ai.aot.AiRuntimeHints.*, org.springframework.ai.openai.metadata.support.OpenAiApiResponseHeaders.*, org.springframework.ai.image.observation.ImageModelObservationDocumentation.*, org.springframework.ai.observation.embedding.EmbeddingModelObservationDocumentation.*, org.springframework.aot.hint.predicate.RuntimeHintsPredicates.*, org.springframework.ai.vectorstore.filter.Filter.ExpressionType.*, org.springframework.ai.chat.observation.ChatModelObservationDocumentation.*, org.assertj.core.groups.Tuple.*, org.assertj.core.api.AssertionsForClassTypes.*, org.junit.jupiter.api.Assertions.*, org.assertj.core.api.Assertions.*, org.junit.Assert.*, org.junit.Assume.*, org.junit.internal.matchers.ThrowableMessageMatcher.*, org.hamcrest.CoreMatchers.*, org.hamcrest.Matchers.*, org.springframework.boot.configurationprocessor.ConfigurationMetadataMatchers.*, org.springframework.boot.configurationprocessor.TestCompiler.*, org.springframework.boot.test.autoconfigure.AutoConfigurationImportedCondition.*, org.mockito.Mockito.*, org.mockito.BDDMockito.*, org.mockito.Matchers.*, org.mockito.ArgumentMatchers.*, org.springframework.restdocs.mockmvc.MockMvcRestDocumentation.*, org.springframework.restdocs.hypermedia.HypermediaDocumentation.*, org.springframework.test.web.servlet.request.MockMvcRequestBuilders.*, org.springframework.test.web.servlet.result.MockMvcResultMatchers.*, org.springframework.security.test.web.servlet.request.SecurityMockMvcRequestBuilders.*, org.springframework.security.test.web.servlet.request.SecurityMockMvcRequestPostProcessors.*, org.springframework.security.test.web.servlet.setup.SecurityMockMvcConfigurers.*, org.springframework.hateoas.mvc.ControllerLinkBuilder.linkTo, org.springframework.test.web.client.match.MockRestRequestMatchers.*, org.springframework.test.web.client.response.MockRestResponseCreators.*, org.springframework.web.reactive.function.server.RequestPredicates.*, org.springframework.web.reactive.function.server.RouterFunctions.*, org.springframework.test.web.servlet.setup.MockMvcBuilders.*"/>
diff --git a/vector-stores/spring-ai-azure-cosmos-db-store/src/main/java/org/springframework/ai/vectorstore/cosmosdb/CosmosDBVectorStore.java b/vector-stores/spring-ai-azure-cosmos-db-store/src/main/java/org/springframework/ai/vectorstore/cosmosdb/CosmosDBVectorStore.java
index 662ff522443..ca2a817001a 100644
--- a/vector-stores/spring-ai-azure-cosmos-db-store/src/main/java/org/springframework/ai/vectorstore/cosmosdb/CosmosDBVectorStore.java
+++ b/vector-stores/spring-ai-azure-cosmos-db-store/src/main/java/org/springframework/ai/vectorstore/cosmosdb/CosmosDBVectorStore.java
@@ -19,7 +19,6 @@
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
-import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Optional;
@@ -33,7 +32,6 @@
import com.azure.cosmos.models.CosmosBulkOperations;
import com.azure.cosmos.models.CosmosContainerProperties;
import com.azure.cosmos.models.CosmosItemOperation;
-import com.azure.cosmos.models.CosmosItemResponse;
import com.azure.cosmos.models.CosmosQueryRequestOptions;
import com.azure.cosmos.models.CosmosVectorDataType;
import com.azure.cosmos.models.CosmosVectorDistanceFunction;
@@ -42,7 +40,6 @@
import com.azure.cosmos.models.CosmosVectorIndexSpec;
import com.azure.cosmos.models.CosmosVectorIndexType;
import com.azure.cosmos.models.ExcludedPath;
-import com.azure.cosmos.models.FeedResponse;
import com.azure.cosmos.models.IncludedPath;
import com.azure.cosmos.models.IndexingMode;
import com.azure.cosmos.models.IndexingPolicy;
@@ -53,7 +50,6 @@
import com.azure.cosmos.models.SqlQuerySpec;
import com.azure.cosmos.models.ThroughputProperties;
import com.azure.cosmos.util.CosmosPagedFlux;
-
import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.node.ObjectNode;
diff --git a/vector-stores/spring-ai-azure-cosmos-db-store/src/test/java/org/springframework/ai/vectorstore/cosmosdb/CosmosDBVectorStoreWithMetadataPartitionKeyIT.java b/vector-stores/spring-ai-azure-cosmos-db-store/src/test/java/org/springframework/ai/vectorstore/cosmosdb/CosmosDBVectorStoreWithMetadataPartitionKeyIT.java
index 5ec456871c7..2a46c672dd3 100644
--- a/vector-stores/spring-ai-azure-cosmos-db-store/src/test/java/org/springframework/ai/vectorstore/cosmosdb/CosmosDBVectorStoreWithMetadataPartitionKeyIT.java
+++ b/vector-stores/spring-ai-azure-cosmos-db-store/src/test/java/org/springframework/ai/vectorstore/cosmosdb/CosmosDBVectorStoreWithMetadataPartitionKeyIT.java
@@ -16,6 +16,12 @@
package org.springframework.ai.vectorstore.cosmosdb;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.Optional;
+import java.util.UUID;
+
import com.azure.cosmos.CosmosAsyncClient;
import com.azure.cosmos.CosmosAsyncContainer;
import com.azure.cosmos.CosmosClientBuilder;
@@ -23,6 +29,7 @@
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.condition.EnabledIfEnvironmentVariable;
+
import org.springframework.ai.document.Document;
import org.springframework.ai.embedding.EmbeddingModel;
import org.springframework.ai.transformers.TransformersEmbeddingModel;
@@ -35,12 +42,6 @@
import org.springframework.boot.test.context.runner.ApplicationContextRunner;
import org.springframework.context.annotation.Bean;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-import java.util.Optional;
-import java.util.UUID;
-
import static org.assertj.core.api.Assertions.assertThat;
import static org.assertj.core.api.Assertions.assertThatThrownBy;
diff --git a/vector-stores/spring-ai-chroma-store/src/main/java/org/springframework/ai/chroma/vectorstore/ChromaApi.java b/vector-stores/spring-ai-chroma-store/src/main/java/org/springframework/ai/chroma/vectorstore/ChromaApi.java
index 72495566d91..9c55e6011c5 100644
--- a/vector-stores/spring-ai-chroma-store/src/main/java/org/springframework/ai/chroma/vectorstore/ChromaApi.java
+++ b/vector-stores/spring-ai-chroma-store/src/main/java/org/springframework/ai/chroma/vectorstore/ChromaApi.java
@@ -634,7 +634,7 @@ public Builder objectMapper(ObjectMapper objectMapper) {
}
public ChromaApi build() {
- return new ChromaApi(this.baseUrl, this.restClientBuilder, objectMapper);
+ return new ChromaApi(this.baseUrl, this.restClientBuilder, this.objectMapper);
}
}
diff --git a/vector-stores/spring-ai-chroma-store/src/main/java/org/springframework/ai/chroma/vectorstore/common/ChromaApiConstants.java b/vector-stores/spring-ai-chroma-store/src/main/java/org/springframework/ai/chroma/vectorstore/common/ChromaApiConstants.java
index 80e01975e42..34cc03e7f57 100644
--- a/vector-stores/spring-ai-chroma-store/src/main/java/org/springframework/ai/chroma/vectorstore/common/ChromaApiConstants.java
+++ b/vector-stores/spring-ai-chroma-store/src/main/java/org/springframework/ai/chroma/vectorstore/common/ChromaApiConstants.java
@@ -21,7 +21,7 @@
*
* @author Jonghoon Park
*/
-public class ChromaApiConstants {
+public final class ChromaApiConstants {
public static final String DEFAULT_BASE_URL = "http://localhost:8000";
@@ -31,4 +31,8 @@ public class ChromaApiConstants {
public static final String DEFAULT_COLLECTION_NAME = "SpringAiCollection";
+ private ChromaApiConstants() {
+ // prevents instantiation.
+ }
+
}
diff --git a/vector-stores/spring-ai-chroma-store/src/test/java/org/springframework/ai/chroma/vectorstore/BasicAuthChromaWhereIT.java b/vector-stores/spring-ai-chroma-store/src/test/java/org/springframework/ai/chroma/vectorstore/BasicAuthChromaWhereIT.java
index f6216e05bd5..a24b9904890 100644
--- a/vector-stores/spring-ai-chroma-store/src/test/java/org/springframework/ai/chroma/vectorstore/BasicAuthChromaWhereIT.java
+++ b/vector-stores/spring-ai-chroma-store/src/test/java/org/springframework/ai/chroma/vectorstore/BasicAuthChromaWhereIT.java
@@ -22,8 +22,6 @@
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.condition.EnabledIfEnvironmentVariable;
import org.testcontainers.chromadb.ChromaDBContainer;
-import org.testcontainers.containers.wait.strategy.AbstractWaitStrategy;
-import org.testcontainers.containers.wait.strategy.Wait;
import org.testcontainers.junit.jupiter.Container;
import org.testcontainers.junit.jupiter.Testcontainers;
import org.testcontainers.utility.MountableFile;
diff --git a/vector-stores/spring-ai-chroma-store/src/test/java/org/springframework/ai/chroma/vectorstore/ChromaApiIT.java b/vector-stores/spring-ai-chroma-store/src/test/java/org/springframework/ai/chroma/vectorstore/ChromaApiIT.java
index 5d59526342d..25478fab66d 100644
--- a/vector-stores/spring-ai-chroma-store/src/test/java/org/springframework/ai/chroma/vectorstore/ChromaApiIT.java
+++ b/vector-stores/spring-ai-chroma-store/src/test/java/org/springframework/ai/chroma/vectorstore/ChromaApiIT.java
@@ -22,10 +22,7 @@
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
-import org.springframework.ai.chroma.vectorstore.common.ChromaApiConstants;
import org.testcontainers.chromadb.ChromaDBContainer;
-import org.testcontainers.containers.wait.strategy.AbstractWaitStrategy;
-import org.testcontainers.containers.wait.strategy.Wait;
import org.testcontainers.junit.jupiter.Container;
import org.testcontainers.junit.jupiter.Testcontainers;
@@ -34,6 +31,7 @@
import org.springframework.ai.chroma.vectorstore.ChromaApi.Collection;
import org.springframework.ai.chroma.vectorstore.ChromaApi.GetEmbeddingsRequest;
import org.springframework.ai.chroma.vectorstore.ChromaApi.QueryRequest;
+import org.springframework.ai.chroma.vectorstore.common.ChromaApiConstants;
import org.springframework.ai.document.Document;
import org.springframework.ai.embedding.EmbeddingModel;
import org.springframework.ai.transformers.TransformersEmbeddingModel;
@@ -72,24 +70,24 @@ public class ChromaApiIT {
@BeforeEach
public void beforeEach() {
- var tenant = this.chromaApi.getTenant(defaultTenantName);
+ var tenant = this.chromaApi.getTenant(this.defaultTenantName);
if (tenant == null) {
- this.chromaApi.createTenant(defaultTenantName);
+ this.chromaApi.createTenant(this.defaultTenantName);
}
- var database = this.chromaApi.getDatabase(defaultTenantName, defaultDatabaseName);
+ var database = this.chromaApi.getDatabase(this.defaultTenantName, this.defaultDatabaseName);
if (database == null) {
- this.chromaApi.createDatabase(defaultTenantName, defaultDatabaseName);
+ this.chromaApi.createDatabase(this.defaultTenantName, this.defaultDatabaseName);
}
- this.chromaApi.listCollections(defaultTenantName, defaultDatabaseName)
- .forEach(c -> this.chromaApi.deleteCollection(defaultTenantName, defaultDatabaseName, c.name()));
+ this.chromaApi.listCollections(this.defaultTenantName, this.defaultDatabaseName)
+ .forEach(c -> this.chromaApi.deleteCollection(this.defaultTenantName, this.defaultDatabaseName, c.name()));
}
@Test
public void testClientWithMetadata() {
Map metadata = Map.of("hnsw:space", "cosine", "hnsw:M", 5);
- var newCollection = this.chromaApi.createCollection(defaultTenantName, defaultDatabaseName,
+ var newCollection = this.chromaApi.createCollection(this.defaultTenantName, this.defaultDatabaseName,
new ChromaApi.CreateCollectionRequest("TestCollection", metadata));
assertThat(newCollection).isNotNull();
assertThat(newCollection.name()).isEqualTo("TestCollection");
@@ -97,29 +95,30 @@ public void testClientWithMetadata() {
@Test
public void testClient() {
- var newCollection = this.chromaApi.createCollection(defaultTenantName, defaultDatabaseName,
+ var newCollection = this.chromaApi.createCollection(this.defaultTenantName, this.defaultDatabaseName,
new ChromaApi.CreateCollectionRequest("TestCollection"));
assertThat(newCollection).isNotNull();
assertThat(newCollection.name()).isEqualTo("TestCollection");
- var getCollection = this.chromaApi.getCollection(defaultTenantName, defaultDatabaseName, "TestCollection");
+ var getCollection = this.chromaApi.getCollection(this.defaultTenantName, this.defaultDatabaseName,
+ "TestCollection");
assertThat(getCollection).isNotNull();
assertThat(getCollection.name()).isEqualTo("TestCollection");
assertThat(getCollection.id()).isEqualTo(newCollection.id());
- List collections = this.chromaApi.listCollections(defaultTenantName, defaultDatabaseName);
+ List collections = this.chromaApi.listCollections(this.defaultTenantName, this.defaultDatabaseName);
assertThat(collections).hasSize(1);
assertThat(collections.get(0).id()).isEqualTo(newCollection.id());
- this.chromaApi.deleteCollection(defaultTenantName, defaultDatabaseName, newCollection.name());
- assertThat(this.chromaApi.listCollections(defaultTenantName, defaultDatabaseName)).hasSize(0);
+ this.chromaApi.deleteCollection(this.defaultTenantName, this.defaultDatabaseName, newCollection.name());
+ assertThat(this.chromaApi.listCollections(this.defaultTenantName, this.defaultDatabaseName)).hasSize(0);
}
@Test
public void testCollection() {
- var newCollection = this.chromaApi.createCollection(defaultTenantName, defaultDatabaseName,
+ var newCollection = this.chromaApi.createCollection(this.defaultTenantName, this.defaultDatabaseName,
new ChromaApi.CreateCollectionRequest("TestCollection"));
- assertThat(this.chromaApi.countEmbeddings(defaultTenantName, defaultDatabaseName, newCollection.id()))
+ assertThat(this.chromaApi.countEmbeddings(this.defaultTenantName, this.defaultDatabaseName, newCollection.id()))
.isEqualTo(0);
var addEmbeddingRequest = new AddEmbeddingsRequest(List.of("id1", "id2"),
@@ -127,20 +126,20 @@ public void testCollection() {
List.of(Map.of(), Map.of("key1", "value1", "key2", true, "key3", 23.4)),
List.of("Hello World", "Big World"));
- this.chromaApi.upsertEmbeddings(defaultTenantName, defaultDatabaseName, newCollection.id(),
+ this.chromaApi.upsertEmbeddings(this.defaultTenantName, this.defaultDatabaseName, newCollection.id(),
addEmbeddingRequest);
var addEmbeddingRequest2 = new AddEmbeddingsRequest("id3", new float[] { 3f, 3f, 3f },
Map.of("key1", "value1", "key2", true, "key3", 23.4), "Big World");
- this.chromaApi.upsertEmbeddings(defaultTenantName, defaultDatabaseName, newCollection.id(),
+ this.chromaApi.upsertEmbeddings(this.defaultTenantName, this.defaultDatabaseName, newCollection.id(),
addEmbeddingRequest2);
- assertThat(this.chromaApi.countEmbeddings(defaultTenantName, defaultDatabaseName, newCollection.id()))
+ assertThat(this.chromaApi.countEmbeddings(this.defaultTenantName, this.defaultDatabaseName, newCollection.id()))
.isEqualTo(3);
- var queryResult = this.chromaApi.queryCollection(defaultTenantName, defaultDatabaseName, newCollection.id(),
- new QueryRequest(new float[] { 1f, 1f, 1f }, 3, this.chromaApi.where("""
+ var queryResult = this.chromaApi.queryCollection(this.defaultTenantName, this.defaultDatabaseName,
+ newCollection.id(), new QueryRequest(new float[] { 1f, 1f, 1f }, 3, this.chromaApi.where("""
{
"key2" : { "$eq": true }
}
@@ -149,16 +148,16 @@ public void testCollection() {
assertThat(queryResult.ids().get(0)).containsExactlyInAnyOrder("id2", "id3");
// Update existing embedding.
- this.chromaApi.upsertEmbeddings(defaultTenantName, defaultDatabaseName, newCollection.id(),
+ this.chromaApi.upsertEmbeddings(this.defaultTenantName, this.defaultDatabaseName, newCollection.id(),
new AddEmbeddingsRequest("id3", new float[] { 6f, 6f, 6f },
Map.of("key1", "value2", "key2", false, "key4", 23.4), "Small World"));
- var result = this.chromaApi.getEmbeddings(defaultTenantName, defaultDatabaseName, newCollection.id(),
+ var result = this.chromaApi.getEmbeddings(this.defaultTenantName, this.defaultDatabaseName, newCollection.id(),
new GetEmbeddingsRequest(List.of("id2")));
assertThat(result.ids().get(0)).isEqualTo("id2");
- queryResult = this.chromaApi.queryCollection(defaultTenantName, defaultDatabaseName, newCollection.id(),
- new QueryRequest(new float[] { 1f, 1f, 1f }, 3, this.chromaApi.where("""
+ queryResult = this.chromaApi.queryCollection(this.defaultTenantName, this.defaultDatabaseName,
+ newCollection.id(), new QueryRequest(new float[] { 1f, 1f, 1f }, 3, this.chromaApi.where("""
{
"key2" : { "$eq": true }
}
@@ -170,7 +169,7 @@ public void testCollection() {
@Test
public void testQueryWhere() {
- var collection = this.chromaApi.createCollection(defaultTenantName, defaultDatabaseName,
+ var collection = this.chromaApi.createCollection(this.defaultTenantName, this.defaultDatabaseName,
new ChromaApi.CreateCollectionRequest("TestCollection"));
var add1 = new AddEmbeddingsRequest("id1", new float[] { 1f, 1f, 1f },
@@ -184,15 +183,15 @@ public void testQueryWhere() {
Map.of("country", "BG", "active", false, "price", 40.1, "year", 2023),
"The World is Big and Salvation Lurks Around the Corner");
- this.chromaApi.upsertEmbeddings(defaultTenantName, defaultDatabaseName, collection.id(), add1);
- this.chromaApi.upsertEmbeddings(defaultTenantName, defaultDatabaseName, collection.id(), add2);
- this.chromaApi.upsertEmbeddings(defaultTenantName, defaultDatabaseName, collection.id(), add3);
+ this.chromaApi.upsertEmbeddings(this.defaultTenantName, this.defaultDatabaseName, collection.id(), add1);
+ this.chromaApi.upsertEmbeddings(this.defaultTenantName, this.defaultDatabaseName, collection.id(), add2);
+ this.chromaApi.upsertEmbeddings(this.defaultTenantName, this.defaultDatabaseName, collection.id(), add3);
- assertThat(this.chromaApi.countEmbeddings(defaultTenantName, defaultDatabaseName, collection.id()))
+ assertThat(this.chromaApi.countEmbeddings(this.defaultTenantName, this.defaultDatabaseName, collection.id()))
.isEqualTo(3);
- var queryResult = this.chromaApi.queryCollection(defaultTenantName, defaultDatabaseName, collection.id(),
- new QueryRequest(new float[] { 1f, 1f, 1f }, 3));
+ var queryResult = this.chromaApi.queryCollection(this.defaultTenantName, this.defaultDatabaseName,
+ collection.id(), new QueryRequest(new float[] { 1f, 1f, 1f }, 3));
assertThat(queryResult.ids().get(0)).hasSize(3);
assertThat(queryResult.ids().get(0)).containsExactlyInAnyOrder("id1", "id2", "id3");
@@ -202,7 +201,7 @@ public void testQueryWhere() {
assertThat(chromaEmbeddings).hasSize(3);
assertThat(chromaEmbeddings).hasSize(3);
- queryResult = this.chromaApi.queryCollection(defaultTenantName, defaultDatabaseName, collection.id(),
+ queryResult = this.chromaApi.queryCollection(this.defaultTenantName, this.defaultDatabaseName, collection.id(),
new QueryRequest(new float[] { 1f, 1f, 1f }, 3, this.chromaApi.where("""
{
"$and" : [
@@ -214,7 +213,7 @@ public void testQueryWhere() {
assertThat(queryResult.ids().get(0)).hasSize(2);
assertThat(queryResult.ids().get(0)).containsExactlyInAnyOrder("id1", "id3");
- queryResult = this.chromaApi.queryCollection(defaultTenantName, defaultDatabaseName, collection.id(),
+ queryResult = this.chromaApi.queryCollection(this.defaultTenantName, this.defaultDatabaseName, collection.id(),
new QueryRequest(new float[] { 1f, 1f, 1f }, 3, this.chromaApi.where("""
{
"$and" : [
@@ -232,7 +231,7 @@ public void testQueryWhere() {
void shouldUseExistingCollectionWhenSchemaInitializationDisabled() { // initializeSchema
// is false by
// default.
- var collection = this.chromaApi.createCollection(defaultTenantName, defaultDatabaseName,
+ var collection = this.chromaApi.createCollection(this.defaultTenantName, this.defaultDatabaseName,
new ChromaApi.CreateCollectionRequest("test-collection"));
assertThat(collection).isNotNull();
assertThat(collection.name()).isEqualTo("test-collection");
@@ -254,7 +253,8 @@ void shouldCreateNewCollectionWhenSchemaInitializationEnabled() {
.initializeImmediately(true)
.build();
- var collection = this.chromaApi.getCollection(defaultTenantName, defaultDatabaseName, "new-collection");
+ var collection = this.chromaApi.getCollection(this.defaultTenantName, this.defaultDatabaseName,
+ "new-collection");
assertThat(collection).isNotNull();
assertThat(collection.name()).isEqualTo("new-collection");
diff --git a/vector-stores/spring-ai-chroma-store/src/test/java/org/springframework/ai/chroma/vectorstore/ChromaVectorStoreIT.java b/vector-stores/spring-ai-chroma-store/src/test/java/org/springframework/ai/chroma/vectorstore/ChromaVectorStoreIT.java
index b3252c67341..b65333605ad 100644
--- a/vector-stores/spring-ai-chroma-store/src/test/java/org/springframework/ai/chroma/vectorstore/ChromaVectorStoreIT.java
+++ b/vector-stores/spring-ai-chroma-store/src/test/java/org/springframework/ai/chroma/vectorstore/ChromaVectorStoreIT.java
@@ -25,8 +25,6 @@
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.condition.EnabledIfEnvironmentVariable;
import org.testcontainers.chromadb.ChromaDBContainer;
-import org.testcontainers.containers.wait.strategy.AbstractWaitStrategy;
-import org.testcontainers.containers.wait.strategy.Wait;
import org.testcontainers.junit.jupiter.Container;
import org.testcontainers.junit.jupiter.Testcontainers;
diff --git a/vector-stores/spring-ai-chroma-store/src/test/java/org/springframework/ai/chroma/vectorstore/ChromaVectorStoreObservationIT.java b/vector-stores/spring-ai-chroma-store/src/test/java/org/springframework/ai/chroma/vectorstore/ChromaVectorStoreObservationIT.java
index 693973617b1..d30d6ff49d7 100644
--- a/vector-stores/spring-ai-chroma-store/src/test/java/org/springframework/ai/chroma/vectorstore/ChromaVectorStoreObservationIT.java
+++ b/vector-stores/spring-ai-chroma-store/src/test/java/org/springframework/ai/chroma/vectorstore/ChromaVectorStoreObservationIT.java
@@ -27,8 +27,6 @@
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.condition.EnabledIfEnvironmentVariable;
import org.testcontainers.chromadb.ChromaDBContainer;
-import org.testcontainers.containers.wait.strategy.AbstractWaitStrategy;
-import org.testcontainers.containers.wait.strategy.Wait;
import org.testcontainers.junit.jupiter.Container;
import org.testcontainers.junit.jupiter.Testcontainers;
diff --git a/vector-stores/spring-ai-chroma-store/src/test/java/org/springframework/ai/chroma/vectorstore/TokenSecuredChromaWhereIT.java b/vector-stores/spring-ai-chroma-store/src/test/java/org/springframework/ai/chroma/vectorstore/TokenSecuredChromaWhereIT.java
index 73b38911b07..463ce84fc0b 100644
--- a/vector-stores/spring-ai-chroma-store/src/test/java/org/springframework/ai/chroma/vectorstore/TokenSecuredChromaWhereIT.java
+++ b/vector-stores/spring-ai-chroma-store/src/test/java/org/springframework/ai/chroma/vectorstore/TokenSecuredChromaWhereIT.java
@@ -22,8 +22,6 @@
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.condition.EnabledIfEnvironmentVariable;
import org.testcontainers.chromadb.ChromaDBContainer;
-import org.testcontainers.containers.wait.strategy.AbstractWaitStrategy;
-import org.testcontainers.containers.wait.strategy.Wait;
import org.testcontainers.junit.jupiter.Container;
import org.testcontainers.junit.jupiter.Testcontainers;
diff --git a/vector-stores/spring-ai-pgvector-store/src/test/java/org/springframework/ai/vectorstore/pgvector/PgVectorStoreAutoTruncationIT.java b/vector-stores/spring-ai-pgvector-store/src/test/java/org/springframework/ai/vectorstore/pgvector/PgVectorStoreAutoTruncationIT.java
index a35106b1d07..819c72f294b 100644
--- a/vector-stores/spring-ai-pgvector-store/src/test/java/org/springframework/ai/vectorstore/pgvector/PgVectorStoreAutoTruncationIT.java
+++ b/vector-stores/spring-ai-pgvector-store/src/test/java/org/springframework/ai/vectorstore/pgvector/PgVectorStoreAutoTruncationIT.java
@@ -51,7 +51,7 @@
import org.springframework.jdbc.core.JdbcTemplate;
import static org.assertj.core.api.Assertions.assertThat;
-import static org.junit.Assert.assertThrows;
+import static org.assertj.core.api.Assertions.assertThatThrownBy;
import static org.junit.jupiter.api.Assertions.assertDoesNotThrow;
/**
@@ -147,9 +147,8 @@ public void testExceedingArtificialLimit() {
Document massiveDocument = new Document(massiveContent);
// This should throw an exception as it exceeds our configured limit
- assertThrows(IllegalArgumentException.class, () -> {
- batchingStrategy.batch(List.of(massiveDocument));
- });
+ assertThatThrownBy(() -> batchingStrategy.batch(List.of(massiveDocument)))
+ .isInstanceOf(IllegalArgumentException.class);
dropTable(context);
});
diff --git a/vector-stores/spring-ai-pgvector-store/src/test/java/org/springframework/ai/vectorstore/pgvector/PgVectorStoreVectorStoreChatMemoryAdvisorIT.java b/vector-stores/spring-ai-pgvector-store/src/test/java/org/springframework/ai/vectorstore/pgvector/PgVectorStoreVectorStoreChatMemoryAdvisorIT.java
index ccc91f22df3..9a84f71b28d 100644
--- a/vector-stores/spring-ai-pgvector-store/src/test/java/org/springframework/ai/vectorstore/pgvector/PgVectorStoreVectorStoreChatMemoryAdvisorIT.java
+++ b/vector-stores/spring-ai-pgvector-store/src/test/java/org/springframework/ai/vectorstore/pgvector/PgVectorStoreVectorStoreChatMemoryAdvisorIT.java
@@ -79,7 +79,7 @@ void testUseCustomConversationId() throws Exception {
.of(new Document("Hello from memory", java.util.Map.of("conversationId", conversationId))));
// Build ChatClient with VectorStoreChatMemoryAdvisor
- ChatClient chatClient = ChatClient.builder(chatModel)
+ ChatClient chatClient = ChatClient.builder(this.chatModel)
.defaultAdvisors(VectorStoreChatMemoryAdvisor.builder(store).build())
.build();
@@ -117,7 +117,7 @@ void testSemanticSearchRetrievesRelevantMemory() throws Exception {
java.util.Map.of("conversationId", conversationId)),
new Document("Dogs are loyal pets.", java.util.Map.of("conversationId", conversationId))));
- ChatClient chatClient = ChatClient.builder(chatModel)
+ ChatClient chatClient = ChatClient.builder(this.chatModel)
.defaultAdvisors(VectorStoreChatMemoryAdvisor.builder(store).defaultTopK(1).build())
.build();
@@ -153,7 +153,7 @@ void testSemanticSynonymRetrieval() throws Exception {
store.add(java.util.List
.of(new Document("Automobiles are fast.", java.util.Map.of("conversationId", conversationId))));
- ChatClient chatClient = ChatClient.builder(chatModel)
+ ChatClient chatClient = ChatClient.builder(this.chatModel)
.defaultAdvisors(VectorStoreChatMemoryAdvisor.builder(store).defaultTopK(1).build())
.build();
@@ -185,7 +185,7 @@ void testIrrelevantMessageExclusion() throws Exception {
new Document("The capital of Italy is Rome.", java.util.Map.of("conversationId", conversationId)),
new Document("Bananas are yellow.", java.util.Map.of("conversationId", conversationId))));
- ChatClient chatClient = ChatClient.builder(chatModel)
+ ChatClient chatClient = ChatClient.builder(this.chatModel)
.defaultAdvisors(VectorStoreChatMemoryAdvisor.builder(store).defaultTopK(2).build())
.build();
@@ -219,7 +219,7 @@ void testTopKSemanticRelevance() throws Exception {
java.util.Map.of("conversationId", conversationId)),
new Document("Dogs are loyal pets.", java.util.Map.of("conversationId", conversationId))));
- ChatClient chatClient = ChatClient.builder(chatModel)
+ ChatClient chatClient = ChatClient.builder(this.chatModel)
.defaultAdvisors(VectorStoreChatMemoryAdvisor.builder(store).defaultTopK(1).build())
.build();
@@ -250,7 +250,7 @@ void testSemanticRetrievalWithParaphrasing() throws Exception {
store.add(java.util.List.of(new Document("The quick brown fox jumps over the lazy dog.",
java.util.Map.of("conversationId", conversationId))));
- ChatClient chatClient = ChatClient.builder(chatModel)
+ ChatClient chatClient = ChatClient.builder(this.chatModel)
.defaultAdvisors(VectorStoreChatMemoryAdvisor.builder(store).defaultTopK(1).build())
.build();
@@ -282,7 +282,7 @@ void testMultipleRelevantMemoriesTopK() throws Exception {
new Document("Strawberries are also red.", java.util.Map.of("conversationId", conversationId)),
new Document("Bananas are yellow.", java.util.Map.of("conversationId", conversationId))));
- ChatClient chatClient = ChatClient.builder(chatModel)
+ ChatClient chatClient = ChatClient.builder(this.chatModel)
.defaultAdvisors(VectorStoreChatMemoryAdvisor.builder(store).defaultTopK(2).build())
.build();
@@ -314,7 +314,7 @@ void testNoRelevantMemory() throws Exception {
store.add(java.util.List
.of(new Document("The sun is a star.", java.util.Map.of("conversationId", conversationId))));
- ChatClient chatClient = ChatClient.builder(chatModel)
+ ChatClient chatClient = ChatClient.builder(this.chatModel)
.defaultAdvisors(VectorStoreChatMemoryAdvisor.builder(store).defaultTopK(1).build())
.build();