diff --git a/document-readers/pdf-reader/src/main/java/org/springframework/ai/reader/pdf/PagePdfDocumentReader.java b/document-readers/pdf-reader/src/main/java/org/springframework/ai/reader/pdf/PagePdfDocumentReader.java index 9af7cf4e8..724f7ee5c 100644 --- a/document-readers/pdf-reader/src/main/java/org/springframework/ai/reader/pdf/PagePdfDocumentReader.java +++ b/document-readers/pdf-reader/src/main/java/org/springframework/ai/reader/pdf/PagePdfDocumentReader.java @@ -22,10 +22,11 @@ import java.util.ArrayList; import java.util.List; import java.util.stream.Collectors; -import org.apache.commons.logging.LogFactory; import org.apache.pdfbox.pdfparser.PDFParser; import org.apache.pdfbox.pdmodel.PDDocument; import org.apache.pdfbox.pdmodel.PDPage; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import org.springframework.ai.document.Document; import org.springframework.ai.document.DocumentReader; @@ -33,7 +34,6 @@ import org.springframework.ai.reader.pdf.config.PdfDocumentReaderConfig; import org.springframework.ai.reader.pdf.layout.PDFLayoutTextStripperByArea; import org.springframework.core.io.DefaultResourceLoader; import org.springframework.core.io.Resource; -import org.springframework.core.log.LogAccessor; import org.springframework.util.CollectionUtils; import org.springframework.util.StringUtils; @@ -55,10 +55,10 @@ public class PagePdfDocumentReader implements DocumentReader { private static final String PDF_PAGE_REGION = "pdfPageRegion"; - private static final LogAccessor logger = new LogAccessor(LogFactory.getLog(PagePdfDocumentReader.class)); - protected final PDDocument document; + private final Logger logger = LoggerFactory.getLogger(getClass()); + protected String resourceFileName; private PdfDocumentReaderConfig config; @@ -112,7 +112,7 @@ public class PagePdfDocumentReader implements DocumentReader { for (PDPage page : this.document.getDocumentCatalog().getPages()) { lastPage = page; if (counter % logFrequency == 0 && counter / logFrequency < 10) { - logger.info("Processing PDF page: " + (counter + 1)); + logger.info("Processing PDF page: {}", (counter + 1)); } counter++; @@ -154,7 +154,7 @@ public class PagePdfDocumentReader implements DocumentReader { readDocuments.add(toDocument(lastPage, pageTextGroupList.stream().collect(Collectors.joining()), startPageNumber, pageNumber)); } - logger.info("Processing " + totalPages + " pages"); + logger.info("Processing {} pages", totalPages); return readDocuments; } diff --git a/document-readers/pdf-reader/src/main/java/org/springframework/ai/reader/pdf/ParagraphPdfDocumentReader.java b/document-readers/pdf-reader/src/main/java/org/springframework/ai/reader/pdf/ParagraphPdfDocumentReader.java index 1c3e173a2..95863fff6 100644 --- a/document-readers/pdf-reader/src/main/java/org/springframework/ai/reader/pdf/ParagraphPdfDocumentReader.java +++ b/document-readers/pdf-reader/src/main/java/org/springframework/ai/reader/pdf/ParagraphPdfDocumentReader.java @@ -23,6 +23,8 @@ import java.util.List; import org.apache.pdfbox.pdfparser.PDFParser; import org.apache.pdfbox.pdmodel.PDDocument; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import org.springframework.ai.document.Document; import org.springframework.ai.document.DocumentReader; @@ -32,7 +34,6 @@ import org.springframework.ai.reader.pdf.config.PdfDocumentReaderConfig; import org.springframework.ai.reader.pdf.layout.PDFLayoutTextStripperByArea; import org.springframework.core.io.DefaultResourceLoader; import org.springframework.core.io.Resource; -import org.springframework.core.log.LogAccessor; import org.springframework.util.CollectionUtils; import org.springframework.util.StringUtils; @@ -61,7 +62,7 @@ public class ParagraphPdfDocumentReader implements DocumentReader { protected final PDDocument document; - private static final LogAccessor logger = new LogAccessor(ParagraphPdfDocumentReader.class); + private final Logger logger = LoggerFactory.getLogger(getClass()); private final ParagraphManager paragraphTextExtractor; diff --git a/models/spring-ai-anthropic/pom.xml b/models/spring-ai-anthropic/pom.xml index 5b32e0d1f..0cf4bbc9d 100644 --- a/models/spring-ai-anthropic/pom.xml +++ b/models/spring-ai-anthropic/pom.xml @@ -77,6 +77,11 @@ spring-context-support + + org.slf4j + slf4j-api + + org.springframework.ai diff --git a/models/spring-ai-anthropic/src/main/java/org/springframework/ai/anthropic/AnthropicChatModel.java b/models/spring-ai-anthropic/src/main/java/org/springframework/ai/anthropic/AnthropicChatModel.java index b1287e7ee..94fe45595 100644 --- a/models/spring-ai-anthropic/src/main/java/org/springframework/ai/anthropic/AnthropicChatModel.java +++ b/models/spring-ai-anthropic/src/main/java/org/springframework/ai/anthropic/AnthropicChatModel.java @@ -27,6 +27,8 @@ import java.util.stream.Collectors; import io.micrometer.observation.Observation; import io.micrometer.observation.ObservationRegistry; import io.micrometer.observation.contextpropagation.ObservationThreadLocalAccessor; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import reactor.core.publisher.Flux; import reactor.core.publisher.Mono; @@ -65,7 +67,6 @@ import org.springframework.ai.model.function.FunctionCallback; import org.springframework.ai.model.function.FunctionCallbackResolver; import org.springframework.ai.model.function.FunctionCallingOptions; import org.springframework.ai.retry.RetryUtils; -import org.springframework.core.log.LogAccessor; import org.springframework.http.ResponseEntity; import org.springframework.retry.support.RetryTemplate; import org.springframework.util.Assert; @@ -91,7 +92,7 @@ public class AnthropicChatModel extends AbstractToolCallSupport implements ChatM public static final Double DEFAULT_TEMPERATURE = 0.8; - private static final LogAccessor logger = new LogAccessor(AnthropicChatModel.class); + private static final Logger logger = LoggerFactory.getLogger(AnthropicChatModel.class); private static final ChatModelObservationConvention DEFAULT_OBSERVATION_CONVENTION = new DefaultChatModelObservationConvention(); diff --git a/models/spring-ai-anthropic/src/test/java/org/springframework/ai/anthropic/AnthropicChatModelIT.java b/models/spring-ai-anthropic/src/test/java/org/springframework/ai/anthropic/AnthropicChatModelIT.java index dca4c7ddb..a006d802c 100644 --- a/models/spring-ai-anthropic/src/test/java/org/springframework/ai/anthropic/AnthropicChatModelIT.java +++ b/models/spring-ai-anthropic/src/test/java/org/springframework/ai/anthropic/AnthropicChatModelIT.java @@ -27,6 +27,8 @@ import org.junit.jupiter.api.Test; import org.junit.jupiter.api.condition.EnabledIfEnvironmentVariable; import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.provider.ValueSource; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import reactor.core.publisher.Flux; import org.springframework.ai.anthropic.api.AnthropicApi; @@ -57,7 +59,6 @@ import org.springframework.context.annotation.Bean; import org.springframework.core.convert.support.DefaultConversionService; import org.springframework.core.io.ClassPathResource; import org.springframework.core.io.Resource; -import org.springframework.core.log.LogAccessor; import org.springframework.util.MimeType; import org.springframework.util.MimeTypeUtils; import org.springframework.util.StringUtils; @@ -68,7 +69,7 @@ import static org.assertj.core.api.Assertions.assertThat; @EnabledIfEnvironmentVariable(named = "ANTHROPIC_API_KEY", matches = ".+") class AnthropicChatModelIT { - private static final LogAccessor logger = new LogAccessor(AnthropicChatModelIT.class); + private static final Logger logger = LoggerFactory.getLogger(AnthropicChatModelIT.class); @Autowired protected ChatModel chatModel; @@ -282,7 +283,7 @@ class AnthropicChatModelIT { ChatResponse response = this.chatModel.call(new Prompt(messages, promptOptions)); - logger.info("Response: " + response); + logger.info("Response: {}", response); Generation generation = response.getResult(); assertThat(generation).isNotNull(); @@ -321,7 +322,7 @@ class AnthropicChatModelIT { .map(cr -> cr.getResult().getOutput().getText()) .collect(Collectors.joining()); - logger.info("Response: " + content); + logger.info("Response: {}", content); assertThat(content).contains("30", "10", "15"); } @@ -346,7 +347,7 @@ class AnthropicChatModelIT { ChatResponse chatResponse = responseFlux.last().block(); - logger.info("Response: " + chatResponse); + logger.info("Response: {}", chatResponse); Usage usage = chatResponse.getMetadata().getUsage(); assertThat(usage).isNotNull(); diff --git a/models/spring-ai-anthropic/src/test/java/org/springframework/ai/anthropic/EventParsingTests.java b/models/spring-ai-anthropic/src/test/java/org/springframework/ai/anthropic/EventParsingTests.java index e5d90d9e9..9cd11068b 100644 --- a/models/spring-ai-anthropic/src/test/java/org/springframework/ai/anthropic/EventParsingTests.java +++ b/models/spring-ai-anthropic/src/test/java/org/springframework/ai/anthropic/EventParsingTests.java @@ -23,10 +23,11 @@ import java.util.List; import com.fasterxml.jackson.core.type.TypeReference; import com.fasterxml.jackson.databind.ObjectMapper; import org.junit.jupiter.api.Test; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import org.springframework.ai.anthropic.api.AnthropicApi.StreamEvent; import org.springframework.core.io.DefaultResourceLoader; -import org.springframework.core.log.LogAccessor; import static org.assertj.core.api.Assertions.assertThat; @@ -36,7 +37,7 @@ import static org.assertj.core.api.Assertions.assertThat; */ public class EventParsingTests { - private static final LogAccessor logger = new LogAccessor(EventParsingTests.class); + private static final Logger logger = LoggerFactory.getLogger(EventParsingTests.class); @Test public void readEvents() throws IOException { diff --git a/models/spring-ai-anthropic/src/test/java/org/springframework/ai/anthropic/api/tool/AnthropicApiLegacyToolIT.java b/models/spring-ai-anthropic/src/test/java/org/springframework/ai/anthropic/api/tool/AnthropicApiLegacyToolIT.java index 3cffa70f8..0be31a138 100644 --- a/models/spring-ai-anthropic/src/test/java/org/springframework/ai/anthropic/api/tool/AnthropicApiLegacyToolIT.java +++ b/models/spring-ai-anthropic/src/test/java/org/springframework/ai/anthropic/api/tool/AnthropicApiLegacyToolIT.java @@ -22,6 +22,8 @@ import java.util.function.Function; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.condition.EnabledIfEnvironmentVariable; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import org.springframework.ai.anthropic.api.AnthropicApi; import org.springframework.ai.anthropic.api.AnthropicApi.AnthropicMessage; @@ -34,7 +36,6 @@ import org.springframework.ai.anthropic.api.tool.XmlHelper.Tools; import org.springframework.ai.anthropic.api.tool.XmlHelper.Tools.ToolDescription; import org.springframework.ai.anthropic.api.tool.XmlHelper.Tools.ToolDescription.Parameter; import org.springframework.ai.model.ModelOptionsUtils; -import org.springframework.core.log.LogAccessor; import org.springframework.http.ResponseEntity; import static org.assertj.core.api.Assertions.assertThat; @@ -80,7 +81,7 @@ public class AnthropicApiLegacyToolIT { public static final ConcurrentHashMap FUNCTIONS = new ConcurrentHashMap<>(); - private static final LogAccessor logger = new LogAccessor(AnthropicApiLegacyToolIT.class); + private static final Logger logger = LoggerFactory.getLogger(AnthropicApiLegacyToolIT.class); AnthropicApi anthropicApi = new AnthropicApi(System.getenv("ANTHROPIC_API_KEY")); diff --git a/models/spring-ai-anthropic/src/test/java/org/springframework/ai/anthropic/api/tool/AnthropicApiToolIT.java b/models/spring-ai-anthropic/src/test/java/org/springframework/ai/anthropic/api/tool/AnthropicApiToolIT.java index 0ffeaccd7..079a01b3c 100644 --- a/models/spring-ai-anthropic/src/test/java/org/springframework/ai/anthropic/api/tool/AnthropicApiToolIT.java +++ b/models/spring-ai-anthropic/src/test/java/org/springframework/ai/anthropic/api/tool/AnthropicApiToolIT.java @@ -23,6 +23,8 @@ import java.util.function.Function; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.condition.EnabledIfEnvironmentVariable; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import org.springframework.ai.anthropic.api.AnthropicApi; import org.springframework.ai.anthropic.api.AnthropicApi.AnthropicMessage; @@ -33,7 +35,6 @@ import org.springframework.ai.anthropic.api.AnthropicApi.ContentBlock.Type; import org.springframework.ai.anthropic.api.AnthropicApi.Role; import org.springframework.ai.anthropic.api.AnthropicApi.Tool; import org.springframework.ai.model.ModelOptionsUtils; -import org.springframework.core.log.LogAccessor; import org.springframework.http.ResponseEntity; import org.springframework.util.CollectionUtils; @@ -55,7 +56,7 @@ public class AnthropicApiToolIT { public static final ConcurrentHashMap FUNCTIONS = new ConcurrentHashMap<>(); - private static final LogAccessor logger = new LogAccessor(AnthropicApiToolIT.class); + private static final Logger logger = LoggerFactory.getLogger(AnthropicApiToolIT.class); AnthropicApi anthropicApi = new AnthropicApi(System.getenv("ANTHROPIC_API_KEY")); diff --git a/models/spring-ai-anthropic/src/test/java/org/springframework/ai/anthropic/client/AnthropicChatClientIT.java b/models/spring-ai-anthropic/src/test/java/org/springframework/ai/anthropic/client/AnthropicChatClientIT.java index f03a24ccc..f685b190a 100644 --- a/models/spring-ai-anthropic/src/test/java/org/springframework/ai/anthropic/client/AnthropicChatClientIT.java +++ b/models/spring-ai-anthropic/src/test/java/org/springframework/ai/anthropic/client/AnthropicChatClientIT.java @@ -28,6 +28,8 @@ import org.junit.jupiter.api.Test; import org.junit.jupiter.api.condition.EnabledIfEnvironmentVariable; import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.provider.ValueSource; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import reactor.core.publisher.Flux; import org.springframework.ai.anthropic.AnthropicChatOptions; @@ -48,7 +50,6 @@ import org.springframework.core.ParameterizedTypeReference; import org.springframework.core.convert.support.DefaultConversionService; import org.springframework.core.io.ClassPathResource; import org.springframework.core.io.Resource; -import org.springframework.core.log.LogAccessor; import org.springframework.test.context.ActiveProfiles; import org.springframework.util.MimeTypeUtils; @@ -59,7 +60,7 @@ import static org.assertj.core.api.Assertions.assertThat; @ActiveProfiles("logging-test") class AnthropicChatClientIT { - private static final LogAccessor logger = new LogAccessor(AnthropicChatClientIT.class); + private static final Logger logger = LoggerFactory.getLogger(AnthropicChatClientIT.class); @Autowired ChatModel chatModel; @@ -218,7 +219,7 @@ class AnthropicChatClientIT { .content(); // @formatter:on - logger.info("Response: " + response); + logger.info("Response: {}", response); assertThat(response).contains("30", "10", "15"); } @@ -236,7 +237,7 @@ class AnthropicChatClientIT { .content(); // @formatter:on - logger.info("Response: " + response); + logger.info("Response: {}", response); assertThat(response).contains("30", "10", "15"); } @@ -257,7 +258,7 @@ class AnthropicChatClientIT { .content(); // @formatter:on - logger.info("Response: " + response); + logger.info("Response: {}", response); assertThat(response).contains("30", "10", "15"); } @@ -277,7 +278,7 @@ class AnthropicChatClientIT { // @formatter:on String content = response.collectList().block().stream().collect(Collectors.joining()); - logger.info("Response: " + content); + logger.info("Response: {}", content); assertThat(content).contains("30", "10", "15"); } @@ -339,7 +340,7 @@ class AnthropicChatClientIT { String content = response.collectList().block().stream().collect(Collectors.joining()); - logger.info("Response: " + content); + logger.info("Response: {}", content); assertThat(content).contains("bananas", "apple"); assertThat(content).containsAnyOf("bowl", "basket"); } diff --git a/models/spring-ai-anthropic/src/test/java/org/springframework/ai/anthropic/client/AnthropicChatClientMethodInvokingFunctionCallbackIT.java b/models/spring-ai-anthropic/src/test/java/org/springframework/ai/anthropic/client/AnthropicChatClientMethodInvokingFunctionCallbackIT.java index d1a72e5e3..8828c7ffe 100644 --- a/models/spring-ai-anthropic/src/test/java/org/springframework/ai/anthropic/client/AnthropicChatClientMethodInvokingFunctionCallbackIT.java +++ b/models/spring-ai-anthropic/src/test/java/org/springframework/ai/anthropic/client/AnthropicChatClientMethodInvokingFunctionCallbackIT.java @@ -23,6 +23,8 @@ import java.util.concurrent.ConcurrentHashMap; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.condition.EnabledIfEnvironmentVariable; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import org.springframework.ai.anthropic.AnthropicTestConfiguration; import org.springframework.ai.chat.client.ChatClient; @@ -34,7 +36,6 @@ import org.springframework.ai.tool.definition.ToolDefinition; import org.springframework.ai.tool.method.MethodToolCallback; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; -import org.springframework.core.log.LogAccessor; import org.springframework.test.context.ActiveProfiles; import org.springframework.util.ReflectionUtils; @@ -47,8 +48,8 @@ import static org.assertj.core.api.AssertionsForClassTypes.assertThatThrownBy; @SuppressWarnings("null") class AnthropicChatClientMethodInvokingFunctionCallbackIT { - private static final LogAccessor logger = new LogAccessor( - AnthropicChatClientMethodInvokingFunctionCallbackIT.class); + private static final Logger logger = LoggerFactory + .getLogger(AnthropicChatClientMethodInvokingFunctionCallbackIT.class); public static Map arguments = new ConcurrentHashMap<>(); @@ -74,7 +75,7 @@ class AnthropicChatClientMethodInvokingFunctionCallbackIT { .content(); // @formatter:on - logger.info("Response: " + response); + logger.info("Response: {}", response); assertThat(response).contains("30", "10", "15"); } @@ -98,7 +99,7 @@ class AnthropicChatClientMethodInvokingFunctionCallbackIT { .content(); // @formatter:on - logger.info("Response: " + response); + logger.info("Response: {}", response); assertThat(response).contains("30", "10", "15"); } @@ -126,7 +127,7 @@ class AnthropicChatClientMethodInvokingFunctionCallbackIT { .content(); // @formatter:on - logger.info("Response: " + response); + logger.info("Response: {}", response); assertThat(arguments).containsEntry("roomName", "living room"); assertThat(arguments).containsEntry("on", true); @@ -154,7 +155,7 @@ class AnthropicChatClientMethodInvokingFunctionCallbackIT { .content(); // @formatter:on - logger.info("Response: " + response); + logger.info("Response: {}", response); assertThat(response).contains("30", "10", "15"); } @@ -181,7 +182,7 @@ class AnthropicChatClientMethodInvokingFunctionCallbackIT { .call() .content(); - logger.info("Response: " + response); + logger.info("Response: {}", response); assertThat(response).contains("30", "10", "15"); assertThat(arguments).containsEntry("tool", "value"); @@ -238,7 +239,7 @@ class AnthropicChatClientMethodInvokingFunctionCallbackIT { .content(); // @formatter:on - logger.info("Response: " + response); + logger.info("Response: {}", response); assertThat(arguments).containsEntry("turnLivingRoomLightOn", true); } @@ -256,7 +257,7 @@ class AnthropicChatClientMethodInvokingFunctionCallbackIT { .content(); // @formatter:on - logger.info("Response:" + response); + logger.info("Response: {}", response); assertThat(arguments).containsEntry("roomName", "living room") .containsEntry("color", TestFunctionClass.LightColor.RED); @@ -318,7 +319,7 @@ class AnthropicChatClientMethodInvokingFunctionCallbackIT { public void turnLight(String roomName, boolean on) { arguments.put("roomName", roomName); arguments.put("on", on); - logger.info("Turn light in room: " + roomName + " to: " + on); + logger.info("Turn light in room: {} to: {}", roomName, on); } public void turnLivingRoomLightOn() { @@ -335,7 +336,7 @@ class AnthropicChatClientMethodInvokingFunctionCallbackIT { public void changeRoomLightColor(String roomName, LightColor color) { arguments.put("roomName", roomName); arguments.put("color", color); - logger.info("Change light colur in room: " + roomName + " to color: " + color); + logger.info("Change light colur in room: {} to color: {}", roomName, color); } } diff --git a/models/spring-ai-azure-openai/pom.xml b/models/spring-ai-azure-openai/pom.xml index 2203a706c..402bb7a8a 100644 --- a/models/spring-ai-azure-openai/pom.xml +++ b/models/spring-ai-azure-openai/pom.xml @@ -59,6 +59,11 @@ spring-context-support + + org.slf4j + slf4j-api + + org.springframework.ai diff --git a/models/spring-ai-azure-openai/src/main/java/org/springframework/ai/azure/openai/AzureOpenAiEmbeddingModel.java b/models/spring-ai-azure-openai/src/main/java/org/springframework/ai/azure/openai/AzureOpenAiEmbeddingModel.java index f56a0ef1e..a5f5b3357 100644 --- a/models/spring-ai-azure-openai/src/main/java/org/springframework/ai/azure/openai/AzureOpenAiEmbeddingModel.java +++ b/models/spring-ai-azure-openai/src/main/java/org/springframework/ai/azure/openai/AzureOpenAiEmbeddingModel.java @@ -25,6 +25,8 @@ import com.azure.ai.openai.models.Embeddings; import com.azure.ai.openai.models.EmbeddingsOptions; import com.azure.ai.openai.models.EmbeddingsUsage; import io.micrometer.observation.ObservationRegistry; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import org.springframework.ai.chat.metadata.DefaultUsage; import org.springframework.ai.document.Document; @@ -40,7 +42,6 @@ import org.springframework.ai.embedding.observation.EmbeddingModelObservationCon import org.springframework.ai.embedding.observation.EmbeddingModelObservationDocumentation; import org.springframework.ai.model.EmbeddingUtils; import org.springframework.ai.observation.conventions.AiProvider; -import org.springframework.core.log.LogAccessor; import org.springframework.util.Assert; import org.springframework.util.CollectionUtils; @@ -54,7 +55,7 @@ import org.springframework.util.CollectionUtils; */ public class AzureOpenAiEmbeddingModel extends AbstractEmbeddingModel { - private static final LogAccessor logger = new LogAccessor(AzureOpenAiEmbeddingModel.class); + private static final Logger logger = LoggerFactory.getLogger(AzureOpenAiEmbeddingModel.class); private static final EmbeddingModelObservationConvention DEFAULT_OBSERVATION_CONVENTION = new DefaultEmbeddingModelObservationConvention(); diff --git a/models/spring-ai-azure-openai/src/main/java/org/springframework/ai/azure/openai/AzureOpenAiImageModel.java b/models/spring-ai-azure-openai/src/main/java/org/springframework/ai/azure/openai/AzureOpenAiImageModel.java index 676c6952f..88fe6ae6e 100644 --- a/models/spring-ai-azure-openai/src/main/java/org/springframework/ai/azure/openai/AzureOpenAiImageModel.java +++ b/models/spring-ai-azure-openai/src/main/java/org/springframework/ai/azure/openai/AzureOpenAiImageModel.java @@ -29,6 +29,8 @@ 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.slf4j.Logger; +import org.slf4j.LoggerFactory; import org.springframework.ai.azure.openai.metadata.AzureOpenAiImageGenerationMetadata; import org.springframework.ai.azure.openai.metadata.AzureOpenAiImageResponseMetadata; @@ -40,7 +42,6 @@ import org.springframework.ai.image.ImageResponse; import org.springframework.ai.image.ImageResponseMetadata; import org.springframework.ai.model.ModelOptionsUtils; import org.springframework.ai.util.JacksonUtils; -import org.springframework.core.log.LogAccessor; import org.springframework.util.Assert; /** @@ -57,7 +58,7 @@ public class AzureOpenAiImageModel implements ImageModel { private static final String DEFAULT_DEPLOYMENT_NAME = AzureOpenAiImageOptions.DEFAULT_IMAGE_MODEL; - private final LogAccessor logger = new LogAccessor(getClass()); + private final Logger logger = LoggerFactory.getLogger(getClass()); private final OpenAIClient openAIClient; @@ -90,14 +91,14 @@ public class AzureOpenAiImageModel implements ImageModel { ImageGenerationOptions imageGenerationOptions = toOpenAiImageOptions(imagePrompt); String deploymentOrModelName = getDeploymentName(imagePrompt); if (logger.isTraceEnabled()) { - logger.trace("Azure ImageGenerationOptions call " + deploymentOrModelName + " with the following options : " - + toPrettyJson(imageGenerationOptions)); + logger.trace("Azure ImageGenerationOptions call {} with the following options : {} ", deploymentOrModelName, + toPrettyJson(imageGenerationOptions)); } var images = this.openAIClient.getImageGenerations(deploymentOrModelName, imageGenerationOptions); if (logger.isTraceEnabled()) { - logger.trace("Azure ImageGenerations: " + toPrettyJson(images)); + logger.trace("Azure ImageGenerations: {}", toPrettyJson(images)); } List imageGenerations = images.getData().stream().map(entry -> { diff --git a/models/spring-ai-azure-openai/src/test/java/org/springframework/ai/azure/openai/AzureOpenAiChatModelIT.java b/models/spring-ai-azure-openai/src/test/java/org/springframework/ai/azure/openai/AzureOpenAiChatModelIT.java index 2234d3ad6..d9f6e89a2 100644 --- a/models/spring-ai-azure-openai/src/test/java/org/springframework/ai/azure/openai/AzureOpenAiChatModelIT.java +++ b/models/spring-ai-azure-openai/src/test/java/org/springframework/ai/azure/openai/AzureOpenAiChatModelIT.java @@ -29,6 +29,8 @@ import com.azure.ai.openai.OpenAIServiceVersion; import com.azure.core.credential.AzureKeyCredential; import com.azure.core.http.policy.HttpLogOptions; import org.junit.jupiter.api.Test; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import org.springframework.ai.chat.client.ChatClient; import org.springframework.ai.chat.messages.AssistantMessage; @@ -49,7 +51,6 @@ import org.springframework.context.annotation.Bean; import org.springframework.core.convert.support.DefaultConversionService; import org.springframework.core.io.ClassPathResource; import org.springframework.core.io.Resource; -import org.springframework.core.log.LogAccessor; import org.springframework.util.MimeTypeUtils; import static org.assertj.core.api.Assertions.assertThat; @@ -58,7 +59,7 @@ import static org.assertj.core.api.Assertions.assertThat; @RequiresAzureCredentials class AzureOpenAiChatModelIT { - private static final LogAccessor logger = new LogAccessor(AzureOpenAiChatModelIT.class); + private static final Logger logger = LoggerFactory.getLogger(AzureOpenAiChatModelIT.class); @Autowired private AzureOpenAiChatModel chatModel; diff --git a/models/spring-ai-azure-openai/src/test/java/org/springframework/ai/azure/openai/MockAiTestConfiguration.java b/models/spring-ai-azure-openai/src/test/java/org/springframework/ai/azure/openai/MockAiTestConfiguration.java index 9a4f090e2..08d6ae77f 100644 --- a/models/spring-ai-azure-openai/src/test/java/org/springframework/ai/azure/openai/MockAiTestConfiguration.java +++ b/models/spring-ai-azure-openai/src/test/java/org/springframework/ai/azure/openai/MockAiTestConfiguration.java @@ -30,6 +30,8 @@ import okhttp3.mockwebserver.MockResponse; import okhttp3.mockwebserver.MockWebServer; import okhttp3.mockwebserver.RecordedRequest; import okio.Buffer; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import org.springframework.beans.factory.DisposableBean; import org.springframework.beans.factory.FactoryBean; @@ -37,7 +39,6 @@ import org.springframework.beans.factory.InitializingBean; import org.springframework.context.SmartLifecycle; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; -import org.springframework.core.log.LogAccessor; import org.springframework.lang.Nullable; import org.springframework.mock.web.MockHttpServletResponse; import org.springframework.test.web.servlet.MockMvc; @@ -205,7 +206,7 @@ public class MockAiTestConfiguration { */ static class MockWebServerFactoryBean implements FactoryBean, InitializingBean, DisposableBean { - private final LogAccessor logger = new LogAccessor(getClass().getName()); + private final Logger logger = LoggerFactory.getLogger(getClass().getName()); private final Queue queuedResponses = new ConcurrentLinkedDeque<>(); @@ -221,7 +222,7 @@ public class MockAiTestConfiguration { this.dispatcher = dispatcher; } - protected LogAccessor getLogger() { + protected Logger getLogger() { return logger; } @@ -255,8 +256,8 @@ public class MockAiTestConfiguration { this.mockWebServer.shutdown(); } catch (IOException e) { - getLogger().warn("MockWebServer was not shutdown correctly: " + e.getMessage()); - getLogger().trace(e, "MockWebServer shutdown failure"); + getLogger().warn("MockWebServer was not shutdown correctly: {}", e.getMessage()); + getLogger().trace("MockWebServer shutdown failure", e); } } diff --git a/models/spring-ai-azure-openai/src/test/java/org/springframework/ai/azure/openai/function/AzureOpenAiChatModelFunctionCallIT.java b/models/spring-ai-azure-openai/src/test/java/org/springframework/ai/azure/openai/function/AzureOpenAiChatModelFunctionCallIT.java index e25b7a253..e88573d4f 100644 --- a/models/spring-ai-azure-openai/src/test/java/org/springframework/ai/azure/openai/function/AzureOpenAiChatModelFunctionCallIT.java +++ b/models/spring-ai-azure-openai/src/test/java/org/springframework/ai/azure/openai/function/AzureOpenAiChatModelFunctionCallIT.java @@ -27,6 +27,8 @@ import com.azure.ai.openai.OpenAIClientBuilder; import com.azure.ai.openai.models.ChatCompletionStreamOptions; import com.azure.core.credential.AzureKeyCredential; import org.junit.jupiter.api.Test; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import reactor.core.publisher.Flux; import org.springframework.ai.azure.openai.AzureOpenAiChatModel; @@ -43,7 +45,6 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.SpringBootConfiguration; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.context.annotation.Bean; -import org.springframework.core.log.LogAccessor; import org.springframework.util.StringUtils; import static org.assertj.core.api.Assertions.assertThat; @@ -52,7 +53,7 @@ import static org.assertj.core.api.Assertions.assertThat; @RequiresAzureCredentials class AzureOpenAiChatModelFunctionCallIT { - private static final LogAccessor logger = new LogAccessor(AzureOpenAiChatModelFunctionCallIT.class); + private static final Logger logger = LoggerFactory.getLogger(AzureOpenAiChatModelFunctionCallIT.class); @Autowired private String selectedModel; @@ -77,7 +78,7 @@ class AzureOpenAiChatModelFunctionCallIT { ChatResponse response = this.chatModel.call(new Prompt(messages, promptOptions)); - logger.info("Response: " + response); + logger.info("Response: {}", response); assertThat(response.getResult()).isNotNull(); assertThat(response.getResult().getOutput()).isNotNull(); @@ -105,7 +106,7 @@ class AzureOpenAiChatModelFunctionCallIT { ChatResponse response = this.chatModel.call(new Prompt(messages, promptOptions)); - logger.info("Response: " + response); + logger.info("Response: {}", response); assertThat(response.getResult().getOutput().getText()).contains("30", "10", "15"); } @@ -136,7 +137,7 @@ class AzureOpenAiChatModelFunctionCallIT { .map(Generation::getOutput) .map(AssistantMessage::getText) .collect(Collectors.joining()); - logger.info("Response: " + content); + logger.info("Response: {}", content); assertThat(counter.get()).isGreaterThan(30).as("The response should be chunked in more than 30 messages"); @@ -165,7 +166,7 @@ class AzureOpenAiChatModelFunctionCallIT { Flux response = this.chatModel.stream(new Prompt(messages, promptOptions)); ChatResponse chatResponse = response.last().block(); - logger.info("Response: " + chatResponse); + logger.info("Response: {}", chatResponse); assertThat(chatResponse.getMetadata().getUsage().getTotalTokens()).isGreaterThan(600).isLessThan(800); @@ -201,7 +202,7 @@ class AzureOpenAiChatModelFunctionCallIT { .filter(Objects::nonNull) .collect(Collectors.joining()); - logger.info("Response: " + response); + logger.info("Response: {}", response); assertThat(content).contains("30", "10", "15"); } diff --git a/models/spring-ai-bedrock-converse/src/main/java/org/springframework/ai/bedrock/converse/BedrockProxyChatModel.java b/models/spring-ai-bedrock-converse/src/main/java/org/springframework/ai/bedrock/converse/BedrockProxyChatModel.java index 68fd6838f..37afa84de 100644 --- a/models/spring-ai-bedrock-converse/src/main/java/org/springframework/ai/bedrock/converse/BedrockProxyChatModel.java +++ b/models/spring-ai-bedrock-converse/src/main/java/org/springframework/ai/bedrock/converse/BedrockProxyChatModel.java @@ -32,6 +32,8 @@ import java.util.Set; import io.micrometer.observation.Observation; import io.micrometer.observation.ObservationRegistry; import io.micrometer.observation.contextpropagation.ObservationThreadLocalAccessor; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import reactor.core.publisher.Flux; import reactor.core.publisher.Mono; import reactor.core.publisher.Sinks; @@ -99,7 +101,6 @@ import org.springframework.ai.model.function.FunctionCallback; import org.springframework.ai.model.function.FunctionCallbackResolver; import org.springframework.ai.model.function.FunctionCallingOptions; import org.springframework.ai.observation.conventions.AiProvider; -import org.springframework.core.log.LogAccessor; import org.springframework.util.Assert; import org.springframework.util.CollectionUtils; import org.springframework.util.StreamUtils; @@ -133,7 +134,7 @@ import org.springframework.util.StringUtils; */ public class BedrockProxyChatModel extends AbstractToolCallSupport implements ChatModel { - private static final LogAccessor logger = new LogAccessor(BedrockProxyChatModel.class); + private static final Logger logger = LoggerFactory.getLogger(BedrockProxyChatModel.class); private static final ChatModelObservationConvention DEFAULT_OBSERVATION_CONVENTION = new DefaultChatModelObservationConvention(); @@ -199,7 +200,7 @@ public class BedrockProxyChatModel extends AbstractToolCallSupport implements Ch ConverseResponse converseResponse = this.bedrockRuntimeClient.converse(converseRequest); - logger.debug("ConverseResponse: " + converseResponse); + logger.debug("ConverseResponse: {}", converseResponse); var response = this.toChatResponse(converseResponse, perviousChatResponse); @@ -654,7 +655,7 @@ public class BedrockProxyChatModel extends AbstractToolCallSupport implements Ch ConverseStreamResponseHandler.Visitor visitor = ConverseStreamResponseHandler.Visitor.builder() .onDefault(output -> { - logger.debug("Received converse stream output: " + output); + logger.debug("Received converse stream output:{}", output); eventSink.emitNext(output, DEFAULT_EMIT_FAILURE_HANDLER); }) .build(); @@ -666,7 +667,7 @@ public class BedrockProxyChatModel extends AbstractToolCallSupport implements Ch logger.info("Completed streaming response."); }) .onError(error -> { - logger.error(error, "Error handling Bedrock converse stream response"); + logger.error("Error handling Bedrock converse stream response", error); eventSink.emitError(error, DEFAULT_EMIT_FAILURE_HANDLER); }) .build(); diff --git a/models/spring-ai-bedrock-converse/src/test/java/org/springframework/ai/bedrock/converse/BedrockConverseChatClientIT.java b/models/spring-ai-bedrock-converse/src/test/java/org/springframework/ai/bedrock/converse/BedrockConverseChatClientIT.java index 93edb429e..fcd404433 100644 --- a/models/spring-ai-bedrock-converse/src/test/java/org/springframework/ai/bedrock/converse/BedrockConverseChatClientIT.java +++ b/models/spring-ai-bedrock-converse/src/test/java/org/springframework/ai/bedrock/converse/BedrockConverseChatClientIT.java @@ -26,6 +26,8 @@ import java.util.stream.Collectors; import org.junit.jupiter.api.Test; import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.provider.ValueSource; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import reactor.core.publisher.Flux; import org.springframework.ai.chat.client.ChatClient; @@ -43,7 +45,6 @@ import org.springframework.core.ParameterizedTypeReference; import org.springframework.core.convert.support.DefaultConversionService; import org.springframework.core.io.ClassPathResource; import org.springframework.core.io.Resource; -import org.springframework.core.log.LogAccessor; import org.springframework.util.MimeTypeUtils; import static org.assertj.core.api.Assertions.assertThat; @@ -52,7 +53,7 @@ import static org.assertj.core.api.Assertions.assertThat; @RequiresAwsCredentials class BedrockConverseChatClientIT { - private static final LogAccessor logger = new LogAccessor(BedrockConverseChatClientIT.class); + private static final Logger logger = LoggerFactory.getLogger(BedrockConverseChatClientIT.class); @Value("classpath:/prompts/system-message.st") private Resource systemTextResource; @@ -218,7 +219,7 @@ class BedrockConverseChatClientIT { .content(); // @formatter:on - logger.info("Response: " + response); + logger.info("Response: {}", response); assertThat(response).contains("30", "10", "15"); } @@ -252,7 +253,7 @@ class BedrockConverseChatClientIT { assertThat(metadata.getUsage().getTotalTokens()) .isEqualTo(metadata.getUsage().getPromptTokens() + metadata.getUsage().getCompletionTokens()); - logger.info("Response: " + response); + logger.info("Response: {}", response); assertThat(response.getResult().getOutput().getText()).contains("30", "10", "15"); } @@ -272,7 +273,7 @@ class BedrockConverseChatClientIT { .content(); // @formatter:on - logger.info("Response: " + response); + logger.info("Response: {}", response); assertThat(response).contains("30", "10", "15"); } @@ -293,7 +294,7 @@ class BedrockConverseChatClientIT { .content(); // @formatter:on - logger.info("Response: " + response); + logger.info("Response: {}", response); assertThat(response).contains("30", "10", "15"); } @@ -334,7 +335,7 @@ class BedrockConverseChatClientIT { .filter(cr -> cr.getResult() != null) .map(cr -> cr.getResult().getOutput().getText()) .collect(Collectors.joining()); - logger.info("Response: " + content); + logger.info("Response: {}", content); assertThat(content).contains("30", "10", "15"); } @@ -354,7 +355,7 @@ class BedrockConverseChatClientIT { // @formatter:on String content = response.collectList().block().stream().collect(Collectors.joining()); - logger.info("Response: " + content); + logger.info("Response: {}", content); assertThat(content).contains("15"); } @@ -414,7 +415,7 @@ class BedrockConverseChatClientIT { String content = response.collectList().block().stream().collect(Collectors.joining()); - logger.info("Response: " + content); + logger.info("Response: {}", content); assertThat(content).contains("bananas", "apple"); assertThat(content).containsAnyOf("bowl", "basket"); } diff --git a/models/spring-ai-bedrock-converse/src/test/java/org/springframework/ai/bedrock/converse/BedrockProxyChatModelIT.java b/models/spring-ai-bedrock-converse/src/test/java/org/springframework/ai/bedrock/converse/BedrockProxyChatModelIT.java index cf3078adb..f4ffbcbdd 100644 --- a/models/spring-ai-bedrock-converse/src/test/java/org/springframework/ai/bedrock/converse/BedrockProxyChatModelIT.java +++ b/models/spring-ai-bedrock-converse/src/test/java/org/springframework/ai/bedrock/converse/BedrockProxyChatModelIT.java @@ -27,6 +27,8 @@ import org.junit.jupiter.api.Disabled; import org.junit.jupiter.api.Test; import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.provider.ValueSource; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import reactor.core.publisher.Flux; import org.springframework.ai.chat.client.ChatClient; @@ -52,7 +54,6 @@ import org.springframework.boot.test.context.SpringBootTest; import org.springframework.core.convert.support.DefaultConversionService; import org.springframework.core.io.ClassPathResource; import org.springframework.core.io.Resource; -import org.springframework.core.log.LogAccessor; import org.springframework.util.MimeTypeUtils; import static org.assertj.core.api.Assertions.assertThat; @@ -61,7 +62,7 @@ import static org.assertj.core.api.Assertions.assertThat; @RequiresAwsCredentials class BedrockProxyChatModelIT { - private static final LogAccessor logger = new LogAccessor(BedrockProxyChatModelIT.class); + private static final Logger logger = LoggerFactory.getLogger(BedrockProxyChatModelIT.class); @Autowired protected ChatModel chatModel; @@ -261,7 +262,7 @@ class BedrockProxyChatModelIT { ChatResponse response = this.chatModel.call(new Prompt(messages, promptOptions)); - logger.info("Response: " + response); + logger.info("Response: {}", response); Generation generation = response.getResult(); assertThat(generation.getOutput().getText()).contains("30", "10", "15"); @@ -296,7 +297,7 @@ class BedrockProxyChatModelIT { .map(cr -> cr.getResult().getOutput().getText()) .collect(Collectors.joining()); - logger.info("Response: " + content); + logger.info("Response: {}", content); assertThat(content).contains("30", "10", "15"); } diff --git a/models/spring-ai-bedrock-converse/src/test/java/org/springframework/ai/bedrock/converse/client/BedrockNovaChatClientIT.java b/models/spring-ai-bedrock-converse/src/test/java/org/springframework/ai/bedrock/converse/client/BedrockNovaChatClientIT.java index b3d6e0bed..8bd422c08 100644 --- a/models/spring-ai-bedrock-converse/src/test/java/org/springframework/ai/bedrock/converse/client/BedrockNovaChatClientIT.java +++ b/models/spring-ai-bedrock-converse/src/test/java/org/springframework/ai/bedrock/converse/client/BedrockNovaChatClientIT.java @@ -21,6 +21,8 @@ import java.time.Duration; import java.util.Set; import org.junit.jupiter.api.Test; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import software.amazon.awssdk.auth.credentials.EnvironmentVariableCredentialsProvider; import software.amazon.awssdk.regions.Region; @@ -36,7 +38,6 @@ import org.springframework.boot.SpringBootConfiguration; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.context.annotation.Bean; import org.springframework.core.io.ClassPathResource; -import org.springframework.core.log.LogAccessor; import static org.assertj.core.api.Assertions.assertThat; import static org.junit.jupiter.api.Assertions.assertAll; @@ -49,7 +50,7 @@ import static org.junit.jupiter.api.Assertions.assertTrue; @RequiresAwsCredentials public class BedrockNovaChatClientIT { - private static final LogAccessor logger = new LogAccessor(BedrockNovaChatClientIT.class); + private static final Logger logger = LoggerFactory.getLogger(BedrockNovaChatClientIT.class); @Autowired ChatModel chatModel; @@ -165,7 +166,7 @@ public class BedrockNovaChatClientIT { .content(); // @formatter:on - logger.info("Response: " + response); + logger.info("Response: {}", response); assertThat(response).contains("30", "10", "15"); } diff --git a/models/spring-ai-bedrock/src/main/java/org/springframework/ai/bedrock/api/AbstractBedrockApi.java b/models/spring-ai-bedrock/src/main/java/org/springframework/ai/bedrock/api/AbstractBedrockApi.java index 2c22dd58f..024f3f4f7 100644 --- a/models/spring-ai-bedrock/src/main/java/org/springframework/ai/bedrock/api/AbstractBedrockApi.java +++ b/models/spring-ai-bedrock/src/main/java/org/springframework/ai/bedrock/api/AbstractBedrockApi.java @@ -27,6 +27,8 @@ import com.fasterxml.jackson.annotation.JsonInclude.Include; import com.fasterxml.jackson.annotation.JsonProperty; import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.ObjectMapper; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import reactor.core.publisher.Flux; import reactor.core.publisher.Sinks; import reactor.core.publisher.Sinks.EmitFailureHandler; @@ -43,7 +45,6 @@ import software.amazon.awssdk.services.bedrockruntime.model.InvokeModelWithRespo import software.amazon.awssdk.services.bedrockruntime.model.ResponseStream; import org.springframework.ai.model.ModelOptionsUtils; -import org.springframework.core.log.LogAccessor; import org.springframework.util.Assert; /** @@ -66,7 +67,7 @@ import org.springframework.util.Assert; */ public abstract class AbstractBedrockApi { - private static final LogAccessor logger = new LogAccessor(AbstractBedrockApi.class); + private static final Logger logger = LoggerFactory.getLogger(AbstractBedrockApi.class); /** * Default emit failure handler. @@ -289,7 +290,7 @@ public abstract class AbstractBedrockApi { eventSink.emitNext(response, DEFAULT_EMIT_FAILURE_HANDLER); } catch (Exception e) { - logger.error(e, "Failed to unmarshall"); + logger.error("Failed to unmarshall", e); eventSink.emitError(e, DEFAULT_EMIT_FAILURE_HANDLER); } }) diff --git a/models/spring-ai-bedrock/src/main/java/org/springframework/ai/bedrock/titan/BedrockTitanEmbeddingModel.java b/models/spring-ai-bedrock/src/main/java/org/springframework/ai/bedrock/titan/BedrockTitanEmbeddingModel.java index e5dd7f3cd..2eabc32d4 100644 --- a/models/spring-ai-bedrock/src/main/java/org/springframework/ai/bedrock/titan/BedrockTitanEmbeddingModel.java +++ b/models/spring-ai-bedrock/src/main/java/org/springframework/ai/bedrock/titan/BedrockTitanEmbeddingModel.java @@ -1,5 +1,5 @@ /* - * Copyright 2023-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. @@ -20,7 +20,8 @@ import java.util.ArrayList; import java.util.List; import java.util.concurrent.atomic.AtomicInteger; -import org.apache.commons.logging.LogFactory; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import org.springframework.ai.bedrock.titan.api.TitanEmbeddingBedrockApi; import org.springframework.ai.bedrock.titan.api.TitanEmbeddingBedrockApi.TitanEmbeddingRequest; @@ -31,7 +32,6 @@ import org.springframework.ai.embedding.Embedding; import org.springframework.ai.embedding.EmbeddingOptions; import org.springframework.ai.embedding.EmbeddingRequest; import org.springframework.ai.embedding.EmbeddingResponse; -import org.springframework.core.log.LogAccessor; import org.springframework.util.Assert; /** @@ -47,7 +47,7 @@ import org.springframework.util.Assert; */ public class BedrockTitanEmbeddingModel extends AbstractEmbeddingModel { - private static final LogAccessor logger = new LogAccessor(LogFactory.getLog(BedrockTitanEmbeddingModel.class)); + private final Logger logger = LoggerFactory.getLogger(getClass()); private final TitanEmbeddingBedrockApi embeddingApi; diff --git a/models/spring-ai-huggingface/pom.xml b/models/spring-ai-huggingface/pom.xml index 62807b918..753001f80 100644 --- a/models/spring-ai-huggingface/pom.xml +++ b/models/spring-ai-huggingface/pom.xml @@ -72,6 +72,11 @@ spring-context-support + + org.slf4j + slf4j-api + + org.springframework.boot diff --git a/models/spring-ai-minimax/pom.xml b/models/spring-ai-minimax/pom.xml index dd0164d6d..ee9b952bc 100644 --- a/models/spring-ai-minimax/pom.xml +++ b/models/spring-ai-minimax/pom.xml @@ -60,6 +60,11 @@ spring-context-support + + org.slf4j + slf4j-api + + org.springframework.ai diff --git a/models/spring-ai-minimax/src/main/java/org/springframework/ai/minimax/MiniMaxChatModel.java b/models/spring-ai-minimax/src/main/java/org/springframework/ai/minimax/MiniMaxChatModel.java index dcdd24c27..e1660d18a 100644 --- a/models/spring-ai-minimax/src/main/java/org/springframework/ai/minimax/MiniMaxChatModel.java +++ b/models/spring-ai-minimax/src/main/java/org/springframework/ai/minimax/MiniMaxChatModel.java @@ -26,6 +26,8 @@ import java.util.concurrent.ConcurrentHashMap; import io.micrometer.observation.Observation; import io.micrometer.observation.ObservationRegistry; import io.micrometer.observation.contextpropagation.ObservationThreadLocalAccessor; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import reactor.core.publisher.Flux; import reactor.core.publisher.Mono; @@ -64,7 +66,6 @@ import org.springframework.ai.model.function.FunctionCallback; import org.springframework.ai.model.function.FunctionCallbackResolver; import org.springframework.ai.model.function.FunctionCallingOptions; import org.springframework.ai.retry.RetryUtils; -import org.springframework.core.log.LogAccessor; import org.springframework.http.ResponseEntity; import org.springframework.retry.support.RetryTemplate; import org.springframework.util.Assert; @@ -83,7 +84,7 @@ import org.springframework.util.CollectionUtils; */ public class MiniMaxChatModel extends AbstractToolCallSupport implements ChatModel, StreamingChatModel { - private static final LogAccessor logger = new LogAccessor(MiniMaxChatModel.class); + private static final Logger logger = LoggerFactory.getLogger(MiniMaxChatModel.class); private static final ChatModelObservationConvention DEFAULT_OBSERVATION_CONVENTION = new DefaultChatModelObservationConvention(); @@ -228,14 +229,14 @@ public class MiniMaxChatModel extends AbstractToolCallSupport implements ChatMod var chatCompletion = completionEntity.getBody(); if (chatCompletion == null) { - logger.warn("No chat completion returned for prompt: " + prompt); + logger.warn("No chat completion returned for prompt: {}", prompt); return new ChatResponse(List.of()); } List choices = chatCompletion.choices(); if (choices == null) { - logger.warn("No choices returned for prompt: " + prompt + ", because: " - + chatCompletion.baseResponse().message()); + logger.warn("No choices returned for prompt: {}, because: {}}", prompt, + chatCompletion.baseResponse().message()); return new ChatResponse(List.of()); } @@ -328,7 +329,7 @@ public class MiniMaxChatModel extends AbstractToolCallSupport implements ChatMod return new ChatResponse(generations, from(chatCompletion2)); } catch (Exception e) { - logger.error(e, "Error processing chat completion"); + logger.error("Error processing chat completion", e); return new ChatResponse(List.of()); } })); diff --git a/models/spring-ai-minimax/src/main/java/org/springframework/ai/minimax/MiniMaxEmbeddingModel.java b/models/spring-ai-minimax/src/main/java/org/springframework/ai/minimax/MiniMaxEmbeddingModel.java index 5860d31e0..fec3b0c31 100644 --- a/models/spring-ai-minimax/src/main/java/org/springframework/ai/minimax/MiniMaxEmbeddingModel.java +++ b/models/spring-ai-minimax/src/main/java/org/springframework/ai/minimax/MiniMaxEmbeddingModel.java @@ -20,6 +20,8 @@ import java.util.ArrayList; import java.util.List; import io.micrometer.observation.ObservationRegistry; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import org.springframework.ai.chat.metadata.DefaultUsage; import org.springframework.ai.document.Document; @@ -38,7 +40,6 @@ import org.springframework.ai.minimax.api.MiniMaxApi; import org.springframework.ai.minimax.api.MiniMaxApiConstants; import org.springframework.ai.model.ModelOptionsUtils; import org.springframework.ai.retry.RetryUtils; -import org.springframework.core.log.LogAccessor; import org.springframework.lang.Nullable; import org.springframework.retry.support.RetryTemplate; import org.springframework.util.Assert; @@ -52,7 +53,7 @@ import org.springframework.util.Assert; */ public class MiniMaxEmbeddingModel extends AbstractEmbeddingModel { - private static final LogAccessor logger = new LogAccessor(MiniMaxEmbeddingModel.class); + private static final Logger logger = LoggerFactory.getLogger(MiniMaxEmbeddingModel.class); private static final EmbeddingModelObservationConvention DEFAULT_OBSERVATION_CONVENTION = new DefaultEmbeddingModelObservationConvention(); @@ -166,7 +167,7 @@ public class MiniMaxEmbeddingModel extends AbstractEmbeddingModel { .execute(ctx -> this.miniMaxApi.embeddings(apiRequest).getBody()); if (apiEmbeddingResponse == null) { - logger.warn("No embeddings returned for request: " + request); + logger.warn("No embeddings returned for request: {}", request); return new EmbeddingResponse(List.of()); } diff --git a/models/spring-ai-minimax/src/test/java/org/springframework/ai/minimax/api/MiniMaxApiToolFunctionCallIT.java b/models/spring-ai-minimax/src/test/java/org/springframework/ai/minimax/api/MiniMaxApiToolFunctionCallIT.java index 18f5763c3..86c337a58 100644 --- a/models/spring-ai-minimax/src/test/java/org/springframework/ai/minimax/api/MiniMaxApiToolFunctionCallIT.java +++ b/models/spring-ai-minimax/src/test/java/org/springframework/ai/minimax/api/MiniMaxApiToolFunctionCallIT.java @@ -24,6 +24,8 @@ import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.ObjectMapper; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.condition.EnabledIfEnvironmentVariable; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import org.springframework.ai.minimax.api.MiniMaxApi.ChatCompletion; import org.springframework.ai.minimax.api.MiniMaxApi.ChatCompletionMessage; @@ -31,7 +33,6 @@ import org.springframework.ai.minimax.api.MiniMaxApi.ChatCompletionMessage.Role; import org.springframework.ai.minimax.api.MiniMaxApi.ChatCompletionMessage.ToolCall; import org.springframework.ai.minimax.api.MiniMaxApi.ChatCompletionRequest; import org.springframework.ai.minimax.api.MiniMaxApi.ChatCompletionRequest.ToolChoiceBuilder; -import org.springframework.core.log.LogAccessor; import org.springframework.http.ResponseEntity; import static org.assertj.core.api.Assertions.assertThat; @@ -42,7 +43,7 @@ import static org.assertj.core.api.Assertions.assertThat; @EnabledIfEnvironmentVariable(named = "MINIMAX_API_KEY", matches = ".+") public class MiniMaxApiToolFunctionCallIT { - private static final LogAccessor logger = new LogAccessor(MiniMaxApiToolFunctionCallIT.class); + private final Logger logger = LoggerFactory.getLogger(MiniMaxApiToolFunctionCallIT.class); MockWeatherService weatherService = new MockWeatherService(); diff --git a/models/spring-ai-minimax/src/test/java/org/springframework/ai/minimax/chat/MiniMaxChatOptionsTests.java b/models/spring-ai-minimax/src/test/java/org/springframework/ai/minimax/chat/MiniMaxChatOptionsTests.java index 383daf7a4..8a7e9ee2e 100644 --- a/models/spring-ai-minimax/src/test/java/org/springframework/ai/minimax/chat/MiniMaxChatOptionsTests.java +++ b/models/spring-ai-minimax/src/test/java/org/springframework/ai/minimax/chat/MiniMaxChatOptionsTests.java @@ -23,6 +23,8 @@ import java.util.stream.Collectors; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.condition.EnabledIfEnvironmentVariable; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import reactor.core.publisher.Flux; import org.springframework.ai.chat.messages.AssistantMessage; @@ -34,7 +36,6 @@ import org.springframework.ai.chat.prompt.Prompt; import org.springframework.ai.minimax.MiniMaxChatModel; import org.springframework.ai.minimax.MiniMaxChatOptions; import org.springframework.ai.minimax.api.MiniMaxApi; -import org.springframework.core.log.LogAccessor; import static org.assertj.core.api.Assertions.assertThat; @@ -44,7 +45,7 @@ import static org.assertj.core.api.Assertions.assertThat; @EnabledIfEnvironmentVariable(named = "MINIMAX_API_KEY", matches = ".+") public class MiniMaxChatOptionsTests { - private static final LogAccessor logger = new LogAccessor(MiniMaxChatOptionsTests.class); + private static final Logger logger = LoggerFactory.getLogger(MiniMaxChatOptionsTests.class); private final MiniMaxChatModel chatModel = new MiniMaxChatModel(new MiniMaxApi(System.getenv("MINIMAX_API_KEY"))); @@ -134,7 +135,7 @@ public class MiniMaxChatOptionsTests { .map(AssistantMessage::getText) .filter(Objects::nonNull) .collect(Collectors.joining()); - logger.info("Response: " + content); + logger.info("Response: {}", content); assertThat(content).contains("40"); } diff --git a/models/spring-ai-mistral-ai/pom.xml b/models/spring-ai-mistral-ai/pom.xml index 06985cb6b..409a328dd 100644 --- a/models/spring-ai-mistral-ai/pom.xml +++ b/models/spring-ai-mistral-ai/pom.xml @@ -61,6 +61,11 @@ spring-context-support + + org.slf4j + slf4j-api + + org.springframework.ai diff --git a/models/spring-ai-mistral-ai/src/main/java/org/springframework/ai/mistralai/MistralAiChatModel.java b/models/spring-ai-mistral-ai/src/main/java/org/springframework/ai/mistralai/MistralAiChatModel.java index d3dfba3ad..804380086 100644 --- a/models/spring-ai-mistral-ai/src/main/java/org/springframework/ai/mistralai/MistralAiChatModel.java +++ b/models/spring-ai-mistral-ai/src/main/java/org/springframework/ai/mistralai/MistralAiChatModel.java @@ -27,6 +27,8 @@ import java.util.concurrent.ConcurrentHashMap; import io.micrometer.observation.Observation; import io.micrometer.observation.ObservationRegistry; import io.micrometer.observation.contextpropagation.ObservationThreadLocalAccessor; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import reactor.core.publisher.Flux; import reactor.core.publisher.Mono; @@ -64,7 +66,6 @@ import org.springframework.ai.model.function.FunctionCallback; import org.springframework.ai.model.function.FunctionCallbackResolver; import org.springframework.ai.model.function.FunctionCallingOptions; import org.springframework.ai.retry.RetryUtils; -import org.springframework.core.log.LogAccessor; import org.springframework.http.ResponseEntity; import org.springframework.retry.support.RetryTemplate; import org.springframework.util.Assert; @@ -87,7 +88,7 @@ public class MistralAiChatModel extends AbstractToolCallSupport implements ChatM private static final ChatModelObservationConvention DEFAULT_OBSERVATION_CONVENTION = new DefaultChatModelObservationConvention(); - private final LogAccessor logger = new LogAccessor(getClass()); + private final Logger logger = LoggerFactory.getLogger(getClass()); /** * The default options used for the chat completion requests. @@ -202,7 +203,7 @@ public class MistralAiChatModel extends AbstractToolCallSupport implements ChatM ChatCompletion chatCompletion = completionEntity.getBody(); if (chatCompletion == null) { - logger.warn("No chat completion returned for prompt: " + prompt); + logger.warn("No chat completion returned for prompt: {}", prompt); return new ChatResponse(List.of()); } @@ -299,7 +300,7 @@ public class MistralAiChatModel extends AbstractToolCallSupport implements ChatM } } catch (Exception e) { - logger.error(e, "Error processing chat completion"); + logger.error("Error processing chat completion", e); return new ChatResponse(List.of()); } })); diff --git a/models/spring-ai-mistral-ai/src/main/java/org/springframework/ai/mistralai/MistralAiEmbeddingModel.java b/models/spring-ai-mistral-ai/src/main/java/org/springframework/ai/mistralai/MistralAiEmbeddingModel.java index f7e642a3f..834bcfcd9 100644 --- a/models/spring-ai-mistral-ai/src/main/java/org/springframework/ai/mistralai/MistralAiEmbeddingModel.java +++ b/models/spring-ai-mistral-ai/src/main/java/org/springframework/ai/mistralai/MistralAiEmbeddingModel.java @@ -19,6 +19,8 @@ package org.springframework.ai.mistralai; import java.util.List; import io.micrometer.observation.ObservationRegistry; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import org.springframework.ai.chat.metadata.DefaultUsage; import org.springframework.ai.document.Document; @@ -37,7 +39,6 @@ import org.springframework.ai.embedding.observation.EmbeddingModelObservationDoc import org.springframework.ai.mistralai.api.MistralAiApi; import org.springframework.ai.model.ModelOptionsUtils; import org.springframework.ai.retry.RetryUtils; -import org.springframework.core.log.LogAccessor; import org.springframework.retry.support.RetryTemplate; import org.springframework.util.Assert; @@ -51,7 +52,7 @@ import org.springframework.util.Assert; */ public class MistralAiEmbeddingModel extends AbstractEmbeddingModel { - private static final LogAccessor logger = new LogAccessor(MistralAiEmbeddingModel.class); + private static final Logger logger = LoggerFactory.getLogger(MistralAiEmbeddingModel.class); private static final EmbeddingModelObservationConvention DEFAULT_OBSERVATION_CONVENTION = new DefaultEmbeddingModelObservationConvention(); @@ -125,7 +126,7 @@ public class MistralAiEmbeddingModel extends AbstractEmbeddingModel { .execute(ctx -> this.mistralAiApi.embeddings(apiRequest).getBody()); if (apiEmbeddingResponse == null) { - logger.warn("No embeddings returned for request: " + request); + logger.warn("No embeddings returned for request: {}", request); return new EmbeddingResponse(List.of()); } diff --git a/models/spring-ai-mistral-ai/src/test/java/org/springframework/ai/mistralai/MistralAiChatClientIT.java b/models/spring-ai-mistral-ai/src/test/java/org/springframework/ai/mistralai/MistralAiChatClientIT.java index fba261f81..0bdff32ee 100644 --- a/models/spring-ai-mistral-ai/src/test/java/org/springframework/ai/mistralai/MistralAiChatClientIT.java +++ b/models/spring-ai-mistral-ai/src/test/java/org/springframework/ai/mistralai/MistralAiChatClientIT.java @@ -23,6 +23,8 @@ import java.util.stream.Collectors; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.condition.EnabledIfEnvironmentVariable; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import reactor.core.publisher.Flux; import org.springframework.ai.chat.client.ChatClient; @@ -39,7 +41,6 @@ import org.springframework.boot.test.context.SpringBootTest; import org.springframework.core.ParameterizedTypeReference; import org.springframework.core.convert.support.DefaultConversionService; import org.springframework.core.io.Resource; -import org.springframework.core.log.LogAccessor; import static org.assertj.core.api.Assertions.assertThat; @@ -47,7 +48,7 @@ import static org.assertj.core.api.Assertions.assertThat; @EnabledIfEnvironmentVariable(named = "MISTRAL_AI_API_KEY", matches = ".+") class MistralAiChatClientIT { - private static final LogAccessor logger = new LogAccessor(MistralAiChatClientIT.class); + private static final Logger logger = LoggerFactory.getLogger(MistralAiChatClientIT.class); @Autowired MistralAiChatModel chatModel; @@ -232,7 +233,7 @@ class MistralAiChatClientIT { .content(); // @formatter:on - logger.info("Response: " + response); + logger.info("Response: {}", response); assertThat(response).containsAnyOf("30.0", "30"); assertThat(response).containsAnyOf("10.0", "10"); @@ -254,7 +255,7 @@ class MistralAiChatClientIT { .prompt().call().content(); // @formatter:on - logger.info("Response: " + response); + logger.info("Response: {}", response); assertThat(response).containsAnyOf("30.0", "30"); assertThat(response).containsAnyOf("10.0", "10"); @@ -277,7 +278,7 @@ class MistralAiChatClientIT { // @formatter:on String content = response.collectList().block().stream().collect(Collectors.joining()); - logger.info("Response: " + content); + logger.info("Response: {}", content); assertThat(content).containsAnyOf("30.0", "30"); assertThat(content).containsAnyOf("10.0", "10"); diff --git a/models/spring-ai-mistral-ai/src/test/java/org/springframework/ai/mistralai/MistralAiChatModelIT.java b/models/spring-ai-mistral-ai/src/test/java/org/springframework/ai/mistralai/MistralAiChatModelIT.java index e39cd2fb3..c32792af6 100644 --- a/models/spring-ai-mistral-ai/src/test/java/org/springframework/ai/mistralai/MistralAiChatModelIT.java +++ b/models/spring-ai-mistral-ai/src/test/java/org/springframework/ai/mistralai/MistralAiChatModelIT.java @@ -28,6 +28,8 @@ import org.junit.jupiter.api.Test; import org.junit.jupiter.api.condition.EnabledIfEnvironmentVariable; import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.provider.ValueSource; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import reactor.core.publisher.Flux; import org.springframework.ai.chat.messages.AssistantMessage; @@ -54,7 +56,6 @@ import org.springframework.boot.test.context.SpringBootTest; import org.springframework.core.convert.support.DefaultConversionService; import org.springframework.core.io.ClassPathResource; import org.springframework.core.io.Resource; -import org.springframework.core.log.LogAccessor; import org.springframework.util.MimeTypeUtils; import static org.assertj.core.api.Assertions.assertThat; @@ -69,7 +70,7 @@ import static org.assertj.core.api.Assertions.assertThat; @EnabledIfEnvironmentVariable(named = "MISTRAL_AI_API_KEY", matches = ".+") class MistralAiChatModelIT { - private static final LogAccessor logger = new LogAccessor(MistralAiChatModelIT.class); + private static final Logger logger = LoggerFactory.getLogger(MistralAiChatModelIT.class); @Autowired protected ChatModel chatModel; @@ -212,7 +213,7 @@ class MistralAiChatModelIT { ChatResponse response = this.chatModel.call(new Prompt(messages, promptOptions)); - logger.info("Response: " + response); + logger.info("Response: {}", response); assertThat(response.getResult().getOutput().getText()).containsAnyOf("30.0", "30"); assertThat(response.getMetadata()).isNotNull(); @@ -245,7 +246,7 @@ class MistralAiChatModelIT { .map(Generation::getOutput) .map(AssistantMessage::getText) .collect(Collectors.joining()); - logger.info("Response: " + content); + logger.info("Response: {}", content); assertThat(content).containsAnyOf("10.0", "10"); } @@ -302,7 +303,7 @@ class MistralAiChatModelIT { .map(Generation::getOutput) .map(AssistantMessage::getText) .collect(Collectors.joining()); - logger.info("Response: " + content); + logger.info("Response: {}", content); assertThat(content).contains("bananas", "apple"); assertThat(content).containsAnyOf("bowl", "basket", "fruit stand"); } @@ -325,7 +326,7 @@ class MistralAiChatModelIT { Flux response = this.streamingChatModel.stream(new Prompt(messages, promptOptions)); ChatResponse chatResponse = response.last().block(); - logger.info("Response: " + chatResponse); + logger.info("Response: {}", chatResponse); assertThat(chatResponse.getMetadata()).isNotNull(); assertThat(chatResponse.getMetadata().getUsage()).isNotNull(); assertThat(chatResponse.getMetadata().getUsage().getTotalTokens()).isLessThan(1050).isGreaterThan(750); diff --git a/models/spring-ai-mistral-ai/src/test/java/org/springframework/ai/mistralai/api/tool/MistralAiApiToolFunctionCallIT.java b/models/spring-ai-mistral-ai/src/test/java/org/springframework/ai/mistralai/api/tool/MistralAiApiToolFunctionCallIT.java index 8d0d39a25..09406736d 100644 --- a/models/spring-ai-mistral-ai/src/test/java/org/springframework/ai/mistralai/api/tool/MistralAiApiToolFunctionCallIT.java +++ b/models/spring-ai-mistral-ai/src/test/java/org/springframework/ai/mistralai/api/tool/MistralAiApiToolFunctionCallIT.java @@ -23,6 +23,8 @@ import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.ObjectMapper; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.condition.EnabledIfEnvironmentVariable; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import org.springframework.ai.mistralai.api.MistralAiApi; import org.springframework.ai.mistralai.api.MistralAiApi.ChatCompletion; @@ -33,7 +35,6 @@ import org.springframework.ai.mistralai.api.MistralAiApi.ChatCompletionRequest; import org.springframework.ai.mistralai.api.MistralAiApi.ChatCompletionRequest.ToolChoice; import org.springframework.ai.mistralai.api.MistralAiApi.FunctionTool.Type; import org.springframework.ai.model.ModelOptionsUtils; -import org.springframework.core.log.LogAccessor; import org.springframework.http.ResponseEntity; import org.springframework.util.ObjectUtils; @@ -48,7 +49,7 @@ public class MistralAiApiToolFunctionCallIT { static final String MISTRAL_AI_CHAT_MODEL = MistralAiApi.ChatModel.LARGE.getValue(); - private final LogAccessor logger = new LogAccessor(MistralAiApiToolFunctionCallIT.class); + private final Logger logger = LoggerFactory.getLogger(MistralAiApiToolFunctionCallIT.class); MockWeatherService weatherService = new MockWeatherService(); diff --git a/models/spring-ai-mistral-ai/src/test/java/org/springframework/ai/mistralai/api/tool/PaymentStatusFunctionCallingIT.java b/models/spring-ai-mistral-ai/src/test/java/org/springframework/ai/mistralai/api/tool/PaymentStatusFunctionCallingIT.java index 5fae46724..f2c03cd3d 100644 --- a/models/spring-ai-mistral-ai/src/test/java/org/springframework/ai/mistralai/api/tool/PaymentStatusFunctionCallingIT.java +++ b/models/spring-ai-mistral-ai/src/test/java/org/springframework/ai/mistralai/api/tool/PaymentStatusFunctionCallingIT.java @@ -26,6 +26,8 @@ import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.ObjectMapper; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.condition.EnabledIfEnvironmentVariable; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import org.springframework.ai.mistralai.api.MistralAiApi; import org.springframework.ai.mistralai.api.MistralAiApi.ChatCompletion; @@ -36,7 +38,6 @@ import org.springframework.ai.mistralai.api.MistralAiApi.ChatCompletionRequest; import org.springframework.ai.mistralai.api.MistralAiApi.ChatCompletionRequest.ToolChoice; import org.springframework.ai.mistralai.api.MistralAiApi.FunctionTool; import org.springframework.ai.mistralai.api.MistralAiApi.FunctionTool.Type; -import org.springframework.core.log.LogAccessor; import org.springframework.http.ResponseEntity; import static org.assertj.core.api.Assertions.assertThat; @@ -63,7 +64,7 @@ public class PaymentStatusFunctionCallingIT { static Map> functions = Map.of("retrieve_payment_status", new RetrievePaymentStatus(), "retrieve_payment_date", new RetrievePaymentDate()); - private final LogAccessor logger = new LogAccessor(PaymentStatusFunctionCallingIT.class); + private final Logger logger = LoggerFactory.getLogger(PaymentStatusFunctionCallingIT.class); private static T jsonToObject(String json, Class targetClass) { try { diff --git a/models/spring-ai-moonshot/pom.xml b/models/spring-ai-moonshot/pom.xml index ec03221b5..a55b938ba 100644 --- a/models/spring-ai-moonshot/pom.xml +++ b/models/spring-ai-moonshot/pom.xml @@ -61,6 +61,11 @@ spring-context-support + + org.slf4j + slf4j-api + + org.springframework.ai diff --git a/models/spring-ai-moonshot/src/main/java/org/springframework/ai/moonshot/MoonshotChatModel.java b/models/spring-ai-moonshot/src/main/java/org/springframework/ai/moonshot/MoonshotChatModel.java index e75bf718d..403c15a46 100644 --- a/models/spring-ai-moonshot/src/main/java/org/springframework/ai/moonshot/MoonshotChatModel.java +++ b/models/spring-ai-moonshot/src/main/java/org/springframework/ai/moonshot/MoonshotChatModel.java @@ -25,6 +25,8 @@ import java.util.concurrent.ConcurrentHashMap; import io.micrometer.observation.Observation; import io.micrometer.observation.ObservationRegistry; import io.micrometer.observation.contextpropagation.ObservationThreadLocalAccessor; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import reactor.core.publisher.Flux; import reactor.core.publisher.Mono; @@ -65,7 +67,6 @@ import org.springframework.ai.moonshot.api.MoonshotApi.ChatCompletionRequest; import org.springframework.ai.moonshot.api.MoonshotApi.FunctionTool; import org.springframework.ai.moonshot.api.MoonshotConstants; import org.springframework.ai.retry.RetryUtils; -import org.springframework.core.log.LogAccessor; import org.springframework.http.ResponseEntity; import org.springframework.retry.support.RetryTemplate; import org.springframework.util.Assert; @@ -80,7 +81,7 @@ import org.springframework.util.CollectionUtils; */ public class MoonshotChatModel extends AbstractToolCallSupport implements ChatModel, StreamingChatModel { - private static final LogAccessor logger = new LogAccessor(MoonshotChatModel.class); + private static final Logger logger = LoggerFactory.getLogger(MoonshotChatModel.class); private static final ChatModelObservationConvention DEFAULT_OBSERVATION_CONVENTION = new DefaultChatModelObservationConvention(); @@ -204,13 +205,13 @@ public class MoonshotChatModel extends AbstractToolCallSupport implements ChatMo var chatCompletion = completionEntity.getBody(); if (chatCompletion == null) { - logger.warn("No chat completion returned for prompt: " + prompt); + logger.warn("No chat completion returned for prompt: {}", prompt); return new ChatResponse(List.of()); } List choices = chatCompletion.choices(); if (choices == null) { - logger.warn("No choices returned for prompt: " + prompt); + logger.warn("No choices returned for prompt: {}", prompt); return new ChatResponse(List.of()); } @@ -311,7 +312,7 @@ public class MoonshotChatModel extends AbstractToolCallSupport implements ChatMo return new ChatResponse(generations, from(chatCompletion2, cumulativeUsage)); } catch (Exception e) { - logger.error(e, "Error processing chat completion"); + logger.error("Error processing chat completion", e); return new ChatResponse(List.of()); } diff --git a/models/spring-ai-moonshot/src/test/java/org/springframework/ai/moonshot/api/MoonshotApiToolFunctionCallIT.java b/models/spring-ai-moonshot/src/test/java/org/springframework/ai/moonshot/api/MoonshotApiToolFunctionCallIT.java index 4dd1f099d..c2597fc1d 100644 --- a/models/spring-ai-moonshot/src/test/java/org/springframework/ai/moonshot/api/MoonshotApiToolFunctionCallIT.java +++ b/models/spring-ai-moonshot/src/test/java/org/springframework/ai/moonshot/api/MoonshotApiToolFunctionCallIT.java @@ -24,6 +24,8 @@ import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.ObjectMapper; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.condition.EnabledIfEnvironmentVariable; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import org.springframework.ai.moonshot.api.MoonshotApi.ChatCompletion; import org.springframework.ai.moonshot.api.MoonshotApi.ChatCompletionMessage; @@ -33,7 +35,6 @@ import org.springframework.ai.moonshot.api.MoonshotApi.ChatCompletionRequest; import org.springframework.ai.moonshot.api.MoonshotApi.ChatCompletionRequest.ToolChoiceBuilder; import org.springframework.ai.moonshot.api.MoonshotApi.FunctionTool; import org.springframework.ai.moonshot.api.MoonshotApi.FunctionTool.Type; -import org.springframework.core.log.LogAccessor; import org.springframework.http.ResponseEntity; import static org.assertj.core.api.Assertions.assertThat; @@ -70,7 +71,7 @@ public class MoonshotApiToolFunctionCallIT { } """)); - private static final LogAccessor logger = new LogAccessor(MoonshotApiToolFunctionCallIT.class); + private final Logger logger = LoggerFactory.getLogger(MoonshotApiToolFunctionCallIT.class); private final MockWeatherService weatherService = new MockWeatherService(); diff --git a/models/spring-ai-moonshot/src/test/java/org/springframework/ai/moonshot/chat/MoonshotChatModelFunctionCallingIT.java b/models/spring-ai-moonshot/src/test/java/org/springframework/ai/moonshot/chat/MoonshotChatModelFunctionCallingIT.java index afebc5a13..f24600653 100644 --- a/models/spring-ai-moonshot/src/test/java/org/springframework/ai/moonshot/chat/MoonshotChatModelFunctionCallingIT.java +++ b/models/spring-ai-moonshot/src/test/java/org/springframework/ai/moonshot/chat/MoonshotChatModelFunctionCallingIT.java @@ -24,6 +24,8 @@ import java.util.stream.Collectors; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.condition.EnabledIfEnvironmentVariable; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import reactor.core.publisher.Flux; import org.springframework.ai.chat.messages.AssistantMessage; @@ -40,7 +42,6 @@ import org.springframework.ai.moonshot.api.MockWeatherService; import org.springframework.ai.moonshot.api.MoonshotApi; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; -import org.springframework.core.log.LogAccessor; import static org.assertj.core.api.Assertions.assertThat; @@ -48,7 +49,7 @@ import static org.assertj.core.api.Assertions.assertThat; @EnabledIfEnvironmentVariable(named = "MOONSHOT_API_KEY", matches = ".+") class MoonshotChatModelFunctionCallingIT { - private static final LogAccessor logger = new LogAccessor(MoonshotChatModelFunctionCallingIT.class); + private static final Logger logger = LoggerFactory.getLogger(MoonshotChatModelFunctionCallingIT.class); @Autowired ChatModel chatModel; @@ -99,7 +100,7 @@ class MoonshotChatModelFunctionCallingIT { ChatResponse response = this.chatModel.call(new Prompt(messages, promptOptions)); - logger.info("Response: " + response); + logger.info("Response: {}", response); assertThat(response.getResult().getOutput().getText()).contains("30", "10", "15"); } @@ -131,7 +132,7 @@ class MoonshotChatModelFunctionCallingIT { .map(AssistantMessage::getText) .filter(Objects::nonNull) .collect(Collectors.joining()); - logger.info("Response: " + content); + logger.info("Response: {}", content); assertThat(content).contains("30", "10", "15"); } diff --git a/models/spring-ai-moonshot/src/test/java/org/springframework/ai/moonshot/chat/MoonshotChatModelIT.java b/models/spring-ai-moonshot/src/test/java/org/springframework/ai/moonshot/chat/MoonshotChatModelIT.java index 199494083..c177645b7 100644 --- a/models/spring-ai-moonshot/src/test/java/org/springframework/ai/moonshot/chat/MoonshotChatModelIT.java +++ b/models/spring-ai-moonshot/src/test/java/org/springframework/ai/moonshot/chat/MoonshotChatModelIT.java @@ -23,6 +23,8 @@ import java.util.stream.Collectors; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.condition.EnabledIfEnvironmentVariable; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import org.springframework.ai.chat.messages.AssistantMessage; import org.springframework.ai.chat.messages.Message; @@ -43,7 +45,6 @@ import org.springframework.beans.factory.annotation.Value; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.core.convert.support.DefaultConversionService; import org.springframework.core.io.Resource; -import org.springframework.core.log.LogAccessor; import static org.assertj.core.api.Assertions.assertThat; @@ -54,7 +55,7 @@ import static org.assertj.core.api.Assertions.assertThat; @EnabledIfEnvironmentVariable(named = "MOONSHOT_API_KEY", matches = ".+") public class MoonshotChatModelIT { - private static final LogAccessor logger = new LogAccessor(MoonshotChatModelIT.class); + private static final Logger logger = LoggerFactory.getLogger(MoonshotChatModelIT.class); @Autowired protected ChatModel chatModel; diff --git a/models/spring-ai-oci-genai/pom.xml b/models/spring-ai-oci-genai/pom.xml index e694ff627..c87cf0834 100644 --- a/models/spring-ai-oci-genai/pom.xml +++ b/models/spring-ai-oci-genai/pom.xml @@ -65,6 +65,11 @@ spring-context-support + + org.slf4j + slf4j-api + + org.springframework.ai diff --git a/models/spring-ai-ollama/pom.xml b/models/spring-ai-ollama/pom.xml index 8710fb3a8..679ac3ecb 100644 --- a/models/spring-ai-ollama/pom.xml +++ b/models/spring-ai-ollama/pom.xml @@ -69,6 +69,11 @@ ${jackson.version} + + org.slf4j + slf4j-api + + org.springframework.boot diff --git a/models/spring-ai-ollama/src/main/java/org/springframework/ai/ollama/management/OllamaModelManager.java b/models/spring-ai-ollama/src/main/java/org/springframework/ai/ollama/management/OllamaModelManager.java index 8c1c578fa..e939e69d4 100644 --- a/models/spring-ai-ollama/src/main/java/org/springframework/ai/ollama/management/OllamaModelManager.java +++ b/models/spring-ai-ollama/src/main/java/org/springframework/ai/ollama/management/OllamaModelManager.java @@ -18,13 +18,14 @@ package org.springframework.ai.ollama.management; import java.time.Duration; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import reactor.util.retry.Retry; import org.springframework.ai.ollama.api.OllamaApi; import org.springframework.ai.ollama.api.OllamaApi.DeleteModelRequest; import org.springframework.ai.ollama.api.OllamaApi.ListModelResponse; import org.springframework.ai.ollama.api.OllamaApi.PullModelRequest; -import org.springframework.core.log.LogAccessor; import org.springframework.util.Assert; import org.springframework.util.CollectionUtils; @@ -37,7 +38,7 @@ import org.springframework.util.CollectionUtils; */ public class OllamaModelManager { - private static final LogAccessor logger = new LogAccessor(OllamaModelManager.class); + private final Logger logger = LoggerFactory.getLogger(OllamaModelManager.class); private final OllamaApi ollamaApi; @@ -80,13 +81,13 @@ public class OllamaModelManager { } public void deleteModel(String modelName) { - logger.info("Start deletion of model: " + modelName); + logger.info("Start deletion of model: {}", modelName); if (!isModelAvailable(modelName)) { - logger.info("Model " + modelName + " not found"); + logger.info("Model {} not found", modelName); return; } this.ollamaApi.deleteModel(new DeleteModelRequest(modelName)); - logger.info("Completed deletion of model: " + modelName); + logger.info("Completed deletion of model: {}", modelName); } public void pullModel(String modelName) { @@ -100,20 +101,20 @@ public class OllamaModelManager { if (PullModelStrategy.WHEN_MISSING.equals(pullModelStrategy)) { if (isModelAvailable(modelName)) { - logger.debug("Model '" + modelName + "' already available. Skipping pull operation."); + logger.debug("Model '{}' already available. Skipping pull operation.", modelName); return; } } // @formatter:off - logger.info("Start pulling model: "+ modelName); + logger.info("Start pulling model: {}", modelName); this.ollamaApi.pullModel(new PullModelRequest(modelName)) .bufferUntilChanged(OllamaApi.ProgressResponse::status) .doOnEach(signal -> { var progressResponses = signal.get(); if (!CollectionUtils.isEmpty(progressResponses) && progressResponses.get(progressResponses.size() - 1) != null) { - logger.info("Pulling the '"+ modelName +"' model - Status: "+ progressResponses.get(progressResponses.size() - 1).status()); + logger.info("Pulling the '{}' model - Status: {}", modelName, progressResponses.get(progressResponses.size() - 1).status()); } }) .takeUntil(progressResponses -> @@ -121,7 +122,7 @@ public class OllamaModelManager { .timeout(this.options.timeout()) .retryWhen(Retry.backoff(this.options.maxRetries(), Duration.ofSeconds(5))) .blockLast(); - logger.info("Completed pulling the '"+ modelName +"' model"); + logger.info("Completed pulling the '{}' model", modelName); // @formatter:on } diff --git a/models/spring-ai-ollama/src/test/java/org/springframework/ai/ollama/OllamaChatModelFunctionCallingIT.java b/models/spring-ai-ollama/src/test/java/org/springframework/ai/ollama/OllamaChatModelFunctionCallingIT.java index 04a8cd5b8..25f800ca9 100644 --- a/models/spring-ai-ollama/src/test/java/org/springframework/ai/ollama/OllamaChatModelFunctionCallingIT.java +++ b/models/spring-ai-ollama/src/test/java/org/springframework/ai/ollama/OllamaChatModelFunctionCallingIT.java @@ -21,6 +21,8 @@ import java.util.List; import java.util.stream.Collectors; import org.junit.jupiter.api.Test; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import reactor.core.publisher.Flux; import org.springframework.ai.chat.messages.AssistantMessage; @@ -38,14 +40,13 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.SpringBootConfiguration; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.context.annotation.Bean; -import org.springframework.core.log.LogAccessor; import static org.assertj.core.api.Assertions.assertThat; @SpringBootTest(classes = OllamaChatModelFunctionCallingIT.Config.class) class OllamaChatModelFunctionCallingIT extends BaseOllamaIT { - private static final LogAccessor logger = new LogAccessor(OllamaChatModelFunctionCallingIT.class); + private static final Logger logger = LoggerFactory.getLogger(OllamaChatModelFunctionCallingIT.class); private static final String MODEL = "qwen2.5:3b"; @@ -70,7 +71,7 @@ class OllamaChatModelFunctionCallingIT extends BaseOllamaIT { ChatResponse response = this.chatModel.call(new Prompt(messages, promptOptions)); - logger.info("Response: " + response); + logger.info("Response: {}", response); assertThat(response.getResult().getOutput().getText()).contains("30", "10", "15"); } @@ -101,7 +102,7 @@ class OllamaChatModelFunctionCallingIT extends BaseOllamaIT { .map(Generation::getOutput) .map(AssistantMessage::getText) .collect(Collectors.joining()); - logger.info("Response: " + content); + logger.info("Response: {}", content); assertThat(content).contains("30", "10", "15"); } diff --git a/models/spring-ai-ollama/src/test/java/org/springframework/ai/ollama/OllamaChatModelMultimodalIT.java b/models/spring-ai-ollama/src/test/java/org/springframework/ai/ollama/OllamaChatModelMultimodalIT.java index 9e5816c25..1fa5828e3 100644 --- a/models/spring-ai-ollama/src/test/java/org/springframework/ai/ollama/OllamaChatModelMultimodalIT.java +++ b/models/spring-ai-ollama/src/test/java/org/springframework/ai/ollama/OllamaChatModelMultimodalIT.java @@ -19,6 +19,8 @@ package org.springframework.ai.ollama; import java.util.List; import org.junit.jupiter.api.Test; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import org.springframework.ai.chat.messages.UserMessage; import org.springframework.ai.chat.prompt.Prompt; @@ -30,7 +32,6 @@ import org.springframework.boot.SpringBootConfiguration; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.context.annotation.Bean; import org.springframework.core.io.ClassPathResource; -import org.springframework.core.log.LogAccessor; import org.springframework.util.MimeTypeUtils; import static org.assertj.core.api.Assertions.assertThat; @@ -39,7 +40,7 @@ import static org.assertj.core.api.AssertionsForClassTypes.assertThatThrownBy; @SpringBootTest class OllamaChatModelMultimodalIT extends BaseOllamaIT { - private static final LogAccessor logger = new LogAccessor(OllamaChatModelMultimodalIT.class); + private static final Logger logger = LoggerFactory.getLogger(OllamaChatModelMultimodalIT.class); private static final String MODEL = "llava-phi3"; diff --git a/models/spring-ai-ollama/src/test/java/org/springframework/ai/ollama/api/tool/OllamaApiToolFunctionCallIT.java b/models/spring-ai-ollama/src/test/java/org/springframework/ai/ollama/api/tool/OllamaApiToolFunctionCallIT.java index 5d8d0e6fb..104cd91ce 100644 --- a/models/spring-ai-ollama/src/test/java/org/springframework/ai/ollama/api/tool/OllamaApiToolFunctionCallIT.java +++ b/models/spring-ai-ollama/src/test/java/org/springframework/ai/ollama/api/tool/OllamaApiToolFunctionCallIT.java @@ -23,6 +23,8 @@ import java.util.Map; import org.junit.jupiter.api.BeforeAll; import org.junit.jupiter.api.Test; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import org.springframework.ai.model.ModelOptionsUtils; import org.springframework.ai.ollama.BaseOllamaIT; @@ -31,7 +33,6 @@ import org.springframework.ai.ollama.api.OllamaApi.ChatResponse; import org.springframework.ai.ollama.api.OllamaApi.Message; import org.springframework.ai.ollama.api.OllamaApi.Message.Role; import org.springframework.ai.ollama.api.OllamaApi.Message.ToolCall; -import org.springframework.core.log.LogAccessor; import static org.assertj.core.api.Assertions.assertThat; @@ -43,7 +44,7 @@ public class OllamaApiToolFunctionCallIT extends BaseOllamaIT { private static final String MODEL = "qwen2.5:3b"; - private static final LogAccessor logger = new LogAccessor(OllamaApiToolFunctionCallIT.class); + private static final Logger logger = LoggerFactory.getLogger(OllamaApiToolFunctionCallIT.class); static OllamaApi ollamaApi; diff --git a/models/spring-ai-openai/pom.xml b/models/spring-ai-openai/pom.xml index 6c1bd4fea..05d8a9693 100644 --- a/models/spring-ai-openai/pom.xml +++ b/models/spring-ai-openai/pom.xml @@ -76,6 +76,11 @@ spring-context-support + + org.slf4j + slf4j-api + + org.springframework.ai diff --git a/models/spring-ai-openai/src/main/java/org/springframework/ai/openai/OpenAiAudioSpeechModel.java b/models/spring-ai-openai/src/main/java/org/springframework/ai/openai/OpenAiAudioSpeechModel.java index a1981837d..baf772ed4 100644 --- a/models/spring-ai-openai/src/main/java/org/springframework/ai/openai/OpenAiAudioSpeechModel.java +++ b/models/spring-ai-openai/src/main/java/org/springframework/ai/openai/OpenAiAudioSpeechModel.java @@ -17,6 +17,8 @@ package org.springframework.ai.openai; import org.apache.commons.lang3.StringUtils; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import reactor.core.publisher.Flux; import org.springframework.ai.chat.metadata.RateLimit; @@ -30,7 +32,6 @@ import org.springframework.ai.openai.audio.speech.StreamingSpeechModel; import org.springframework.ai.openai.metadata.audio.OpenAiAudioSpeechResponseMetadata; import org.springframework.ai.openai.metadata.support.OpenAiResponseHeaderExtractor; import org.springframework.ai.retry.RetryUtils; -import org.springframework.core.log.LogAccessor; import org.springframework.http.ResponseEntity; import org.springframework.retry.support.RetryTemplate; import org.springframework.util.Assert; @@ -52,7 +53,7 @@ public class OpenAiAudioSpeechModel implements SpeechModel, StreamingSpeechModel */ private static final Float SPEED = 1.0f; - private final LogAccessor logger = new LogAccessor(getClass()); + private final Logger logger = LoggerFactory.getLogger(getClass()); /** * The default options used for the audio completion requests. @@ -131,7 +132,7 @@ public class OpenAiAudioSpeechModel implements SpeechModel, StreamingSpeechModel var speech = speechEntity.getBody(); if (speech == null) { - logger.warn("No speech response returned for speechRequest: " + speechRequest); + logger.warn("No speech response returned for speechRequest: {}", speechRequest); return new SpeechResponse(new Speech(new byte[0])); } diff --git a/models/spring-ai-openai/src/main/java/org/springframework/ai/openai/OpenAiAudioTranscriptionModel.java b/models/spring-ai-openai/src/main/java/org/springframework/ai/openai/OpenAiAudioTranscriptionModel.java index 7753d13b2..4c7bb1056 100644 --- a/models/spring-ai-openai/src/main/java/org/springframework/ai/openai/OpenAiAudioTranscriptionModel.java +++ b/models/spring-ai-openai/src/main/java/org/springframework/ai/openai/OpenAiAudioTranscriptionModel.java @@ -16,6 +16,9 @@ package org.springframework.ai.openai; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + import org.springframework.ai.audio.transcription.AudioTranscription; import org.springframework.ai.audio.transcription.AudioTranscriptionPrompt; import org.springframework.ai.audio.transcription.AudioTranscriptionResponse; @@ -27,7 +30,6 @@ import org.springframework.ai.openai.metadata.audio.OpenAiAudioTranscriptionResp import org.springframework.ai.openai.metadata.support.OpenAiResponseHeaderExtractor; import org.springframework.ai.retry.RetryUtils; import org.springframework.core.io.Resource; -import org.springframework.core.log.LogAccessor; import org.springframework.http.ResponseEntity; import org.springframework.retry.support.RetryTemplate; import org.springframework.util.Assert; @@ -45,7 +47,7 @@ import org.springframework.util.Assert; */ public class OpenAiAudioTranscriptionModel implements Model { - private static final LogAccessor logger = new LogAccessor(OpenAiAudioTranscriptionModel.class); + private final Logger logger = LoggerFactory.getLogger(getClass()); private final OpenAiAudioTranscriptionOptions defaultOptions; @@ -116,7 +118,7 @@ public class OpenAiAudioTranscriptionModel implements Model choices = chatCompletion.choices(); if (choices == null) { - logger.warn("No choices returned for prompt: " + prompt); + logger.warn("No choices returned for prompt: {}", prompt); return new ChatResponse(List.of()); } @@ -357,7 +358,7 @@ public class OpenAiChatModel extends AbstractToolCallSupport implements ChatMode return new ChatResponse(generations, from(chatCompletion2, null, accumulatedUsage)); } catch (Exception e) { - logger.error(e, "Error processing chat completion"); + logger.error("Error processing chat completion", e); return new ChatResponse(List.of()); } // When in stream mode and enabled to include the usage, the OpenAI diff --git a/models/spring-ai-openai/src/main/java/org/springframework/ai/openai/OpenAiEmbeddingModel.java b/models/spring-ai-openai/src/main/java/org/springframework/ai/openai/OpenAiEmbeddingModel.java index 5018f3f0c..22c99aefa 100644 --- a/models/spring-ai-openai/src/main/java/org/springframework/ai/openai/OpenAiEmbeddingModel.java +++ b/models/spring-ai-openai/src/main/java/org/springframework/ai/openai/OpenAiEmbeddingModel.java @@ -19,6 +19,8 @@ package org.springframework.ai.openai; import java.util.List; import io.micrometer.observation.ObservationRegistry; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import org.springframework.ai.chat.metadata.DefaultUsage; import org.springframework.ai.document.Document; @@ -38,7 +40,6 @@ import org.springframework.ai.openai.api.OpenAiApi; import org.springframework.ai.openai.api.OpenAiApi.EmbeddingList; import org.springframework.ai.openai.api.common.OpenAiApiConstants; import org.springframework.ai.retry.RetryUtils; -import org.springframework.core.log.LogAccessor; import org.springframework.lang.Nullable; import org.springframework.retry.support.RetryTemplate; import org.springframework.util.Assert; @@ -51,7 +52,7 @@ import org.springframework.util.Assert; */ public class OpenAiEmbeddingModel extends AbstractEmbeddingModel { - private static final LogAccessor logger = new LogAccessor(OpenAiEmbeddingModel.class); + private static final Logger logger = LoggerFactory.getLogger(OpenAiEmbeddingModel.class); private static final EmbeddingModelObservationConvention DEFAULT_OBSERVATION_CONVENTION = new DefaultEmbeddingModelObservationConvention(); @@ -162,7 +163,7 @@ public class OpenAiEmbeddingModel extends AbstractEmbeddingModel { .execute(ctx -> this.openAiApi.embeddings(apiRequest).getBody()); if (apiEmbeddingResponse == null) { - logger.warn("No embeddings returned for request: " + request); + logger.warn("No embeddings returned for request: {}", request); return new EmbeddingResponse(List.of()); } diff --git a/models/spring-ai-openai/src/main/java/org/springframework/ai/openai/OpenAiImageModel.java b/models/spring-ai-openai/src/main/java/org/springframework/ai/openai/OpenAiImageModel.java index 43e6f513d..336a44d93 100644 --- a/models/spring-ai-openai/src/main/java/org/springframework/ai/openai/OpenAiImageModel.java +++ b/models/spring-ai-openai/src/main/java/org/springframework/ai/openai/OpenAiImageModel.java @@ -19,6 +19,8 @@ package org.springframework.ai.openai; import java.util.List; import io.micrometer.observation.ObservationRegistry; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import org.springframework.ai.image.Image; import org.springframework.ai.image.ImageGeneration; @@ -36,7 +38,6 @@ import org.springframework.ai.openai.api.OpenAiImageApi; import org.springframework.ai.openai.api.common.OpenAiApiConstants; import org.springframework.ai.openai.metadata.OpenAiImageGenerationMetadata; import org.springframework.ai.retry.RetryUtils; -import org.springframework.core.log.LogAccessor; import org.springframework.http.ResponseEntity; import org.springframework.lang.Nullable; import org.springframework.retry.support.RetryTemplate; @@ -54,7 +55,7 @@ import org.springframework.util.Assert; */ public class OpenAiImageModel implements ImageModel { - private static final LogAccessor logger = new LogAccessor(OpenAiImageModel.class); + private static final Logger logger = LoggerFactory.getLogger(OpenAiImageModel.class); private static final ImageModelObservationConvention DEFAULT_OBSERVATION_CONVENTION = new DefaultImageModelObservationConvention(); @@ -164,7 +165,7 @@ public class OpenAiImageModel implements ImageModel { OpenAiImageApi.OpenAiImageRequest openAiImageRequest) { OpenAiImageApi.OpenAiImageResponse imageApiResponse = imageResponseEntity.getBody(); if (imageApiResponse == null) { - logger.warn("No image response returned for request: " + openAiImageRequest); + logger.warn("No image response returned for request: {}", openAiImageRequest); return new ImageResponse(List.of()); } diff --git a/models/spring-ai-openai/src/main/java/org/springframework/ai/openai/OpenAiModerationModel.java b/models/spring-ai-openai/src/main/java/org/springframework/ai/openai/OpenAiModerationModel.java index a8b55736b..8e00c24b4 100644 --- a/models/spring-ai-openai/src/main/java/org/springframework/ai/openai/OpenAiModerationModel.java +++ b/models/spring-ai-openai/src/main/java/org/springframework/ai/openai/OpenAiModerationModel.java @@ -19,6 +19,9 @@ package org.springframework.ai.openai; import java.util.ArrayList; import java.util.List; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + import org.springframework.ai.model.ModelOptionsUtils; import org.springframework.ai.moderation.Categories; import org.springframework.ai.moderation.CategoryScores; @@ -31,7 +34,6 @@ import org.springframework.ai.moderation.ModerationResponse; import org.springframework.ai.moderation.ModerationResult; import org.springframework.ai.openai.api.OpenAiModerationApi; import org.springframework.ai.retry.RetryUtils; -import org.springframework.core.log.LogAccessor; import org.springframework.http.ResponseEntity; import org.springframework.retry.support.RetryTemplate; import org.springframework.util.Assert; @@ -45,7 +47,7 @@ import org.springframework.util.Assert; */ public class OpenAiModerationModel implements ModerationModel { - private final LogAccessor logger = new LogAccessor(getClass()); + private final Logger logger = LoggerFactory.getLogger(getClass()); private final OpenAiModerationApi openAiModerationApi; @@ -104,7 +106,7 @@ public class OpenAiModerationModel implements ModerationModel { OpenAiModerationApi.OpenAiModerationRequest openAiModerationRequest) { OpenAiModerationApi.OpenAiModerationResponse moderationApiResponse = moderationResponseEntity.getBody(); if (moderationApiResponse == null) { - logger.warn("No moderation response returned for request: " + openAiModerationRequest); + logger.warn("No moderation response returned for request: {}", openAiModerationRequest); return new ModerationResponse(new Generation()); } diff --git a/models/spring-ai-openai/src/main/java/org/springframework/ai/openai/metadata/support/OpenAiResponseHeaderExtractor.java b/models/spring-ai-openai/src/main/java/org/springframework/ai/openai/metadata/support/OpenAiResponseHeaderExtractor.java index cde5d3b42..7a4d34475 100644 --- a/models/spring-ai-openai/src/main/java/org/springframework/ai/openai/metadata/support/OpenAiResponseHeaderExtractor.java +++ b/models/spring-ai-openai/src/main/java/org/springframework/ai/openai/metadata/support/OpenAiResponseHeaderExtractor.java @@ -23,9 +23,11 @@ import java.util.function.Predicate; import java.util.regex.Matcher; import java.util.regex.Pattern; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + import org.springframework.ai.chat.metadata.RateLimit; import org.springframework.ai.openai.metadata.OpenAiRateLimit; -import org.springframework.core.log.LogAccessor; import org.springframework.http.ResponseEntity; import org.springframework.util.Assert; import org.springframework.util.CollectionUtils; @@ -47,7 +49,7 @@ import static org.springframework.ai.openai.metadata.support.OpenAiApiResponseHe */ public final class OpenAiResponseHeaderExtractor { - private static final LogAccessor logger = new LogAccessor(OpenAiResponseHeaderExtractor.class); + private static final Logger logger = LoggerFactory.getLogger(OpenAiResponseHeaderExtractor.class); private OpenAiResponseHeaderExtractor() { @@ -96,8 +98,8 @@ public final class OpenAiResponseHeaderExtractor { return Long.parseLong(headerValue.trim()); } catch (NumberFormatException e) { - logger.warn("Value [" + headerName + "] for HTTP header [" + headerValue + "] is not valid: " - + e.getMessage()); + logger.warn("Value [{}] for HTTP header [{}] is not valid: {}", headerName, headerValue, + e.getMessage()); } } diff --git a/models/spring-ai-openai/src/test/java/org/springframework/ai/openai/acme/AcmeIT.java b/models/spring-ai-openai/src/test/java/org/springframework/ai/openai/acme/AcmeIT.java index 3733b08a6..b0b0205b0 100644 --- a/models/spring-ai-openai/src/test/java/org/springframework/ai/openai/acme/AcmeIT.java +++ b/models/spring-ai-openai/src/test/java/org/springframework/ai/openai/acme/AcmeIT.java @@ -22,6 +22,8 @@ import java.util.stream.Collectors; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.condition.EnabledIfEnvironmentVariable; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import org.springframework.ai.chat.messages.Message; import org.springframework.ai.chat.messages.UserMessage; @@ -41,7 +43,6 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.core.io.Resource; -import org.springframework.core.log.LogAccessor; import static org.assertj.core.api.Assertions.assertThat; @@ -49,7 +50,7 @@ import static org.assertj.core.api.Assertions.assertThat; @EnabledIfEnvironmentVariable(named = "OPENAI_API_KEY", matches = ".+") public class AcmeIT extends AbstractIT { - private static final LogAccessor logger = new LogAccessor(AcmeIT.class); + private static final Logger logger = LoggerFactory.getLogger(AcmeIT.class); @Value("classpath:/data/acme/bikes.json") private Resource bikesResource; diff --git a/models/spring-ai-openai/src/test/java/org/springframework/ai/openai/api/tool/OpenAiApiToolFunctionCallIT.java b/models/spring-ai-openai/src/test/java/org/springframework/ai/openai/api/tool/OpenAiApiToolFunctionCallIT.java index 1f0c3ab42..33f50b1f4 100644 --- a/models/spring-ai-openai/src/test/java/org/springframework/ai/openai/api/tool/OpenAiApiToolFunctionCallIT.java +++ b/models/spring-ai-openai/src/test/java/org/springframework/ai/openai/api/tool/OpenAiApiToolFunctionCallIT.java @@ -23,6 +23,8 @@ import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.ObjectMapper; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.condition.EnabledIfEnvironmentVariable; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import org.springframework.ai.model.ModelOptionsUtils; import org.springframework.ai.openai.api.OpenAiApi; @@ -32,7 +34,6 @@ import org.springframework.ai.openai.api.OpenAiApi.ChatCompletionMessage.Role; import org.springframework.ai.openai.api.OpenAiApi.ChatCompletionMessage.ToolCall; import org.springframework.ai.openai.api.OpenAiApi.ChatCompletionRequest; import org.springframework.ai.openai.api.OpenAiApi.ChatCompletionRequest.ToolChoiceBuilder; -import org.springframework.core.log.LogAccessor; import org.springframework.http.ResponseEntity; import static org.assertj.core.api.Assertions.assertThat; @@ -47,7 +48,7 @@ import static org.assertj.core.api.Assertions.assertThat; @EnabledIfEnvironmentVariable(named = "OPENAI_API_KEY", matches = ".+") public class OpenAiApiToolFunctionCallIT { - private static final LogAccessor logger = new LogAccessor(OpenAiApiToolFunctionCallIT.class); + private final Logger logger = LoggerFactory.getLogger(OpenAiApiToolFunctionCallIT.class); MockWeatherService weatherService = new MockWeatherService(); diff --git a/models/spring-ai-openai/src/test/java/org/springframework/ai/openai/chat/OpenAiChatModelFunctionCallingIT.java b/models/spring-ai-openai/src/test/java/org/springframework/ai/openai/chat/OpenAiChatModelFunctionCallingIT.java index 00723f5de..799b76ea1 100644 --- a/models/spring-ai-openai/src/test/java/org/springframework/ai/openai/chat/OpenAiChatModelFunctionCallingIT.java +++ b/models/spring-ai-openai/src/test/java/org/springframework/ai/openai/chat/OpenAiChatModelFunctionCallingIT.java @@ -25,6 +25,8 @@ import java.util.stream.Collectors; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.condition.EnabledIfEnvironmentVariable; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import reactor.core.publisher.Flux; import org.springframework.ai.chat.client.ChatClient; @@ -47,7 +49,6 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.SpringBootConfiguration; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.context.annotation.Bean; -import org.springframework.core.log.LogAccessor; import static org.assertj.core.api.Assertions.assertThat; @@ -55,7 +56,7 @@ import static org.assertj.core.api.Assertions.assertThat; @EnabledIfEnvironmentVariable(named = "OPENAI_API_KEY", matches = ".+") class OpenAiChatModelFunctionCallingIT { - private static final LogAccessor logger = new LogAccessor(OpenAiChatModelFunctionCallingIT.class); + private static final Logger logger = LoggerFactory.getLogger(OpenAiChatModelFunctionCallingIT.class); @Autowired ChatModel chatModel; @@ -75,7 +76,7 @@ class OpenAiChatModelFunctionCallingIT { .content(); // @formatter:on - logger.info("Response: " + response); + logger.info("Response: {}", response); assertThat(state).containsEntry("Light", "ON"); } @@ -136,7 +137,7 @@ class OpenAiChatModelFunctionCallingIT { ChatResponse response = this.chatModel.call(new Prompt(messages, promptOptions)); - logger.info("Response: " + response); + logger.info("Response: {}", response); assertThat(response.getResult().getOutput().getText()).contains("30", "10", "15"); } @@ -208,7 +209,7 @@ class OpenAiChatModelFunctionCallingIT { .map(Generation::getOutput) .map(AssistantMessage::getText) .collect(Collectors.joining()); - logger.info("Response: " + content); + logger.info("Response: {}", content); assertThat(content).contains("30", "10", "15"); } 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 ab45ac0a3..c88b245ad 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 @@ -32,6 +32,8 @@ import org.junit.jupiter.api.Test; import org.junit.jupiter.api.condition.EnabledIfEnvironmentVariable; import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.provider.ValueSource; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import reactor.core.publisher.Flux; import org.springframework.ai.chat.client.ChatClient; @@ -65,7 +67,6 @@ import org.springframework.boot.test.context.SpringBootTest; import org.springframework.core.convert.support.DefaultConversionService; import org.springframework.core.io.ClassPathResource; import org.springframework.core.io.Resource; -import org.springframework.core.log.LogAccessor; import org.springframework.util.MimeTypeUtils; import static org.assertj.core.api.Assertions.assertThat; @@ -75,7 +76,7 @@ import static org.assertj.core.api.Assertions.assertThatThrownBy; @EnabledIfEnvironmentVariable(named = "OPENAI_API_KEY", matches = ".+") public class OpenAiChatModelIT extends AbstractIT { - private static final LogAccessor logger = new LogAccessor(OpenAiChatModelIT.class); + private static final Logger logger = LoggerFactory.getLogger(OpenAiChatModelIT.class); @Value("classpath:/prompts/system-message.st") private Resource systemResource; @@ -348,7 +349,7 @@ public class OpenAiChatModelIT extends AbstractIT { ChatResponse response = this.chatModel.call(new Prompt(messages, promptOptions)); - logger.info("Response: " + response); + logger.info("Response: {}", response); assertThat(response.getResult().getOutput().getText()).containsAnyOf("30.0", "30"); assertThat(response.getResult().getOutput().getText()).containsAnyOf("10.0", "10"); @@ -381,7 +382,7 @@ public class OpenAiChatModelIT extends AbstractIT { .map(Generation::getOutput) .map(AssistantMessage::getText) .collect(Collectors.joining()); - logger.info("Response: " + content); + logger.info("Response: {}", content); assertThat(content).containsAnyOf("30.0", "30"); assertThat(content).containsAnyOf("10.0", "10"); @@ -405,10 +406,10 @@ public class OpenAiChatModelIT extends AbstractIT { .build(); ChatResponse chatResponse = this.chatModel.call(new Prompt(messages, promptOptions)); - logger.info("Response: " + chatResponse); + logger.info("Response: {}", chatResponse); Usage usage = chatResponse.getMetadata().getUsage(); - logger.info("Usage: " + usage); + logger.info("Usage: {}", usage); assertThat(usage).isNotNull(); assertThat(usage).isNotInstanceOf(EmptyUsage.class); assertThat(usage).isInstanceOf(DefaultUsage.class); @@ -437,7 +438,7 @@ public class OpenAiChatModelIT extends AbstractIT { Flux response = this.streamingChatModel.stream(new Prompt(messages, promptOptions)); Usage usage = response.last().block().getMetadata().getUsage(); - logger.info("Usage: " + usage); + logger.info("Usage: {}", usage); assertThat(usage).isNotNull(); assertThat(usage).isNotInstanceOf(EmptyUsage.class); assertThat(usage).isInstanceOf(DefaultUsage.class); @@ -501,7 +502,7 @@ public class OpenAiChatModelIT extends AbstractIT { .map(Generation::getOutput) .map(AssistantMessage::getText) .collect(Collectors.joining()); - logger.info("Response: " + content); + logger.info("Response: {}", content); assertThat(content).containsAnyOf("bananas", "apple", "bowl", "basket", "fruit stand"); } @@ -576,7 +577,7 @@ public class OpenAiChatModelIT extends AbstractIT { .map(Generation::getOutput) .map(AssistantMessage::getText) .collect(Collectors.joining()); - logger.info("Response: " + content); + logger.info("Response: {}", content); assertThat(content).containsIgnoringCase("hobbits"); } diff --git a/models/spring-ai-openai/src/test/java/org/springframework/ai/openai/chat/OpenAiChatModelProxyToolCallsIT.java b/models/spring-ai-openai/src/test/java/org/springframework/ai/openai/chat/OpenAiChatModelProxyToolCallsIT.java index adffce2ba..db047a3cf 100644 --- a/models/spring-ai-openai/src/test/java/org/springframework/ai/openai/chat/OpenAiChatModelProxyToolCallsIT.java +++ b/models/spring-ai-openai/src/test/java/org/springframework/ai/openai/chat/OpenAiChatModelProxyToolCallsIT.java @@ -30,6 +30,8 @@ import com.fasterxml.jackson.databind.ObjectMapper; import io.micrometer.observation.ObservationRegistry; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.condition.EnabledIfEnvironmentVariable; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import reactor.core.publisher.Flux; import org.springframework.ai.chat.messages.AssistantMessage; @@ -50,7 +52,6 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.SpringBootConfiguration; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.context.annotation.Bean; -import org.springframework.core.log.LogAccessor; import org.springframework.util.CollectionUtils; import static org.assertj.core.api.Assertions.assertThat; @@ -59,7 +60,7 @@ import static org.assertj.core.api.Assertions.assertThat; @EnabledIfEnvironmentVariable(named = "OPENAI_API_KEY", matches = ".+") class OpenAiChatModelProxyToolCallsIT { - private static final LogAccessor logger = new LogAccessor(OpenAiChatModelProxyToolCallsIT.class); + private static final Logger logger = LoggerFactory.getLogger(OpenAiChatModelProxyToolCallsIT.class); private static final String DEFAULT_MODEL = "gpt-4o-mini"; @@ -185,7 +186,7 @@ class OpenAiChatModelProxyToolCallsIT { } while (isToolCall); - logger.info("Response: " + chatResponse); + logger.info("Response: {}", chatResponse); assertThat(chatResponse.getResult().getOutput().getText()).contains("30", "10", "15"); } @@ -222,7 +223,7 @@ class OpenAiChatModelProxyToolCallsIT { .map(cr -> cr.getResult().getOutput().getText()) .collect(Collectors.joining()); - logger.info("Response: " + response); + logger.info("Response: {}", response); assertThat(response).contains("30", "10", "15"); @@ -303,7 +304,7 @@ class OpenAiChatModelProxyToolCallsIT { return functionResponse; }); - logger.info("Response: " + chatResponse); + logger.info("Response: {}", chatResponse); assertThat(chatResponse.getResult().getOutput().getText()).contains("30", "10", "15"); } @@ -343,7 +344,7 @@ class OpenAiChatModelProxyToolCallsIT { .map(cr -> cr.getResult().getOutput().getText()) .collect(Collectors.joining()); - logger.info("Response: " + response); + logger.info("Response: {}", response); assertThat(response).contains("30", "10", "15"); diff --git a/models/spring-ai-openai/src/test/java/org/springframework/ai/openai/chat/OpenAiChatModelResponseFormatIT.java b/models/spring-ai-openai/src/test/java/org/springframework/ai/openai/chat/OpenAiChatModelResponseFormatIT.java index eaaff36f1..f2f286496 100644 --- a/models/spring-ai-openai/src/test/java/org/springframework/ai/openai/chat/OpenAiChatModelResponseFormatIT.java +++ b/models/spring-ai-openai/src/test/java/org/springframework/ai/openai/chat/OpenAiChatModelResponseFormatIT.java @@ -25,6 +25,8 @@ import com.fasterxml.jackson.databind.JsonMappingException; import com.fasterxml.jackson.databind.ObjectMapper; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.condition.EnabledIfEnvironmentVariable; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import org.springframework.ai.chat.model.ChatResponse; import org.springframework.ai.chat.prompt.Prompt; @@ -38,7 +40,6 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.SpringBootConfiguration; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.context.annotation.Bean; -import org.springframework.core.log.LogAccessor; import static org.assertj.core.api.Assertions.assertThat; @@ -52,7 +53,7 @@ public class OpenAiChatModelResponseFormatIT { private static ObjectMapper MAPPER = new ObjectMapper().enable(DeserializationFeature.FAIL_ON_TRAILING_TOKENS); - private final LogAccessor logger = new LogAccessor(getClass()); + private final Logger logger = LoggerFactory.getLogger(getClass()); @Autowired private OpenAiChatModel openAiChatModel; @@ -90,7 +91,7 @@ public class OpenAiChatModelResponseFormatIT { String content = response.getResult().getOutput().getText(); - logger.info("Response content: " + content); + logger.info("Response content: {}", content); assertThat(isValidJson(content)).isTrue(); } @@ -133,7 +134,7 @@ public class OpenAiChatModelResponseFormatIT { String content = response.getResult().getOutput().getText(); - logger.info("Response content: " + content); + logger.info("Response content: {}", content); assertThat(isValidJson(content)).isTrue(); } @@ -214,7 +215,7 @@ public class OpenAiChatModelResponseFormatIT { String content = response.getResult().getOutput().getText(); - logger.info("Response content: " + content); + logger.info("Response content: {}", content); assertThat(isValidJson(content)).isTrue(); diff --git a/models/spring-ai-openai/src/test/java/org/springframework/ai/openai/chat/OpenAiChatModelTypeReferenceBeanOutputConverterIT.java b/models/spring-ai-openai/src/test/java/org/springframework/ai/openai/chat/OpenAiChatModelTypeReferenceBeanOutputConverterIT.java index 549295494..1831095ab 100644 --- a/models/spring-ai-openai/src/test/java/org/springframework/ai/openai/chat/OpenAiChatModelTypeReferenceBeanOutputConverterIT.java +++ b/models/spring-ai-openai/src/test/java/org/springframework/ai/openai/chat/OpenAiChatModelTypeReferenceBeanOutputConverterIT.java @@ -22,6 +22,8 @@ import java.util.stream.Collectors; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.condition.EnabledIfEnvironmentVariable; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import org.springframework.ai.chat.messages.AssistantMessage; import org.springframework.ai.chat.model.ChatResponse; @@ -33,7 +35,6 @@ import org.springframework.ai.openai.OpenAiTestConfiguration; import org.springframework.ai.openai.testutils.AbstractIT; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.core.ParameterizedTypeReference; -import org.springframework.core.log.LogAccessor; import static org.assertj.core.api.Assertions.assertThat; @@ -41,7 +42,8 @@ import static org.assertj.core.api.Assertions.assertThat; @EnabledIfEnvironmentVariable(named = "OPENAI_API_KEY", matches = ".+") class OpenAiChatModelTypeReferenceBeanOutputConverterIT extends AbstractIT { - private static final LogAccessor logger = new LogAccessor(OpenAiChatModelTypeReferenceBeanOutputConverterIT.class); + private static final Logger logger = LoggerFactory + .getLogger(OpenAiChatModelTypeReferenceBeanOutputConverterIT.class); @Test void typeRefOutputConverterRecords() { 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 fee7902fc..f2a92a1ef 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 @@ -24,6 +24,8 @@ import java.util.stream.Collectors; import org.junit.jupiter.api.condition.EnabledIfEnvironmentVariable; import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.provider.ValueSource; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import reactor.core.publisher.Flux; import org.springframework.ai.chat.client.ChatClient; @@ -46,7 +48,6 @@ import org.springframework.context.ApplicationContext; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Description; import org.springframework.core.ParameterizedTypeReference; -import org.springframework.core.log.LogAccessor; import static org.assertj.core.api.Assertions.assertThat; @@ -57,7 +58,7 @@ import static org.assertj.core.api.Assertions.assertThat; @EnabledIfEnvironmentVariable(named = "OPENAI_API_KEY", matches = ".*") public class OpenAiPaymentTransactionIT { - private static final LogAccessor logger = new LogAccessor(OpenAiPaymentTransactionIT.class); + private static final Logger logger = LoggerFactory.getLogger(OpenAiPaymentTransactionIT.class); private static final Map DATASET = Map.of(new Transaction("001"), new Status("pending"), new Transaction("002"), new Status("approved"), new Transaction("003"), new Status("rejected")); @@ -131,7 +132,7 @@ public class OpenAiPaymentTransactionIT { private static class LoggingAdvisor implements CallAroundAdvisor { - private static final LogAccessor logger = new LogAccessor(LoggingAdvisor.class); + private final Logger logger = LoggerFactory.getLogger(LoggingAdvisor.class); public String getName() { return this.getClass().getSimpleName(); diff --git a/models/spring-ai-openai/src/test/java/org/springframework/ai/openai/chat/OpenAiRetryTests.java b/models/spring-ai-openai/src/test/java/org/springframework/ai/openai/chat/OpenAiRetryTests.java index 1c3d4e5ff..20ca78309 100644 --- a/models/spring-ai-openai/src/test/java/org/springframework/ai/openai/chat/OpenAiRetryTests.java +++ b/models/spring-ai-openai/src/test/java/org/springframework/ai/openai/chat/OpenAiRetryTests.java @@ -25,6 +25,8 @@ import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; import org.mockito.Mock; import org.mockito.junit.jupiter.MockitoExtension; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import reactor.core.publisher.Flux; import org.springframework.ai.audio.transcription.AudioTranscriptionPrompt; @@ -62,7 +64,6 @@ import org.springframework.ai.openai.api.OpenAiImageApi.OpenAiImageResponse; import org.springframework.ai.retry.RetryUtils; import org.springframework.ai.retry.TransientAiException; import org.springframework.core.io.ClassPathResource; -import org.springframework.core.log.LogAccessor; import org.springframework.http.ResponseEntity; import org.springframework.retry.RetryCallback; import org.springframework.retry.RetryContext; @@ -83,7 +84,7 @@ import static org.mockito.BDDMockito.given; @ExtendWith(MockitoExtension.class) public class OpenAiRetryTests { - private static final LogAccessor logger = new LogAccessor(OpenAiRetryTests.class); + private static final Logger logger = LoggerFactory.getLogger(OpenAiRetryTests.class); private TestRetryListener retryListener; diff --git a/models/spring-ai-openai/src/test/java/org/springframework/ai/openai/chat/client/OpenAiChatClientIT.java b/models/spring-ai-openai/src/test/java/org/springframework/ai/openai/chat/client/OpenAiChatClientIT.java index 60434c740..46452de25 100644 --- a/models/spring-ai-openai/src/test/java/org/springframework/ai/openai/chat/client/OpenAiChatClientIT.java +++ b/models/spring-ai-openai/src/test/java/org/springframework/ai/openai/chat/client/OpenAiChatClientIT.java @@ -28,6 +28,8 @@ import org.junit.jupiter.api.Test; import org.junit.jupiter.api.condition.EnabledIfEnvironmentVariable; import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.provider.ValueSource; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import reactor.core.publisher.Flux; import org.springframework.ai.chat.client.ChatClient; @@ -48,7 +50,6 @@ import org.springframework.core.ParameterizedTypeReference; import org.springframework.core.convert.support.DefaultConversionService; import org.springframework.core.io.ClassPathResource; import org.springframework.core.io.Resource; -import org.springframework.core.log.LogAccessor; import org.springframework.test.context.ActiveProfiles; import org.springframework.util.MimeTypeUtils; @@ -59,7 +60,7 @@ import static org.assertj.core.api.Assertions.assertThat; @ActiveProfiles("logging-test") class OpenAiChatClientIT extends AbstractIT { - private static final LogAccessor logger = new LogAccessor(OpenAiChatClientIT.class); + private static final Logger logger = LoggerFactory.getLogger(OpenAiChatClientIT.class); @Value("classpath:/prompts/system-message.st") private Resource systemTextResource; @@ -256,7 +257,7 @@ class OpenAiChatClientIT extends AbstractIT { .content(); // @formatter:on - logger.info("Response: " + response); + logger.info("Response: {}", response); assertThat(response).contains("30", "10", "15"); } @@ -275,7 +276,7 @@ class OpenAiChatClientIT extends AbstractIT { .prompt().call().content(); // @formatter:on - logger.info("Response: " + response); + logger.info("Response: {}", response); assertThat(response).contains("30", "10", "15"); } @@ -295,7 +296,7 @@ class OpenAiChatClientIT extends AbstractIT { // @formatter:on String content = response.collectList().block().stream().collect(Collectors.joining()); - logger.info("Response: " + content); + logger.info("Response: {}", content); assertThat(content).contains("30", "10", "15"); } @@ -357,7 +358,7 @@ class OpenAiChatClientIT extends AbstractIT { String content = response.collectList().block().stream().collect(Collectors.joining()); - logger.info("Response: " + content); + logger.info("Response: {}", content); assertThat(content).contains("bananas", "apple"); assertThat(content).containsAnyOf("bowl", "basket"); } diff --git a/models/spring-ai-openai/src/test/java/org/springframework/ai/openai/chat/client/OpenAiChatClientMethodInvokingFunctionCallbackIT.java b/models/spring-ai-openai/src/test/java/org/springframework/ai/openai/chat/client/OpenAiChatClientMethodInvokingFunctionCallbackIT.java index 112133a90..6aba69820 100644 --- a/models/spring-ai-openai/src/test/java/org/springframework/ai/openai/chat/client/OpenAiChatClientMethodInvokingFunctionCallbackIT.java +++ b/models/spring-ai-openai/src/test/java/org/springframework/ai/openai/chat/client/OpenAiChatClientMethodInvokingFunctionCallbackIT.java @@ -22,6 +22,8 @@ import java.util.concurrent.ConcurrentHashMap; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.condition.EnabledIfEnvironmentVariable; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import org.springframework.ai.chat.client.ChatClient; import org.springframework.ai.chat.model.ChatModel; @@ -31,7 +33,6 @@ import org.springframework.ai.tool.definition.ToolDefinition; import org.springframework.ai.tool.method.MethodToolCallback; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; -import org.springframework.core.log.LogAccessor; import org.springframework.test.context.ActiveProfiles; import org.springframework.util.ReflectionUtils; @@ -43,7 +44,8 @@ import static org.assertj.core.api.AssertionsForClassTypes.assertThatThrownBy; @ActiveProfiles("logging-test") class OpenAiChatClientMethodInvokingFunctionCallbackIT { - private static final LogAccessor logger = new LogAccessor(OpenAiChatClientMethodInvokingFunctionCallbackIT.class); + private static final Logger logger = LoggerFactory + .getLogger(OpenAiChatClientMethodInvokingFunctionCallbackIT.class); public static Map arguments = new ConcurrentHashMap<>(); @@ -74,7 +76,7 @@ class OpenAiChatClientMethodInvokingFunctionCallbackIT { .content(); // @formatter:on - logger.info("Response: " + response); + logger.info("Response: {}", response); assertThat(response).contains("30", "10", "15"); } @@ -100,7 +102,7 @@ class OpenAiChatClientMethodInvokingFunctionCallbackIT { .content(); // @formatter:on - logger.info("Response: " + response); + logger.info("Response: {}", response); assertThat(arguments).containsEntry("roomName", "living room"); assertThat(arguments).containsEntry("on", true); @@ -128,7 +130,7 @@ class OpenAiChatClientMethodInvokingFunctionCallbackIT { .content(); // @formatter:on - logger.info("Response: " + response); + logger.info("Response: {}", response); assertThat(response).contains("30", "10", "15"); } @@ -156,7 +158,7 @@ class OpenAiChatClientMethodInvokingFunctionCallbackIT { .content(); // @formatter:on - logger.info("Response: " + response); + logger.info("Response: {}", response); assertThat(response).contains("30", "10", "15"); assertThat(arguments).containsEntry("tool", "value"); @@ -209,7 +211,7 @@ class OpenAiChatClientMethodInvokingFunctionCallbackIT { .content(); // @formatter:on - logger.info("Response: " + response); + logger.info("Response: {}", response); assertThat(arguments).containsEntry("turnLivingRoomLightOn", true); } @@ -262,7 +264,7 @@ class OpenAiChatClientMethodInvokingFunctionCallbackIT { public void turnLight(String roomName, boolean on) { arguments.put("roomName", roomName); arguments.put("on", on); - logger.info("Turn light in room: " + roomName + " to: " + on); + logger.info("Turn light in room: {} to: {}", roomName, on); } public void turnLivingRoomLightOn() { diff --git a/models/spring-ai-openai/src/test/java/org/springframework/ai/openai/chat/client/OpenAiChatClientMultipleFunctionCallsIT.java b/models/spring-ai-openai/src/test/java/org/springframework/ai/openai/chat/client/OpenAiChatClientMultipleFunctionCallsIT.java index 715213a7e..f318caf53 100644 --- a/models/spring-ai-openai/src/test/java/org/springframework/ai/openai/chat/client/OpenAiChatClientMultipleFunctionCallsIT.java +++ b/models/spring-ai-openai/src/test/java/org/springframework/ai/openai/chat/client/OpenAiChatClientMultipleFunctionCallsIT.java @@ -25,6 +25,8 @@ import java.util.stream.Collectors; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.condition.EnabledIfEnvironmentVariable; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import reactor.core.publisher.Flux; import org.springframework.ai.chat.client.ChatClient; @@ -38,7 +40,6 @@ import org.springframework.ai.tool.function.FunctionToolCallback; import org.springframework.beans.factory.annotation.Value; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.core.io.Resource; -import org.springframework.core.log.LogAccessor; import org.springframework.test.context.ActiveProfiles; import static org.assertj.core.api.Assertions.assertThat; @@ -48,7 +49,7 @@ import static org.assertj.core.api.Assertions.assertThat; @ActiveProfiles("logging-test") class OpenAiChatClientMultipleFunctionCallsIT extends AbstractIT { - private static final LogAccessor logger = new LogAccessor(OpenAiChatClientMultipleFunctionCallsIT.class); + private static final Logger logger = LoggerFactory.getLogger(OpenAiChatClientMultipleFunctionCallsIT.class); @Value("classpath:/prompts/system-message.st") private Resource systemTextResource; @@ -76,7 +77,7 @@ class OpenAiChatClientMultipleFunctionCallsIT extends AbstractIT { .content(); // @formatter:on - logger.info("Response: " + response); + logger.info("Response: {}", response); assertThat(response).doesNotContain("30", "10", "15"); @@ -91,7 +92,7 @@ class OpenAiChatClientMultipleFunctionCallsIT extends AbstractIT { .content(); // @formatter:on - logger.info("Response: " + response); + logger.info("Response: {}", response); assertThat(response).contains("30", "10", "15"); @@ -102,7 +103,7 @@ class OpenAiChatClientMultipleFunctionCallsIT extends AbstractIT { .content(); // @formatter:on - logger.info("Response: " + response); + logger.info("Response: {}", response); assertThat(response).doesNotContain("30", "10", "15"); @@ -122,7 +123,7 @@ class OpenAiChatClientMultipleFunctionCallsIT extends AbstractIT { .prompt().call().content(); // @formatter:on - logger.info("Response: " + response); + logger.info("Response: {}", response); assertThat(response).contains("30", "10", "15"); } @@ -165,7 +166,7 @@ class OpenAiChatClientMultipleFunctionCallsIT extends AbstractIT { .prompt().call().content(); // @formatter:on - logger.info("Response: " + response); + logger.info("Response: {}", response); assertThat(response).contains("30", "10", "15"); } @@ -209,7 +210,7 @@ class OpenAiChatClientMultipleFunctionCallsIT extends AbstractIT { .call().content(); // @formatter:on - logger.info("Response: " + response); + logger.info("Response: {}", response); assertThat(response).contains("30", "10", "15"); } @@ -229,7 +230,7 @@ class OpenAiChatClientMultipleFunctionCallsIT extends AbstractIT { // @formatter:on String content = response.collectList().block().stream().collect(Collectors.joining()); - logger.info("Response: " + content); + logger.info("Response: {}", content); assertThat(content).contains("30", "10", "15"); diff --git a/models/spring-ai-openai/src/test/java/org/springframework/ai/openai/chat/client/OpenAiChatClientProxyFunctionCallsIT.java b/models/spring-ai-openai/src/test/java/org/springframework/ai/openai/chat/client/OpenAiChatClientProxyFunctionCallsIT.java index 67ea94ece..5a072c9a2 100644 --- a/models/spring-ai-openai/src/test/java/org/springframework/ai/openai/chat/client/OpenAiChatClientProxyFunctionCallsIT.java +++ b/models/spring-ai-openai/src/test/java/org/springframework/ai/openai/chat/client/OpenAiChatClientProxyFunctionCallsIT.java @@ -27,6 +27,8 @@ import com.fasterxml.jackson.databind.JsonMappingException; import com.fasterxml.jackson.databind.ObjectMapper; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.condition.EnabledIfEnvironmentVariable; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import org.springframework.ai.chat.client.ChatClient; import org.springframework.ai.chat.messages.AssistantMessage; @@ -47,7 +49,6 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.core.io.Resource; -import org.springframework.core.log.LogAccessor; import org.springframework.test.context.ActiveProfiles; import org.springframework.util.CollectionUtils; @@ -58,7 +59,7 @@ import static org.assertj.core.api.Assertions.assertThat; @ActiveProfiles("logging-test") class OpenAiChatClientProxyFunctionCallsIT extends AbstractIT { - private static final LogAccessor logger = new LogAccessor(OpenAiChatClientMultipleFunctionCallsIT.class); + private static final Logger logger = LoggerFactory.getLogger(OpenAiChatClientMultipleFunctionCallsIT.class); @Value("classpath:/prompts/system-message.st") private Resource systemTextResource; @@ -176,7 +177,7 @@ class OpenAiChatClientProxyFunctionCallsIT extends AbstractIT { } while (isToolCall); - logger.info("Response: " + chatResponse); + logger.info("Response: {}", chatResponse); assertThat(chatResponse.getResult().getOutput().getText()).contains("30", "10", "15"); } diff --git a/models/spring-ai-openai/src/test/java/org/springframework/ai/openai/chat/proxy/DeepSeekWithOpenAiChatModelIT.java b/models/spring-ai-openai/src/test/java/org/springframework/ai/openai/chat/proxy/DeepSeekWithOpenAiChatModelIT.java index 84c00209a..461b8cdaf 100644 --- a/models/spring-ai-openai/src/test/java/org/springframework/ai/openai/chat/proxy/DeepSeekWithOpenAiChatModelIT.java +++ b/models/spring-ai-openai/src/test/java/org/springframework/ai/openai/chat/proxy/DeepSeekWithOpenAiChatModelIT.java @@ -27,6 +27,8 @@ import org.junit.jupiter.api.Test; import org.junit.jupiter.api.condition.EnabledIfEnvironmentVariable; import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.provider.ValueSource; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import reactor.core.publisher.Flux; import org.springframework.ai.chat.client.ChatClient; @@ -54,7 +56,6 @@ import org.springframework.boot.test.context.SpringBootTest; import org.springframework.context.annotation.Bean; import org.springframework.core.convert.support.DefaultConversionService; import org.springframework.core.io.Resource; -import org.springframework.core.log.LogAccessor; import static org.assertj.core.api.Assertions.assertThat; @@ -72,7 +73,7 @@ import static org.assertj.core.api.Assertions.assertThat; @Disabled("Requires DeepSeek credits") class DeepSeekWithOpenAiChatModelIT { - private static final LogAccessor logger = new LogAccessor(DeepSeekWithOpenAiChatModelIT.class); + private static final Logger logger = LoggerFactory.getLogger(DeepSeekWithOpenAiChatModelIT.class); private static final String DEEPSEEK_BASE_URL = "https://api.deepseek.com"; @@ -211,7 +212,7 @@ class DeepSeekWithOpenAiChatModelIT { DeepSeekWithOpenAiChatModelIT.ActorsFilmsRecord actorsFilms = outputConverter .convert(generation.getOutput().getText()); - logger.info("" + actorsFilms); + logger.info("{}", actorsFilms); assertThat(actorsFilms.actor()).isEqualTo("Tom Hanks"); assertThat(actorsFilms.movies()).hasSize(5); } @@ -241,7 +242,7 @@ class DeepSeekWithOpenAiChatModelIT { .collect(Collectors.joining()); DeepSeekWithOpenAiChatModelIT.ActorsFilmsRecord actorsFilms = outputConverter.convert(generationTextFromStream); - logger.info("" + actorsFilms); + logger.info("{}", actorsFilms); assertThat(actorsFilms.actor()).isEqualTo("Tom Hanks"); assertThat(actorsFilms.movies()).hasSize(5); } @@ -264,7 +265,7 @@ class DeepSeekWithOpenAiChatModelIT { ChatResponse response = this.chatModel.call(new Prompt(messages, promptOptions)); - logger.info("Response: " + response); + logger.info("Response: {}", response); assertThat(response.getResult().getOutput().getText()).contains("30", "10", "15"); } @@ -296,7 +297,7 @@ class DeepSeekWithOpenAiChatModelIT { .map(Generation::getOutput) .map(AssistantMessage::getText) .collect(Collectors.joining()); - logger.info("Response: " + content); + logger.info("Response: {}", content); assertThat(content).contains("30", "10", "15"); } diff --git a/models/spring-ai-openai/src/test/java/org/springframework/ai/openai/chat/proxy/GroqWithOpenAiChatModelIT.java b/models/spring-ai-openai/src/test/java/org/springframework/ai/openai/chat/proxy/GroqWithOpenAiChatModelIT.java index 1f4866c23..cce105b78 100644 --- a/models/spring-ai-openai/src/test/java/org/springframework/ai/openai/chat/proxy/GroqWithOpenAiChatModelIT.java +++ b/models/spring-ai-openai/src/test/java/org/springframework/ai/openai/chat/proxy/GroqWithOpenAiChatModelIT.java @@ -29,6 +29,8 @@ import org.junit.jupiter.api.Test; import org.junit.jupiter.api.condition.EnabledIfEnvironmentVariable; import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.provider.ValueSource; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import reactor.core.publisher.Flux; import org.springframework.ai.chat.client.ChatClient; @@ -58,7 +60,6 @@ import org.springframework.context.annotation.Bean; import org.springframework.core.convert.support.DefaultConversionService; import org.springframework.core.io.ClassPathResource; import org.springframework.core.io.Resource; -import org.springframework.core.log.LogAccessor; import org.springframework.util.MimeTypeUtils; import static org.assertj.core.api.Assertions.assertThat; @@ -68,7 +69,7 @@ import static org.assertj.core.api.Assertions.assertThat; @Disabled("Due to rate limiting it is hard to run it in one go") class GroqWithOpenAiChatModelIT { - private static final LogAccessor logger = new LogAccessor(GroqWithOpenAiChatModelIT.class); + private static final Logger logger = LoggerFactory.getLogger(GroqWithOpenAiChatModelIT.class); private static final String GROQ_BASE_URL = "https://api.groq.com/openai"; @@ -257,7 +258,7 @@ class GroqWithOpenAiChatModelIT { ChatResponse response = this.chatModel.call(new Prompt(messages, promptOptions)); - logger.info("Response: " + response); + logger.info("Response: {}", response); assertThat(response.getResult().getOutput().getText()).contains("30", "10", "15"); } @@ -288,7 +289,7 @@ class GroqWithOpenAiChatModelIT { .map(Generation::getOutput) .map(AssistantMessage::getText) .collect(Collectors.joining()); - logger.info("Response: " + content); + logger.info("Response: {}", content); assertThat(content).contains("30", "10", "15"); } @@ -350,7 +351,7 @@ class GroqWithOpenAiChatModelIT { .map(Generation::getOutput) .map(AssistantMessage::getText) .collect(Collectors.joining()); - logger.info("Response: " + content); + logger.info("Response: {}", content); assertThat(content).contains("bananas", "apple"); assertThat(content).containsAnyOf("bowl", "basket"); } diff --git a/models/spring-ai-openai/src/test/java/org/springframework/ai/openai/chat/proxy/MistralWithOpenAiChatModelIT.java b/models/spring-ai-openai/src/test/java/org/springframework/ai/openai/chat/proxy/MistralWithOpenAiChatModelIT.java index cfb073c68..7071f3608 100644 --- a/models/spring-ai-openai/src/test/java/org/springframework/ai/openai/chat/proxy/MistralWithOpenAiChatModelIT.java +++ b/models/spring-ai-openai/src/test/java/org/springframework/ai/openai/chat/proxy/MistralWithOpenAiChatModelIT.java @@ -29,6 +29,8 @@ import org.junit.jupiter.api.Test; import org.junit.jupiter.api.condition.EnabledIfEnvironmentVariable; import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.provider.ValueSource; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import reactor.core.publisher.Flux; import org.springframework.ai.chat.client.ChatClient; @@ -58,7 +60,6 @@ import org.springframework.context.annotation.Bean; import org.springframework.core.convert.support.DefaultConversionService; import org.springframework.core.io.ClassPathResource; import org.springframework.core.io.Resource; -import org.springframework.core.log.LogAccessor; import org.springframework.util.MimeTypeUtils; import static org.assertj.core.api.Assertions.assertThat; @@ -67,7 +68,7 @@ import static org.assertj.core.api.Assertions.assertThat; @EnabledIfEnvironmentVariable(named = "MISTRAL_AI_API_KEY", matches = ".+") class MistralWithOpenAiChatModelIT { - private static final LogAccessor logger = new LogAccessor(MistralWithOpenAiChatModelIT.class); + private static final Logger logger = LoggerFactory.getLogger(MistralWithOpenAiChatModelIT.class); private static final String MISTRAL_BASE_URL = "https://api.mistral.ai"; @@ -259,7 +260,7 @@ class MistralWithOpenAiChatModelIT { ChatResponse response = this.chatModel.call(new Prompt(messages, promptOptions)); - logger.info("Response: " + response); + logger.info("Response: {}", response); assertThat(response.getResult().getOutput().getText()).contains("30", "10", "15"); } @@ -292,7 +293,7 @@ class MistralWithOpenAiChatModelIT { .map(Generation::getOutput) .map(AssistantMessage::getText) .collect(Collectors.joining()); - logger.info("Response: " + content); + logger.info("Response: {}", content); assertThat(content).contains("30", "10", "15"); } @@ -354,7 +355,7 @@ class MistralWithOpenAiChatModelIT { .map(Generation::getOutput) .map(AssistantMessage::getText) .collect(Collectors.joining()); - logger.info("Response: " + content); + logger.info("Response: {}", content); assertThat(content).contains("bananas", "apple"); assertThat(content).containsAnyOf("bowl", "basket"); } diff --git a/models/spring-ai-openai/src/test/java/org/springframework/ai/openai/chat/proxy/NvidiaWithOpenAiChatModelIT.java b/models/spring-ai-openai/src/test/java/org/springframework/ai/openai/chat/proxy/NvidiaWithOpenAiChatModelIT.java index a339af3fd..4983e96c7 100644 --- a/models/spring-ai-openai/src/test/java/org/springframework/ai/openai/chat/proxy/NvidiaWithOpenAiChatModelIT.java +++ b/models/spring-ai-openai/src/test/java/org/springframework/ai/openai/chat/proxy/NvidiaWithOpenAiChatModelIT.java @@ -25,6 +25,8 @@ import java.util.stream.Collectors; import org.junit.jupiter.api.Disabled; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.condition.EnabledIfEnvironmentVariable; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import reactor.core.publisher.Flux; import org.springframework.ai.chat.client.ChatClient; @@ -52,7 +54,6 @@ import org.springframework.boot.test.context.SpringBootTest; import org.springframework.context.annotation.Bean; import org.springframework.core.convert.support.DefaultConversionService; import org.springframework.core.io.Resource; -import org.springframework.core.log.LogAccessor; import static org.assertj.core.api.Assertions.assertThat; @@ -65,7 +66,7 @@ import static org.assertj.core.api.Assertions.assertThat; @Disabled("Requires NVIDIA credits") class NvidiaWithOpenAiChatModelIT { - private static final LogAccessor logger = new LogAccessor(NvidiaWithOpenAiChatModelIT.class); + private static final Logger logger = LoggerFactory.getLogger(NvidiaWithOpenAiChatModelIT.class); private static final String NVIDIA_BASE_URL = "https://integrate.api.nvidia.com"; @@ -254,7 +255,7 @@ class NvidiaWithOpenAiChatModelIT { ChatResponse response = this.chatModel.call(new Prompt(messages, promptOptions)); - logger.info("Response: " + response); + logger.info("Response: {}", response); assertThat(response.getResult().getOutput().getText()).contains("30", "10", "15"); } @@ -285,7 +286,7 @@ class NvidiaWithOpenAiChatModelIT { .map(Generation::getOutput) .map(AssistantMessage::getText) .collect(Collectors.joining()); - logger.info("Response: " + content); + logger.info("Response: {}", content); assertThat(content).contains("30", "10", "15"); } diff --git a/models/spring-ai-openai/src/test/java/org/springframework/ai/openai/chat/proxy/OllamaWithOpenAiChatModelIT.java b/models/spring-ai-openai/src/test/java/org/springframework/ai/openai/chat/proxy/OllamaWithOpenAiChatModelIT.java index c0587c03b..2ec5c34c5 100644 --- a/models/spring-ai-openai/src/test/java/org/springframework/ai/openai/chat/proxy/OllamaWithOpenAiChatModelIT.java +++ b/models/spring-ai-openai/src/test/java/org/springframework/ai/openai/chat/proxy/OllamaWithOpenAiChatModelIT.java @@ -1,5 +1,5 @@ /* - * Copyright 2023-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. @@ -29,6 +29,8 @@ import org.junit.jupiter.api.Disabled; import org.junit.jupiter.api.Test; import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.provider.ValueSource; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import org.testcontainers.junit.jupiter.Container; import org.testcontainers.junit.jupiter.Testcontainers; import org.testcontainers.ollama.OllamaContainer; @@ -61,7 +63,6 @@ import org.springframework.context.annotation.Bean; import org.springframework.core.convert.support.DefaultConversionService; import org.springframework.core.io.ClassPathResource; import org.springframework.core.io.Resource; -import org.springframework.core.log.LogAccessor; import org.springframework.util.MimeTypeUtils; import static org.assertj.core.api.Assertions.assertThat; @@ -71,7 +72,7 @@ import static org.assertj.core.api.Assertions.assertThat; @SpringBootTest(classes = OllamaWithOpenAiChatModelIT.Config.class) class OllamaWithOpenAiChatModelIT { - private static final LogAccessor logger = new LogAccessor(OllamaWithOpenAiChatModelIT.class); + private static final Logger logger = LoggerFactory.getLogger(OllamaWithOpenAiChatModelIT.class); private static final String DEFAULT_OLLAMA_MODEL = "mistral"; @@ -280,7 +281,7 @@ class OllamaWithOpenAiChatModelIT { ChatResponse response = this.chatModel.call(new Prompt(messages, promptOptions)); - logger.info("Response: " + response); + logger.info("Response: {}", response); assertThat(response.getResult().getOutput().getText()).contains("30", "10", "15"); } @@ -316,7 +317,7 @@ class OllamaWithOpenAiChatModelIT { .map(Generation::getOutput) .map(AssistantMessage::getText) .collect(Collectors.joining()); - logger.info("Response: " + content); + logger.info("Response: {}", content); assertThat(content).contains("30", "10", "15"); } @@ -379,7 +380,7 @@ class OllamaWithOpenAiChatModelIT { .map(Generation::getOutput) .map(AssistantMessage::getText) .collect(Collectors.joining()); - logger.info("Response: " + content); + logger.info("Response: {}", content); assertThat(content).contains("bananas", "apple"); assertThat(content).containsAnyOf("bowl", "basket"); } diff --git a/models/spring-ai-openai/src/test/java/org/springframework/ai/openai/chat/proxy/PerplexityWithOpenAiChatModelIT.java b/models/spring-ai-openai/src/test/java/org/springframework/ai/openai/chat/proxy/PerplexityWithOpenAiChatModelIT.java index 03c0bf67c..ceb6c9441 100644 --- a/models/spring-ai-openai/src/test/java/org/springframework/ai/openai/chat/proxy/PerplexityWithOpenAiChatModelIT.java +++ b/models/spring-ai-openai/src/test/java/org/springframework/ai/openai/chat/proxy/PerplexityWithOpenAiChatModelIT.java @@ -25,6 +25,8 @@ import java.util.stream.Collectors; import org.junit.jupiter.api.Disabled; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.condition.EnabledIfEnvironmentVariable; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import reactor.core.publisher.Flux; import org.springframework.ai.chat.client.ChatClient; @@ -53,7 +55,6 @@ import org.springframework.boot.test.context.SpringBootTest; import org.springframework.context.annotation.Bean; import org.springframework.core.convert.support.DefaultConversionService; import org.springframework.core.io.Resource; -import org.springframework.core.log.LogAccessor; import org.springframework.web.client.RestClient; import org.springframework.web.reactive.function.client.WebClient; @@ -76,7 +77,7 @@ import static org.assertj.core.api.Assertions.assertThat; @Disabled("Requires Perplexity credits") class PerplexityWithOpenAiChatModelIT { - private static final LogAccessor logger = new LogAccessor(PerplexityWithOpenAiChatModelIT.class); + private static final Logger logger = LoggerFactory.getLogger(PerplexityWithOpenAiChatModelIT.class); private static final String PERPLEXITY_BASE_URL = "https://api.perplexity.ai"; @@ -266,7 +267,7 @@ class PerplexityWithOpenAiChatModelIT { ChatResponse response = this.chatModel.call(new Prompt(messages, promptOptions)); - logger.info("Response: " + response); + logger.info("Response: {}", response); assertThat(response.getResults().stream().mapToLong(r -> r.getOutput().getToolCalls().size()).sum()).isZero(); } @@ -296,7 +297,7 @@ class PerplexityWithOpenAiChatModelIT { .map(Generation::getOutput) .map(AssistantMessage::getText) .collect(Collectors.joining()); - logger.info("Response: " + content); + logger.info("Response: {}", content); assertThat(content).doesNotContain("toolCalls"); } diff --git a/models/spring-ai-openai/src/test/java/org/springframework/ai/openai/testutils/AbstractIT.java b/models/spring-ai-openai/src/test/java/org/springframework/ai/openai/testutils/AbstractIT.java index adeb757ce..90a0de6b6 100644 --- a/models/spring-ai-openai/src/test/java/org/springframework/ai/openai/testutils/AbstractIT.java +++ b/models/spring-ai-openai/src/test/java/org/springframework/ai/openai/testutils/AbstractIT.java @@ -19,6 +19,9 @@ package org.springframework.ai.openai.testutils; import java.util.List; import java.util.Map; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + import org.springframework.ai.chat.messages.Message; import org.springframework.ai.chat.messages.SystemMessage; import org.springframework.ai.chat.model.ChatModel; @@ -35,14 +38,13 @@ import org.springframework.ai.openai.OpenAiModerationModel; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.core.io.Resource; -import org.springframework.core.log.LogAccessor; import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.Assertions.fail; public abstract class AbstractIT { - private static final LogAccessor logger = new LogAccessor(AbstractIT.class); + private static final Logger logger = LoggerFactory.getLogger(AbstractIT.class); @Autowired protected ChatModel chatModel; diff --git a/models/spring-ai-qianfan/pom.xml b/models/spring-ai-qianfan/pom.xml index c29935b28..0055ae5f2 100644 --- a/models/spring-ai-qianfan/pom.xml +++ b/models/spring-ai-qianfan/pom.xml @@ -60,6 +60,12 @@ spring-context-support + + org.slf4j + slf4j-api + + + org.springframework.ai diff --git a/models/spring-ai-qianfan/src/main/java/org/springframework/ai/qianfan/QianFanChatModel.java b/models/spring-ai-qianfan/src/main/java/org/springframework/ai/qianfan/QianFanChatModel.java index 0d6058e2c..5f3d1ab71 100644 --- a/models/spring-ai-qianfan/src/main/java/org/springframework/ai/qianfan/QianFanChatModel.java +++ b/models/spring-ai-qianfan/src/main/java/org/springframework/ai/qianfan/QianFanChatModel.java @@ -23,6 +23,8 @@ import java.util.Map; import io.micrometer.observation.Observation; import io.micrometer.observation.ObservationRegistry; import io.micrometer.observation.contextpropagation.ObservationThreadLocalAccessor; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import reactor.core.publisher.Flux; import reactor.core.publisher.Mono; @@ -50,7 +52,6 @@ import org.springframework.ai.qianfan.api.QianFanApi.ChatCompletionMessage.Role; import org.springframework.ai.qianfan.api.QianFanApi.ChatCompletionRequest; import org.springframework.ai.qianfan.api.QianFanConstants; import org.springframework.ai.retry.RetryUtils; -import org.springframework.core.log.LogAccessor; import org.springframework.http.ResponseEntity; import org.springframework.retry.support.RetryTemplate; import org.springframework.util.Assert; @@ -68,7 +69,7 @@ import org.springframework.util.Assert; */ public class QianFanChatModel implements ChatModel, StreamingChatModel { - private static final LogAccessor logger = new LogAccessor(QianFanChatModel.class); + private static final Logger logger = LoggerFactory.getLogger(QianFanChatModel.class); private static final ChatModelObservationConvention DEFAULT_OBSERVATION_CONVENTION = new DefaultChatModelObservationConvention(); @@ -168,7 +169,7 @@ public class QianFanChatModel implements ChatModel, StreamingChatModel { var chatCompletion = completionEntity.getBody(); if (chatCompletion == null) { - logger.warn("No chat completion returned for prompt: " + prompt); + logger.warn("No chat completion returned for prompt: {}", prompt); return new ChatResponse(List.of()); } diff --git a/models/spring-ai-qianfan/src/main/java/org/springframework/ai/qianfan/QianFanEmbeddingModel.java b/models/spring-ai-qianfan/src/main/java/org/springframework/ai/qianfan/QianFanEmbeddingModel.java index 758ee9f43..a77635d4a 100644 --- a/models/spring-ai-qianfan/src/main/java/org/springframework/ai/qianfan/QianFanEmbeddingModel.java +++ b/models/spring-ai-qianfan/src/main/java/org/springframework/ai/qianfan/QianFanEmbeddingModel.java @@ -19,6 +19,8 @@ package org.springframework.ai.qianfan; import java.util.List; import io.micrometer.observation.ObservationRegistry; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import org.springframework.ai.chat.metadata.DefaultUsage; import org.springframework.ai.document.Document; @@ -38,7 +40,6 @@ import org.springframework.ai.qianfan.api.QianFanApi; import org.springframework.ai.qianfan.api.QianFanApi.EmbeddingList; import org.springframework.ai.qianfan.api.QianFanConstants; import org.springframework.ai.retry.RetryUtils; -import org.springframework.core.log.LogAccessor; import org.springframework.lang.Nullable; import org.springframework.retry.support.RetryTemplate; import org.springframework.util.Assert; @@ -52,7 +53,7 @@ import org.springframework.util.Assert; */ public class QianFanEmbeddingModel extends AbstractEmbeddingModel { - private static final LogAccessor logger = new LogAccessor(QianFanEmbeddingModel.class); + private static final Logger logger = LoggerFactory.getLogger(QianFanEmbeddingModel.class); private static final EmbeddingModelObservationConvention DEFAULT_OBSERVATION_CONVENTION = new DefaultEmbeddingModelObservationConvention(); @@ -164,12 +165,12 @@ public class QianFanEmbeddingModel extends AbstractEmbeddingModel { .execute(ctx -> this.qianFanApi.embeddings(apiRequest).getBody()); if (apiEmbeddingResponse == null) { - logger.warn("No embeddings returned for request: " + request); + logger.warn("No embeddings returned for request: {}", request); return new EmbeddingResponse(List.of()); } if (apiEmbeddingResponse.errorNsg() != null) { - logger.error("Error message returned for request: " + apiEmbeddingResponse.errorNsg()); + logger.error("Error message returned for request: {}", apiEmbeddingResponse.errorNsg()); throw new RuntimeException("Embedding failed: error code:" + apiEmbeddingResponse.errorCode() + ", message:" + apiEmbeddingResponse.errorNsg()); } diff --git a/models/spring-ai-qianfan/src/main/java/org/springframework/ai/qianfan/QianFanImageModel.java b/models/spring-ai-qianfan/src/main/java/org/springframework/ai/qianfan/QianFanImageModel.java index db5d74e49..91214f58b 100644 --- a/models/spring-ai-qianfan/src/main/java/org/springframework/ai/qianfan/QianFanImageModel.java +++ b/models/spring-ai-qianfan/src/main/java/org/springframework/ai/qianfan/QianFanImageModel.java @@ -19,6 +19,8 @@ package org.springframework.ai.qianfan; import java.util.List; import io.micrometer.observation.ObservationRegistry; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import org.springframework.ai.image.Image; import org.springframework.ai.image.ImageGeneration; @@ -34,7 +36,6 @@ import org.springframework.ai.model.ModelOptionsUtils; import org.springframework.ai.qianfan.api.QianFanConstants; import org.springframework.ai.qianfan.api.QianFanImageApi; import org.springframework.ai.retry.RetryUtils; -import org.springframework.core.log.LogAccessor; import org.springframework.http.ResponseEntity; import org.springframework.lang.Nullable; import org.springframework.retry.support.RetryTemplate; @@ -49,7 +50,7 @@ import org.springframework.util.Assert; */ public class QianFanImageModel implements ImageModel { - private static final LogAccessor logger = new LogAccessor(QianFanImageModel.class); + private static final Logger logger = LoggerFactory.getLogger(QianFanImageModel.class); private static final ImageModelObservationConvention DEFAULT_OBSERVATION_CONVENTION = new DefaultImageModelObservationConvention(); @@ -174,7 +175,7 @@ public class QianFanImageModel implements ImageModel { QianFanImageApi.QianFanImageRequest qianFanImageRequest) { QianFanImageApi.QianFanImageResponse imageApiResponse = imageResponseEntity.getBody(); if (imageApiResponse == null) { - logger.warn("No image response returned for request: " + qianFanImageRequest); + logger.warn("No image response returned for request: {}", qianFanImageRequest); return new ImageResponse(List.of()); } diff --git a/models/spring-ai-stability-ai/pom.xml b/models/spring-ai-stability-ai/pom.xml index 182ccbead..b8cababc4 100644 --- a/models/spring-ai-stability-ai/pom.xml +++ b/models/spring-ai-stability-ai/pom.xml @@ -60,6 +60,11 @@ spring-context-support + + org.slf4j + slf4j-api + + org.springframework.ai diff --git a/models/spring-ai-transformers/src/main/java/org/springframework/ai/transformers/TransformersEmbeddingModel.java b/models/spring-ai-transformers/src/main/java/org/springframework/ai/transformers/TransformersEmbeddingModel.java index e5951ff99..5fd6f4a8b 100644 --- a/models/spring-ai-transformers/src/main/java/org/springframework/ai/transformers/TransformersEmbeddingModel.java +++ b/models/spring-ai-transformers/src/main/java/org/springframework/ai/transformers/TransformersEmbeddingModel.java @@ -37,6 +37,8 @@ import ai.onnxruntime.OrtEnvironment; import ai.onnxruntime.OrtException; import ai.onnxruntime.OrtSession; import io.micrometer.observation.ObservationRegistry; +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; import org.springframework.ai.document.Document; import org.springframework.ai.document.MetadataMode; @@ -53,7 +55,6 @@ import org.springframework.ai.observation.conventions.AiProvider; import org.springframework.beans.factory.InitializingBean; import org.springframework.core.io.DefaultResourceLoader; import org.springframework.core.io.Resource; -import org.springframework.core.log.LogAccessor; import org.springframework.util.Assert; import org.springframework.util.StringUtils; @@ -88,7 +89,7 @@ public class TransformersEmbeddingModel extends AbstractEmbeddingModel implement public static final String DEFAULT_MODEL_OUTPUT_NAME = "last_hidden_state"; - private static final LogAccessor logger = new LogAccessor(TransformersEmbeddingModel.class); + private static final Log logger = LogFactory.getLog(TransformersEmbeddingModel.class); private static final EmbeddingModelObservationConvention DEFAULT_OBSERVATION_CONVENTION = new DefaultEmbeddingModelObservationConvention(); diff --git a/models/spring-ai-vertex-ai-embedding/pom.xml b/models/spring-ai-vertex-ai-embedding/pom.xml index 4ff85a918..3159198c6 100644 --- a/models/spring-ai-vertex-ai-embedding/pom.xml +++ b/models/spring-ai-vertex-ai-embedding/pom.xml @@ -83,6 +83,11 @@ spring-context-support + + org.slf4j + slf4j-api + + io.micrometer micrometer-observation-test diff --git a/models/spring-ai-vertex-ai-embedding/src/main/java/org/springframework/ai/vertexai/embedding/multimodal/VertexAiMultimodalEmbeddingModel.java b/models/spring-ai-vertex-ai-embedding/src/main/java/org/springframework/ai/vertexai/embedding/multimodal/VertexAiMultimodalEmbeddingModel.java index d81410aaf..9062f6ba3 100644 --- a/models/spring-ai-vertex-ai-embedding/src/main/java/org/springframework/ai/vertexai/embedding/multimodal/VertexAiMultimodalEmbeddingModel.java +++ b/models/spring-ai-vertex-ai-embedding/src/main/java/org/springframework/ai/vertexai/embedding/multimodal/VertexAiMultimodalEmbeddingModel.java @@ -29,6 +29,8 @@ import com.google.cloud.aiplatform.v1.PredictResponse; import com.google.cloud.aiplatform.v1.PredictionServiceClient; import com.google.protobuf.InvalidProtocolBufferException; import com.google.protobuf.Value; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import org.springframework.ai.chat.metadata.DefaultUsage; import org.springframework.ai.chat.metadata.Usage; @@ -47,7 +49,6 @@ import org.springframework.ai.vertexai.embedding.VertexAiEmbeddingUtils; import org.springframework.ai.vertexai.embedding.VertexAiEmbeddingUtils.ImageBuilder; import org.springframework.ai.vertexai.embedding.VertexAiEmbeddingUtils.MultimodalInstanceBuilder; import org.springframework.ai.vertexai.embedding.VertexAiEmbeddingUtils.VideoBuilder; -import org.springframework.core.log.LogAccessor; import org.springframework.util.Assert; import org.springframework.util.MimeType; import org.springframework.util.MimeTypeUtils; @@ -63,7 +64,7 @@ import org.springframework.util.StringUtils; */ public class VertexAiMultimodalEmbeddingModel implements DocumentEmbeddingModel { - private static final LogAccessor logger = new LogAccessor(VertexAiMultimodalEmbeddingModel.class); + private static final Logger logger = LoggerFactory.getLogger(VertexAiMultimodalEmbeddingModel.class); private static final MimeType TEXT_MIME_TYPE = MimeTypeUtils.parseMimeType("text/*"); @@ -163,7 +164,7 @@ public class VertexAiMultimodalEmbeddingModel implements DocumentEmbeddingModel new DocumentMetadata(document.getId(), media.getMimeType(), media.getData())); } else { - logger.warn("Unsupported image mime type: " + media.getMimeType()); + logger.warn("Unsupported image mime type: {}", media.getMimeType()); throw new IllegalArgumentException("Unsupported image mime type: " + media.getMimeType()); } } @@ -178,7 +179,7 @@ public class VertexAiMultimodalEmbeddingModel implements DocumentEmbeddingModel new DocumentMetadata(document.getId(), media.getMimeType(), media.getData())); } else { - logger.warn("Unsupported media type: " + media.getMimeType()); + logger.warn("Unsupported media type: {}", media.getMimeType()); throw new IllegalArgumentException("Unsupported media type: " + media.getMimeType()); } } diff --git a/models/spring-ai-vertex-ai-gemini/pom.xml b/models/spring-ai-vertex-ai-gemini/pom.xml index d17fd38c7..07db09ee0 100644 --- a/models/spring-ai-vertex-ai-gemini/pom.xml +++ b/models/spring-ai-vertex-ai-gemini/pom.xml @@ -84,6 +84,11 @@ spring-context-support + + org.slf4j + slf4j-api + + org.springframework.ai diff --git a/models/spring-ai-vertex-ai-gemini/src/test/java/org/springframework/ai/vertexai/gemini/VertexAiGeminiChatModelIT.java b/models/spring-ai-vertex-ai-gemini/src/test/java/org/springframework/ai/vertexai/gemini/VertexAiGeminiChatModelIT.java index 3e865bdac..7e20d0033 100644 --- a/models/spring-ai-vertex-ai-gemini/src/test/java/org/springframework/ai/vertexai/gemini/VertexAiGeminiChatModelIT.java +++ b/models/spring-ai-vertex-ai-gemini/src/test/java/org/springframework/ai/vertexai/gemini/VertexAiGeminiChatModelIT.java @@ -189,7 +189,7 @@ class VertexAiGeminiChatModelIT { .map(AssistantMessage::getText) .collect(Collectors.joining()); - // logger.info("" + actorsFilms); + // logger.info("{}", actorsFilms); assertThat(generationTextFromStream).isNotEmpty(); } @@ -218,7 +218,7 @@ class VertexAiGeminiChatModelIT { .collect(Collectors.joining()); ActorsFilmsRecord actorsFilms = outputConverter.convert(generationTextFromStream); - // logger.info("" + actorsFilms); + // logger.info("{}", actorsFilms); assertThat(actorsFilms.actor()).isEqualTo("Tom Hanks"); assertThat(actorsFilms.movies()).hasSize(5); } diff --git a/models/spring-ai-vertex-ai-gemini/src/test/java/org/springframework/ai/vertexai/gemini/function/MockWeatherService.java b/models/spring-ai-vertex-ai-gemini/src/test/java/org/springframework/ai/vertexai/gemini/function/MockWeatherService.java index fff34d698..d79b317cd 100644 --- a/models/spring-ai-vertex-ai-gemini/src/test/java/org/springframework/ai/vertexai/gemini/function/MockWeatherService.java +++ b/models/spring-ai-vertex-ai-gemini/src/test/java/org/springframework/ai/vertexai/gemini/function/MockWeatherService.java @@ -23,15 +23,15 @@ import com.fasterxml.jackson.annotation.JsonInclude; import com.fasterxml.jackson.annotation.JsonInclude.Include; import com.fasterxml.jackson.annotation.JsonProperty; import com.fasterxml.jackson.annotation.JsonPropertyDescription; - -import org.springframework.core.log.LogAccessor; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; /** * @author Christian Tzolov */ public class MockWeatherService implements Function { - private final LogAccessor logger = new LogAccessor(getClass()); + private final Logger logger = LoggerFactory.getLogger(getClass()); @Override public Response apply(Request request) { @@ -47,7 +47,7 @@ public class MockWeatherService implements Function DATASET = Map.of(new Transaction("001"), new Status("pending"), new Transaction("002"), new Status("approved"), new Transaction("003"), new Status("rejected")); @@ -115,7 +116,7 @@ public class VertexAiGeminiPaymentTransactionIT { private static class LoggingAdvisor implements CallAroundAdvisor { - private static final LogAccessor logger = new LogAccessor(LoggingAdvisor.class); + private final Logger logger = LoggerFactory.getLogger(LoggingAdvisor.class); @Override public String getName() { diff --git a/models/spring-ai-watsonx-ai/pom.xml b/models/spring-ai-watsonx-ai/pom.xml index 217253d15..2513d95de 100644 --- a/models/spring-ai-watsonx-ai/pom.xml +++ b/models/spring-ai-watsonx-ai/pom.xml @@ -57,6 +57,11 @@ ${project.parent.version} + + org.slf4j + slf4j-api + + com.ibm.cloud sdk-core diff --git a/models/spring-ai-watsonx-ai/src/main/java/org/springframework/ai/watsonx/WatsonxAiEmbeddingModel.java b/models/spring-ai-watsonx-ai/src/main/java/org/springframework/ai/watsonx/WatsonxAiEmbeddingModel.java index 0a10ca9a5..169307400 100644 --- a/models/spring-ai-watsonx-ai/src/main/java/org/springframework/ai/watsonx/WatsonxAiEmbeddingModel.java +++ b/models/spring-ai-watsonx-ai/src/main/java/org/springframework/ai/watsonx/WatsonxAiEmbeddingModel.java @@ -19,6 +19,9 @@ package org.springframework.ai.watsonx; import java.util.List; import java.util.concurrent.atomic.AtomicInteger; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + import org.springframework.ai.document.Document; import org.springframework.ai.embedding.AbstractEmbeddingModel; import org.springframework.ai.embedding.Embedding; @@ -29,7 +32,6 @@ import org.springframework.ai.embedding.EmbeddingResponse; import org.springframework.ai.watsonx.api.WatsonxAiApi; import org.springframework.ai.watsonx.api.WatsonxAiEmbeddingRequest; import org.springframework.ai.watsonx.api.WatsonxAiEmbeddingResponse; -import org.springframework.core.log.LogAccessor; import org.springframework.util.Assert; import org.springframework.util.StringUtils; @@ -49,7 +51,7 @@ import org.springframework.util.StringUtils; */ public class WatsonxAiEmbeddingModel extends AbstractEmbeddingModel { - private static final LogAccessor logger = new LogAccessor(WatsonxAiEmbeddingModel.class); + private final Logger logger = LoggerFactory.getLogger(getClass()); private final WatsonxAiApi watsonxAiApi; diff --git a/models/spring-ai-zhipuai/pom.xml b/models/spring-ai-zhipuai/pom.xml index 85deca0f1..39358da13 100644 --- a/models/spring-ai-zhipuai/pom.xml +++ b/models/spring-ai-zhipuai/pom.xml @@ -58,6 +58,11 @@ spring-context-support + + org.slf4j + slf4j-api + + org.springframework.ai diff --git a/models/spring-ai-zhipuai/src/main/java/org/springframework/ai/zhipuai/ZhiPuAiChatModel.java b/models/spring-ai-zhipuai/src/main/java/org/springframework/ai/zhipuai/ZhiPuAiChatModel.java index 47c9d5e69..17d562852 100644 --- a/models/spring-ai-zhipuai/src/main/java/org/springframework/ai/zhipuai/ZhiPuAiChatModel.java +++ b/models/spring-ai-zhipuai/src/main/java/org/springframework/ai/zhipuai/ZhiPuAiChatModel.java @@ -27,6 +27,8 @@ import java.util.concurrent.ConcurrentHashMap; import io.micrometer.observation.Observation; import io.micrometer.observation.ObservationRegistry; import io.micrometer.observation.contextpropagation.ObservationThreadLocalAccessor; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import reactor.core.publisher.Flux; import reactor.core.publisher.Mono; @@ -67,7 +69,6 @@ import org.springframework.ai.zhipuai.api.ZhiPuAiApi.ChatCompletionMessage.Role; import org.springframework.ai.zhipuai.api.ZhiPuAiApi.ChatCompletionMessage.ToolCall; import org.springframework.ai.zhipuai.api.ZhiPuAiApi.ChatCompletionRequest; import org.springframework.ai.zhipuai.api.ZhiPuApiConstants; -import org.springframework.core.log.LogAccessor; import org.springframework.http.ResponseEntity; import org.springframework.retry.support.RetryTemplate; import org.springframework.util.Assert; @@ -87,7 +88,7 @@ import org.springframework.util.MimeType; */ public class ZhiPuAiChatModel extends AbstractToolCallSupport implements ChatModel, StreamingChatModel { - private static final LogAccessor logger = new LogAccessor(ZhiPuAiChatModel.class); + private static final Logger logger = LoggerFactory.getLogger(ZhiPuAiChatModel.class); private static final ChatModelObservationConvention DEFAULT_OBSERVATION_CONVENTION = new DefaultChatModelObservationConvention(); @@ -211,7 +212,7 @@ public class ZhiPuAiChatModel extends AbstractToolCallSupport implements ChatMod var chatCompletion = completionEntity.getBody(); if (chatCompletion == null) { - logger.warn("No chat completion returned for prompt: " + prompt); + logger.warn("No chat completion returned for prompt: {}", prompt); return new ChatResponse(List.of()); } @@ -296,7 +297,7 @@ public class ZhiPuAiChatModel extends AbstractToolCallSupport implements ChatMod return new ChatResponse(generations, from(chatCompletion2)); } catch (Exception e) { - logger.error(e, "Error processing chat completion"); + logger.error("Error processing chat completion", e); return new ChatResponse(List.of()); } diff --git a/models/spring-ai-zhipuai/src/main/java/org/springframework/ai/zhipuai/ZhiPuAiEmbeddingModel.java b/models/spring-ai-zhipuai/src/main/java/org/springframework/ai/zhipuai/ZhiPuAiEmbeddingModel.java index c80a36e2d..f310f65cc 100644 --- a/models/spring-ai-zhipuai/src/main/java/org/springframework/ai/zhipuai/ZhiPuAiEmbeddingModel.java +++ b/models/spring-ai-zhipuai/src/main/java/org/springframework/ai/zhipuai/ZhiPuAiEmbeddingModel.java @@ -21,6 +21,8 @@ import java.util.List; import java.util.concurrent.atomic.AtomicInteger; import io.micrometer.observation.ObservationRegistry; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import org.springframework.ai.chat.metadata.DefaultUsage; import org.springframework.ai.document.Document; @@ -39,7 +41,6 @@ import org.springframework.ai.model.ModelOptionsUtils; import org.springframework.ai.retry.RetryUtils; import org.springframework.ai.zhipuai.api.ZhiPuAiApi; import org.springframework.ai.zhipuai.api.ZhiPuApiConstants; -import org.springframework.core.log.LogAccessor; import org.springframework.lang.Nullable; import org.springframework.retry.support.RetryTemplate; import org.springframework.util.Assert; @@ -52,7 +53,7 @@ import org.springframework.util.Assert; */ public class ZhiPuAiEmbeddingModel extends AbstractEmbeddingModel { - private static final LogAccessor logger = new LogAccessor(ZhiPuAiEmbeddingModel.class); + private static final Logger logger = LoggerFactory.getLogger(ZhiPuAiEmbeddingModel.class); private static final EmbeddingModelObservationConvention DEFAULT_OBSERVATION_CONVENTION = new DefaultEmbeddingModelObservationConvention(); @@ -174,7 +175,7 @@ public class ZhiPuAiEmbeddingModel extends AbstractEmbeddingModel { ZhiPuAiApi.EmbeddingList response = this.retryTemplate .execute(ctx -> this.zhiPuAiApi.embeddings(apiRequest).getBody()); if (response == null || response.data() == null || response.data().isEmpty()) { - logger.warn("No embeddings returned for input: " + inputContent); + logger.warn("No embeddings returned for input: {}", inputContent); embeddingList.add(new float[0]); } else { diff --git a/models/spring-ai-zhipuai/src/main/java/org/springframework/ai/zhipuai/ZhiPuAiImageModel.java b/models/spring-ai-zhipuai/src/main/java/org/springframework/ai/zhipuai/ZhiPuAiImageModel.java index 7dc3753ae..406221e7d 100644 --- a/models/spring-ai-zhipuai/src/main/java/org/springframework/ai/zhipuai/ZhiPuAiImageModel.java +++ b/models/spring-ai-zhipuai/src/main/java/org/springframework/ai/zhipuai/ZhiPuAiImageModel.java @@ -18,6 +18,9 @@ package org.springframework.ai.zhipuai; import java.util.List; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + import org.springframework.ai.image.Image; import org.springframework.ai.image.ImageGeneration; import org.springframework.ai.image.ImageModel; @@ -27,7 +30,6 @@ import org.springframework.ai.image.ImageResponse; import org.springframework.ai.model.ModelOptionsUtils; import org.springframework.ai.retry.RetryUtils; import org.springframework.ai.zhipuai.api.ZhiPuAiImageApi; -import org.springframework.core.log.LogAccessor; import org.springframework.http.ResponseEntity; import org.springframework.retry.support.RetryTemplate; import org.springframework.util.Assert; @@ -41,7 +43,7 @@ import org.springframework.util.Assert; */ public class ZhiPuAiImageModel implements ImageModel { - private static final LogAccessor logger = new LogAccessor(ZhiPuAiImageModel.class); + private static final Logger logger = LoggerFactory.getLogger(ZhiPuAiImageModel.class); public final RetryTemplate retryTemplate; @@ -99,7 +101,7 @@ public class ZhiPuAiImageModel implements ImageModel { ZhiPuAiImageApi.ZhiPuAiImageRequest zhiPuAiImageRequest) { ZhiPuAiImageApi.ZhiPuAiImageResponse imageApiResponse = imageResponseEntity.getBody(); if (imageApiResponse == null) { - logger.warn("No image response returned for request: " + zhiPuAiImageRequest); + logger.warn("No image response returned for request: {}", zhiPuAiImageRequest); return new ImageResponse(List.of()); } diff --git a/models/spring-ai-zhipuai/src/test/java/org/springframework/ai/zhipuai/api/ZhiPuAiApiToolFunctionCallIT.java b/models/spring-ai-zhipuai/src/test/java/org/springframework/ai/zhipuai/api/ZhiPuAiApiToolFunctionCallIT.java index 11b9029c1..c45b8b017 100644 --- a/models/spring-ai-zhipuai/src/test/java/org/springframework/ai/zhipuai/api/ZhiPuAiApiToolFunctionCallIT.java +++ b/models/spring-ai-zhipuai/src/test/java/org/springframework/ai/zhipuai/api/ZhiPuAiApiToolFunctionCallIT.java @@ -24,6 +24,8 @@ import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.ObjectMapper; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.condition.EnabledIfEnvironmentVariable; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import org.springframework.ai.model.ModelOptionsUtils; import org.springframework.ai.zhipuai.api.ZhiPuAiApi.ChatCompletion; @@ -32,7 +34,6 @@ import org.springframework.ai.zhipuai.api.ZhiPuAiApi.ChatCompletionMessage.Role; import org.springframework.ai.zhipuai.api.ZhiPuAiApi.ChatCompletionMessage.ToolCall; import org.springframework.ai.zhipuai.api.ZhiPuAiApi.ChatCompletionRequest; import org.springframework.ai.zhipuai.api.ZhiPuAiApi.ChatCompletionRequest.ToolChoiceBuilder; -import org.springframework.core.log.LogAccessor; import org.springframework.http.ResponseEntity; import static org.assertj.core.api.Assertions.assertThat; @@ -43,7 +44,7 @@ import static org.assertj.core.api.Assertions.assertThat; @EnabledIfEnvironmentVariable(named = "ZHIPU_AI_API_KEY", matches = ".+") public class ZhiPuAiApiToolFunctionCallIT { - private static final LogAccessor logger = new LogAccessor(ZhiPuAiApiToolFunctionCallIT.class); + private final Logger logger = LoggerFactory.getLogger(ZhiPuAiApiToolFunctionCallIT.class); MockWeatherService weatherService = new MockWeatherService(); 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 cd0da6dbf..40aa97419 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 @@ -29,6 +29,8 @@ import org.junit.jupiter.api.Test; import org.junit.jupiter.api.condition.EnabledIfEnvironmentVariable; import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.provider.ValueSource; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import reactor.core.publisher.Flux; import org.springframework.ai.chat.messages.AssistantMessage; @@ -56,7 +58,6 @@ import org.springframework.boot.test.context.SpringBootTest; import org.springframework.core.convert.support.DefaultConversionService; import org.springframework.core.io.ClassPathResource; import org.springframework.core.io.Resource; -import org.springframework.core.log.LogAccessor; import org.springframework.util.MimeTypeUtils; import static org.assertj.core.api.Assertions.assertThat; @@ -68,7 +69,7 @@ import static org.assertj.core.api.Assertions.assertThat; @EnabledIfEnvironmentVariable(named = "ZHIPU_AI_API_KEY", matches = ".+") class ZhiPuAiChatModelIT { - private static final LogAccessor logger = new LogAccessor(ZhiPuAiChatModelIT.class); + private static final Logger logger = LoggerFactory.getLogger(ZhiPuAiChatModelIT.class); @Autowired protected ChatModel chatModel; @@ -238,7 +239,7 @@ class ZhiPuAiChatModelIT { ChatResponse response = this.chatModel.call(new Prompt(messages, promptOptions)); - logger.info("Response: " + response); + logger.info("Response: {}", response); assertThat(response.getResult().getOutput().getText()).containsAnyOf("30.0", "30"); assertThat(response.getResult().getOutput().getText()).containsAnyOf("10.0", "10"); @@ -271,7 +272,7 @@ class ZhiPuAiChatModelIT { .map(Generation::getOutput) .map(AssistantMessage::getText) .collect(Collectors.joining()); - logger.info("Response: " + content); + logger.info("Response: {}", content); assertThat(content).containsAnyOf("30.0", "30"); assertThat(content).containsAnyOf("10.0", "10"); @@ -332,7 +333,7 @@ class ZhiPuAiChatModelIT { .map(Generation::getOutput) .map(AssistantMessage::getText) .collect(Collectors.joining()); - logger.info("Response: " + content); + logger.info("Response: {}", content); assertThat(content).contains("bananas", "apple"); assertThat(content).containsAnyOf("bowl", "basket"); } diff --git a/spring-ai-core/src/main/java/org/springframework/ai/aot/AiRuntimeHints.java b/spring-ai-core/src/main/java/org/springframework/ai/aot/AiRuntimeHints.java index 744d84286..286059bd3 100644 --- a/spring-ai-core/src/main/java/org/springframework/ai/aot/AiRuntimeHints.java +++ b/spring-ai-core/src/main/java/org/springframework/ai/aot/AiRuntimeHints.java @@ -25,10 +25,11 @@ import java.util.stream.Collectors; import com.fasterxml.jackson.annotation.JsonInclude; import com.fasterxml.jackson.annotation.JsonProperty; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import org.springframework.aot.hint.TypeReference; import org.springframework.context.annotation.ClassPathScanningCandidateComponentProvider; -import org.springframework.core.log.LogAccessor; import org.springframework.core.type.filter.AnnotationTypeFilter; import org.springframework.core.type.filter.TypeFilter; @@ -42,7 +43,7 @@ import org.springframework.core.type.filter.TypeFilter; */ public abstract class AiRuntimeHints { - private static final LogAccessor logger = new LogAccessor(AiRuntimeHints.class); + private static final Logger log = LoggerFactory.getLogger(AiRuntimeHints.class); /** * Finds classes in a package that are annotated with JsonInclude or have Jackson @@ -90,8 +91,8 @@ public abstract class AiRuntimeHints { .stream()// .map(bd -> TypeReference.of(Objects.requireNonNull(bd.getBeanClassName())))// .peek(tr -> { - if (logger.isDebugEnabled()) { - logger.debug("registering [" + tr.getName() + ']'); + if (log.isDebugEnabled()) { + log.debug("registering [" + tr.getName() + ']'); } }) .collect(Collectors.toUnmodifiableSet()); diff --git a/spring-ai-core/src/main/java/org/springframework/ai/chat/client/advisor/SimpleLoggerAdvisor.java b/spring-ai-core/src/main/java/org/springframework/ai/chat/client/advisor/SimpleLoggerAdvisor.java index 17c3ff648..c6fc0d794 100644 --- a/spring-ai-core/src/main/java/org/springframework/ai/chat/client/advisor/SimpleLoggerAdvisor.java +++ b/spring-ai-core/src/main/java/org/springframework/ai/chat/client/advisor/SimpleLoggerAdvisor.java @@ -18,6 +18,8 @@ package org.springframework.ai.chat.client.advisor; import java.util.function.Function; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import reactor.core.publisher.Flux; import org.springframework.ai.chat.client.advisor.api.AdvisedRequest; @@ -29,7 +31,6 @@ import org.springframework.ai.chat.client.advisor.api.StreamAroundAdvisorChain; import org.springframework.ai.chat.model.ChatResponse; import org.springframework.ai.chat.model.MessageAggregator; import org.springframework.ai.model.ModelOptionsUtils; -import org.springframework.core.log.LogAccessor; /** * A simple logger advisor that logs the request and response messages. @@ -43,7 +44,7 @@ public class SimpleLoggerAdvisor implements CallAroundAdvisor, StreamAroundAdvis public static final Function DEFAULT_RESPONSE_TO_STRING = response -> ModelOptionsUtils .toJsonStringPrettyPrinter(response); - private static final LogAccessor logger = new LogAccessor(SimpleLoggerAdvisor.class); + private static final Logger logger = LoggerFactory.getLogger(SimpleLoggerAdvisor.class); private final Function requestToString; @@ -77,12 +78,12 @@ public class SimpleLoggerAdvisor implements CallAroundAdvisor, StreamAroundAdvis } private AdvisedRequest before(AdvisedRequest request) { - logger.debug("request: " + this.requestToString.apply(request)); + logger.debug("request: {}", this.requestToString.apply(request)); return request; } private void observeAfter(AdvisedResponse advisedResponse) { - logger.debug("response: " + this.responseToString.apply(advisedResponse.response())); + logger.debug("response: {}", this.responseToString.apply(advisedResponse.response())); } @Override diff --git a/spring-ai-core/src/main/java/org/springframework/ai/chat/metadata/ChatResponseMetadata.java b/spring-ai-core/src/main/java/org/springframework/ai/chat/metadata/ChatResponseMetadata.java index 61ad0d068..b8392c7ed 100644 --- a/spring-ai-core/src/main/java/org/springframework/ai/chat/metadata/ChatResponseMetadata.java +++ b/spring-ai-core/src/main/java/org/springframework/ai/chat/metadata/ChatResponseMetadata.java @@ -19,9 +19,11 @@ package org.springframework.ai.chat.metadata; import java.util.Map; import java.util.Objects; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + import org.springframework.ai.model.AbstractResponseMetadata; import org.springframework.ai.model.ResponseMetadata; -import org.springframework.core.log.LogAccessor; /** * Models common AI provider metadata returned in an AI response. @@ -34,7 +36,7 @@ import org.springframework.core.log.LogAccessor; */ public class ChatResponseMetadata extends AbstractResponseMetadata implements ResponseMetadata { - private static final LogAccessor logger = new LogAccessor(ChatResponseMetadata.class); + private static final Logger logger = LoggerFactory.getLogger(ChatResponseMetadata.class); private String id = ""; // Set to blank to preserve backward compat with previous @@ -138,7 +140,7 @@ public class ChatResponseMetadata extends AbstractResponseMetadata implements Re this.chatResponseMetadata.map.put(key, value); } else { - logger.debug("Ignore null value for key [" + key + "]"); + logger.debug("Ignore null value for key [{}]", key); } return this; } diff --git a/spring-ai-core/src/main/java/org/springframework/ai/chat/model/MessageAggregator.java b/spring-ai-core/src/main/java/org/springframework/ai/chat/model/MessageAggregator.java index dc0a6019d..b94a91f6d 100644 --- a/spring-ai-core/src/main/java/org/springframework/ai/chat/model/MessageAggregator.java +++ b/spring-ai-core/src/main/java/org/springframework/ai/chat/model/MessageAggregator.java @@ -22,6 +22,8 @@ import java.util.Map; import java.util.concurrent.atomic.AtomicReference; import java.util.function.Consumer; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import reactor.core.publisher.Flux; import org.springframework.ai.chat.client.advisor.api.AdvisedResponse; @@ -32,7 +34,6 @@ import org.springframework.ai.chat.metadata.EmptyRateLimit; import org.springframework.ai.chat.metadata.PromptMetadata; import org.springframework.ai.chat.metadata.RateLimit; import org.springframework.ai.chat.metadata.Usage; -import org.springframework.core.log.LogAccessor; import org.springframework.util.StringUtils; /** @@ -45,7 +46,7 @@ import org.springframework.util.StringUtils; */ public class MessageAggregator { - private static final LogAccessor logger = new LogAccessor(MessageAggregator.class); + private static final Logger logger = LoggerFactory.getLogger(MessageAggregator.class); public Flux aggregateAdvisedResponse(Flux advisedResponses, Consumer aggregationHandler) { @@ -167,7 +168,7 @@ public class MessageAggregator { metadataPromptMetadataRef.set(PromptMetadata.empty()); metadataRateLimitRef.set(new EmptyRateLimit()); - }).doOnError(e -> logger.error(e, "Aggregation Error")); + }).doOnError(e -> logger.error("Aggregation Error", e)); } public record DefaultUsage(Integer promptTokens, Integer completionTokens, Integer totalTokens) implements Usage { diff --git a/spring-ai-core/src/main/java/org/springframework/ai/converter/BeanOutputConverter.java b/spring-ai-core/src/main/java/org/springframework/ai/converter/BeanOutputConverter.java index a5010824d..ea7cf3141 100644 --- a/spring-ai-core/src/main/java/org/springframework/ai/converter/BeanOutputConverter.java +++ b/spring-ai-core/src/main/java/org/springframework/ai/converter/BeanOutputConverter.java @@ -34,10 +34,11 @@ import com.github.victools.jsonschema.generator.SchemaGeneratorConfig; import com.github.victools.jsonschema.generator.SchemaGeneratorConfigBuilder; import com.github.victools.jsonschema.module.jackson.JacksonModule; import com.github.victools.jsonschema.module.jackson.JacksonOption; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import org.springframework.ai.util.JacksonUtils; import org.springframework.core.ParameterizedTypeReference; -import org.springframework.core.log.LogAccessor; import org.springframework.lang.NonNull; /** @@ -58,7 +59,7 @@ import org.springframework.lang.NonNull; */ public class BeanOutputConverter implements StructuredOutputConverter { - private static final LogAccessor logger = new LogAccessor(BeanOutputConverter.class); + private final Logger logger = LoggerFactory.getLogger(BeanOutputConverter.class); /** * The target class type reference to which the output will be converted. @@ -226,7 +227,7 @@ public class BeanOutputConverter implements StructuredOutputConverter { return this.objectMapper.readValue(this.jsonSchema, Map.class); } catch (JsonProcessingException ex) { - logger.error(ex, "Could not parse the JSON Schema to a Map object"); + logger.error("Could not parse the JSON Schema to a Map object", ex); throw new IllegalStateException(ex); } } diff --git a/spring-ai-core/src/main/java/org/springframework/ai/model/function/DefaultFunctionCallbackBuilder.java b/spring-ai-core/src/main/java/org/springframework/ai/model/function/DefaultFunctionCallbackBuilder.java index bef09e773..d18e0bf5d 100644 --- a/spring-ai-core/src/main/java/org/springframework/ai/model/function/DefaultFunctionCallbackBuilder.java +++ b/spring-ai-core/src/main/java/org/springframework/ai/model/function/DefaultFunctionCallbackBuilder.java @@ -23,6 +23,9 @@ import java.util.function.Consumer; import java.util.function.Function; import java.util.function.Supplier; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + import org.springframework.ai.chat.model.ToolContext; import org.springframework.ai.model.ModelOptionsUtils; import org.springframework.ai.model.function.FunctionCallback.FunctionInvokingSpec; @@ -32,7 +35,6 @@ import org.springframework.ai.tool.function.FunctionToolCallback; import org.springframework.ai.tool.method.MethodToolCallback; import org.springframework.ai.util.ParsingUtils; import org.springframework.core.ParameterizedTypeReference; -import org.springframework.core.log.LogAccessor; import org.springframework.util.Assert; import org.springframework.util.ReflectionUtils; import org.springframework.util.StringUtils; @@ -48,7 +50,7 @@ import org.springframework.util.StringUtils; @Deprecated public class DefaultFunctionCallbackBuilder implements FunctionCallback.Builder { - private static final LogAccessor logger = new LogAccessor(DefaultFunctionCallbackBuilder.class); + private static final Logger logger = LoggerFactory.getLogger(DefaultFunctionCallbackBuilder.class); @Override public FunctionInvokingSpec function(String name, Function function) { @@ -83,8 +85,8 @@ public class DefaultFunctionCallbackBuilder implements FunctionCallback.Builder String generatedDescription = ParsingUtils.reConcatenateCamelCase(fromName, " "); - logger.info("Description is not set! A best effort attempt to generate a description:'" + generatedDescription - + "' from the:'" + fromName + "'"); + logger.info("Description is not set! A best effort attempt to generate a description:'{}' from the:'{}'", + generatedDescription, fromName); logger.info("It is recommended to set the Description explicitly! Use the 'description()' method!"); return generatedDescription; diff --git a/spring-ai-core/src/main/java/org/springframework/ai/model/function/MethodInvokingFunctionCallback.java b/spring-ai-core/src/main/java/org/springframework/ai/model/function/MethodInvokingFunctionCallback.java index a02637916..e3a724b15 100644 --- a/spring-ai-core/src/main/java/org/springframework/ai/model/function/MethodInvokingFunctionCallback.java +++ b/spring-ai-core/src/main/java/org/springframework/ai/model/function/MethodInvokingFunctionCallback.java @@ -29,11 +29,12 @@ import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.node.ObjectNode; import com.fasterxml.jackson.module.jsonSchema.JsonSchema; import com.fasterxml.jackson.module.jsonSchema.JsonSchemaGenerator; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import org.springframework.ai.chat.model.ToolContext; import org.springframework.ai.model.ModelOptionsUtils; import org.springframework.ai.tool.method.MethodToolCallback; -import org.springframework.core.log.LogAccessor; import org.springframework.util.Assert; import org.springframework.util.ClassUtils; import org.springframework.util.CollectionUtils; @@ -56,7 +57,7 @@ import org.springframework.util.ReflectionUtils; @Deprecated public class MethodInvokingFunctionCallback implements FunctionCallback { - private static final LogAccessor logger = new LogAccessor(MethodInvokingFunctionCallback.class); + private static final Logger logger = LoggerFactory.getLogger(MethodInvokingFunctionCallback.class); /** * Object instance that contains the method to be invoked. If the method is static @@ -124,7 +125,7 @@ public class MethodInvokingFunctionCallback implements FunctionCallback { this.inputSchema = this.generateJsonSchema(methodParameters); - logger.debug("Generated JSON Schema: " + this.inputSchema); + logger.debug("Generated JSON Schema: {}", this.inputSchema); } @Override diff --git a/spring-ai-core/src/main/java/org/springframework/ai/model/observation/ErrorLoggingObservationHandler.java b/spring-ai-core/src/main/java/org/springframework/ai/model/observation/ErrorLoggingObservationHandler.java index 62a802d55..0e6cd80d5 100644 --- a/spring-ai-core/src/main/java/org/springframework/ai/model/observation/ErrorLoggingObservationHandler.java +++ b/spring-ai-core/src/main/java/org/springframework/ai/model/observation/ErrorLoggingObservationHandler.java @@ -24,8 +24,9 @@ import io.micrometer.observation.Observation.Context; import io.micrometer.observation.ObservationHandler; import io.micrometer.tracing.Tracer; import io.micrometer.tracing.handler.TracingObservationHandler.TracingContext; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; -import org.springframework.core.log.LogAccessor; import org.springframework.util.Assert; /** @@ -37,7 +38,7 @@ import org.springframework.util.Assert; @SuppressWarnings({ "rawtypes", "null" }) public class ErrorLoggingObservationHandler implements ObservationHandler { - private static final LogAccessor logger = new LogAccessor(ErrorLoggingObservationHandler.class); + private static final Logger logger = LoggerFactory.getLogger(ErrorLoggingObservationHandler.class); private final Tracer tracer; @@ -47,7 +48,7 @@ public class ErrorLoggingObservationHandler implements ObservationHandler { public ErrorLoggingObservationHandler(Tracer tracer, List> supportedContextTypes) { - this(tracer, supportedContextTypes, context -> logger.error("Traced Error: " + context.getError())); + this(tracer, supportedContextTypes, context -> logger.error("Traced Error: ", context.getError())); } public ErrorLoggingObservationHandler(Tracer tracer, diff --git a/spring-ai-core/src/main/java/org/springframework/ai/observation/tracing/TracingHelper.java b/spring-ai-core/src/main/java/org/springframework/ai/observation/tracing/TracingHelper.java index bcccb6456..a675fd98e 100644 --- a/spring-ai-core/src/main/java/org/springframework/ai/observation/tracing/TracingHelper.java +++ b/spring-ai-core/src/main/java/org/springframework/ai/observation/tracing/TracingHelper.java @@ -24,8 +24,9 @@ import java.util.StringJoiner; import io.micrometer.tracing.handler.TracingObservationHandler; import io.opentelemetry.api.trace.Span; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; -import org.springframework.core.log.LogAccessor; import org.springframework.lang.Nullable; /** @@ -35,7 +36,7 @@ import org.springframework.lang.Nullable; */ public final class TracingHelper { - private static final LogAccessor logger = new LogAccessor(TracingHelper.class); + private static final Logger logger = LoggerFactory.getLogger(TracingHelper.class); private TracingHelper() { } @@ -58,7 +59,7 @@ public final class TracingHelper { } } catch (NoSuchMethodException | InvocationTargetException | IllegalAccessException ex) { - logger.warn(ex, "It wasn't possible to extract the OpenTelemetry Span object from Micrometer"); + logger.warn("It wasn't possible to extract the OpenTelemetry Span object from Micrometer", ex); return null; } diff --git a/spring-ai-core/src/main/java/org/springframework/ai/rag/generation/augmentation/ContextualQueryAugmenter.java b/spring-ai-core/src/main/java/org/springframework/ai/rag/generation/augmentation/ContextualQueryAugmenter.java index fa1cd582f..42ab33d4d 100644 --- a/spring-ai-core/src/main/java/org/springframework/ai/rag/generation/augmentation/ContextualQueryAugmenter.java +++ b/spring-ai-core/src/main/java/org/springframework/ai/rag/generation/augmentation/ContextualQueryAugmenter.java @@ -20,11 +20,13 @@ import java.util.List; import java.util.Map; import java.util.stream.Collectors; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + import org.springframework.ai.chat.prompt.PromptTemplate; import org.springframework.ai.document.Document; import org.springframework.ai.rag.Query; import org.springframework.ai.util.PromptAssert; -import org.springframework.core.log.LogAccessor; import org.springframework.lang.Nullable; import org.springframework.util.Assert; @@ -45,7 +47,7 @@ import org.springframework.util.Assert; */ public final class ContextualQueryAugmenter implements QueryAugmenter { - private static final LogAccessor logger = new LogAccessor(ContextualQueryAugmenter.class); + private static final Logger logger = LoggerFactory.getLogger(ContextualQueryAugmenter.class); private static final PromptTemplate DEFAULT_PROMPT_TEMPLATE = new PromptTemplate(""" Context information is below. diff --git a/spring-ai-core/src/main/java/org/springframework/ai/rag/preretrieval/query/expansion/MultiQueryExpander.java b/spring-ai-core/src/main/java/org/springframework/ai/rag/preretrieval/query/expansion/MultiQueryExpander.java index 20094bbed..aa64f46cf 100644 --- a/spring-ai-core/src/main/java/org/springframework/ai/rag/preretrieval/query/expansion/MultiQueryExpander.java +++ b/spring-ai-core/src/main/java/org/springframework/ai/rag/preretrieval/query/expansion/MultiQueryExpander.java @@ -20,11 +20,13 @@ import java.util.Arrays; import java.util.List; import java.util.stream.Collectors; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + import org.springframework.ai.chat.client.ChatClient; import org.springframework.ai.chat.prompt.PromptTemplate; import org.springframework.ai.rag.Query; import org.springframework.ai.util.PromptAssert; -import org.springframework.core.log.LogAccessor; import org.springframework.lang.Nullable; import org.springframework.util.Assert; import org.springframework.util.CollectionUtils; @@ -49,7 +51,7 @@ import org.springframework.util.StringUtils; */ public final class MultiQueryExpander implements QueryExpander { - private static final LogAccessor logger = new LogAccessor(MultiQueryExpander.class); + private static final Logger logger = LoggerFactory.getLogger(MultiQueryExpander.class); private static final PromptTemplate DEFAULT_PROMPT_TEMPLATE = new PromptTemplate(""" You are an expert at information retrieval and search optimization. @@ -95,7 +97,7 @@ public final class MultiQueryExpander implements QueryExpander { public List expand(Query query) { Assert.notNull(query, "query cannot be null"); - logger.debug("Generating " + this.numberOfQueries + " query variants"); + logger.debug("Generating {} query variants", this.numberOfQueries); var response = this.chatClient.prompt() .user(user -> user.text(this.promptTemplate.getTemplate()) @@ -112,8 +114,9 @@ public final class MultiQueryExpander implements QueryExpander { var queryVariants = Arrays.asList(response.split("\n")); if (CollectionUtils.isEmpty(queryVariants) || this.numberOfQueries != queryVariants.size()) { - logger.warn("Query expansion result does not contain the requested " + this.numberOfQueries - + " variants. Returning the input query unchanged."); + logger.warn( + "Query expansion result does not contain the requested {} variants. Returning the input query unchanged.", + this.numberOfQueries); return List.of(query); } diff --git a/spring-ai-core/src/main/java/org/springframework/ai/rag/preretrieval/query/transformation/CompressionQueryTransformer.java b/spring-ai-core/src/main/java/org/springframework/ai/rag/preretrieval/query/transformation/CompressionQueryTransformer.java index 53aaf8b4d..11cb23b22 100644 --- a/spring-ai-core/src/main/java/org/springframework/ai/rag/preretrieval/query/transformation/CompressionQueryTransformer.java +++ b/spring-ai-core/src/main/java/org/springframework/ai/rag/preretrieval/query/transformation/CompressionQueryTransformer.java @@ -19,6 +19,9 @@ package org.springframework.ai.rag.preretrieval.query.transformation; import java.util.List; import java.util.stream.Collectors; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + import org.springframework.ai.chat.client.ChatClient; import org.springframework.ai.chat.messages.Message; import org.springframework.ai.chat.messages.MessageType; @@ -26,7 +29,6 @@ import org.springframework.ai.chat.prompt.ChatOptions; import org.springframework.ai.chat.prompt.PromptTemplate; import org.springframework.ai.rag.Query; import org.springframework.ai.util.PromptAssert; -import org.springframework.core.log.LogAccessor; import org.springframework.lang.Nullable; import org.springframework.util.Assert; import org.springframework.util.StringUtils; @@ -43,7 +45,7 @@ import org.springframework.util.StringUtils; */ public class CompressionQueryTransformer implements QueryTransformer { - private static final LogAccessor logger = new LogAccessor(CompressionQueryTransformer.class); + private static final Logger logger = LoggerFactory.getLogger(CompressionQueryTransformer.class); private static final PromptTemplate DEFAULT_PROMPT_TEMPLATE = new PromptTemplate(""" Given the following conversation history and a follow-up query, your task is to synthesize diff --git a/spring-ai-core/src/main/java/org/springframework/ai/rag/preretrieval/query/transformation/RewriteQueryTransformer.java b/spring-ai-core/src/main/java/org/springframework/ai/rag/preretrieval/query/transformation/RewriteQueryTransformer.java index c7d87a8bf..8dd495029 100644 --- a/spring-ai-core/src/main/java/org/springframework/ai/rag/preretrieval/query/transformation/RewriteQueryTransformer.java +++ b/spring-ai-core/src/main/java/org/springframework/ai/rag/preretrieval/query/transformation/RewriteQueryTransformer.java @@ -16,12 +16,14 @@ package org.springframework.ai.rag.preretrieval.query.transformation; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + import org.springframework.ai.chat.client.ChatClient; import org.springframework.ai.chat.prompt.ChatOptions; import org.springframework.ai.chat.prompt.PromptTemplate; import org.springframework.ai.rag.Query; import org.springframework.ai.util.PromptAssert; -import org.springframework.core.log.LogAccessor; import org.springframework.lang.Nullable; import org.springframework.util.Assert; import org.springframework.util.StringUtils; @@ -39,7 +41,7 @@ import org.springframework.util.StringUtils; */ public class RewriteQueryTransformer implements QueryTransformer { - private static final LogAccessor logger = new LogAccessor(RewriteQueryTransformer.class); + private static final Logger logger = LoggerFactory.getLogger(RewriteQueryTransformer.class); private static final PromptTemplate DEFAULT_PROMPT_TEMPLATE = new PromptTemplate(""" Given a user query, rewrite it to provide better results when querying a {target}. @@ -74,7 +76,7 @@ public class RewriteQueryTransformer implements QueryTransformer { public Query transform(Query query) { Assert.notNull(query, "query cannot be null"); - logger.debug("Rewriting query to optimize for querying a " + this.targetSearchSystem + "."); + logger.debug("Rewriting query to optimize for querying a {}.", this.targetSearchSystem); var rewrittenQueryText = this.chatClient.prompt() .user(user -> user.text(this.promptTemplate.getTemplate()) diff --git a/spring-ai-core/src/main/java/org/springframework/ai/rag/preretrieval/query/transformation/TranslationQueryTransformer.java b/spring-ai-core/src/main/java/org/springframework/ai/rag/preretrieval/query/transformation/TranslationQueryTransformer.java index 1a151e286..7ddf2c7d6 100644 --- a/spring-ai-core/src/main/java/org/springframework/ai/rag/preretrieval/query/transformation/TranslationQueryTransformer.java +++ b/spring-ai-core/src/main/java/org/springframework/ai/rag/preretrieval/query/transformation/TranslationQueryTransformer.java @@ -16,12 +16,14 @@ package org.springframework.ai.rag.preretrieval.query.transformation; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + import org.springframework.ai.chat.client.ChatClient; import org.springframework.ai.chat.prompt.ChatOptions; import org.springframework.ai.chat.prompt.PromptTemplate; import org.springframework.ai.rag.Query; import org.springframework.ai.util.PromptAssert; -import org.springframework.core.log.LogAccessor; import org.springframework.lang.Nullable; import org.springframework.util.Assert; import org.springframework.util.StringUtils; @@ -48,7 +50,7 @@ import org.springframework.util.StringUtils; */ public final class TranslationQueryTransformer implements QueryTransformer { - private static final LogAccessor logger = new LogAccessor(TranslationQueryTransformer.class); + private static final Logger logger = LoggerFactory.getLogger(TranslationQueryTransformer.class); private static final PromptTemplate DEFAULT_PROMPT_TEMPLATE = new PromptTemplate(""" Given a user query, translate it to {targetLanguage}. @@ -83,7 +85,7 @@ public final class TranslationQueryTransformer implements QueryTransformer { public Query transform(Query query) { Assert.notNull(query, "query cannot be null"); - logger.debug("Translating query to target language: " + this.targetLanguage); + logger.debug("Translating query to target language: {}", this.targetLanguage); var translatedQueryText = this.chatClient.prompt() .user(user -> user.text(this.promptTemplate.getTemplate()) diff --git a/spring-ai-core/src/main/java/org/springframework/ai/rag/retrieval/join/ConcatenationDocumentJoiner.java b/spring-ai-core/src/main/java/org/springframework/ai/rag/retrieval/join/ConcatenationDocumentJoiner.java index 5c7c8dc90..56038587f 100644 --- a/spring-ai-core/src/main/java/org/springframework/ai/rag/retrieval/join/ConcatenationDocumentJoiner.java +++ b/spring-ai-core/src/main/java/org/springframework/ai/rag/retrieval/join/ConcatenationDocumentJoiner.java @@ -22,9 +22,11 @@ import java.util.Map; import java.util.function.Function; import java.util.stream.Collectors; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + import org.springframework.ai.document.Document; import org.springframework.ai.rag.Query; -import org.springframework.core.log.LogAccessor; import org.springframework.util.Assert; /** @@ -37,7 +39,7 @@ import org.springframework.util.Assert; */ public class ConcatenationDocumentJoiner implements DocumentJoiner { - private static final LogAccessor logger = new LogAccessor(ConcatenationDocumentJoiner.class); + private static final Logger logger = LoggerFactory.getLogger(ConcatenationDocumentJoiner.class); @Override public List join(Map>> documentsForQuery) { diff --git a/spring-ai-core/src/main/java/org/springframework/ai/tool/execution/DefaultToolCallResultConverter.java b/spring-ai-core/src/main/java/org/springframework/ai/tool/execution/DefaultToolCallResultConverter.java index 290846c6f..fb6fffcef 100644 --- a/spring-ai-core/src/main/java/org/springframework/ai/tool/execution/DefaultToolCallResultConverter.java +++ b/spring-ai-core/src/main/java/org/springframework/ai/tool/execution/DefaultToolCallResultConverter.java @@ -18,10 +18,10 @@ package org.springframework.ai.tool.execution; import java.lang.reflect.Type; -import org.apache.commons.logging.LogFactory; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import org.springframework.ai.util.json.JsonParser; -import org.springframework.core.log.LogAccessor; import org.springframework.lang.Nullable; /** @@ -32,7 +32,7 @@ import org.springframework.lang.Nullable; */ public final class DefaultToolCallResultConverter implements ToolCallResultConverter { - private static final LogAccessor logger = new LogAccessor(LogFactory.getLog(DefaultToolCallResultConverter.class)); + private static final Logger logger = LoggerFactory.getLogger(DefaultToolCallResultConverter.class); @Override public String apply(@Nullable Object result, @Nullable Type returnType) { diff --git a/spring-ai-core/src/main/java/org/springframework/ai/tool/function/FunctionToolCallback.java b/spring-ai-core/src/main/java/org/springframework/ai/tool/function/FunctionToolCallback.java index 8d635a6f4..00a569b61 100644 --- a/spring-ai-core/src/main/java/org/springframework/ai/tool/function/FunctionToolCallback.java +++ b/spring-ai-core/src/main/java/org/springframework/ai/tool/function/FunctionToolCallback.java @@ -22,7 +22,8 @@ import java.util.function.Consumer; import java.util.function.Function; import java.util.function.Supplier; -import org.apache.commons.logging.LogFactory; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import org.springframework.ai.chat.model.ToolContext; import org.springframework.ai.tool.ToolCallback; @@ -34,7 +35,6 @@ import org.springframework.ai.tool.util.ToolUtils; import org.springframework.ai.util.json.JsonParser; import org.springframework.ai.util.json.JsonSchemaGenerator; import org.springframework.core.ParameterizedTypeReference; -import org.springframework.core.log.LogAccessor; import org.springframework.lang.Nullable; import org.springframework.util.Assert; import org.springframework.util.StringUtils; @@ -47,7 +47,7 @@ import org.springframework.util.StringUtils; */ public class FunctionToolCallback implements ToolCallback { - private static final LogAccessor logger = new LogAccessor(LogFactory.getLog(FunctionToolCallback.class)); + private static final Logger logger = LoggerFactory.getLogger(FunctionToolCallback.class); private static final ToolCallResultConverter DEFAULT_RESULT_CONVERTER = new DefaultToolCallResultConverter(); @@ -95,12 +95,12 @@ public class FunctionToolCallback implements ToolCallback { public String call(String toolInput, @Nullable ToolContext toolContext) { Assert.hasText(toolInput, "toolInput cannot be null or empty"); - logger.debug("Starting execution of tool: " + toolDefinition.name()); + logger.debug("Starting execution of tool: {}", toolDefinition.name()); I request = JsonParser.fromJson(toolInput, toolInputType); O response = toolFunction.apply(request, toolContext); - logger.debug("Successful execution of tool: " + toolDefinition.name()); + logger.debug("Successful execution of tool: {}", toolDefinition.name()); return toolCallResultConverter.apply(response, null); } diff --git a/spring-ai-core/src/main/java/org/springframework/ai/tool/method/MethodToolCallback.java b/spring-ai-core/src/main/java/org/springframework/ai/tool/method/MethodToolCallback.java index a2ddf7194..f31b9aece 100644 --- a/spring-ai-core/src/main/java/org/springframework/ai/tool/method/MethodToolCallback.java +++ b/spring-ai-core/src/main/java/org/springframework/ai/tool/method/MethodToolCallback.java @@ -16,15 +16,9 @@ package org.springframework.ai.tool.method; -import java.lang.reflect.InvocationTargetException; -import java.lang.reflect.Method; -import java.lang.reflect.Modifier; -import java.lang.reflect.Type; -import java.util.Map; -import java.util.stream.Stream; - import com.fasterxml.jackson.core.type.TypeReference; - +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import org.springframework.ai.chat.model.ToolContext; import org.springframework.ai.tool.ToolCallback; import org.springframework.ai.tool.definition.ToolDefinition; @@ -33,13 +27,19 @@ import org.springframework.ai.tool.execution.ToolCallResultConverter; import org.springframework.ai.tool.execution.ToolExecutionException; import org.springframework.ai.tool.metadata.ToolMetadata; import org.springframework.ai.util.json.JsonParser; -import org.springframework.core.log.LogAccessor; import org.springframework.lang.Nullable; import org.springframework.util.Assert; import org.springframework.util.ClassUtils; import org.springframework.util.CollectionUtils; import org.springframework.util.ReflectionUtils; +import java.lang.reflect.InvocationTargetException; +import java.lang.reflect.Method; +import java.lang.reflect.Modifier; +import java.lang.reflect.Type; +import java.util.Map; +import java.util.stream.Stream; + /** * A {@link ToolCallback} implementation to invoke methods as tools. * @@ -48,7 +48,7 @@ import org.springframework.util.ReflectionUtils; */ public class MethodToolCallback implements ToolCallback { - private static final LogAccessor logger = new LogAccessor(MethodToolCallback.class); + private static final Logger logger = LoggerFactory.getLogger(MethodToolCallback.class); private static final ToolCallResultConverter DEFAULT_RESULT_CONVERTER = new DefaultToolCallResultConverter(); @@ -98,7 +98,7 @@ public class MethodToolCallback implements ToolCallback { public String call(String toolInput, @Nullable ToolContext toolContext) { Assert.hasText(toolInput, "toolInput cannot be null or empty"); - logger.debug("Starting execution of tool: " + toolDefinition.name()); + logger.debug("Starting execution of tool: {}", toolDefinition.name()); validateToolContextSupport(toolContext); @@ -108,7 +108,7 @@ public class MethodToolCallback implements ToolCallback { Object result = callMethod(methodArguments); - logger.debug("Successful execution of tool: " + toolDefinition.name()); + logger.debug("Successful execution of tool: {}", toolDefinition.name()); Type returnType = toolMethod.getGenericReturnType(); diff --git a/spring-ai-core/src/main/java/org/springframework/ai/tool/method/MethodToolCallbackProvider.java b/spring-ai-core/src/main/java/org/springframework/ai/tool/method/MethodToolCallbackProvider.java index dc130a937..ab89f2d73 100644 --- a/spring-ai-core/src/main/java/org/springframework/ai/tool/method/MethodToolCallbackProvider.java +++ b/spring-ai-core/src/main/java/org/springframework/ai/tool/method/MethodToolCallbackProvider.java @@ -16,6 +16,18 @@ package org.springframework.ai.tool.method; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.ai.tool.ToolCallback; +import org.springframework.ai.tool.ToolCallbackProvider; +import org.springframework.ai.tool.annotation.Tool; +import org.springframework.ai.tool.definition.ToolDefinition; +import org.springframework.ai.tool.metadata.ToolMetadata; +import org.springframework.ai.tool.util.ToolUtils; +import org.springframework.util.Assert; +import org.springframework.util.ClassUtils; +import org.springframework.util.ReflectionUtils; + import java.lang.reflect.Method; import java.util.Arrays; import java.util.List; @@ -25,17 +37,6 @@ import java.util.function.Supplier; import java.util.stream.Collectors; import java.util.stream.Stream; -import org.springframework.ai.tool.ToolCallback; -import org.springframework.ai.tool.ToolCallbackProvider; -import org.springframework.ai.tool.annotation.Tool; -import org.springframework.ai.tool.definition.ToolDefinition; -import org.springframework.ai.tool.metadata.ToolMetadata; -import org.springframework.ai.tool.util.ToolUtils; -import org.springframework.core.log.LogAccessor; -import org.springframework.util.Assert; -import org.springframework.util.ClassUtils; -import org.springframework.util.ReflectionUtils; - /** * A {@link ToolCallbackProvider} that builds {@link ToolCallback} instances from * {@link Tool}-annotated methods. @@ -45,7 +46,7 @@ import org.springframework.util.ReflectionUtils; */ public class MethodToolCallbackProvider implements ToolCallbackProvider { - private static final LogAccessor logger = new LogAccessor(MethodToolCallbackProvider.class); + private static final Logger logger = LoggerFactory.getLogger(MethodToolCallbackProvider.class); private final List toolObjects; @@ -83,8 +84,8 @@ public class MethodToolCallbackProvider implements ToolCallbackProvider { || ClassUtils.isAssignable(toolMethod.getReturnType(), Consumer.class); if (isFunction) { - logger.warn("Method " + toolMethod.getName() + " is annotated with @Tool but returns a functional type. " - + "This is not supported and the method will be ignored."); + logger.warn("Method {} is annotated with @Tool but returns a functional type. " + + "This is not supported and the method will be ignored.", toolMethod.getName()); } return isFunction; diff --git a/spring-ai-core/src/main/java/org/springframework/ai/transformer/splitter/TextSplitter.java b/spring-ai-core/src/main/java/org/springframework/ai/transformer/splitter/TextSplitter.java index 7d8c3a7f9..793c3fb75 100644 --- a/spring-ai-core/src/main/java/org/springframework/ai/transformer/splitter/TextSplitter.java +++ b/spring-ai-core/src/main/java/org/springframework/ai/transformer/splitter/TextSplitter.java @@ -21,14 +21,16 @@ import java.util.List; import java.util.Map; import java.util.stream.Collectors; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + import org.springframework.ai.document.ContentFormatter; import org.springframework.ai.document.Document; import org.springframework.ai.document.DocumentTransformer; -import org.springframework.core.log.LogAccessor; public abstract class TextSplitter implements DocumentTransformer { - private static final LogAccessor logger = new LogAccessor(TextSplitter.class); + private static final Logger logger = LoggerFactory.getLogger(TextSplitter.class); /** * If true the children documents inherit the content-type of the parent they were diff --git a/spring-ai-core/src/main/java/org/springframework/ai/vectorstore/SimpleVectorStore.java b/spring-ai-core/src/main/java/org/springframework/ai/vectorstore/SimpleVectorStore.java index 76d2359ac..c550b1313 100644 --- a/spring-ai-core/src/main/java/org/springframework/ai/vectorstore/SimpleVectorStore.java +++ b/spring-ai-core/src/main/java/org/springframework/ai/vectorstore/SimpleVectorStore.java @@ -38,6 +38,8 @@ import com.fasterxml.jackson.core.type.TypeReference; import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.ObjectWriter; import com.fasterxml.jackson.databind.json.JsonMapper; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import org.springframework.ai.document.Document; import org.springframework.ai.embedding.EmbeddingModel; @@ -47,7 +49,6 @@ import org.springframework.ai.util.JacksonUtils; import org.springframework.ai.vectorstore.observation.AbstractObservationVectorStore; import org.springframework.ai.vectorstore.observation.VectorStoreObservationContext; import org.springframework.core.io.Resource; -import org.springframework.core.log.LogAccessor; /** * SimpleVectorStore is a simple implementation of the VectorStore interface. @@ -69,7 +70,7 @@ import org.springframework.core.log.LogAccessor; */ public class SimpleVectorStore extends AbstractObservationVectorStore { - private static final LogAccessor logger = new LogAccessor(SimpleVectorStore.class); + private static final Logger logger = LoggerFactory.getLogger(SimpleVectorStore.class); private final ObjectMapper objectMapper; @@ -96,7 +97,7 @@ public class SimpleVectorStore extends AbstractObservationVectorStore { } for (Document document : documents) { - logger.info("Calling EmbeddingModel for document id = " + document.getId()); + logger.info("Calling EmbeddingModel for document id = {}", document.getId()); float[] embedding = this.embeddingModel.embed(document); SimpleVectorStoreContent storeContent = new SimpleVectorStoreContent(document.getId(), document.getText(), document.getMetadata(), embedding); @@ -138,7 +139,7 @@ public class SimpleVectorStore extends AbstractObservationVectorStore { String json = getVectorDbAsJson(); try { if (!file.exists()) { - logger.info("Creating new vector store file: " + file); + logger.info("Creating new vector store file: {}", file); try { Files.createFile(file.toPath()); } @@ -150,7 +151,7 @@ public class SimpleVectorStore extends AbstractObservationVectorStore { } } else { - logger.info("Overwriting existing vector store file: " + file); + logger.info("Overwriting existing vector store file: {}", file); } try (OutputStream stream = new FileOutputStream(file); Writer writer = new OutputStreamWriter(stream, StandardCharsets.UTF_8)) { @@ -159,15 +160,15 @@ public class SimpleVectorStore extends AbstractObservationVectorStore { } } catch (IOException ex) { - logger.error(ex, "IOException occurred while saving vector store file."); + logger.error("IOException occurred while saving vector store file.", ex); throw new RuntimeException(ex); } catch (SecurityException ex) { - logger.error(ex, "SecurityException occurred while saving vector store file."); + logger.error("SecurityException occurred while saving vector store file.", ex); throw new RuntimeException(ex); } catch (NullPointerException ex) { - logger.error(ex, "NullPointerException occurred while saving vector store file."); + logger.error("NullPointerException occurred while saving vector store file.", ex); throw new RuntimeException(ex); } } diff --git a/spring-ai-integration-tests/src/test/java/org/springframework/ai/integration/tests/tool/FunctionToolCallbackTests.java b/spring-ai-integration-tests/src/test/java/org/springframework/ai/integration/tests/tool/FunctionToolCallbackTests.java index 4f1c6d0f1..bb4e7f299 100644 --- a/spring-ai-integration-tests/src/test/java/org/springframework/ai/integration/tests/tool/FunctionToolCallbackTests.java +++ b/spring-ai-integration-tests/src/test/java/org/springframework/ai/integration/tests/tool/FunctionToolCallbackTests.java @@ -20,9 +20,10 @@ import java.util.List; import java.util.function.Consumer; import java.util.function.Function; -import org.apache.commons.logging.LogFactory; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.condition.EnabledIfEnvironmentVariable; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import org.springframework.ai.chat.client.ChatClient; import org.springframework.ai.integration.tests.TestApplication; @@ -37,7 +38,6 @@ import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.Description; import org.springframework.context.annotation.Import; -import org.springframework.core.log.LogAccessor; import static org.assertj.core.api.Assertions.assertThat; @@ -53,7 +53,7 @@ public class FunctionToolCallbackTests { // @formatter:off - private static final LogAccessor logger = new LogAccessor(LogFactory.getLog(FunctionToolCallbackTests.class)); + private static final Logger logger = LoggerFactory.getLogger(FunctionToolCallbackTests.class); @Autowired OpenAiChatModel openAiChatModel; @@ -106,7 +106,7 @@ public class FunctionToolCallbackTests { .prompt() .user("Welcome %s to the library".formatted("James Bond")) .tools(FunctionToolCallback.builder("welcomeUser", (user) -> { - logger.info("CALLBACK - Welcoming " + ((User) user).name() + " to the library"); + logger.info("CALLBACK - Welcoming {} to the library", ((User) user).name()); }) .description("Welcome a specific user to the library") .inputType(User.class) @@ -134,7 +134,7 @@ public class FunctionToolCallbackTests { @Test void chatSingleFromCallback() { Function> function = author -> { - logger.info("CALLBACK - Getting books by author: "+ author.name()); + logger.info("CALLBACK - Getting books by author: {}", author.name()); return new BookService().getBooksByAuthor(author); }; var content = ChatClient.builder(this.openAiChatModel) @@ -168,7 +168,7 @@ public class FunctionToolCallbackTests { @Test void chatListFromCallback() { Function> function = books -> { - logger.info("CALLBACK - Getting authors by books: "+ books.books().stream().map(Book::title).toList()); + logger.info("CALLBACK - Getting authors by books: {}", books.books().stream().map(Book::title).toList()); return new BookService().getAuthorsByBook(books.books()); }; var content = ChatClient.builder(this.openAiChatModel) @@ -195,7 +195,7 @@ public class FunctionToolCallbackTests { public static final String WELCOME_USER = "welcomeUser"; - private static final LogAccessor logger = new LogAccessor(Tools.class); + private static final Logger logger = LoggerFactory.getLogger(Tools.class); private final BookService bookService = new BookService(); @@ -208,7 +208,7 @@ public class FunctionToolCallbackTests { @Bean(WELCOME_USER) @Description("Welcome a specific user to the library") Consumer welcomeUser() { - return user -> logger.info("Welcoming "+ user.name() +" to the library"); + return user -> logger.info("Welcoming {} to the library", user.name()); } @Bean(BOOKS_BY_AUTHOR) @@ -224,7 +224,7 @@ public class FunctionToolCallbackTests { @Description("Get the list of authors who wrote the given books available in the library") Function> authorsByBooks() { return books -> { - logger.info("Getting authors by books: "+ books.books().stream().map(Book::title).toList()); + logger.info("Getting authors by books: {}", books.books().stream().map(Book::title).toList()); return bookService.getAuthorsByBook(books.books()); }; } diff --git a/spring-ai-integration-tests/src/test/java/org/springframework/ai/integration/tests/tool/MethodToolCallbackTests.java b/spring-ai-integration-tests/src/test/java/org/springframework/ai/integration/tests/tool/MethodToolCallbackTests.java index c8175d902..d0222c6e0 100644 --- a/spring-ai-integration-tests/src/test/java/org/springframework/ai/integration/tests/tool/MethodToolCallbackTests.java +++ b/spring-ai-integration-tests/src/test/java/org/springframework/ai/integration/tests/tool/MethodToolCallbackTests.java @@ -16,13 +16,10 @@ package org.springframework.ai.integration.tests.tool; -import java.util.List; -import java.util.Map; -import java.util.concurrent.ConcurrentHashMap; - import org.junit.jupiter.api.Test; import org.junit.jupiter.api.condition.EnabledIfEnvironmentVariable; - +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import org.springframework.ai.chat.client.ChatClient; import org.springframework.ai.integration.tests.TestApplication; import org.springframework.ai.integration.tests.tool.domain.Author; @@ -34,7 +31,10 @@ import org.springframework.ai.tool.annotation.Tool; import org.springframework.ai.tool.method.MethodToolCallback; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; -import org.springframework.core.log.LogAccessor; + +import java.util.List; +import java.util.Map; +import java.util.concurrent.ConcurrentHashMap; import static org.assertj.core.api.Assertions.assertThat; @@ -129,7 +129,7 @@ public class MethodToolCallbackTests { static class Tools { - private static final LogAccessor logger = new LogAccessor(Tools.class); + private static final Logger logger = LoggerFactory.getLogger(Tools.class); private final BookService bookService; @@ -144,18 +144,18 @@ public class MethodToolCallbackTests { @Tool(description = "Welcome a specific user to the library") void welcomeUser(String user) { - logger.info("Welcoming " + user + " to the library"); + logger.info("Welcoming {} to the library", user); } @Tool(description = "Get the list of books written by the given author available in the library") List booksByAuthor(String author) { - logger.info("Getting books by author: " + author); + logger.info("Getting books by author: {}", author); return bookService.getBooksByAuthor(new Author(author)); } @Tool(description = "Get the list of authors who wrote the given books available in the library") List authorsByBooks(List books) { - logger.info("Getting authors by books: " + String.join(", ", books)); + logger.info("Getting authors by books: {}", String.join(", ", books)); return bookService.getAuthorsByBook(books.stream().map(b -> new Book(b, "")).toList()); } diff --git a/spring-ai-integration-tests/src/test/java/org/springframework/ai/integration/tests/tool/ToolCallingManagerTests.java b/spring-ai-integration-tests/src/test/java/org/springframework/ai/integration/tests/tool/ToolCallingManagerTests.java index 34fc1887f..b28f1312f 100644 --- a/spring-ai-integration-tests/src/test/java/org/springframework/ai/integration/tests/tool/ToolCallingManagerTests.java +++ b/spring-ai-integration-tests/src/test/java/org/springframework/ai/integration/tests/tool/ToolCallingManagerTests.java @@ -18,9 +18,10 @@ package org.springframework.ai.integration.tests.tool; import java.util.List; -import org.apache.commons.logging.LogFactory; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.condition.EnabledIfEnvironmentVariable; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import reactor.core.publisher.Flux; import org.springframework.ai.chat.messages.Message; @@ -41,7 +42,6 @@ import org.springframework.ai.tool.ToolCallbacks; import org.springframework.ai.tool.annotation.Tool; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; -import org.springframework.core.log.LogAccessor; import static org.assertj.core.api.Assertions.assertThat; @@ -144,13 +144,13 @@ public class ToolCallingManagerTests { static class Tools { - private static final LogAccessor logger = new LogAccessor(LogFactory.getLog(Tools.class)); + private static final Logger logger = LoggerFactory.getLogger(Tools.class); private final BookService bookService = new BookService(); @Tool(description = "Get the list of books written by the given author available in the library") List booksByAuthor(String author) { - logger.info("Getting books by author: " + author); + logger.info("Getting books by author: {}", author); return bookService.getBooksByAuthor(new Author(author)); } diff --git a/spring-ai-retry/src/main/java/org/springframework/ai/retry/RetryUtils.java b/spring-ai-retry/src/main/java/org/springframework/ai/retry/RetryUtils.java index 5ae5c327c..960382d5c 100644 --- a/spring-ai-retry/src/main/java/org/springframework/ai/retry/RetryUtils.java +++ b/spring-ai-retry/src/main/java/org/springframework/ai/retry/RetryUtils.java @@ -20,9 +20,9 @@ import java.io.IOException; import java.nio.charset.StandardCharsets; import java.time.Duration; -import org.apache.commons.logging.LogFactory; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; -import org.springframework.core.log.LogAccessor; import org.springframework.http.client.ClientHttpResponse; import org.springframework.lang.NonNull; import org.springframework.retry.RetryCallback; @@ -41,8 +41,6 @@ import org.springframework.web.client.ResponseErrorHandler; */ public abstract class RetryUtils { - private static final LogAccessor logger = new LogAccessor(LogFactory.getLog(RetryUtils.class)); - public static final ResponseErrorHandler DEFAULT_RESPONSE_ERROR_HANDLER = new ResponseErrorHandler() { @Override @@ -69,6 +67,8 @@ public abstract class RetryUtils { } }; + private static final Logger logger = LoggerFactory.getLogger(RetryUtils.class); + public static final RetryTemplate DEFAULT_RETRY_TEMPLATE = RetryTemplate.builder() .maxAttempts(10) .retryOn(TransientAiException.class) @@ -78,7 +78,7 @@ public abstract class RetryUtils { @Override public void onError(RetryContext context, RetryCallback callback, Throwable throwable) { - logger.warn(throwable, "Retry error. Retry count:" + context.getRetryCount()); + logger.warn("Retry error. Retry count:" + context.getRetryCount(), throwable); } }) .build(); diff --git a/spring-ai-spring-boot-autoconfigure/src/main/java/org/springframework/ai/autoconfigure/chat/client/ChatClientAutoConfiguration.java b/spring-ai-spring-boot-autoconfigure/src/main/java/org/springframework/ai/autoconfigure/chat/client/ChatClientAutoConfiguration.java index d1e44c569..f815dde2e 100644 --- a/spring-ai-spring-boot-autoconfigure/src/main/java/org/springframework/ai/autoconfigure/chat/client/ChatClientAutoConfiguration.java +++ b/spring-ai-spring-boot-autoconfigure/src/main/java/org/springframework/ai/autoconfigure/chat/client/ChatClientAutoConfiguration.java @@ -17,6 +17,8 @@ package org.springframework.ai.autoconfigure.chat.client; import io.micrometer.observation.ObservationRegistry; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import org.springframework.ai.chat.client.ChatClient; import org.springframework.ai.chat.client.ChatClientCustomizer; @@ -32,7 +34,6 @@ import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; import org.springframework.boot.context.properties.EnableConfigurationProperties; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Scope; -import org.springframework.core.log.LogAccessor; /** * {@link EnableAutoConfiguration Auto-configuration} for {@link ChatClient}. @@ -55,7 +56,7 @@ import org.springframework.core.log.LogAccessor; matchIfMissing = true) public class ChatClientAutoConfiguration { - private static final LogAccessor logger = new LogAccessor(ChatClientAutoConfiguration.class); + private static final Logger logger = LoggerFactory.getLogger(ChatClientAutoConfiguration.class); @Bean @ConditionalOnMissingBean diff --git a/spring-ai-spring-boot-autoconfigure/src/main/java/org/springframework/ai/autoconfigure/chat/memory/cassandra/CassandraChatMemoryProperties.java b/spring-ai-spring-boot-autoconfigure/src/main/java/org/springframework/ai/autoconfigure/chat/memory/cassandra/CassandraChatMemoryProperties.java index a69f2d8e4..96a4c4ee3 100644 --- a/spring-ai-spring-boot-autoconfigure/src/main/java/org/springframework/ai/autoconfigure/chat/memory/cassandra/CassandraChatMemoryProperties.java +++ b/spring-ai-spring-boot-autoconfigure/src/main/java/org/springframework/ai/autoconfigure/chat/memory/cassandra/CassandraChatMemoryProperties.java @@ -18,10 +18,12 @@ package org.springframework.ai.autoconfigure.chat.memory.cassandra; import java.time.Duration; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + import org.springframework.ai.autoconfigure.chat.memory.CommonChatMemoryProperties; import org.springframework.ai.chat.memory.cassandra.CassandraChatMemoryConfig; import org.springframework.boot.context.properties.ConfigurationProperties; -import org.springframework.core.log.LogAccessor; import org.springframework.lang.Nullable; /** @@ -36,7 +38,7 @@ public class CassandraChatMemoryProperties extends CommonChatMemoryProperties { public static final String CONFIG_PREFIX = "spring.ai.chat.memory.cassandra"; - private static final LogAccessor logger = new LogAccessor(CassandraChatMemoryProperties.class); + private static final Logger logger = LoggerFactory.getLogger(CassandraChatMemoryProperties.class); private String keyspace = CassandraChatMemoryConfig.DEFAULT_KEYSPACE_NAME; diff --git a/spring-ai-spring-boot-autoconfigure/src/main/java/org/springframework/ai/autoconfigure/chat/observation/ChatObservationAutoConfiguration.java b/spring-ai-spring-boot-autoconfigure/src/main/java/org/springframework/ai/autoconfigure/chat/observation/ChatObservationAutoConfiguration.java index 0349773f1..f439263fd 100644 --- a/spring-ai-spring-boot-autoconfigure/src/main/java/org/springframework/ai/autoconfigure/chat/observation/ChatObservationAutoConfiguration.java +++ b/spring-ai-spring-boot-autoconfigure/src/main/java/org/springframework/ai/autoconfigure/chat/observation/ChatObservationAutoConfiguration.java @@ -21,6 +21,8 @@ import java.util.List; import io.micrometer.core.instrument.MeterRegistry; import io.micrometer.tracing.Tracer; import io.micrometer.tracing.otel.bridge.OtelTracer; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import org.springframework.ai.chat.client.advisor.observation.AdvisorObservationContext; import org.springframework.ai.chat.client.observation.ChatClientObservationContext; @@ -45,7 +47,6 @@ import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; import org.springframework.boot.context.properties.EnableConfigurationProperties; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; -import org.springframework.core.log.LogAccessor; /** * Auto-configuration for Spring AI chat model observations. @@ -59,7 +60,7 @@ import org.springframework.core.log.LogAccessor; @EnableConfigurationProperties({ ChatObservationProperties.class }) public class ChatObservationAutoConfiguration { - private static final LogAccessor logger = new LogAccessor(ChatObservationAutoConfiguration.class); + private static final Logger logger = LoggerFactory.getLogger(ChatObservationAutoConfiguration.class); private static void logPromptContentWarning() { logger.warn( diff --git a/spring-ai-spring-boot-autoconfigure/src/main/java/org/springframework/ai/autoconfigure/image/observation/ImageObservationAutoConfiguration.java b/spring-ai-spring-boot-autoconfigure/src/main/java/org/springframework/ai/autoconfigure/image/observation/ImageObservationAutoConfiguration.java index 971b7d4f1..a89a42102 100644 --- a/spring-ai-spring-boot-autoconfigure/src/main/java/org/springframework/ai/autoconfigure/image/observation/ImageObservationAutoConfiguration.java +++ b/spring-ai-spring-boot-autoconfigure/src/main/java/org/springframework/ai/autoconfigure/image/observation/ImageObservationAutoConfiguration.java @@ -1,5 +1,5 @@ /* - * Copyright 2023-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. @@ -16,6 +16,9 @@ package org.springframework.ai.autoconfigure.image.observation; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + import org.springframework.ai.image.ImageModel; import org.springframework.ai.image.observation.ImageModelPromptContentObservationFilter; import org.springframework.boot.autoconfigure.AutoConfiguration; @@ -24,7 +27,6 @@ import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; import org.springframework.boot.context.properties.EnableConfigurationProperties; import org.springframework.context.annotation.Bean; -import org.springframework.core.log.LogAccessor; /** * Auto-configuration for Spring AI image model observations. @@ -38,7 +40,7 @@ import org.springframework.core.log.LogAccessor; @EnableConfigurationProperties({ ImageObservationProperties.class }) public class ImageObservationAutoConfiguration { - private static final LogAccessor logger = new LogAccessor(ImageObservationAutoConfiguration.class); + private static final Logger logger = LoggerFactory.getLogger(ImageObservationAutoConfiguration.class); @Bean @ConditionalOnMissingBean diff --git a/spring-ai-spring-boot-autoconfigure/src/main/java/org/springframework/ai/autoconfigure/retry/SpringAiRetryAutoConfiguration.java b/spring-ai-spring-boot-autoconfigure/src/main/java/org/springframework/ai/autoconfigure/retry/SpringAiRetryAutoConfiguration.java index dd4103755..b17b4bfc8 100644 --- a/spring-ai-spring-boot-autoconfigure/src/main/java/org/springframework/ai/autoconfigure/retry/SpringAiRetryAutoConfiguration.java +++ b/spring-ai-spring-boot-autoconfigure/src/main/java/org/springframework/ai/autoconfigure/retry/SpringAiRetryAutoConfiguration.java @@ -19,6 +19,9 @@ package org.springframework.ai.autoconfigure.retry; import java.io.IOException; import java.nio.charset.StandardCharsets; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + import org.springframework.ai.retry.NonTransientAiException; import org.springframework.ai.retry.RetryUtils; import org.springframework.ai.retry.TransientAiException; @@ -27,7 +30,6 @@ import org.springframework.boot.autoconfigure.condition.ConditionalOnClass; import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean; import org.springframework.boot.context.properties.EnableConfigurationProperties; import org.springframework.context.annotation.Bean; -import org.springframework.core.log.LogAccessor; import org.springframework.http.client.ClientHttpResponse; import org.springframework.lang.NonNull; import org.springframework.retry.RetryCallback; @@ -48,7 +50,7 @@ import org.springframework.web.client.ResponseErrorHandler; @EnableConfigurationProperties({ SpringAiRetryProperties.class }) public class SpringAiRetryAutoConfiguration { - private static final LogAccessor logger = new LogAccessor(SpringAiRetryAutoConfiguration.class); + private static final Logger logger = LoggerFactory.getLogger(SpringAiRetryAutoConfiguration.class); @Bean @ConditionalOnMissingBean @@ -63,7 +65,7 @@ public class SpringAiRetryAutoConfiguration { @Override public void onError(RetryContext context, RetryCallback callback, Throwable throwable) { - logger.warn(throwable, "Retry error. Retry count:" + context.getRetryCount()); + logger.warn("Retry error. Retry count:" + context.getRetryCount(), throwable); } }) .build(); diff --git a/spring-ai-spring-boot-autoconfigure/src/main/java/org/springframework/ai/autoconfigure/vectorstore/cassandra/CassandraVectorStoreProperties.java b/spring-ai-spring-boot-autoconfigure/src/main/java/org/springframework/ai/autoconfigure/vectorstore/cassandra/CassandraVectorStoreProperties.java index 49b42ba2a..19174772f 100644 --- a/spring-ai-spring-boot-autoconfigure/src/main/java/org/springframework/ai/autoconfigure/vectorstore/cassandra/CassandraVectorStoreProperties.java +++ b/spring-ai-spring-boot-autoconfigure/src/main/java/org/springframework/ai/autoconfigure/vectorstore/cassandra/CassandraVectorStoreProperties.java @@ -1,5 +1,5 @@ /* - * Copyright 2023-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. @@ -17,12 +17,12 @@ package org.springframework.ai.autoconfigure.vectorstore.cassandra; import com.google.api.client.util.Preconditions; -import org.apache.commons.logging.LogFactory; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import org.springframework.ai.autoconfigure.vectorstore.CommonVectorStoreProperties; import org.springframework.ai.vectorstore.cassandra.CassandraVectorStore; import org.springframework.boot.context.properties.ConfigurationProperties; -import org.springframework.core.log.LogAccessor; /** * Configuration properties for Cassandra Vector Store. @@ -35,7 +35,7 @@ public class CassandraVectorStoreProperties extends CommonVectorStoreProperties public static final String CONFIG_PREFIX = "spring.ai.vectorstore.cassandra"; - private static final LogAccessor logger = new LogAccessor(LogFactory.getLog(CassandraVectorStoreProperties.class)); + private static final Logger logger = LoggerFactory.getLogger(CassandraVectorStoreProperties.class); private String keyspace = CassandraVectorStore.DEFAULT_KEYSPACE_NAME; diff --git a/spring-ai-spring-boot-autoconfigure/src/main/java/org/springframework/ai/autoconfigure/vectorstore/observation/VectorStoreObservationAutoConfiguration.java b/spring-ai-spring-boot-autoconfigure/src/main/java/org/springframework/ai/autoconfigure/vectorstore/observation/VectorStoreObservationAutoConfiguration.java index 7b2561c71..b69a48e1b 100644 --- a/spring-ai-spring-boot-autoconfigure/src/main/java/org/springframework/ai/autoconfigure/vectorstore/observation/VectorStoreObservationAutoConfiguration.java +++ b/spring-ai-spring-boot-autoconfigure/src/main/java/org/springframework/ai/autoconfigure/vectorstore/observation/VectorStoreObservationAutoConfiguration.java @@ -17,7 +17,8 @@ package org.springframework.ai.autoconfigure.vectorstore.observation; import io.micrometer.tracing.otel.bridge.OtelTracer; -import org.apache.commons.logging.LogFactory; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import org.springframework.ai.vectorstore.VectorStore; import org.springframework.ai.vectorstore.observation.VectorStoreQueryResponseObservationFilter; @@ -31,7 +32,6 @@ import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; import org.springframework.boot.context.properties.EnableConfigurationProperties; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; -import org.springframework.core.log.LogAccessor; /** * Auto-configuration for Spring AI vector store observations. @@ -46,8 +46,7 @@ import org.springframework.core.log.LogAccessor; @EnableConfigurationProperties({ VectorStoreObservationProperties.class }) public class VectorStoreObservationAutoConfiguration { - private static final LogAccessor logger = new LogAccessor( - LogFactory.getLog(VectorStoreObservationAutoConfiguration.class)); + private static final Logger logger = LoggerFactory.getLogger(VectorStoreObservationAutoConfiguration.class); private static void logQueryResponseContentWarning() { logger.warn( diff --git a/spring-ai-spring-boot-autoconfigure/src/test/java/org/springframework/ai/autoconfigure/anthropic/AnthropicAutoConfigurationIT.java b/spring-ai-spring-boot-autoconfigure/src/test/java/org/springframework/ai/autoconfigure/anthropic/AnthropicAutoConfigurationIT.java index b4084ac0b..5b41f15ae 100644 --- a/spring-ai-spring-boot-autoconfigure/src/test/java/org/springframework/ai/autoconfigure/anthropic/AnthropicAutoConfigurationIT.java +++ b/spring-ai-spring-boot-autoconfigure/src/test/java/org/springframework/ai/autoconfigure/anthropic/AnthropicAutoConfigurationIT.java @@ -19,6 +19,8 @@ package org.springframework.ai.autoconfigure.anthropic; import java.util.List; import java.util.stream.Collectors; +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.condition.EnabledIfEnvironmentVariable; import reactor.core.publisher.Flux; @@ -33,14 +35,13 @@ import org.springframework.ai.chat.model.Generation; import org.springframework.ai.chat.prompt.Prompt; import org.springframework.boot.autoconfigure.AutoConfigurations; import org.springframework.boot.test.context.runner.ApplicationContextRunner; -import org.springframework.core.log.LogAccessor; import static org.assertj.core.api.Assertions.assertThat; @EnabledIfEnvironmentVariable(named = "ANTHROPIC_API_KEY", matches = ".*") public class AnthropicAutoConfigurationIT { - private static final LogAccessor logger = new LogAccessor(AnthropicAutoConfigurationIT.class); + private static final Log logger = LogFactory.getLog(AnthropicAutoConfigurationIT.class); private final ApplicationContextRunner contextRunner = new ApplicationContextRunner() .withPropertyValues("spring.ai.anthropic.apiKey=" + System.getenv("ANTHROPIC_API_KEY")) diff --git a/spring-ai-spring-boot-autoconfigure/src/test/java/org/springframework/ai/autoconfigure/anthropic/tool/FunctionCallWithFunctionBeanIT.java b/spring-ai-spring-boot-autoconfigure/src/test/java/org/springframework/ai/autoconfigure/anthropic/tool/FunctionCallWithFunctionBeanIT.java index ee110e554..51e9e39be 100644 --- a/spring-ai-spring-boot-autoconfigure/src/test/java/org/springframework/ai/autoconfigure/anthropic/tool/FunctionCallWithFunctionBeanIT.java +++ b/spring-ai-spring-boot-autoconfigure/src/test/java/org/springframework/ai/autoconfigure/anthropic/tool/FunctionCallWithFunctionBeanIT.java @@ -21,6 +21,8 @@ import java.util.function.Function; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.condition.EnabledIfEnvironmentVariable; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import org.springframework.ai.anthropic.AnthropicChatModel; import org.springframework.ai.anthropic.AnthropicChatOptions; @@ -37,14 +39,13 @@ import org.springframework.boot.test.context.runner.ApplicationContextRunner; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.Description; -import org.springframework.core.log.LogAccessor; import static org.assertj.core.api.Assertions.assertThat; @EnabledIfEnvironmentVariable(named = "ANTHROPIC_API_KEY", matches = ".*") class FunctionCallWithFunctionBeanIT { - private final LogAccessor logger = new LogAccessor(FunctionCallWithFunctionBeanIT.class); + private final Logger logger = LoggerFactory.getLogger(FunctionCallWithFunctionBeanIT.class); private final ApplicationContextRunner contextRunner = new ApplicationContextRunner() .withPropertyValues("spring.ai.anthropic.apiKey=" + System.getenv("ANTHROPIC_API_KEY")) @@ -67,14 +68,14 @@ class FunctionCallWithFunctionBeanIT { ChatResponse response = chatModel.call(new Prompt(List.of(userMessage), AnthropicChatOptions.builder().function("weatherFunction").build())); - logger.info("Response: " + response); + logger.info("Response: {}", response); assertThat(response.getResult().getOutput().getText()).contains("30", "10", "15"); response = chatModel.call(new Prompt(List.of(userMessage), AnthropicChatOptions.builder().function("weatherFunction3").build())); - logger.info("Response: " + response); + logger.info("Response: {}", response); assertThat(response.getResult().getOutput().getText()).contains("30", "10", "15"); @@ -97,7 +98,7 @@ class FunctionCallWithFunctionBeanIT { ChatResponse response = chatModel.call(new Prompt(List.of(userMessage), FunctionCallingOptions.builder().function("weatherFunction").build())); - logger.info("Response: " + response); + logger.info("Response: {}", response); assertThat(response.getResult().getOutput().getText()).contains("30", "10", "15"); }); diff --git a/spring-ai-spring-boot-autoconfigure/src/test/java/org/springframework/ai/autoconfigure/anthropic/tool/FunctionCallWithPromptFunctionIT.java b/spring-ai-spring-boot-autoconfigure/src/test/java/org/springframework/ai/autoconfigure/anthropic/tool/FunctionCallWithPromptFunctionIT.java index 8ad18487b..8121991e9 100644 --- a/spring-ai-spring-boot-autoconfigure/src/test/java/org/springframework/ai/autoconfigure/anthropic/tool/FunctionCallWithPromptFunctionIT.java +++ b/spring-ai-spring-boot-autoconfigure/src/test/java/org/springframework/ai/autoconfigure/anthropic/tool/FunctionCallWithPromptFunctionIT.java @@ -20,6 +20,8 @@ import java.util.List; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.condition.EnabledIfEnvironmentVariable; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import org.springframework.ai.anthropic.AnthropicChatModel; import org.springframework.ai.anthropic.AnthropicChatOptions; @@ -31,14 +33,13 @@ import org.springframework.ai.chat.prompt.Prompt; import org.springframework.ai.tool.function.FunctionToolCallback; import org.springframework.boot.autoconfigure.AutoConfigurations; import org.springframework.boot.test.context.runner.ApplicationContextRunner; -import org.springframework.core.log.LogAccessor; import static org.assertj.core.api.Assertions.assertThat; @EnabledIfEnvironmentVariable(named = "ANTHROPIC_API_KEY", matches = ".*") public class FunctionCallWithPromptFunctionIT { - private static final LogAccessor logger = new LogAccessor(FunctionCallWithPromptFunctionIT.class); + private final Logger logger = LoggerFactory.getLogger(FunctionCallWithPromptFunctionIT.class); private final ApplicationContextRunner contextRunner = new ApplicationContextRunner() .withPropertyValues("spring.ai.anthropic.apiKey=" + System.getenv("ANTHROPIC_API_KEY")) @@ -66,7 +67,7 @@ public class FunctionCallWithPromptFunctionIT { ChatResponse response = chatModel.call(new Prompt(List.of(userMessage), promptOptions)); - logger.info("Response: " + response); + logger.info("Response: {}", response); assertThat(response.getResult().getOutput().getText()).contains("30", "10", "15"); }); diff --git a/spring-ai-spring-boot-autoconfigure/src/test/java/org/springframework/ai/autoconfigure/azure/tool/FunctionCallWithFunctionBeanIT.java b/spring-ai-spring-boot-autoconfigure/src/test/java/org/springframework/ai/autoconfigure/azure/tool/FunctionCallWithFunctionBeanIT.java index f3d6747ab..454f91b75 100644 --- a/spring-ai-spring-boot-autoconfigure/src/test/java/org/springframework/ai/autoconfigure/azure/tool/FunctionCallWithFunctionBeanIT.java +++ b/spring-ai-spring-boot-autoconfigure/src/test/java/org/springframework/ai/autoconfigure/azure/tool/FunctionCallWithFunctionBeanIT.java @@ -21,6 +21,8 @@ import java.util.function.Function; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.condition.EnabledIfEnvironmentVariable; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import org.springframework.ai.autoconfigure.azure.openai.AzureOpenAiAutoConfiguration; import org.springframework.ai.azure.openai.AzureOpenAiChatModel; @@ -35,7 +37,6 @@ import org.springframework.boot.test.context.runner.ApplicationContextRunner; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.Description; -import org.springframework.core.log.LogAccessor; import static org.assertj.core.api.Assertions.assertThat; @@ -43,7 +44,7 @@ import static org.assertj.core.api.Assertions.assertThat; @EnabledIfEnvironmentVariable(named = "AZURE_OPENAI_ENDPOINT", matches = ".+") class FunctionCallWithFunctionBeanIT { - private static final LogAccessor logger = new LogAccessor(FunctionCallWithFunctionBeanIT.class); + private final Logger logger = LoggerFactory.getLogger(FunctionCallWithFunctionBeanIT.class); private final ApplicationContextRunner contextRunner = new ApplicationContextRunner().withPropertyValues( // @formatter:off @@ -68,14 +69,14 @@ class FunctionCallWithFunctionBeanIT { ChatResponse response = chatModel.call(new Prompt(List.of(userMessage), AzureOpenAiChatOptions.builder().function("weatherFunction").build())); - logger.info("Response: " + response); + logger.info("Response: {}", response); assertThat(response.getResult().getOutput().getText()).contains("30", "10", "15"); response = chatModel.call(new Prompt(List.of(userMessage), AzureOpenAiChatOptions.builder().function("weatherFunction3").build())); - logger.info("Response: " + response); + logger.info("Response: {}", response); assertThat(response.getResult().getOutput().getText()).contains("30", "10", "15"); @@ -97,7 +98,7 @@ class FunctionCallWithFunctionBeanIT { ChatResponse response = chatModel.call(new Prompt(List.of(userMessage), ToolCallingChatOptions.builder().tools("weatherFunction").build())); - logger.info("Response: " + response); + logger.info("Response: {}", response); assertThat(response.getResult().getOutput().getText()).contains("30", "10", "15"); diff --git a/spring-ai-spring-boot-autoconfigure/src/test/java/org/springframework/ai/autoconfigure/azure/tool/FunctionCallWithFunctionWrapperIT.java b/spring-ai-spring-boot-autoconfigure/src/test/java/org/springframework/ai/autoconfigure/azure/tool/FunctionCallWithFunctionWrapperIT.java index 05d5e53e7..7df9cc89d 100644 --- a/spring-ai-spring-boot-autoconfigure/src/test/java/org/springframework/ai/autoconfigure/azure/tool/FunctionCallWithFunctionWrapperIT.java +++ b/spring-ai-spring-boot-autoconfigure/src/test/java/org/springframework/ai/autoconfigure/azure/tool/FunctionCallWithFunctionWrapperIT.java @@ -20,6 +20,8 @@ import java.util.List; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.condition.EnabledIfEnvironmentVariable; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import org.springframework.ai.autoconfigure.azure.openai.AzureOpenAiAutoConfiguration; import org.springframework.ai.azure.openai.AzureOpenAiChatModel; @@ -33,7 +35,6 @@ import org.springframework.boot.autoconfigure.AutoConfigurations; import org.springframework.boot.test.context.runner.ApplicationContextRunner; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; -import org.springframework.core.log.LogAccessor; import static org.assertj.core.api.Assertions.assertThat; @@ -41,7 +42,7 @@ import static org.assertj.core.api.Assertions.assertThat; @EnabledIfEnvironmentVariable(named = "AZURE_OPENAI_ENDPOINT", matches = ".+") public class FunctionCallWithFunctionWrapperIT { - private static final LogAccessor logger = new LogAccessor(FunctionCallWithFunctionWrapperIT.class); + private final Logger logger = LoggerFactory.getLogger(FunctionCallWithFunctionWrapperIT.class); private final ApplicationContextRunner contextRunner = new ApplicationContextRunner().withPropertyValues( // @formatter:off @@ -66,7 +67,7 @@ public class FunctionCallWithFunctionWrapperIT { ChatResponse response = chatModel.call(new Prompt(List.of(userMessage), AzureOpenAiChatOptions.builder().function("WeatherInfo").build())); - logger.info("Response: " + response); + logger.info("Response: {}", response); assertThat(response.getResult().getOutput().getText()).containsAnyOf("30", "10", "15"); diff --git a/spring-ai-spring-boot-autoconfigure/src/test/java/org/springframework/ai/autoconfigure/azure/tool/FunctionCallWithPromptFunctionIT.java b/spring-ai-spring-boot-autoconfigure/src/test/java/org/springframework/ai/autoconfigure/azure/tool/FunctionCallWithPromptFunctionIT.java index 7c17288a4..8a50160dc 100644 --- a/spring-ai-spring-boot-autoconfigure/src/test/java/org/springframework/ai/autoconfigure/azure/tool/FunctionCallWithPromptFunctionIT.java +++ b/spring-ai-spring-boot-autoconfigure/src/test/java/org/springframework/ai/autoconfigure/azure/tool/FunctionCallWithPromptFunctionIT.java @@ -20,6 +20,8 @@ import java.util.List; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.condition.EnabledIfEnvironmentVariable; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import org.springframework.ai.autoconfigure.azure.openai.AzureOpenAiAutoConfiguration; import org.springframework.ai.azure.openai.AzureOpenAiChatModel; @@ -30,7 +32,6 @@ import org.springframework.ai.chat.prompt.Prompt; import org.springframework.ai.tool.function.FunctionToolCallback; import org.springframework.boot.autoconfigure.AutoConfigurations; import org.springframework.boot.test.context.runner.ApplicationContextRunner; -import org.springframework.core.log.LogAccessor; import static org.assertj.core.api.Assertions.assertThat; @@ -38,7 +39,7 @@ import static org.assertj.core.api.Assertions.assertThat; @EnabledIfEnvironmentVariable(named = "AZURE_OPENAI_ENDPOINT", matches = ".+") public class FunctionCallWithPromptFunctionIT { - private final LogAccessor logger = new LogAccessor(FunctionCallWithPromptFunctionIT.class); + private final Logger logger = LoggerFactory.getLogger(FunctionCallWithPromptFunctionIT.class); private final ApplicationContextRunner contextRunner = new ApplicationContextRunner().withPropertyValues( // @formatter:off @@ -69,7 +70,7 @@ public class FunctionCallWithPromptFunctionIT { ChatResponse response = chatModel.call(new Prompt(List.of(userMessage), promptOptions)); - logger.info("Response: " + response); + logger.info("Response: {}", response); assertThat(response.getResult().getOutput().getText()).contains("30", "10", "15"); }); diff --git a/spring-ai-spring-boot-autoconfigure/src/test/java/org/springframework/ai/autoconfigure/bedrock/converse/BedrockConverseProxyChatAutoConfigurationIT.java b/spring-ai-spring-boot-autoconfigure/src/test/java/org/springframework/ai/autoconfigure/bedrock/converse/BedrockConverseProxyChatAutoConfigurationIT.java index 8125fa759..936f4b59f 100644 --- a/spring-ai-spring-boot-autoconfigure/src/test/java/org/springframework/ai/autoconfigure/bedrock/converse/BedrockConverseProxyChatAutoConfigurationIT.java +++ b/spring-ai-spring-boot-autoconfigure/src/test/java/org/springframework/ai/autoconfigure/bedrock/converse/BedrockConverseProxyChatAutoConfigurationIT.java @@ -19,6 +19,8 @@ package org.springframework.ai.autoconfigure.bedrock.converse; import java.util.List; import java.util.stream.Collectors; +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; import org.junit.jupiter.api.Test; import reactor.core.publisher.Flux; @@ -32,14 +34,13 @@ import org.springframework.ai.chat.model.Generation; import org.springframework.ai.chat.prompt.Prompt; import org.springframework.boot.autoconfigure.AutoConfigurations; import org.springframework.boot.test.context.runner.ApplicationContextRunner; -import org.springframework.core.log.LogAccessor; import static org.assertj.core.api.Assertions.assertThat; @RequiresAwsCredentials public class BedrockConverseProxyChatAutoConfigurationIT { - private static final LogAccessor logger = new LogAccessor(BedrockConverseProxyChatAutoConfigurationIT.class); + private static final Log logger = LogFactory.getLog(BedrockConverseProxyChatAutoConfigurationIT.class); private final ApplicationContextRunner contextRunner = BedrockTestUtils.getContextRunner() .withPropertyValues( diff --git a/spring-ai-spring-boot-autoconfigure/src/test/java/org/springframework/ai/autoconfigure/bedrock/converse/tool/FunctionCallWithFunctionBeanIT.java b/spring-ai-spring-boot-autoconfigure/src/test/java/org/springframework/ai/autoconfigure/bedrock/converse/tool/FunctionCallWithFunctionBeanIT.java index 364ef52f2..9a34b9613 100644 --- a/spring-ai-spring-boot-autoconfigure/src/test/java/org/springframework/ai/autoconfigure/bedrock/converse/tool/FunctionCallWithFunctionBeanIT.java +++ b/spring-ai-spring-boot-autoconfigure/src/test/java/org/springframework/ai/autoconfigure/bedrock/converse/tool/FunctionCallWithFunctionBeanIT.java @@ -21,6 +21,8 @@ import java.util.function.Function; import java.util.stream.Collectors; import org.junit.jupiter.api.Test; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import reactor.core.publisher.Flux; import org.springframework.ai.autoconfigure.bedrock.BedrockTestUtils; @@ -36,14 +38,13 @@ import org.springframework.boot.test.context.runner.ApplicationContextRunner; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.Description; -import org.springframework.core.log.LogAccessor; import static org.assertj.core.api.Assertions.assertThat; @RequiresAwsCredentials class FunctionCallWithFunctionBeanIT { - private static final LogAccessor logger = new LogAccessor(FunctionCallWithFunctionBeanIT.class); + private final Logger logger = LoggerFactory.getLogger(FunctionCallWithFunctionBeanIT.class); private final ApplicationContextRunner contextRunner = BedrockTestUtils.getContextRunner() .withConfiguration(AutoConfigurations.of(BedrockConverseProxyChatAutoConfiguration.class)) @@ -65,14 +66,14 @@ class FunctionCallWithFunctionBeanIT { ChatResponse response = chatModel.call(new Prompt(List.of(userMessage), ToolCallingChatOptions.builder().tools("weatherFunction").build())); - logger.info("Response: " + response); + logger.info("Response: {}", response); assertThat(response.getResult().getOutput().getText()).contains("30", "10", "15"); response = chatModel.call(new Prompt(List.of(userMessage), ToolCallingChatOptions.builder().tools("weatherFunction3").build())); - logger.info("Response: " + response); + logger.info("Response: {}", response); assertThat(response.getResult().getOutput().getText()).contains("30", "10", "15"); }); @@ -101,7 +102,7 @@ class FunctionCallWithFunctionBeanIT { .map(cr -> cr.getResult().getOutput().getText()) .collect(Collectors.joining()); - logger.info("Response: " + content); + logger.info("Response: {}", content); assertThat(content).contains("30", "10", "15"); }); diff --git a/spring-ai-spring-boot-autoconfigure/src/test/java/org/springframework/ai/autoconfigure/bedrock/converse/tool/FunctionCallWithPromptFunctionIT.java b/spring-ai-spring-boot-autoconfigure/src/test/java/org/springframework/ai/autoconfigure/bedrock/converse/tool/FunctionCallWithPromptFunctionIT.java index b8f6433ed..62af91d29 100644 --- a/spring-ai-spring-boot-autoconfigure/src/test/java/org/springframework/ai/autoconfigure/bedrock/converse/tool/FunctionCallWithPromptFunctionIT.java +++ b/spring-ai-spring-boot-autoconfigure/src/test/java/org/springframework/ai/autoconfigure/bedrock/converse/tool/FunctionCallWithPromptFunctionIT.java @@ -19,6 +19,8 @@ package org.springframework.ai.autoconfigure.bedrock.converse.tool; import java.util.List; import org.junit.jupiter.api.Test; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import org.springframework.ai.autoconfigure.bedrock.BedrockTestUtils; import org.springframework.ai.autoconfigure.bedrock.RequiresAwsCredentials; @@ -31,14 +33,13 @@ import org.springframework.ai.model.tool.ToolCallingChatOptions; import org.springframework.ai.tool.function.FunctionToolCallback; import org.springframework.boot.autoconfigure.AutoConfigurations; import org.springframework.boot.test.context.runner.ApplicationContextRunner; -import org.springframework.core.log.LogAccessor; import static org.assertj.core.api.Assertions.assertThat; @RequiresAwsCredentials public class FunctionCallWithPromptFunctionIT { - private static final LogAccessor logger = new LogAccessor(FunctionCallWithPromptFunctionIT.class); + private final Logger logger = LoggerFactory.getLogger(FunctionCallWithPromptFunctionIT.class); private final ApplicationContextRunner contextRunner = BedrockTestUtils.getContextRunner() .withConfiguration(AutoConfigurations.of(BedrockConverseProxyChatAutoConfiguration.class)); @@ -65,7 +66,7 @@ public class FunctionCallWithPromptFunctionIT { ChatResponse response = chatModel.call(new Prompt(List.of(userMessage), promptOptions)); - logger.info("Response: " + response); + logger.info("Response: {}", response); assertThat(response.getResult().getOutput().getText()).contains("30", "10", "15"); }); diff --git a/spring-ai-spring-boot-autoconfigure/src/test/java/org/springframework/ai/autoconfigure/chat/client/ChatClientAutoConfigurationIT.java b/spring-ai-spring-boot-autoconfigure/src/test/java/org/springframework/ai/autoconfigure/chat/client/ChatClientAutoConfigurationIT.java index 097135a45..ae04bbd86 100644 --- a/spring-ai-spring-boot-autoconfigure/src/test/java/org/springframework/ai/autoconfigure/chat/client/ChatClientAutoConfigurationIT.java +++ b/spring-ai-spring-boot-autoconfigure/src/test/java/org/springframework/ai/autoconfigure/chat/client/ChatClientAutoConfigurationIT.java @@ -18,6 +18,8 @@ package org.springframework.ai.autoconfigure.chat.client; import java.util.List; +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.condition.EnabledIfEnvironmentVariable; @@ -30,7 +32,6 @@ import org.springframework.boot.autoconfigure.web.client.RestClientAutoConfigura import org.springframework.boot.test.context.runner.ApplicationContextRunner; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; -import org.springframework.core.log.LogAccessor; import static org.assertj.core.api.Assertions.assertThat; @@ -40,7 +41,7 @@ import static org.assertj.core.api.Assertions.assertThat; @EnabledIfEnvironmentVariable(named = "OPENAI_API_KEY", matches = ".*") public class ChatClientAutoConfigurationIT { - private static final LogAccessor logger = new LogAccessor(ChatClientAutoConfigurationIT.class); + private static final Log logger = LogFactory.getLog(ChatClientAutoConfigurationIT.class); private final ApplicationContextRunner contextRunner = new ApplicationContextRunner() .withPropertyValues("spring.ai.openai.apiKey=" + System.getenv("OPENAI_API_KEY"), diff --git a/spring-ai-spring-boot-autoconfigure/src/test/java/org/springframework/ai/autoconfigure/huggingface/HuggingfaceChatAutoConfigurationIT.java b/spring-ai-spring-boot-autoconfigure/src/test/java/org/springframework/ai/autoconfigure/huggingface/HuggingfaceChatAutoConfigurationIT.java index 6bdbddea7..e3980a13a 100644 --- a/spring-ai-spring-boot-autoconfigure/src/test/java/org/springframework/ai/autoconfigure/huggingface/HuggingfaceChatAutoConfigurationIT.java +++ b/spring-ai-spring-boot-autoconfigure/src/test/java/org/springframework/ai/autoconfigure/huggingface/HuggingfaceChatAutoConfigurationIT.java @@ -19,6 +19,8 @@ package org.springframework.ai.autoconfigure.huggingface; import java.util.List; import java.util.stream.Collectors; +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; import org.junit.jupiter.api.Disabled; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.condition.EnabledIfEnvironmentVariable; @@ -32,7 +34,6 @@ import org.springframework.ai.chat.prompt.Prompt; import org.springframework.ai.huggingface.HuggingfaceChatModel; import org.springframework.boot.autoconfigure.AutoConfigurations; import org.springframework.boot.test.context.runner.ApplicationContextRunner; -import org.springframework.core.log.LogAccessor; import static org.assertj.core.api.Assertions.assertThat; @@ -40,7 +41,7 @@ import static org.assertj.core.api.Assertions.assertThat; @EnabledIfEnvironmentVariable(named = "HUGGINGFACE_CHAT_URL", matches = ".+") public class HuggingfaceChatAutoConfigurationIT { - private static final LogAccessor logger = new LogAccessor(HuggingfaceChatAutoConfigurationIT.class); + private static final Log logger = LogFactory.getLog(HuggingfaceChatAutoConfigurationIT.class); private final ApplicationContextRunner contextRunner = new ApplicationContextRunner().withPropertyValues( // @formatter:off diff --git a/spring-ai-spring-boot-autoconfigure/src/test/java/org/springframework/ai/autoconfigure/minimax/FunctionCallbackInPromptIT.java b/spring-ai-spring-boot-autoconfigure/src/test/java/org/springframework/ai/autoconfigure/minimax/FunctionCallbackInPromptIT.java index 309a12f73..5e9c88ad9 100644 --- a/spring-ai-spring-boot-autoconfigure/src/test/java/org/springframework/ai/autoconfigure/minimax/FunctionCallbackInPromptIT.java +++ b/spring-ai-spring-boot-autoconfigure/src/test/java/org/springframework/ai/autoconfigure/minimax/FunctionCallbackInPromptIT.java @@ -21,6 +21,8 @@ import java.util.stream.Collectors; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.condition.EnabledIfEnvironmentVariable; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import reactor.core.publisher.Flux; import org.springframework.ai.autoconfigure.retry.SpringAiRetryAutoConfiguration; @@ -35,7 +37,6 @@ import org.springframework.ai.model.function.FunctionCallback; import org.springframework.boot.autoconfigure.AutoConfigurations; import org.springframework.boot.autoconfigure.web.client.RestClientAutoConfiguration; import org.springframework.boot.test.context.runner.ApplicationContextRunner; -import org.springframework.core.log.LogAccessor; import static org.assertj.core.api.Assertions.assertThat; @@ -45,7 +46,7 @@ import static org.assertj.core.api.Assertions.assertThat; @EnabledIfEnvironmentVariable(named = "MINIMAX_API_KEY", matches = ".*") public class FunctionCallbackInPromptIT { - private static final LogAccessor logger = new LogAccessor(FunctionCallbackInPromptIT.class); + private final Logger logger = LoggerFactory.getLogger(FunctionCallbackInPromptIT.class); private final ApplicationContextRunner contextRunner = new ApplicationContextRunner() .withPropertyValues("spring.ai.minimax.apiKey=" + System.getenv("MINIMAX_API_KEY")) @@ -71,7 +72,7 @@ public class FunctionCallbackInPromptIT { ChatResponse response = chatModel.call(new Prompt(List.of(userMessage), promptOptions)); - logger.info("Response: " + response); + logger.info("Response: {}", response); assertThat(response.getResult().getOutput().getText()).contains("30", "10", "15"); }); @@ -105,7 +106,7 @@ public class FunctionCallbackInPromptIT { .map(Generation::getOutput) .map(AssistantMessage::getText) .collect(Collectors.joining()); - logger.info("Response: " + content); + logger.info("Response: {}", content); assertThat(content).containsAnyOf("30.0", "30"); assertThat(content).containsAnyOf("10.0", "10"); diff --git a/spring-ai-spring-boot-autoconfigure/src/test/java/org/springframework/ai/autoconfigure/minimax/FunctionCallbackWithPlainFunctionBeanIT.java b/spring-ai-spring-boot-autoconfigure/src/test/java/org/springframework/ai/autoconfigure/minimax/FunctionCallbackWithPlainFunctionBeanIT.java index 631c4270d..bedb41f5d 100644 --- a/spring-ai-spring-boot-autoconfigure/src/test/java/org/springframework/ai/autoconfigure/minimax/FunctionCallbackWithPlainFunctionBeanIT.java +++ b/spring-ai-spring-boot-autoconfigure/src/test/java/org/springframework/ai/autoconfigure/minimax/FunctionCallbackWithPlainFunctionBeanIT.java @@ -22,6 +22,8 @@ import java.util.stream.Collectors; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.condition.EnabledIfEnvironmentVariable; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import reactor.core.publisher.Flux; import org.springframework.ai.autoconfigure.retry.SpringAiRetryAutoConfiguration; @@ -39,7 +41,6 @@ import org.springframework.boot.test.context.runner.ApplicationContextRunner; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.Description; -import org.springframework.core.log.LogAccessor; import static org.assertj.core.api.Assertions.assertThat; @@ -49,7 +50,7 @@ import static org.assertj.core.api.Assertions.assertThat; @EnabledIfEnvironmentVariable(named = "MINIMAX_API_KEY", matches = ".*") class FunctionCallbackWithPlainFunctionBeanIT { - private static final LogAccessor logger = new LogAccessor(FunctionCallbackWithPlainFunctionBeanIT.class); + private final Logger logger = LoggerFactory.getLogger(FunctionCallbackWithPlainFunctionBeanIT.class); private final ApplicationContextRunner contextRunner = new ApplicationContextRunner() .withPropertyValues("spring.ai.minimax.apiKey=" + System.getenv("MINIMAX_API_KEY")) @@ -71,7 +72,7 @@ class FunctionCallbackWithPlainFunctionBeanIT { ChatResponse response = chatModel.call( new Prompt(List.of(userMessage), MiniMaxChatOptions.builder().function("weatherFunction").build())); - logger.info("Response: " + response); + logger.info("Response: {}", response); assertThat(response.getResult().getOutput().getText()).contains("30", "10", "15"); @@ -79,7 +80,7 @@ class FunctionCallbackWithPlainFunctionBeanIT { response = chatModel.call(new Prompt(List.of(userMessage), MiniMaxChatOptions.builder().function("weatherFunctionTwo").build())); - logger.info("Response: " + response); + logger.info("Response: {}", response); assertThat(response.getResult().getOutput().getText()).contains("30", "10", "15"); @@ -102,7 +103,7 @@ class FunctionCallbackWithPlainFunctionBeanIT { ChatResponse response = chatModel.call(new Prompt(List.of(userMessage), functionOptions)); - logger.info("Response: " + response); + logger.info("Response: {}", response); }); } @@ -128,7 +129,7 @@ class FunctionCallbackWithPlainFunctionBeanIT { .map(Generation::getOutput) .map(AssistantMessage::getText) .collect(Collectors.joining()); - logger.info("Response: " + content); + logger.info("Response: {}", content); assertThat(content).containsAnyOf("30.0", "30"); assertThat(content).containsAnyOf("10.0", "10"); @@ -146,7 +147,7 @@ class FunctionCallbackWithPlainFunctionBeanIT { .map(Generation::getOutput) .map(AssistantMessage::getText) .collect(Collectors.joining()); - logger.info("Response: " + content); + logger.info("Response: {}", content); assertThat(content).containsAnyOf("30.0", "30"); assertThat(content).containsAnyOf("10.0", "10"); diff --git a/spring-ai-spring-boot-autoconfigure/src/test/java/org/springframework/ai/autoconfigure/minimax/MiniMaxAutoConfigurationIT.java b/spring-ai-spring-boot-autoconfigure/src/test/java/org/springframework/ai/autoconfigure/minimax/MiniMaxAutoConfigurationIT.java index 9107511ff..6a3893274 100644 --- a/spring-ai-spring-boot-autoconfigure/src/test/java/org/springframework/ai/autoconfigure/minimax/MiniMaxAutoConfigurationIT.java +++ b/spring-ai-spring-boot-autoconfigure/src/test/java/org/springframework/ai/autoconfigure/minimax/MiniMaxAutoConfigurationIT.java @@ -19,6 +19,8 @@ package org.springframework.ai.autoconfigure.minimax; import java.util.List; import java.util.stream.Collectors; +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.condition.EnabledIfEnvironmentVariable; import reactor.core.publisher.Flux; @@ -33,7 +35,6 @@ import org.springframework.ai.minimax.MiniMaxEmbeddingModel; import org.springframework.boot.autoconfigure.AutoConfigurations; import org.springframework.boot.autoconfigure.web.client.RestClientAutoConfiguration; import org.springframework.boot.test.context.runner.ApplicationContextRunner; -import org.springframework.core.log.LogAccessor; import static org.assertj.core.api.Assertions.assertThat; @@ -43,7 +44,7 @@ import static org.assertj.core.api.Assertions.assertThat; @EnabledIfEnvironmentVariable(named = "MINIMAX_API_KEY", matches = ".*") public class MiniMaxAutoConfigurationIT { - private static final LogAccessor logger = new LogAccessor(MiniMaxAutoConfigurationIT.class); + private static final Log logger = LogFactory.getLog(MiniMaxAutoConfigurationIT.class); private final ApplicationContextRunner contextRunner = new ApplicationContextRunner() .withPropertyValues("spring.ai.minimax.apiKey=" + System.getenv("MINIMAX_API_KEY")) diff --git a/spring-ai-spring-boot-autoconfigure/src/test/java/org/springframework/ai/autoconfigure/minimax/MiniMaxFunctionCallbackIT.java b/spring-ai-spring-boot-autoconfigure/src/test/java/org/springframework/ai/autoconfigure/minimax/MiniMaxFunctionCallbackIT.java index f977689e1..c3937895c 100644 --- a/spring-ai-spring-boot-autoconfigure/src/test/java/org/springframework/ai/autoconfigure/minimax/MiniMaxFunctionCallbackIT.java +++ b/spring-ai-spring-boot-autoconfigure/src/test/java/org/springframework/ai/autoconfigure/minimax/MiniMaxFunctionCallbackIT.java @@ -21,6 +21,8 @@ import java.util.stream.Collectors; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.condition.EnabledIfEnvironmentVariable; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import reactor.core.publisher.Flux; import org.springframework.ai.autoconfigure.retry.SpringAiRetryAutoConfiguration; @@ -37,7 +39,6 @@ import org.springframework.boot.autoconfigure.web.client.RestClientAutoConfigura import org.springframework.boot.test.context.runner.ApplicationContextRunner; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; -import org.springframework.core.log.LogAccessor; import static org.assertj.core.api.Assertions.assertThat; @@ -47,7 +48,7 @@ import static org.assertj.core.api.Assertions.assertThat; @EnabledIfEnvironmentVariable(named = "MINIMAX_API_KEY", matches = ".*") public class MiniMaxFunctionCallbackIT { - private static final LogAccessor logger = new LogAccessor(MiniMaxFunctionCallbackIT.class); + private final Logger logger = LoggerFactory.getLogger(MiniMaxFunctionCallbackIT.class); private final ApplicationContextRunner contextRunner = new ApplicationContextRunner() .withPropertyValues("spring.ai.minimax.apiKey=" + System.getenv("MINIMAX_API_KEY")) @@ -67,7 +68,7 @@ public class MiniMaxFunctionCallbackIT { ChatResponse response = chatModel .call(new Prompt(List.of(userMessage), MiniMaxChatOptions.builder().function("WeatherInfo").build())); - logger.info("Response: " + response); + logger.info("Response: {}", response); assertThat(response.getResult().getOutput().getText()).contains("30", "10", "15"); @@ -94,7 +95,7 @@ public class MiniMaxFunctionCallbackIT { .map(Generation::getOutput) .map(AssistantMessage::getText) .collect(Collectors.joining()); - logger.info("Response: " + content); + logger.info("Response: {}", content); assertThat(content).containsAnyOf("30.0", "30"); assertThat(content).containsAnyOf("10.0", "10"); diff --git a/spring-ai-spring-boot-autoconfigure/src/test/java/org/springframework/ai/autoconfigure/mistralai/MistralAiAutoConfigurationIT.java b/spring-ai-spring-boot-autoconfigure/src/test/java/org/springframework/ai/autoconfigure/mistralai/MistralAiAutoConfigurationIT.java index 29b823a20..99d91c6f3 100644 --- a/spring-ai-spring-boot-autoconfigure/src/test/java/org/springframework/ai/autoconfigure/mistralai/MistralAiAutoConfigurationIT.java +++ b/spring-ai-spring-boot-autoconfigure/src/test/java/org/springframework/ai/autoconfigure/mistralai/MistralAiAutoConfigurationIT.java @@ -19,6 +19,8 @@ package org.springframework.ai.autoconfigure.mistralai; import java.util.List; import java.util.stream.Collectors; +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.condition.EnabledIfEnvironmentVariable; import reactor.core.publisher.Flux; @@ -31,7 +33,6 @@ import org.springframework.ai.mistralai.MistralAiChatModel; import org.springframework.ai.mistralai.MistralAiEmbeddingModel; import org.springframework.boot.autoconfigure.AutoConfigurations; import org.springframework.boot.test.context.runner.ApplicationContextRunner; -import org.springframework.core.log.LogAccessor; import static org.assertj.core.api.Assertions.assertThat; @@ -42,7 +43,7 @@ import static org.assertj.core.api.Assertions.assertThat; @EnabledIfEnvironmentVariable(named = "MISTRAL_AI_API_KEY", matches = ".*") public class MistralAiAutoConfigurationIT { - private static final LogAccessor logger = new LogAccessor(MistralAiAutoConfigurationIT.class); + private static final Log logger = LogFactory.getLog(MistralAiAutoConfigurationIT.class); private final ApplicationContextRunner contextRunner = new ApplicationContextRunner() .withPropertyValues("spring.ai.mistralai.apiKey=" + System.getenv("MISTRAL_AI_API_KEY")) diff --git a/spring-ai-spring-boot-autoconfigure/src/test/java/org/springframework/ai/autoconfigure/mistralai/tool/PaymentStatusBeanIT.java b/spring-ai-spring-boot-autoconfigure/src/test/java/org/springframework/ai/autoconfigure/mistralai/tool/PaymentStatusBeanIT.java index 20bb516b0..36f7c8b38 100644 --- a/spring-ai-spring-boot-autoconfigure/src/test/java/org/springframework/ai/autoconfigure/mistralai/tool/PaymentStatusBeanIT.java +++ b/spring-ai-spring-boot-autoconfigure/src/test/java/org/springframework/ai/autoconfigure/mistralai/tool/PaymentStatusBeanIT.java @@ -23,6 +23,8 @@ import java.util.function.Function; import com.fasterxml.jackson.annotation.JsonProperty; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.condition.EnabledIfEnvironmentVariable; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import org.springframework.ai.autoconfigure.mistralai.MistralAiAutoConfiguration; import org.springframework.ai.chat.messages.UserMessage; @@ -36,7 +38,6 @@ import org.springframework.boot.test.context.runner.ApplicationContextRunner; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.Description; -import org.springframework.core.log.LogAccessor; import static org.assertj.core.api.Assertions.assertThat; @@ -48,7 +49,7 @@ class PaymentStatusBeanIT { new StatusDate("Unpaid", "2021-10-06"), "T1003", new StatusDate("Paid", "2021-10-07"), "T1004", new StatusDate("Paid", "2021-10-05"), "T1005", new StatusDate("Pending", "2021-10-08")); - private static final LogAccessor logger = new LogAccessor(PaymentStatusBeanIT.class); + private final Logger logger = LoggerFactory.getLogger(PaymentStatusBeanIT.class); private final ApplicationContextRunner contextRunner = new ApplicationContextRunner() .withPropertyValues("spring.ai.mistralai.apiKey=" + System.getenv("MISTRAL_AI_API_KEY")) @@ -71,7 +72,7 @@ class PaymentStatusBeanIT { .function("retrievePaymentDate") .build())); - logger.info("Response: " + response); + logger.info("Response: {}", response); assertThat(response.getResult().getOutput().getText()).containsIgnoringCase("T1001"); assertThat(response.getResult().getOutput().getText()).containsIgnoringCase("paid"); diff --git a/spring-ai-spring-boot-autoconfigure/src/test/java/org/springframework/ai/autoconfigure/mistralai/tool/PaymentStatusBeanOpenAiIT.java b/spring-ai-spring-boot-autoconfigure/src/test/java/org/springframework/ai/autoconfigure/mistralai/tool/PaymentStatusBeanOpenAiIT.java index 550a1bcab..321d00f64 100644 --- a/spring-ai-spring-boot-autoconfigure/src/test/java/org/springframework/ai/autoconfigure/mistralai/tool/PaymentStatusBeanOpenAiIT.java +++ b/spring-ai-spring-boot-autoconfigure/src/test/java/org/springframework/ai/autoconfigure/mistralai/tool/PaymentStatusBeanOpenAiIT.java @@ -23,6 +23,8 @@ import java.util.function.Function; import com.fasterxml.jackson.annotation.JsonProperty; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.condition.EnabledIfEnvironmentVariable; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import org.springframework.ai.autoconfigure.openai.OpenAiAutoConfiguration; import org.springframework.ai.chat.messages.UserMessage; @@ -36,7 +38,6 @@ import org.springframework.boot.test.context.runner.ApplicationContextRunner; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.Description; -import org.springframework.core.log.LogAccessor; import static org.assertj.core.api.Assertions.assertThat; @@ -54,7 +55,7 @@ class PaymentStatusBeanOpenAiIT { new StatusDate("Unpaid", "2021-10-06"), "T1003", new StatusDate("Paid", "2021-10-07"), "T1004", new StatusDate("Paid", "2021-10-05"), "T1005", new StatusDate("Pending", "2021-10-08")); - private static final LogAccessor logger = new LogAccessor(PaymentStatusBeanIT.class); + private final Logger logger = LoggerFactory.getLogger(PaymentStatusBeanIT.class); private final ApplicationContextRunner contextRunner = new ApplicationContextRunner() .withPropertyValues("spring.ai.openai.apiKey=" + System.getenv("MISTRAL_AI_API_KEY"), @@ -78,7 +79,7 @@ class PaymentStatusBeanOpenAiIT { .function("retrievePaymentDate") .build())); - logger.info("Response: " + response); + logger.info("Response: {}", response); assertThat(response.getResult().getOutput().getText()).containsIgnoringCase("T1001"); assertThat(response.getResult().getOutput().getText()).containsIgnoringCase("paid"); diff --git a/spring-ai-spring-boot-autoconfigure/src/test/java/org/springframework/ai/autoconfigure/mistralai/tool/PaymentStatusPromptIT.java b/spring-ai-spring-boot-autoconfigure/src/test/java/org/springframework/ai/autoconfigure/mistralai/tool/PaymentStatusPromptIT.java index 8967957a7..a0a88984d 100644 --- a/spring-ai-spring-boot-autoconfigure/src/test/java/org/springframework/ai/autoconfigure/mistralai/tool/PaymentStatusPromptIT.java +++ b/spring-ai-spring-boot-autoconfigure/src/test/java/org/springframework/ai/autoconfigure/mistralai/tool/PaymentStatusPromptIT.java @@ -22,6 +22,8 @@ import java.util.Map; import com.fasterxml.jackson.annotation.JsonProperty; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.condition.EnabledIfEnvironmentVariable; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import org.springframework.ai.autoconfigure.mistralai.MistralAiAutoConfiguration; import org.springframework.ai.chat.messages.UserMessage; @@ -33,7 +35,6 @@ import org.springframework.ai.mistralai.api.MistralAiApi; import org.springframework.ai.tool.function.FunctionToolCallback; import org.springframework.boot.autoconfigure.AutoConfigurations; import org.springframework.boot.test.context.runner.ApplicationContextRunner; -import org.springframework.core.log.LogAccessor; import static org.assertj.core.api.Assertions.assertThat; @@ -46,7 +47,7 @@ public class PaymentStatusPromptIT { new Transaction("T1003"), new StatusDate("Paid", "2021-10-07"), new Transaction("T1004"), new StatusDate("Paid", "2021-10-05"), new Transaction("T1005"), new StatusDate("Pending", "2021-10-08")); - private static final LogAccessor logger = new LogAccessor(WeatherServicePromptIT.class); + private final Logger logger = LoggerFactory.getLogger(WeatherServicePromptIT.class); private final ApplicationContextRunner contextRunner = new ApplicationContextRunner() .withPropertyValues("spring.ai.mistralai.apiKey=" + System.getenv("MISTRAL_AI_API_KEY")) @@ -73,7 +74,7 @@ public class PaymentStatusPromptIT { ChatResponse response = chatModel.call(new Prompt(List.of(userMessage), promptOptions)); - logger.info("Response: " + response); + logger.info("Response: {}", response); assertThat(response.getResult().getOutput().getText()).containsIgnoringCase("T1001"); assertThat(response.getResult().getOutput().getText()).containsIgnoringCase("paid"); diff --git a/spring-ai-spring-boot-autoconfigure/src/test/java/org/springframework/ai/autoconfigure/mistralai/tool/WeatherServicePromptIT.java b/spring-ai-spring-boot-autoconfigure/src/test/java/org/springframework/ai/autoconfigure/mistralai/tool/WeatherServicePromptIT.java index d2a8028f0..7c4e56a7d 100644 --- a/spring-ai-spring-boot-autoconfigure/src/test/java/org/springframework/ai/autoconfigure/mistralai/tool/WeatherServicePromptIT.java +++ b/spring-ai-spring-boot-autoconfigure/src/test/java/org/springframework/ai/autoconfigure/mistralai/tool/WeatherServicePromptIT.java @@ -24,6 +24,8 @@ import com.fasterxml.jackson.annotation.JsonInclude.Include; import com.fasterxml.jackson.annotation.JsonProperty; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.condition.EnabledIfEnvironmentVariable; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import org.springframework.ai.autoconfigure.mistralai.MistralAiAutoConfiguration; import org.springframework.ai.autoconfigure.mistralai.tool.WeatherServicePromptIT.MyWeatherService.Request; @@ -39,7 +41,6 @@ import org.springframework.ai.model.tool.ToolCallingChatOptions; import org.springframework.ai.tool.function.FunctionToolCallback; import org.springframework.boot.autoconfigure.AutoConfigurations; import org.springframework.boot.test.context.runner.ApplicationContextRunner; -import org.springframework.core.log.LogAccessor; import static org.assertj.core.api.Assertions.assertThat; @@ -51,7 +52,7 @@ import static org.assertj.core.api.Assertions.assertThat; @EnabledIfEnvironmentVariable(named = "MISTRAL_AI_API_KEY", matches = ".*") public class WeatherServicePromptIT { - private static final LogAccessor logger = new LogAccessor(WeatherServicePromptIT.class); + private final Logger logger = LoggerFactory.getLogger(WeatherServicePromptIT.class); private final ApplicationContextRunner contextRunner = new ApplicationContextRunner() .withPropertyValues("spring.ai.mistralai.api-key=" + System.getenv("MISTRAL_AI_API_KEY")) @@ -81,7 +82,7 @@ public class WeatherServicePromptIT { ChatResponse response = chatModel.call(new Prompt(List.of(userMessage), promptOptions)); - logger.info("Response: " + response); + logger.info("Response: {}", response); assertThat(response.getResult().getOutput().getText()).containsAnyOf("15", "15.0"); }); @@ -107,7 +108,7 @@ public class WeatherServicePromptIT { ChatResponse response = chatModel.call(new Prompt(List.of(userMessage), functionOptions)); - logger.info("Response: " + response); + logger.info("Response: {}", response); assertThat(response.getResult().getOutput().getText()).containsAnyOf("15", "15.0"); }); diff --git a/spring-ai-spring-boot-autoconfigure/src/test/java/org/springframework/ai/autoconfigure/moonshot/MoonshotAutoConfigurationIT.java b/spring-ai-spring-boot-autoconfigure/src/test/java/org/springframework/ai/autoconfigure/moonshot/MoonshotAutoConfigurationIT.java index 0c8580218..cf8cdd647 100644 --- a/spring-ai-spring-boot-autoconfigure/src/test/java/org/springframework/ai/autoconfigure/moonshot/MoonshotAutoConfigurationIT.java +++ b/spring-ai-spring-boot-autoconfigure/src/test/java/org/springframework/ai/autoconfigure/moonshot/MoonshotAutoConfigurationIT.java @@ -19,6 +19,8 @@ package org.springframework.ai.autoconfigure.moonshot; import java.util.Objects; import java.util.stream.Collectors; +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.condition.EnabledIfEnvironmentVariable; import reactor.core.publisher.Flux; @@ -31,7 +33,6 @@ import org.springframework.ai.moonshot.MoonshotChatModel; import org.springframework.boot.autoconfigure.AutoConfigurations; import org.springframework.boot.autoconfigure.web.client.RestClientAutoConfiguration; import org.springframework.boot.test.context.runner.ApplicationContextRunner; -import org.springframework.core.log.LogAccessor; import static org.assertj.core.api.Assertions.assertThat; @@ -41,7 +42,7 @@ import static org.assertj.core.api.Assertions.assertThat; @EnabledIfEnvironmentVariable(named = "MOONSHOT_API_KEY", matches = ".*") public class MoonshotAutoConfigurationIT { - private static final LogAccessor logger = new LogAccessor(MoonshotAutoConfigurationIT.class); + private static final Log logger = LogFactory.getLog(MoonshotAutoConfigurationIT.class); private final ApplicationContextRunner contextRunner = new ApplicationContextRunner() .withPropertyValues("spring.ai.moonshot.apiKey=" + System.getenv("MOONSHOT_API_KEY")) diff --git a/spring-ai-spring-boot-autoconfigure/src/test/java/org/springframework/ai/autoconfigure/moonshot/tool/FunctionCallbackInPromptIT.java b/spring-ai-spring-boot-autoconfigure/src/test/java/org/springframework/ai/autoconfigure/moonshot/tool/FunctionCallbackInPromptIT.java index 123374fa8..bd20fbb9d 100644 --- a/spring-ai-spring-boot-autoconfigure/src/test/java/org/springframework/ai/autoconfigure/moonshot/tool/FunctionCallbackInPromptIT.java +++ b/spring-ai-spring-boot-autoconfigure/src/test/java/org/springframework/ai/autoconfigure/moonshot/tool/FunctionCallbackInPromptIT.java @@ -21,6 +21,8 @@ import java.util.stream.Collectors; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.condition.EnabledIfEnvironmentVariable; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import reactor.core.publisher.Flux; import org.springframework.ai.autoconfigure.moonshot.MoonshotAutoConfiguration; @@ -36,7 +38,6 @@ import org.springframework.ai.moonshot.MoonshotChatOptions; import org.springframework.boot.autoconfigure.AutoConfigurations; import org.springframework.boot.autoconfigure.web.client.RestClientAutoConfiguration; import org.springframework.boot.test.context.runner.ApplicationContextRunner; -import org.springframework.core.log.LogAccessor; import static org.assertj.core.api.Assertions.assertThat; @@ -47,7 +48,7 @@ import static org.assertj.core.api.Assertions.assertThat; @EnabledIfEnvironmentVariable(named = "MOONSHOT_API_KEY", matches = ".*") public class FunctionCallbackInPromptIT { - private static final LogAccessor logger = new LogAccessor(FunctionCallbackInPromptIT.class); + private final Logger logger = LoggerFactory.getLogger(FunctionCallbackInPromptIT.class); private final ApplicationContextRunner contextRunner = new ApplicationContextRunner() .withPropertyValues("spring.ai.moonshot.apiKey=" + System.getenv("MOONSHOT_API_KEY")) @@ -73,7 +74,7 @@ public class FunctionCallbackInPromptIT { ChatResponse response = chatModel.call(new Prompt(List.of(userMessage), promptOptions)); - logger.info("Response: " + response); + logger.info("Response: {}", response); assertThat(response.getResult().getOutput().getText()).contains("30", "10", "15"); }); @@ -107,7 +108,7 @@ public class FunctionCallbackInPromptIT { .map(Generation::getOutput) .map(AssistantMessage::getText) .collect(Collectors.joining()); - logger.info("Response: " + content); + logger.info("Response: {}", content); assertThat(content).containsAnyOf("30.0", "30"); assertThat(content).containsAnyOf("10.0", "10"); diff --git a/spring-ai-spring-boot-autoconfigure/src/test/java/org/springframework/ai/autoconfigure/moonshot/tool/FunctionCallbackWithPlainFunctionBeanIT.java b/spring-ai-spring-boot-autoconfigure/src/test/java/org/springframework/ai/autoconfigure/moonshot/tool/FunctionCallbackWithPlainFunctionBeanIT.java index 1dad6079b..a9beae2cf 100644 --- a/spring-ai-spring-boot-autoconfigure/src/test/java/org/springframework/ai/autoconfigure/moonshot/tool/FunctionCallbackWithPlainFunctionBeanIT.java +++ b/spring-ai-spring-boot-autoconfigure/src/test/java/org/springframework/ai/autoconfigure/moonshot/tool/FunctionCallbackWithPlainFunctionBeanIT.java @@ -22,6 +22,8 @@ import java.util.stream.Collectors; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.condition.EnabledIfEnvironmentVariable; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import reactor.core.publisher.Flux; import org.springframework.ai.autoconfigure.moonshot.MoonshotAutoConfiguration; @@ -40,7 +42,6 @@ import org.springframework.boot.test.context.runner.ApplicationContextRunner; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.Description; -import org.springframework.core.log.LogAccessor; import static org.assertj.core.api.Assertions.assertThat; @@ -51,7 +52,7 @@ import static org.assertj.core.api.Assertions.assertThat; @EnabledIfEnvironmentVariable(named = "MOONSHOT_API_KEY", matches = ".*") class FunctionCallbackWithPlainFunctionBeanIT { - private static final LogAccessor logger = new LogAccessor(FunctionCallbackWithPlainFunctionBeanIT.class); + private final Logger logger = LoggerFactory.getLogger(FunctionCallbackWithPlainFunctionBeanIT.class); private final ApplicationContextRunner contextRunner = new ApplicationContextRunner() .withPropertyValues("spring.ai.moonshot.apiKey=" + System.getenv("MOONSHOT_API_KEY")) @@ -72,7 +73,7 @@ class FunctionCallbackWithPlainFunctionBeanIT { ChatResponse response = chatModel.call(new Prompt(List.of(userMessage), MoonshotChatOptions.builder().function("weatherFunction").build())); - logger.info("Response: " + response); + logger.info("Response: {}", response); assertThat(response.getResult().getOutput().getText()).contains("30", "10", "15"); @@ -80,7 +81,7 @@ class FunctionCallbackWithPlainFunctionBeanIT { response = chatModel.call(new Prompt(List.of(userMessage), MoonshotChatOptions.builder().function("weatherFunctionTwo").build())); - logger.info("Response: " + response); + logger.info("Response: {}", response); assertThat(response.getResult().getOutput().getText()).contains("30", "10", "15"); @@ -103,7 +104,7 @@ class FunctionCallbackWithPlainFunctionBeanIT { ChatResponse response = chatModel.call(new Prompt(List.of(userMessage), functionOptions)); - logger.info("Response: " + response); + logger.info("Response: {}", response); }); } @@ -128,7 +129,7 @@ class FunctionCallbackWithPlainFunctionBeanIT { .map(Generation::getOutput) .map(AssistantMessage::getText) .collect(Collectors.joining()); - logger.info("Response: " + content); + logger.info("Response: {}", content); assertThat(content).containsAnyOf("30.0", "30"); assertThat(content).containsAnyOf("10.0", "10"); @@ -146,7 +147,7 @@ class FunctionCallbackWithPlainFunctionBeanIT { .map(Generation::getOutput) .map(AssistantMessage::getText) .collect(Collectors.joining()); - logger.info("Response: " + content); + logger.info("Response: {}", content); assertThat(content).containsAnyOf("30.0", "30"); assertThat(content).containsAnyOf("10.0", "10"); diff --git a/spring-ai-spring-boot-autoconfigure/src/test/java/org/springframework/ai/autoconfigure/moonshot/tool/MoonshotFunctionCallbackIT.java b/spring-ai-spring-boot-autoconfigure/src/test/java/org/springframework/ai/autoconfigure/moonshot/tool/MoonshotFunctionCallbackIT.java index dab3784ec..fed437ef6 100644 --- a/spring-ai-spring-boot-autoconfigure/src/test/java/org/springframework/ai/autoconfigure/moonshot/tool/MoonshotFunctionCallbackIT.java +++ b/spring-ai-spring-boot-autoconfigure/src/test/java/org/springframework/ai/autoconfigure/moonshot/tool/MoonshotFunctionCallbackIT.java @@ -22,6 +22,8 @@ import java.util.stream.Collectors; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.condition.EnabledIfEnvironmentVariable; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import reactor.core.publisher.Flux; import org.springframework.ai.autoconfigure.moonshot.MoonshotAutoConfiguration; @@ -39,7 +41,6 @@ import org.springframework.boot.autoconfigure.web.client.RestClientAutoConfigura import org.springframework.boot.test.context.runner.ApplicationContextRunner; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; -import org.springframework.core.log.LogAccessor; import static org.assertj.core.api.Assertions.assertThat; @@ -50,7 +51,7 @@ import static org.assertj.core.api.Assertions.assertThat; @EnabledIfEnvironmentVariable(named = "MOONSHOT_API_KEY", matches = ".*") public class MoonshotFunctionCallbackIT { - private static final LogAccessor logger = new LogAccessor(MoonshotFunctionCallbackIT.class); + private final Logger logger = LoggerFactory.getLogger(MoonshotFunctionCallbackIT.class); private final ApplicationContextRunner contextRunner = new ApplicationContextRunner() .withPropertyValues("spring.ai.moonshot.apiKey=" + System.getenv("MOONSHOT_API_KEY")) @@ -70,7 +71,7 @@ public class MoonshotFunctionCallbackIT { ChatResponse response = chatModel .call(new Prompt(List.of(userMessage), MoonshotChatOptions.builder().function("WeatherInfo").build())); - logger.info("Response: " + response); + logger.info("Response: {}", response); assertThat(response.getResult().getOutput().getText()).contains("30", "10", "15"); @@ -98,7 +99,7 @@ public class MoonshotFunctionCallbackIT { .map(AssistantMessage::getText) .filter(Objects::nonNull) .collect(Collectors.joining()); - logger.info("Response: " + content); + logger.info("Response: {}", content); assertThat(content).containsAnyOf("30.0", "30"); assertThat(content).containsAnyOf("10.0", "10"); diff --git a/spring-ai-spring-boot-autoconfigure/src/test/java/org/springframework/ai/autoconfigure/ollama/tool/FunctionCallbackInPromptIT.java b/spring-ai-spring-boot-autoconfigure/src/test/java/org/springframework/ai/autoconfigure/ollama/tool/FunctionCallbackInPromptIT.java index 6a51c0e66..a703033a1 100644 --- a/spring-ai-spring-boot-autoconfigure/src/test/java/org/springframework/ai/autoconfigure/ollama/tool/FunctionCallbackInPromptIT.java +++ b/spring-ai-spring-boot-autoconfigure/src/test/java/org/springframework/ai/autoconfigure/ollama/tool/FunctionCallbackInPromptIT.java @@ -21,6 +21,8 @@ import java.util.stream.Collectors; import org.junit.jupiter.api.BeforeAll; import org.junit.jupiter.api.Test; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import reactor.core.publisher.Flux; import org.springframework.ai.autoconfigure.ollama.BaseOllamaIT; @@ -35,13 +37,12 @@ import org.springframework.ai.ollama.api.OllamaOptions; import org.springframework.ai.tool.function.FunctionToolCallback; import org.springframework.boot.autoconfigure.AutoConfigurations; import org.springframework.boot.test.context.runner.ApplicationContextRunner; -import org.springframework.core.log.LogAccessor; import static org.assertj.core.api.Assertions.assertThat; public class FunctionCallbackInPromptIT extends BaseOllamaIT { - private static final LogAccessor logger = new LogAccessor(FunctionCallbackInPromptIT.class); + private static final Logger logger = LoggerFactory.getLogger(FunctionCallbackInPromptIT.class); private static final String MODEL_NAME = "qwen2.5:3b"; @@ -79,7 +80,7 @@ public class FunctionCallbackInPromptIT extends BaseOllamaIT { ChatResponse response = chatModel.call(new Prompt(List.of(userMessage), promptOptions)); - logger.info("Response: " + response); + logger.info("Response: {}", response); assertThat(response.getResult().getOutput().getText()).contains("30", "10", "15"); }); @@ -113,7 +114,7 @@ public class FunctionCallbackInPromptIT extends BaseOllamaIT { .map(Generation::getOutput) .map(AssistantMessage::getText) .collect(Collectors.joining()); - logger.info("Response: " + content); + logger.info("Response: {}", content); assertThat(content).containsAnyOf("30.0", "30"); assertThat(content).containsAnyOf("10.0", "10"); diff --git a/spring-ai-spring-boot-autoconfigure/src/test/java/org/springframework/ai/autoconfigure/ollama/tool/OllamaFunctionCallbackIT.java b/spring-ai-spring-boot-autoconfigure/src/test/java/org/springframework/ai/autoconfigure/ollama/tool/OllamaFunctionCallbackIT.java index f39e75dd0..1e82e5fdf 100644 --- a/spring-ai-spring-boot-autoconfigure/src/test/java/org/springframework/ai/autoconfigure/ollama/tool/OllamaFunctionCallbackIT.java +++ b/spring-ai-spring-boot-autoconfigure/src/test/java/org/springframework/ai/autoconfigure/ollama/tool/OllamaFunctionCallbackIT.java @@ -21,6 +21,8 @@ import java.util.stream.Collectors; import org.junit.jupiter.api.BeforeAll; import org.junit.jupiter.api.Test; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import reactor.core.publisher.Flux; import org.springframework.ai.autoconfigure.ollama.BaseOllamaIT; @@ -39,13 +41,12 @@ import org.springframework.boot.autoconfigure.AutoConfigurations; import org.springframework.boot.test.context.runner.ApplicationContextRunner; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; -import org.springframework.core.log.LogAccessor; import static org.assertj.core.api.Assertions.assertThat; public class OllamaFunctionCallbackIT extends BaseOllamaIT { - private static final LogAccessor logger = new LogAccessor(OllamaFunctionCallbackIT.class); + private static final Logger logger = LoggerFactory.getLogger(OllamaFunctionCallbackIT.class); private static final String MODEL_NAME = "qwen2.5:3b"; diff --git a/spring-ai-spring-boot-autoconfigure/src/test/java/org/springframework/ai/autoconfigure/ollama/tool/OllamaFunctionToolBeanIT.java b/spring-ai-spring-boot-autoconfigure/src/test/java/org/springframework/ai/autoconfigure/ollama/tool/OllamaFunctionToolBeanIT.java index 10e825135..1440a7cd2 100644 --- a/spring-ai-spring-boot-autoconfigure/src/test/java/org/springframework/ai/autoconfigure/ollama/tool/OllamaFunctionToolBeanIT.java +++ b/spring-ai-spring-boot-autoconfigure/src/test/java/org/springframework/ai/autoconfigure/ollama/tool/OllamaFunctionToolBeanIT.java @@ -22,6 +22,8 @@ import java.util.stream.Collectors; import org.junit.jupiter.api.BeforeAll; import org.junit.jupiter.api.Test; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import reactor.core.publisher.Flux; import org.springframework.ai.autoconfigure.ollama.BaseOllamaIT; @@ -41,7 +43,6 @@ import org.springframework.boot.test.context.runner.ApplicationContextRunner; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.Description; -import org.springframework.core.log.LogAccessor; import static org.assertj.core.api.Assertions.assertThat; @@ -52,7 +53,7 @@ import static org.assertj.core.api.Assertions.assertThat; */ public class OllamaFunctionToolBeanIT extends BaseOllamaIT { - private static final LogAccessor logger = new LogAccessor(OllamaFunctionToolBeanIT.class); + private static final Logger logger = LoggerFactory.getLogger(OllamaFunctionToolBeanIT.class); private static final String MODEL_NAME = "qwen2.5:3b"; @@ -85,7 +86,7 @@ public class OllamaFunctionToolBeanIT extends BaseOllamaIT { ChatResponse response = chatModel.call(new Prompt(List.of(userMessage), OllamaOptions.builder().toolCallbacks(ToolCallbacks.from(myTools)).build())); - logger.info("Response: " + response); + logger.info("Response: {}", response); assertThat(response.getResult().getOutput().getText()).contains("30", "10", "15"); }); @@ -104,7 +105,7 @@ public class OllamaFunctionToolBeanIT extends BaseOllamaIT { ChatResponse response = chatModel .call(new Prompt(List.of(userMessage), OllamaOptions.builder().tools("weatherInfo").build())); - logger.info("Response: " + response); + logger.info("Response: {}", response); assertThat(response.getResult().getOutput().getText()).contains("30", "10", "15"); }); @@ -130,7 +131,7 @@ public class OllamaFunctionToolBeanIT extends BaseOllamaIT { .map(Generation::getOutput) .map(AssistantMessage::getText) .collect(Collectors.joining()); - logger.info("Response: " + content); + logger.info("Response: {}", content); assertThat(content).contains("30", "10", "15"); }); @@ -150,7 +151,7 @@ public class OllamaFunctionToolBeanIT extends BaseOllamaIT { ChatResponse response = chatModel.call(new Prompt(List.of(userMessage), functionOptions)); - logger.info("Response: " + response.getResult().getOutput().getText()); + logger.info("Response: {}", response.getResult().getOutput().getText()); assertThat(response.getResult().getOutput().getText()).contains("30", "10", "15"); }); diff --git a/spring-ai-spring-boot-autoconfigure/src/test/java/org/springframework/ai/autoconfigure/openai/OpenAiAutoConfigurationIT.java b/spring-ai-spring-boot-autoconfigure/src/test/java/org/springframework/ai/autoconfigure/openai/OpenAiAutoConfigurationIT.java index 2a14e0e20..0ebe376bc 100644 --- a/spring-ai-spring-boot-autoconfigure/src/test/java/org/springframework/ai/autoconfigure/openai/OpenAiAutoConfigurationIT.java +++ b/spring-ai-spring-boot-autoconfigure/src/test/java/org/springframework/ai/autoconfigure/openai/OpenAiAutoConfigurationIT.java @@ -20,6 +20,8 @@ import java.util.Arrays; import java.util.List; import java.util.stream.Collectors; +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.condition.EnabledIfEnvironmentVariable; import reactor.core.publisher.Flux; @@ -41,14 +43,13 @@ import org.springframework.boot.autoconfigure.AutoConfigurations; import org.springframework.boot.test.context.runner.ApplicationContextRunner; import org.springframework.core.io.ClassPathResource; import org.springframework.core.io.Resource; -import org.springframework.core.log.LogAccessor; import static org.assertj.core.api.Assertions.assertThat; @EnabledIfEnvironmentVariable(named = "OPENAI_API_KEY", matches = ".*") public class OpenAiAutoConfigurationIT { - private static final LogAccessor logger = new LogAccessor(OpenAiAutoConfigurationIT.class); + private static final Log logger = LogFactory.getLog(OpenAiAutoConfigurationIT.class); private final ApplicationContextRunner contextRunner = new ApplicationContextRunner() .withPropertyValues("spring.ai.openai.apiKey=" + System.getenv("OPENAI_API_KEY")) diff --git a/spring-ai-spring-boot-autoconfigure/src/test/java/org/springframework/ai/autoconfigure/openai/tool/FunctionCallbackInPrompt2IT.java b/spring-ai-spring-boot-autoconfigure/src/test/java/org/springframework/ai/autoconfigure/openai/tool/FunctionCallbackInPrompt2IT.java index d8714b0d6..21c11f7af 100644 --- a/spring-ai-spring-boot-autoconfigure/src/test/java/org/springframework/ai/autoconfigure/openai/tool/FunctionCallbackInPrompt2IT.java +++ b/spring-ai-spring-boot-autoconfigure/src/test/java/org/springframework/ai/autoconfigure/openai/tool/FunctionCallbackInPrompt2IT.java @@ -22,6 +22,8 @@ import java.util.stream.Collectors; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.condition.EnabledIfEnvironmentVariable; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import org.springframework.ai.autoconfigure.openai.OpenAiAutoConfiguration; import org.springframework.ai.chat.client.ChatClient; @@ -30,14 +32,13 @@ import org.springframework.ai.openai.api.OpenAiApi.ChatModel; import org.springframework.ai.tool.function.FunctionToolCallback; import org.springframework.boot.autoconfigure.AutoConfigurations; import org.springframework.boot.test.context.runner.ApplicationContextRunner; -import org.springframework.core.log.LogAccessor; import static org.assertj.core.api.Assertions.assertThat; @EnabledIfEnvironmentVariable(named = "OPENAI_API_KEY", matches = ".*") public class FunctionCallbackInPrompt2IT { - private static final LogAccessor logger = new LogAccessor(FunctionCallbackInPromptIT.class); + private final Logger logger = LoggerFactory.getLogger(FunctionCallbackInPromptIT.class); private final ApplicationContextRunner contextRunner = new ApplicationContextRunner() .withPropertyValues("spring.ai.openai.apiKey=" + System.getenv("OPENAI_API_KEY")) @@ -67,7 +68,7 @@ public class FunctionCallbackInPrompt2IT { .call().content(); // @formatter:on - logger.info("Response: " + content); + logger.info("Response: {}", content); assertThat(content).contains("30", "10", "15"); }); @@ -97,7 +98,7 @@ public class FunctionCallbackInPrompt2IT { .build()) .call().content(); // @formatter:on - logger.info("Response: " + content); + logger.info("Response: {}", content); assertThat(state).containsEntry("kitchen", Boolean.TRUE); assertThat(state).containsEntry("living room", Boolean.TRUE); }); @@ -120,7 +121,7 @@ public class FunctionCallbackInPrompt2IT { .build()) .call().content(); // @formatter:on - logger.info("Response: " + content); + logger.info("Response: {}", content); assertThat(content).contains("18"); }); @@ -146,7 +147,7 @@ public class FunctionCallbackInPrompt2IT { .collectList().block().stream().collect(Collectors.joining()); // @formatter:on - logger.info("Response: " + content); + logger.info("Response: {}", content); assertThat(content).contains("30", "10", "15"); }); diff --git a/spring-ai-spring-boot-autoconfigure/src/test/java/org/springframework/ai/autoconfigure/openai/tool/FunctionCallbackInPromptIT.java b/spring-ai-spring-boot-autoconfigure/src/test/java/org/springframework/ai/autoconfigure/openai/tool/FunctionCallbackInPromptIT.java index b4195bf55..14e60ab68 100644 --- a/spring-ai-spring-boot-autoconfigure/src/test/java/org/springframework/ai/autoconfigure/openai/tool/FunctionCallbackInPromptIT.java +++ b/spring-ai-spring-boot-autoconfigure/src/test/java/org/springframework/ai/autoconfigure/openai/tool/FunctionCallbackInPromptIT.java @@ -21,6 +21,8 @@ import java.util.stream.Collectors; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.condition.EnabledIfEnvironmentVariable; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import reactor.core.publisher.Flux; import org.springframework.ai.autoconfigure.openai.OpenAiAutoConfiguration; @@ -35,14 +37,13 @@ import org.springframework.ai.openai.api.OpenAiApi.ChatModel; import org.springframework.ai.tool.function.FunctionToolCallback; import org.springframework.boot.autoconfigure.AutoConfigurations; import org.springframework.boot.test.context.runner.ApplicationContextRunner; -import org.springframework.core.log.LogAccessor; import static org.assertj.core.api.Assertions.assertThat; @EnabledIfEnvironmentVariable(named = "OPENAI_API_KEY", matches = ".*") public class FunctionCallbackInPromptIT { - private static final LogAccessor logger = new LogAccessor(FunctionCallbackInPromptIT.class); + private final Logger logger = LoggerFactory.getLogger(FunctionCallbackInPromptIT.class); private final ApplicationContextRunner contextRunner = new ApplicationContextRunner() .withPropertyValues("spring.ai.openai.apiKey=" + System.getenv("OPENAI_API_KEY")) @@ -70,7 +71,7 @@ public class FunctionCallbackInPromptIT { ChatResponse response = chatModel.call(new Prompt(List.of(userMessage), promptOptions)); - logger.info("Response: " + response); + logger.info("Response: {}", response); assertThat(response.getResult().getOutput().getText()).contains("30", "10", "15"); }); @@ -107,7 +108,7 @@ public class FunctionCallbackInPromptIT { .map(Generation::getOutput) .map(AssistantMessage::getText) .collect(Collectors.joining()); - logger.info("Response: " + content); + logger.info("Response: {}", content); assertThat(content).contains("30", "10", "15"); }); diff --git a/spring-ai-spring-boot-autoconfigure/src/test/java/org/springframework/ai/autoconfigure/openai/tool/FunctionCallbackWithPlainFunctionBeanIT.java b/spring-ai-spring-boot-autoconfigure/src/test/java/org/springframework/ai/autoconfigure/openai/tool/FunctionCallbackWithPlainFunctionBeanIT.java index 513d2dbfd..4c5df9a30 100644 --- a/spring-ai-spring-boot-autoconfigure/src/test/java/org/springframework/ai/autoconfigure/openai/tool/FunctionCallbackWithPlainFunctionBeanIT.java +++ b/spring-ai-spring-boot-autoconfigure/src/test/java/org/springframework/ai/autoconfigure/openai/tool/FunctionCallbackWithPlainFunctionBeanIT.java @@ -28,6 +28,8 @@ import java.util.stream.Collectors; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.condition.EnabledIfEnvironmentVariable; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import reactor.core.publisher.Flux; import org.springframework.ai.autoconfigure.openai.OpenAiAutoConfiguration; @@ -47,14 +49,13 @@ import org.springframework.boot.test.context.runner.ApplicationContextRunner; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.Description; -import org.springframework.core.log.LogAccessor; import static org.assertj.core.api.Assertions.assertThat; @EnabledIfEnvironmentVariable(named = "OPENAI_API_KEY", matches = ".*") class FunctionCallbackWithPlainFunctionBeanIT { - private static final LogAccessor logger = new LogAccessor(FunctionCallbackWithPlainFunctionBeanIT.class); + private static final Logger logger = LoggerFactory.getLogger(FunctionCallbackWithPlainFunctionBeanIT.class); private final ApplicationContextRunner contextRunner = new ApplicationContextRunner() .withPropertyValues("spring.ai.openai.apiKey=" + System.getenv("OPENAI_API_KEY"), @@ -81,7 +82,7 @@ class FunctionCallbackWithPlainFunctionBeanIT { ChatResponse response = chatModel.call(new Prompt(List.of(userMessage), OpenAiChatOptions.builder().function("turnLivingRoomLightOn").build())); - logger.info("Response: " + response); + logger.info("Response: {}", response); assertThat(feedback).hasSize(1); assertThat(feedback.get("turnLivingRoomLightOn")).isEqualTo(Boolean.valueOf(true)); }); @@ -99,7 +100,7 @@ class FunctionCallbackWithPlainFunctionBeanIT { ChatResponse response = chatModel.call(new Prompt(List.of(userMessage), OpenAiChatOptions.builder().function("turnLivingRoomLightOnSupplier").build())); - logger.info("Response: " + response); + logger.info("Response: {}", response); assertThat(feedback).hasSize(1); assertThat(feedback.get("turnLivingRoomLightOnSupplier")).isEqualTo(Boolean.valueOf(true)); }); @@ -117,7 +118,7 @@ class FunctionCallbackWithPlainFunctionBeanIT { ChatResponse response = chatModel .call(new Prompt(List.of(userMessage), OpenAiChatOptions.builder().function("turnLight").build())); - logger.info("Response: " + response); + logger.info("Response: {}", response); assertThat(feedback).hasSize(2); assertThat(feedback.get("kitchen")).isEqualTo(Boolean.valueOf(true)); assertThat(feedback.get("living room")).isEqualTo(Boolean.valueOf(true)); @@ -136,7 +137,7 @@ class FunctionCallbackWithPlainFunctionBeanIT { ChatResponse response = chatModel.call(new Prompt(List.of(userMessage), OpenAiChatOptions.builder().function("turnLightConsumer").build())); - logger.info("Response: " + response); + logger.info("Response: {}", response); assertThat(feedback).hasSize(2); assertThat(feedback.get("kitchen")).isEqualTo(Boolean.valueOf(true)); assertThat(feedback.get("living room")).isEqualTo(Boolean.valueOf(true)); @@ -158,7 +159,7 @@ class FunctionCallbackWithPlainFunctionBeanIT { ChatResponse response = chatModel.call(new Prompt(List.of(userMessage), functionOptions)); - logger.info("Response: " + response.getResult().getOutput().getText()); + logger.info("Response: {}", response.getResult().getOutput().getText()); }); } @@ -187,7 +188,7 @@ class FunctionCallbackWithPlainFunctionBeanIT { .toolContext(Map.of("sessionId", "123")) .build())); - logger.info("Response: " + response); + logger.info("Response: {}", response); assertThat(response.getResult().getOutput().getText()).contains("30", "10", "15"); @@ -219,7 +220,7 @@ class FunctionCallbackWithPlainFunctionBeanIT { .toolContext(Map.of("sessionId", "123")) .build())); - logger.info("Response: " + response); + logger.info("Response: {}", response); assertThat(response.getResult().getOutput().getText()).contains("30", "10", "15"); @@ -239,7 +240,7 @@ class FunctionCallbackWithPlainFunctionBeanIT { ChatResponse response = chatModel.call( new Prompt(List.of(userMessage), OpenAiChatOptions.builder().function("weatherFunction").build())); - logger.info("Response: " + response); + logger.info("Response: {}", response); assertThat(response.getResult().getOutput().getText()).contains("30", "10", "15"); @@ -247,7 +248,7 @@ class FunctionCallbackWithPlainFunctionBeanIT { response = chatModel.call(new Prompt(List.of(userMessage), OpenAiChatOptions.builder().function("weatherFunctionTwo").build())); - logger.info("Response: " + response); + logger.info("Response: {}", response); assertThat(response.getResult().getOutput().getText()).contains("30", "10", "15"); @@ -267,7 +268,7 @@ class FunctionCallbackWithPlainFunctionBeanIT { ChatResponse response = chatModel.call(new Prompt(List.of(userMessage), functionOptions)); - logger.info("Response: " + response.getResult().getOutput().getText()); + logger.info("Response: {}", response.getResult().getOutput().getText()); assertThat(response.getResult().getOutput().getText()).contains("30", "10", "15"); }); @@ -294,7 +295,7 @@ class FunctionCallbackWithPlainFunctionBeanIT { .map(Generation::getOutput) .map(AssistantMessage::getText) .collect(Collectors.joining()); - logger.info("Response: " + content); + logger.info("Response: {}", content); assertThat(content).contains("30", "10", "15"); @@ -310,7 +311,7 @@ class FunctionCallbackWithPlainFunctionBeanIT { .map(Generation::getOutput) .map(AssistantMessage::getText) .collect(Collectors.joining()); - logger.info("Response: " + content); + logger.info("Response: {}", content); assertThat(content).isNotEmpty().withFailMessage("Content returned from OpenAI model is empty"); assertThat(content).contains("30", "10", "15"); diff --git a/spring-ai-spring-boot-autoconfigure/src/test/java/org/springframework/ai/autoconfigure/openai/tool/OpenAiFunctionCallback2IT.java b/spring-ai-spring-boot-autoconfigure/src/test/java/org/springframework/ai/autoconfigure/openai/tool/OpenAiFunctionCallback2IT.java index c361a8971..aab1aabd8 100644 --- a/spring-ai-spring-boot-autoconfigure/src/test/java/org/springframework/ai/autoconfigure/openai/tool/OpenAiFunctionCallback2IT.java +++ b/spring-ai-spring-boot-autoconfigure/src/test/java/org/springframework/ai/autoconfigure/openai/tool/OpenAiFunctionCallback2IT.java @@ -20,6 +20,8 @@ import java.util.stream.Collectors; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.condition.EnabledIfEnvironmentVariable; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import org.springframework.ai.autoconfigure.openai.OpenAiAutoConfiguration; import org.springframework.ai.chat.client.ChatClient; @@ -31,14 +33,13 @@ import org.springframework.boot.autoconfigure.AutoConfigurations; import org.springframework.boot.test.context.runner.ApplicationContextRunner; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; -import org.springframework.core.log.LogAccessor; import static org.assertj.core.api.Assertions.assertThat; @EnabledIfEnvironmentVariable(named = "OPENAI_API_KEY", matches = ".*") public class OpenAiFunctionCallback2IT { - private static final LogAccessor logger = new LogAccessor(OpenAiFunctionCallback2IT.class); + private final Logger logger = LoggerFactory.getLogger(OpenAiFunctionCallback2IT.class); private final ApplicationContextRunner contextRunner = new ApplicationContextRunner() .withPropertyValues("spring.ai.openai.apiKey=" + System.getenv("OPENAI_API_KEY"), @@ -63,7 +64,7 @@ public class OpenAiFunctionCallback2IT { .call().content(); // @formatter:on - logger.info("Response: " + content); + logger.info("Response: {}", content); assertThat(content).contains("30", "10", "15"); }); @@ -83,7 +84,7 @@ public class OpenAiFunctionCallback2IT { .collectList().block().stream().collect(Collectors.joining()); // @formatter:on - logger.info("Response: " + content); + logger.info("Response: {}", content); assertThat(content).contains("30", "10", "15"); }); diff --git a/spring-ai-spring-boot-autoconfigure/src/test/java/org/springframework/ai/autoconfigure/openai/tool/OpenAiFunctionCallbackIT.java b/spring-ai-spring-boot-autoconfigure/src/test/java/org/springframework/ai/autoconfigure/openai/tool/OpenAiFunctionCallbackIT.java index ffc799fe7..d4914146c 100644 --- a/spring-ai-spring-boot-autoconfigure/src/test/java/org/springframework/ai/autoconfigure/openai/tool/OpenAiFunctionCallbackIT.java +++ b/spring-ai-spring-boot-autoconfigure/src/test/java/org/springframework/ai/autoconfigure/openai/tool/OpenAiFunctionCallbackIT.java @@ -21,6 +21,8 @@ import java.util.stream.Collectors; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.condition.EnabledIfEnvironmentVariable; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import reactor.core.publisher.Flux; import org.springframework.ai.autoconfigure.openai.OpenAiAutoConfiguration; @@ -38,14 +40,13 @@ import org.springframework.boot.autoconfigure.AutoConfigurations; import org.springframework.boot.test.context.runner.ApplicationContextRunner; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; -import org.springframework.core.log.LogAccessor; import static org.assertj.core.api.Assertions.assertThat; @EnabledIfEnvironmentVariable(named = "OPENAI_API_KEY", matches = ".*") public class OpenAiFunctionCallbackIT { - private static final LogAccessor logger = new LogAccessor(OpenAiFunctionCallbackIT.class); + private final Logger logger = LoggerFactory.getLogger(OpenAiFunctionCallbackIT.class); private final ApplicationContextRunner contextRunner = new ApplicationContextRunner() .withPropertyValues("spring.ai.openai.apiKey=" + System.getenv("OPENAI_API_KEY"), @@ -64,7 +65,7 @@ public class OpenAiFunctionCallbackIT { ChatResponse response = chatModel .call(new Prompt(List.of(userMessage), OpenAiChatOptions.builder().function("WeatherInfo").build())); - logger.info("Response: " + response); + logger.info("Response: {}", response); assertThat(response.getResult().getOutput().getText()).contains("30", "10", "15"); @@ -91,7 +92,7 @@ public class OpenAiFunctionCallbackIT { .map(Generation::getOutput) .map(AssistantMessage::getText) .collect(Collectors.joining()); - logger.info("Response: " + content); + logger.info("Response: {}", content); assertThat(content).containsAnyOf("30.0", "30"); assertThat(content).containsAnyOf("10.0", "10"); diff --git a/spring-ai-spring-boot-autoconfigure/src/test/java/org/springframework/ai/autoconfigure/qianfan/QianFanAutoConfigurationIT.java b/spring-ai-spring-boot-autoconfigure/src/test/java/org/springframework/ai/autoconfigure/qianfan/QianFanAutoConfigurationIT.java index f04ed5d81..788429912 100644 --- a/spring-ai-spring-boot-autoconfigure/src/test/java/org/springframework/ai/autoconfigure/qianfan/QianFanAutoConfigurationIT.java +++ b/spring-ai-spring-boot-autoconfigure/src/test/java/org/springframework/ai/autoconfigure/qianfan/QianFanAutoConfigurationIT.java @@ -20,6 +20,8 @@ import java.util.List; import java.util.Objects; import java.util.stream.Collectors; +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.condition.EnabledIfEnvironmentVariable; import org.junit.jupiter.api.condition.EnabledIfEnvironmentVariables; @@ -38,7 +40,6 @@ import org.springframework.ai.qianfan.QianFanImageModel; import org.springframework.boot.autoconfigure.AutoConfigurations; import org.springframework.boot.autoconfigure.web.client.RestClientAutoConfiguration; import org.springframework.boot.test.context.runner.ApplicationContextRunner; -import org.springframework.core.log.LogAccessor; import static org.assertj.core.api.Assertions.assertThat; @@ -49,7 +50,7 @@ import static org.assertj.core.api.Assertions.assertThat; @EnabledIfEnvironmentVariable(named = "QIANFAN_SECRET_KEY", matches = ".+") }) public class QianFanAutoConfigurationIT { - private static final LogAccessor logger = new LogAccessor(QianFanAutoConfigurationIT.class); + private static final Log logger = LogFactory.getLog(QianFanAutoConfigurationIT.class); private final ApplicationContextRunner contextRunner = new ApplicationContextRunner() .withPropertyValues("spring.ai.qianfan.apiKey=" + System.getenv("QIANFAN_API_KEY"), diff --git a/spring-ai-spring-boot-autoconfigure/src/test/java/org/springframework/ai/autoconfigure/vertexai/gemini/VertexAiGeminiAutoConfigurationIT.java b/spring-ai-spring-boot-autoconfigure/src/test/java/org/springframework/ai/autoconfigure/vertexai/gemini/VertexAiGeminiAutoConfigurationIT.java index 5ad44895e..ca2cdeb3a 100644 --- a/spring-ai-spring-boot-autoconfigure/src/test/java/org/springframework/ai/autoconfigure/vertexai/gemini/VertexAiGeminiAutoConfigurationIT.java +++ b/spring-ai-spring-boot-autoconfigure/src/test/java/org/springframework/ai/autoconfigure/vertexai/gemini/VertexAiGeminiAutoConfigurationIT.java @@ -18,6 +18,8 @@ package org.springframework.ai.autoconfigure.vertexai.gemini; import java.util.stream.Collectors; +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.condition.EnabledIfEnvironmentVariable; import reactor.core.publisher.Flux; @@ -28,7 +30,6 @@ import org.springframework.ai.chat.prompt.Prompt; import org.springframework.ai.vertexai.gemini.VertexAiGeminiChatModel; import org.springframework.boot.autoconfigure.AutoConfigurations; import org.springframework.boot.test.context.runner.ApplicationContextRunner; -import org.springframework.core.log.LogAccessor; import static org.assertj.core.api.Assertions.assertThat; @@ -36,7 +37,7 @@ import static org.assertj.core.api.Assertions.assertThat; @EnabledIfEnvironmentVariable(named = "VERTEX_AI_GEMINI_LOCATION", matches = ".*") public class VertexAiGeminiAutoConfigurationIT { - private static final LogAccessor logger = new LogAccessor(VertexAiGeminiAutoConfigurationIT.class); + private static final Log logger = LogFactory.getLog(VertexAiGeminiAutoConfigurationIT.class); private final ApplicationContextRunner contextRunner = new ApplicationContextRunner() .withPropertyValues("spring.ai.vertex.ai.gemini.project-id=" + System.getenv("VERTEX_AI_GEMINI_PROJECT_ID"), diff --git a/spring-ai-spring-boot-autoconfigure/src/test/java/org/springframework/ai/autoconfigure/vertexai/gemini/tool/FunctionCallWithFunctionBeanIT.java b/spring-ai-spring-boot-autoconfigure/src/test/java/org/springframework/ai/autoconfigure/vertexai/gemini/tool/FunctionCallWithFunctionBeanIT.java index 304bff8fc..92769b234 100644 --- a/spring-ai-spring-boot-autoconfigure/src/test/java/org/springframework/ai/autoconfigure/vertexai/gemini/tool/FunctionCallWithFunctionBeanIT.java +++ b/spring-ai-spring-boot-autoconfigure/src/test/java/org/springframework/ai/autoconfigure/vertexai/gemini/tool/FunctionCallWithFunctionBeanIT.java @@ -21,6 +21,8 @@ import java.util.function.Function; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.condition.EnabledIfEnvironmentVariable; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import org.springframework.ai.autoconfigure.vertexai.gemini.VertexAiGeminiAutoConfiguration; import org.springframework.ai.chat.messages.UserMessage; @@ -34,7 +36,6 @@ import org.springframework.boot.test.context.runner.ApplicationContextRunner; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.Description; -import org.springframework.core.log.LogAccessor; import static org.assertj.core.api.Assertions.assertThat; @@ -42,7 +43,7 @@ import static org.assertj.core.api.Assertions.assertThat; @EnabledIfEnvironmentVariable(named = "VERTEX_AI_GEMINI_LOCATION", matches = ".*") class FunctionCallWithFunctionBeanIT { - private static final LogAccessor logger = new LogAccessor(FunctionCallWithFunctionBeanIT.class); + private final Logger logger = LoggerFactory.getLogger(FunctionCallWithFunctionBeanIT.class); private final ApplicationContextRunner contextRunner = new ApplicationContextRunner() .withPropertyValues("spring.ai.vertex.ai.gemini.project-id=" + System.getenv("VERTEX_AI_GEMINI_PROJECT_ID"), @@ -70,21 +71,21 @@ class FunctionCallWithFunctionBeanIT { ChatResponse response = chatModel.call(new Prompt(List.of(userMessage), VertexAiGeminiChatOptions.builder().function("weatherFunction").build())); - logger.info("Response: " + response); + logger.info("Response: {}", response); assertThat(response.getResult().getOutput().getText()).contains("30", "10", "15"); response = chatModel.call(new Prompt(List.of(userMessage), VertexAiGeminiChatOptions.builder().function("weatherFunction3").build())); - logger.info("Response: " + response); + logger.info("Response: {}", response); assertThat(response.getResult().getOutput().getText()).contains("30", "10", "15"); response = chatModel .call(new Prompt(List.of(userMessage), VertexAiGeminiChatOptions.builder().build())); - logger.info("Response: " + response); + logger.info("Response: {}", response); assertThat(response.getResult().getOutput().getText()).doesNotContain("30", "10", "15"); @@ -110,14 +111,14 @@ class FunctionCallWithFunctionBeanIT { ChatResponse response = chatModel.call(new Prompt(List.of(userMessage), FunctionCallingOptions.builder().function("weatherFunction").build())); - logger.info("Response: " + response); + logger.info("Response: {}", response); assertThat(response.getResult().getOutput().getText()).contains("30", "10", "15"); response = chatModel.call(new Prompt(List.of(userMessage), VertexAiGeminiChatOptions.builder().function("weatherFunction3").build())); - logger.info("Response: " + response); + logger.info("Response: {}", response); assertThat(response.getResult().getOutput().getText()).contains("30", "10", "15"); diff --git a/spring-ai-spring-boot-autoconfigure/src/test/java/org/springframework/ai/autoconfigure/vertexai/gemini/tool/FunctionCallWithFunctionWrapperIT.java b/spring-ai-spring-boot-autoconfigure/src/test/java/org/springframework/ai/autoconfigure/vertexai/gemini/tool/FunctionCallWithFunctionWrapperIT.java index 497894fd5..4747e6af8 100644 --- a/spring-ai-spring-boot-autoconfigure/src/test/java/org/springframework/ai/autoconfigure/vertexai/gemini/tool/FunctionCallWithFunctionWrapperIT.java +++ b/spring-ai-spring-boot-autoconfigure/src/test/java/org/springframework/ai/autoconfigure/vertexai/gemini/tool/FunctionCallWithFunctionWrapperIT.java @@ -20,6 +20,8 @@ import java.util.List; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.condition.EnabledIfEnvironmentVariable; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import org.springframework.ai.autoconfigure.vertexai.gemini.VertexAiGeminiAutoConfiguration; import org.springframework.ai.chat.messages.UserMessage; @@ -33,7 +35,6 @@ import org.springframework.boot.autoconfigure.AutoConfigurations; import org.springframework.boot.test.context.runner.ApplicationContextRunner; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; -import org.springframework.core.log.LogAccessor; import static org.assertj.core.api.Assertions.assertThat; @@ -41,7 +42,7 @@ import static org.assertj.core.api.Assertions.assertThat; @EnabledIfEnvironmentVariable(named = "VERTEX_AI_GEMINI_LOCATION", matches = ".*") public class FunctionCallWithFunctionWrapperIT { - private static final LogAccessor logger = new LogAccessor(FunctionCallWithFunctionWrapperIT.class); + private final Logger logger = LoggerFactory.getLogger(FunctionCallWithFunctionWrapperIT.class); private final ApplicationContextRunner contextRunner = new ApplicationContextRunner() .withPropertyValues("spring.ai.vertex.ai.gemini.project-id=" + System.getenv("VERTEX_AI_GEMINI_PROJECT_ID"), @@ -66,7 +67,7 @@ public class FunctionCallWithFunctionWrapperIT { ChatResponse response = chatModel.call(new Prompt(List.of(userMessage), VertexAiGeminiChatOptions.builder().function("WeatherInfo").build())); - logger.info("Response: " + response); + logger.info("Response: {}", response); assertThat(response.getResult().getOutput().getText()).contains("30", "10", "15"); }); diff --git a/spring-ai-spring-boot-autoconfigure/src/test/java/org/springframework/ai/autoconfigure/vertexai/gemini/tool/FunctionCallWithPromptFunctionIT.java b/spring-ai-spring-boot-autoconfigure/src/test/java/org/springframework/ai/autoconfigure/vertexai/gemini/tool/FunctionCallWithPromptFunctionIT.java index f3cad660d..99e524f52 100644 --- a/spring-ai-spring-boot-autoconfigure/src/test/java/org/springframework/ai/autoconfigure/vertexai/gemini/tool/FunctionCallWithPromptFunctionIT.java +++ b/spring-ai-spring-boot-autoconfigure/src/test/java/org/springframework/ai/autoconfigure/vertexai/gemini/tool/FunctionCallWithPromptFunctionIT.java @@ -20,6 +20,8 @@ import java.util.List; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.condition.EnabledIfEnvironmentVariable; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import org.springframework.ai.autoconfigure.vertexai.gemini.VertexAiGeminiAutoConfiguration; import org.springframework.ai.chat.messages.UserMessage; @@ -31,7 +33,6 @@ import org.springframework.ai.vertexai.gemini.VertexAiGeminiChatModel; import org.springframework.ai.vertexai.gemini.VertexAiGeminiChatOptions; import org.springframework.boot.autoconfigure.AutoConfigurations; import org.springframework.boot.test.context.runner.ApplicationContextRunner; -import org.springframework.core.log.LogAccessor; import static org.assertj.core.api.Assertions.assertThat; @@ -39,7 +40,7 @@ import static org.assertj.core.api.Assertions.assertThat; @EnabledIfEnvironmentVariable(named = "VERTEX_AI_GEMINI_LOCATION", matches = ".*") public class FunctionCallWithPromptFunctionIT { - private static final LogAccessor logger = new LogAccessor(FunctionCallWithPromptFunctionIT.class); + private final Logger logger = LoggerFactory.getLogger(FunctionCallWithPromptFunctionIT.class); private final ApplicationContextRunner contextRunner = new ApplicationContextRunner() .withPropertyValues("spring.ai.vertex.ai.gemini.project-id=" + System.getenv("VERTEX_AI_GEMINI_PROJECT_ID"), @@ -77,7 +78,7 @@ public class FunctionCallWithPromptFunctionIT { ChatResponse response = chatModel.call(new Prompt(List.of(userMessage), promptOptions)); - logger.info("Response: " + response); + logger.info("Response: {}", response); assertThat(response.getResult().getOutput().getText()).contains("30", "10", "15"); @@ -85,7 +86,7 @@ public class FunctionCallWithPromptFunctionIT { response = chatModel .call(new Prompt(List.of(userMessage), VertexAiGeminiChatOptions.builder().build())); - logger.info("Response: " + response); + logger.info("Response: {}", response); assertThat(response.getResult().getOutput().getText()).doesNotContain("30", "10", "15"); diff --git a/spring-ai-spring-boot-autoconfigure/src/test/java/org/springframework/ai/autoconfigure/zhipuai/ZhiPuAiAutoConfigurationIT.java b/spring-ai-spring-boot-autoconfigure/src/test/java/org/springframework/ai/autoconfigure/zhipuai/ZhiPuAiAutoConfigurationIT.java index 8b00bace4..f60814cb4 100644 --- a/spring-ai-spring-boot-autoconfigure/src/test/java/org/springframework/ai/autoconfigure/zhipuai/ZhiPuAiAutoConfigurationIT.java +++ b/spring-ai-spring-boot-autoconfigure/src/test/java/org/springframework/ai/autoconfigure/zhipuai/ZhiPuAiAutoConfigurationIT.java @@ -19,6 +19,8 @@ package org.springframework.ai.autoconfigure.zhipuai; import java.util.List; import java.util.stream.Collectors; +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.condition.EnabledIfEnvironmentVariable; import reactor.core.publisher.Flux; @@ -36,7 +38,6 @@ import org.springframework.ai.zhipuai.ZhiPuAiImageModel; import org.springframework.boot.autoconfigure.AutoConfigurations; import org.springframework.boot.autoconfigure.web.client.RestClientAutoConfiguration; import org.springframework.boot.test.context.runner.ApplicationContextRunner; -import org.springframework.core.log.LogAccessor; import static org.assertj.core.api.Assertions.assertThat; @@ -46,7 +47,7 @@ import static org.assertj.core.api.Assertions.assertThat; @EnabledIfEnvironmentVariable(named = "ZHIPU_AI_API_KEY", matches = ".*") public class ZhiPuAiAutoConfigurationIT { - private static final LogAccessor logger = new LogAccessor(ZhiPuAiAutoConfigurationIT.class); + private static final Log logger = LogFactory.getLog(ZhiPuAiAutoConfigurationIT.class); private final ApplicationContextRunner contextRunner = new ApplicationContextRunner() .withPropertyValues("spring.ai.zhipuai.apiKey=" + System.getenv("ZHIPU_AI_API_KEY")) diff --git a/spring-ai-spring-boot-autoconfigure/src/test/java/org/springframework/ai/autoconfigure/zhipuai/tool/FunctionCallbackInPromptIT.java b/spring-ai-spring-boot-autoconfigure/src/test/java/org/springframework/ai/autoconfigure/zhipuai/tool/FunctionCallbackInPromptIT.java index 22cebfb3c..556e7df8c 100644 --- a/spring-ai-spring-boot-autoconfigure/src/test/java/org/springframework/ai/autoconfigure/zhipuai/tool/FunctionCallbackInPromptIT.java +++ b/spring-ai-spring-boot-autoconfigure/src/test/java/org/springframework/ai/autoconfigure/zhipuai/tool/FunctionCallbackInPromptIT.java @@ -21,6 +21,8 @@ import java.util.stream.Collectors; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.condition.EnabledIfEnvironmentVariable; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import reactor.core.publisher.Flux; import org.springframework.ai.autoconfigure.retry.SpringAiRetryAutoConfiguration; @@ -36,7 +38,6 @@ import org.springframework.ai.zhipuai.ZhiPuAiChatOptions; import org.springframework.boot.autoconfigure.AutoConfigurations; import org.springframework.boot.autoconfigure.web.client.RestClientAutoConfiguration; import org.springframework.boot.test.context.runner.ApplicationContextRunner; -import org.springframework.core.log.LogAccessor; import static org.assertj.core.api.Assertions.assertThat; @@ -46,7 +47,7 @@ import static org.assertj.core.api.Assertions.assertThat; @EnabledIfEnvironmentVariable(named = "ZHIPU_AI_API_KEY", matches = ".*") public class FunctionCallbackInPromptIT { - private static final LogAccessor logger = new LogAccessor(FunctionCallbackInPromptIT.class); + private final Logger logger = LoggerFactory.getLogger(FunctionCallbackInPromptIT.class); private final ApplicationContextRunner contextRunner = new ApplicationContextRunner() .withPropertyValues("spring.ai.zhipuai.apiKey=" + System.getenv("ZHIPU_AI_API_KEY")) @@ -74,7 +75,7 @@ public class FunctionCallbackInPromptIT { ChatResponse response = chatModel.call(new Prompt(List.of(userMessage), promptOptions)); - logger.info("Response: " + response); + logger.info("Response: {}", response); assertThat(response.getResult().getOutput().getText()).contains("30", "10", "15"); }); @@ -108,7 +109,7 @@ public class FunctionCallbackInPromptIT { .map(Generation::getOutput) .map(AssistantMessage::getText) .collect(Collectors.joining()); - logger.info("Response: " + content); + logger.info("Response: {}", content); assertThat(content).containsAnyOf("30.0", "30"); assertThat(content).containsAnyOf("10.0", "10"); diff --git a/spring-ai-spring-boot-autoconfigure/src/test/java/org/springframework/ai/autoconfigure/zhipuai/tool/FunctionCallbackWithPlainFunctionBeanIT.java b/spring-ai-spring-boot-autoconfigure/src/test/java/org/springframework/ai/autoconfigure/zhipuai/tool/FunctionCallbackWithPlainFunctionBeanIT.java index 20c044234..714ea619c 100644 --- a/spring-ai-spring-boot-autoconfigure/src/test/java/org/springframework/ai/autoconfigure/zhipuai/tool/FunctionCallbackWithPlainFunctionBeanIT.java +++ b/spring-ai-spring-boot-autoconfigure/src/test/java/org/springframework/ai/autoconfigure/zhipuai/tool/FunctionCallbackWithPlainFunctionBeanIT.java @@ -22,6 +22,8 @@ import java.util.stream.Collectors; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.condition.EnabledIfEnvironmentVariable; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import reactor.core.publisher.Flux; import org.springframework.ai.autoconfigure.retry.SpringAiRetryAutoConfiguration; @@ -40,7 +42,6 @@ import org.springframework.boot.test.context.runner.ApplicationContextRunner; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.Description; -import org.springframework.core.log.LogAccessor; import static org.assertj.core.api.Assertions.assertThat; @@ -50,7 +51,7 @@ import static org.assertj.core.api.Assertions.assertThat; @EnabledIfEnvironmentVariable(named = "ZHIPU_AI_API_KEY", matches = ".*") class FunctionCallbackWithPlainFunctionBeanIT { - private static final LogAccessor logger = new LogAccessor(FunctionCallbackWithPlainFunctionBeanIT.class); + private final Logger logger = LoggerFactory.getLogger(FunctionCallbackWithPlainFunctionBeanIT.class); private final ApplicationContextRunner contextRunner = new ApplicationContextRunner() .withPropertyValues("spring.ai.zhipuai.apiKey=" + System.getenv("ZHIPU_AI_API_KEY")) @@ -71,7 +72,7 @@ class FunctionCallbackWithPlainFunctionBeanIT { ChatResponse response = chatModel.call( new Prompt(List.of(userMessage), ZhiPuAiChatOptions.builder().function("weatherFunction").build())); - logger.info("Response: " + response); + logger.info("Response: {}", response); assertThat(response.getResult().getOutput().getText()).contains("30", "10", "15"); @@ -79,7 +80,7 @@ class FunctionCallbackWithPlainFunctionBeanIT { response = chatModel.call(new Prompt(List.of(userMessage), ZhiPuAiChatOptions.builder().function("weatherFunctionTwo").build())); - logger.info("Response: " + response); + logger.info("Response: {}", response); assertThat(response.getResult().getOutput().getText()).contains("30", "10", "15"); @@ -102,7 +103,7 @@ class FunctionCallbackWithPlainFunctionBeanIT { ChatResponse response = chatModel.call(new Prompt(List.of(userMessage), functionOptions)); - logger.info("Response: " + response); + logger.info("Response: {}", response); }); } @@ -127,7 +128,7 @@ class FunctionCallbackWithPlainFunctionBeanIT { .map(Generation::getOutput) .map(AssistantMessage::getText) .collect(Collectors.joining()); - logger.info("Response: " + content); + logger.info("Response: {}", content); assertThat(content).containsAnyOf("30.0", "30"); assertThat(content).containsAnyOf("10.0", "10"); @@ -145,7 +146,7 @@ class FunctionCallbackWithPlainFunctionBeanIT { .map(Generation::getOutput) .map(AssistantMessage::getText) .collect(Collectors.joining()); - logger.info("Response: " + content); + logger.info("Response: {}", content); assertThat(content).containsAnyOf("30.0", "30"); assertThat(content).containsAnyOf("10.0", "10"); diff --git a/spring-ai-spring-boot-autoconfigure/src/test/java/org/springframework/ai/autoconfigure/zhipuai/tool/ZhipuAiFunctionCallbackIT.java b/spring-ai-spring-boot-autoconfigure/src/test/java/org/springframework/ai/autoconfigure/zhipuai/tool/ZhipuAiFunctionCallbackIT.java index d73535ca2..6b258e98d 100644 --- a/spring-ai-spring-boot-autoconfigure/src/test/java/org/springframework/ai/autoconfigure/zhipuai/tool/ZhipuAiFunctionCallbackIT.java +++ b/spring-ai-spring-boot-autoconfigure/src/test/java/org/springframework/ai/autoconfigure/zhipuai/tool/ZhipuAiFunctionCallbackIT.java @@ -21,6 +21,8 @@ import java.util.stream.Collectors; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.condition.EnabledIfEnvironmentVariable; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import reactor.core.publisher.Flux; import org.springframework.ai.autoconfigure.retry.SpringAiRetryAutoConfiguration; @@ -38,7 +40,6 @@ import org.springframework.boot.autoconfigure.web.client.RestClientAutoConfigura import org.springframework.boot.test.context.runner.ApplicationContextRunner; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; -import org.springframework.core.log.LogAccessor; import static org.assertj.core.api.Assertions.assertThat; @@ -48,7 +49,7 @@ import static org.assertj.core.api.Assertions.assertThat; @EnabledIfEnvironmentVariable(named = "ZHIPU_AI_API_KEY", matches = ".*") public class ZhipuAiFunctionCallbackIT { - private static final LogAccessor logger = new LogAccessor(ZhipuAiFunctionCallbackIT.class); + private final Logger logger = LoggerFactory.getLogger(ZhipuAiFunctionCallbackIT.class); private final ApplicationContextRunner contextRunner = new ApplicationContextRunner() .withPropertyValues("spring.ai.zhipuai.apiKey=" + System.getenv("ZHIPU_AI_API_KEY")) @@ -68,7 +69,7 @@ public class ZhipuAiFunctionCallbackIT { ChatResponse response = chatModel .call(new Prompt(List.of(userMessage), ZhiPuAiChatOptions.builder().function("WeatherInfo").build())); - logger.info("Response: " + response); + logger.info("Response: {}", response); assertThat(response.getResult().getOutput().getText()).contains("30", "10", "15"); @@ -95,7 +96,7 @@ public class ZhipuAiFunctionCallbackIT { .map(Generation::getOutput) .map(AssistantMessage::getText) .collect(Collectors.joining()); - logger.info("Response: " + content); + logger.info("Response: {}", content); assertThat(content).containsAnyOf("30.0", "30"); assertThat(content).containsAnyOf("10.0", "10"); diff --git a/spring-ai-spring-boot-autoconfigure/src/test/kotlin/org/springframework/ai/autoconfigure/ollama/tool/FunctionCallbackContextKotlinIT.kt b/spring-ai-spring-boot-autoconfigure/src/test/kotlin/org/springframework/ai/autoconfigure/ollama/tool/FunctionCallbackContextKotlinIT.kt index 83b2ce73f..884d40d03 100644 --- a/spring-ai-spring-boot-autoconfigure/src/test/kotlin/org/springframework/ai/autoconfigure/ollama/tool/FunctionCallbackContextKotlinIT.kt +++ b/spring-ai-spring-boot-autoconfigure/src/test/kotlin/org/springframework/ai/autoconfigure/ollama/tool/FunctionCallbackContextKotlinIT.kt @@ -19,19 +19,21 @@ package org.springframework.ai.autoconfigure.ollama.tool import org.assertj.core.api.Assertions.assertThat import org.junit.jupiter.api.BeforeAll import org.junit.jupiter.api.Test +import org.slf4j.LoggerFactory + import org.springframework.ai.autoconfigure.ollama.BaseOllamaIT import org.springframework.ai.autoconfigure.ollama.OllamaAutoConfiguration import org.springframework.ai.chat.messages.UserMessage import org.springframework.ai.chat.prompt.Prompt import org.springframework.ai.model.function.FunctionCallingOptions import org.springframework.ai.ollama.OllamaChatModel +import org.springframework.ai.ollama.api.OllamaModel import org.springframework.ai.ollama.api.OllamaOptions import org.springframework.boot.autoconfigure.AutoConfigurations import org.springframework.boot.test.context.runner.ApplicationContextRunner import org.springframework.context.annotation.Bean import org.springframework.context.annotation.Configuration import org.springframework.context.annotation.Description -import org.springframework.core.log.LogAccessor class FunctionCallbackResolverKotlinIT : BaseOllamaIT() { @@ -46,7 +48,7 @@ class FunctionCallbackResolverKotlinIT : BaseOllamaIT() { } } - private val logger = LogAccessor(FunctionCallbackResolverKotlinIT::class.java) + private val logger = LoggerFactory.getLogger(FunctionCallbackResolverKotlinIT::class.java) private val contextRunner = ApplicationContextRunner() .withPropertyValues( diff --git a/spring-ai-spring-boot-autoconfigure/src/test/kotlin/org/springframework/ai/autoconfigure/ollama/tool/FunctionCallbackKotlinIT.kt b/spring-ai-spring-boot-autoconfigure/src/test/kotlin/org/springframework/ai/autoconfigure/ollama/tool/FunctionCallbackKotlinIT.kt index 990a98b54..691c22bf9 100644 --- a/spring-ai-spring-boot-autoconfigure/src/test/kotlin/org/springframework/ai/autoconfigure/ollama/tool/FunctionCallbackKotlinIT.kt +++ b/spring-ai-spring-boot-autoconfigure/src/test/kotlin/org/springframework/ai/autoconfigure/ollama/tool/FunctionCallbackKotlinIT.kt @@ -19,6 +19,8 @@ package org.springframework.ai.autoconfigure.ollama.tool import org.assertj.core.api.Assertions.assertThat import org.junit.jupiter.api.BeforeAll import org.junit.jupiter.api.Test +import org.slf4j.LoggerFactory + import org.springframework.ai.autoconfigure.ollama.BaseOllamaIT import org.springframework.ai.autoconfigure.ollama.OllamaAutoConfiguration import org.springframework.ai.chat.messages.UserMessage @@ -31,7 +33,6 @@ import org.springframework.boot.autoconfigure.AutoConfigurations import org.springframework.boot.test.context.runner.ApplicationContextRunner import org.springframework.context.annotation.Bean import org.springframework.context.annotation.Configuration -import org.springframework.core.log.LogAccessor class FunctionCallbackKotlinIT : BaseOllamaIT() { @@ -46,7 +47,7 @@ class FunctionCallbackKotlinIT : BaseOllamaIT() { } } - private val logger = LogAccessor(FunctionCallbackKotlinIT::class.java) + private val logger = LoggerFactory.getLogger(FunctionCallbackKotlinIT::class.java) private val contextRunner = ApplicationContextRunner() .withPropertyValues( diff --git a/spring-ai-spring-boot-testcontainers/src/test/java/org/springframework/ai/testcontainers/service/connection/ollama/OllamaContainerConnectionDetailsFactoryIT.java b/spring-ai-spring-boot-testcontainers/src/test/java/org/springframework/ai/testcontainers/service/connection/ollama/OllamaContainerConnectionDetailsFactoryIT.java index 0cd31f605..4a9b6824d 100644 --- a/spring-ai-spring-boot-testcontainers/src/test/java/org/springframework/ai/testcontainers/service/connection/ollama/OllamaContainerConnectionDetailsFactoryIT.java +++ b/spring-ai-spring-boot-testcontainers/src/test/java/org/springframework/ai/testcontainers/service/connection/ollama/OllamaContainerConnectionDetailsFactoryIT.java @@ -22,6 +22,8 @@ import java.util.List; import org.junit.jupiter.api.BeforeAll; import org.junit.jupiter.api.Disabled; import org.junit.jupiter.api.Test; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import org.testcontainers.junit.jupiter.Container; import org.testcontainers.junit.jupiter.Testcontainers; import org.testcontainers.ollama.OllamaContainer; @@ -34,7 +36,6 @@ import org.springframework.boot.autoconfigure.ImportAutoConfiguration; import org.springframework.boot.autoconfigure.web.client.RestClientAutoConfiguration; import org.springframework.boot.testcontainers.service.connection.ServiceConnection; import org.springframework.context.annotation.Configuration; -import org.springframework.core.log.LogAccessor; import org.springframework.test.context.TestPropertySource; import org.springframework.test.context.junit.jupiter.SpringJUnitConfig; @@ -53,7 +54,7 @@ class OllamaContainerConnectionDetailsFactoryIT { static final String MODEL_NAME = "nomic-embed-text"; - private static final LogAccessor logger = new LogAccessor(OllamaContainerConnectionDetailsFactoryIT.class); + private static final Logger logger = LoggerFactory.getLogger(OllamaContainerConnectionDetailsFactoryIT.class); @Container @ServiceConnection @@ -64,9 +65,9 @@ class OllamaContainerConnectionDetailsFactoryIT { @BeforeAll public static void beforeAll() throws IOException, InterruptedException { - logger.info("Start pulling the '" + MODEL_NAME + "' model. The operation can take several minutes..."); + logger.info("Start pulling the '{}' model. The operation can take several minutes...", MODEL_NAME); ollama.execInContainer("ollama", "pull", MODEL_NAME); - logger.info("Completed pulling the '" + MODEL_NAME + "' model"); + logger.info("Completed pulling the '{}' model", MODEL_NAME); } @Test diff --git a/spring-ai-test/src/main/java/org/springframework/ai/evaluation/BasicEvaluationTest.java b/spring-ai-test/src/main/java/org/springframework/ai/evaluation/BasicEvaluationTest.java index c38bc6ea2..69e50493c 100644 --- a/spring-ai-test/src/main/java/org/springframework/ai/evaluation/BasicEvaluationTest.java +++ b/spring-ai-test/src/main/java/org/springframework/ai/evaluation/BasicEvaluationTest.java @@ -19,6 +19,9 @@ package org.springframework.ai.evaluation; import java.util.List; import java.util.Map; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + import org.springframework.ai.chat.messages.Message; import org.springframework.ai.chat.messages.SystemMessage; import org.springframework.ai.chat.model.ChatModel; @@ -27,14 +30,13 @@ import org.springframework.ai.chat.prompt.PromptTemplate; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.core.io.Resource; -import org.springframework.core.log.LogAccessor; import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.Assertions.fail; public class BasicEvaluationTest { - private static final LogAccessor logger = new LogAccessor(BasicEvaluationTest.class); + private static final Logger logger = LoggerFactory.getLogger(BasicEvaluationTest.class); @Autowired protected ChatModel openAiChatModel; 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 5763728ce..b56b0c1e3 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 @@ -52,9 +52,12 @@ import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.node.ObjectNode; import org.apache.commons.lang3.tuple.ImmutablePair; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import reactor.core.publisher.Flux; import org.springframework.ai.document.Document; +import org.springframework.ai.embedding.BatchingStrategy; import org.springframework.ai.embedding.EmbeddingModel; import org.springframework.ai.embedding.EmbeddingOptionsBuilder; import org.springframework.ai.observation.conventions.VectorStoreProvider; @@ -63,7 +66,6 @@ import org.springframework.ai.vectorstore.SearchRequest; import org.springframework.ai.vectorstore.filter.Filter; import org.springframework.ai.vectorstore.observation.AbstractObservationVectorStore; import org.springframework.ai.vectorstore.observation.VectorStoreObservationContext; -import org.springframework.core.log.LogAccessor; import org.springframework.lang.Nullable; import org.springframework.util.Assert; @@ -77,7 +79,7 @@ import org.springframework.util.Assert; */ public class CosmosDBVectorStore extends AbstractObservationVectorStore implements AutoCloseable { - private static final LogAccessor logger = new LogAccessor(CosmosDBVectorStore.class); + private static final Logger logger = LoggerFactory.getLogger(CosmosDBVectorStore.class); private final CosmosAsyncClient cosmosClient; @@ -251,19 +253,19 @@ public class CosmosDBVectorStore extends AbstractObservationVectorStore implemen // for status code 409 } else { - logger.info("Document added with status: " + statusCode); + logger.info("Document added with status: {}", statusCode); } } else { logger.warn("Received a null response or null status code for a document operation."); } }) - .doOnError(error -> logger.error("Error adding document: " + error.getMessage())) + .doOnError(error -> logger.error("Error adding document: {}", error.getMessage())) .doOnComplete(() -> logger.info("Bulk operation completed successfully.")) .blockLast(); // Block until the last item of the Flux is processed } catch (Exception e) { - logger.error(e, "Exception occurred during bulk add operation: " + e.getMessage()); + logger.error("Exception occurred during bulk add operation: {}", e.getMessage(), e); throw e; // Rethrow the exception after logging } } @@ -279,15 +281,15 @@ public class CosmosDBVectorStore extends AbstractObservationVectorStore implemen // Execute bulk delete operations synchronously by using blockLast() on the // Flux this.container.executeBulkOperations(Flux.fromIterable(itemOperations)) - .doOnNext(response -> logger - .info("Document deleted with status: " + response.getResponse().getStatusCode())) - .doOnError(error -> logger.error("Error deleting document: " + error.getMessage())) + .doOnNext(response -> logger.info("Document deleted with status: {}", + response.getResponse().getStatusCode())) + .doOnError(error -> logger.error("Error deleting document: {}", error.getMessage())) .blockLast(); // This will block until all operations have finished return Optional.of(true); } catch (Exception e) { - logger.error("Exception while deleting documents: " + e.getMessage()); + logger.error("Exception while deleting documents: {}", e.getMessage()); return Optional.of(false); } } @@ -307,7 +309,7 @@ public class CosmosDBVectorStore extends AbstractObservationVectorStore implemen // Convert query into vector embedding float[] embedding = this.embeddingModel.embed(request.getQuery()); - logger.info("similarity threshold: " + request.getSimilarityThreshold()); + logger.info("similarity threshold: {}", request.getSimilarityThreshold()); List embeddingList = IntStream.range(0, embedding.length) .mapToObj(i -> embedding[i]) @@ -343,7 +345,7 @@ public class CosmosDBVectorStore extends AbstractObservationVectorStore implemen CosmosPagedFlux pagedFlux = this.container.queryItems(sqlQuerySpec, options, JsonNode.class); - logger.info("Executing similarity search query: " + query); + logger.info("Executing similarity search query: {}", query); try { // Collect documents from the paged flux List documents = pagedFlux.byPage() @@ -358,7 +360,7 @@ public class CosmosDBVectorStore extends AbstractObservationVectorStore implemen return docs != null ? docs : List.of(); } catch (Exception e) { - logger.error("Error during similarity search: " + e.getMessage()); + logger.error("Error during similarity search: {}", e.getMessage()); return List.of(); } } diff --git a/vector-stores/spring-ai-azure-store/src/main/java/org/springframework/ai/vectorstore/azure/AzureVectorStore.java b/vector-stores/spring-ai-azure-store/src/main/java/org/springframework/ai/vectorstore/azure/AzureVectorStore.java index eff32d5db..867bbff86 100644 --- a/vector-stores/spring-ai-azure-store/src/main/java/org/springframework/ai/vectorstore/azure/AzureVectorStore.java +++ b/vector-stores/spring-ai-azure-store/src/main/java/org/springframework/ai/vectorstore/azure/AzureVectorStore.java @@ -42,7 +42,8 @@ import com.azure.search.documents.models.IndexingResult; import com.azure.search.documents.models.SearchOptions; import com.azure.search.documents.models.VectorSearchOptions; import com.azure.search.documents.models.VectorizedQuery; -import org.apache.commons.logging.LogFactory; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import org.springframework.ai.document.Document; import org.springframework.ai.document.DocumentMetadata; @@ -57,7 +58,6 @@ import org.springframework.ai.vectorstore.filter.FilterExpressionConverter; import org.springframework.ai.vectorstore.observation.AbstractObservationVectorStore; import org.springframework.ai.vectorstore.observation.VectorStoreObservationContext; import org.springframework.beans.factory.InitializingBean; -import org.springframework.core.log.LogAccessor; import org.springframework.lang.Nullable; import org.springframework.util.Assert; import org.springframework.util.CollectionUtils; @@ -80,7 +80,7 @@ public class AzureVectorStore extends AbstractObservationVectorStore implements public static final String DEFAULT_INDEX_NAME = "spring_ai_azure_vector_store"; - private static final LogAccessor logger = new LogAccessor(LogFactory.getLog(AzureVectorStore.class)); + private static final Logger logger = LoggerFactory.getLogger(AzureVectorStore.class); private static final String SPRING_AI_VECTOR_CONFIG = "spring-ai-vector-config"; diff --git a/vector-stores/spring-ai-cassandra-store/src/main/java/org/springframework/ai/cassandra/SchemaUtil.java b/vector-stores/spring-ai-cassandra-store/src/main/java/org/springframework/ai/cassandra/SchemaUtil.java index 694674f7b..ebaf90de2 100644 --- a/vector-stores/spring-ai-cassandra-store/src/main/java/org/springframework/ai/cassandra/SchemaUtil.java +++ b/vector-stores/spring-ai-cassandra-store/src/main/java/org/springframework/ai/cassandra/SchemaUtil.java @@ -21,9 +21,8 @@ import java.time.Duration; import com.datastax.oss.driver.api.core.CqlSession; import com.datastax.oss.driver.api.core.cql.SimpleStatement; import com.datastax.oss.driver.api.querybuilder.SchemaBuilder; -import org.apache.commons.logging.LogFactory; - -import org.springframework.core.log.LogAccessor; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; /** * Utility class for working with Cassandra schema. @@ -33,7 +32,7 @@ import org.springframework.core.log.LogAccessor; */ public final class SchemaUtil { - private static final LogAccessor logger = new LogAccessor(LogFactory.getLog(SchemaUtil.class)); + private static final Logger logger = LoggerFactory.getLogger(SchemaUtil.class); private SchemaUtil() { @@ -62,7 +61,7 @@ public final class SchemaUtil { .withSimpleStrategy(1) .build(); - logger.debug(() -> "Executing " + keyspaceStmt.getQuery()); + logger.debug("Executing {}", keyspaceStmt.getQuery()); session.execute(keyspaceStmt); } } diff --git a/vector-stores/spring-ai-cassandra-store/src/main/java/org/springframework/ai/chat/memory/cassandra/CassandraChatMemoryConfig.java b/vector-stores/spring-ai-cassandra-store/src/main/java/org/springframework/ai/chat/memory/cassandra/CassandraChatMemoryConfig.java index a95d1796f..fa62afe59 100644 --- a/vector-stores/spring-ai-cassandra-store/src/main/java/org/springframework/ai/chat/memory/cassandra/CassandraChatMemoryConfig.java +++ b/vector-stores/spring-ai-cassandra-store/src/main/java/org/springframework/ai/chat/memory/cassandra/CassandraChatMemoryConfig.java @@ -40,10 +40,10 @@ import com.datastax.oss.driver.api.querybuilder.schema.CreateTableStart; import com.datastax.oss.driver.api.querybuilder.schema.CreateTableWithOptions; import com.datastax.oss.driver.shaded.guava.common.annotations.VisibleForTesting; import com.datastax.oss.driver.shaded.guava.common.base.Preconditions; -import org.apache.commons.logging.LogFactory; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import org.springframework.ai.cassandra.SchemaUtil; -import org.springframework.core.log.LogAccessor; /** * Configuration for the Cassandra Chat Memory store. @@ -67,7 +67,7 @@ public final class CassandraChatMemoryConfig { public static final String DEFAULT_USER_COLUMN_NAME = "user"; - private static final LogAccessor logger = new LogAccessor(LogFactory.getLog(CassandraChatMemoryConfig.class)); + private static final Logger logger = LoggerFactory.getLogger(CassandraChatMemoryConfig.class); final CqlSession session; @@ -193,7 +193,7 @@ public final class CassandraChatMemoryConfig { alterTable = alterTable.addColumn(this.userColumn, DataTypes.TEXT); } SimpleStatement stmt = ((AlterTableAddColumnEnd) alterTable).build(); - logger.debug(() -> "Executing " + stmt.getQuery()); + logger.debug("Executing {}", stmt.getQuery()); this.session.execute(stmt); } } diff --git a/vector-stores/spring-ai-cassandra-store/src/main/java/org/springframework/ai/vectorstore/cassandra/CassandraVectorStore.java b/vector-stores/spring-ai-cassandra-store/src/main/java/org/springframework/ai/vectorstore/cassandra/CassandraVectorStore.java index 6e9b1610c..12d059135 100644 --- a/vector-stores/spring-ai-cassandra-store/src/main/java/org/springframework/ai/vectorstore/cassandra/CassandraVectorStore.java +++ b/vector-stores/spring-ai-cassandra-store/src/main/java/org/springframework/ai/vectorstore/cassandra/CassandraVectorStore.java @@ -61,7 +61,8 @@ import com.datastax.oss.driver.api.querybuilder.schema.CreateTable; import com.datastax.oss.driver.api.querybuilder.schema.CreateTableStart; import com.datastax.oss.driver.shaded.guava.common.annotations.VisibleForTesting; import com.datastax.oss.driver.shaded.guava.common.base.Preconditions; -import org.apache.commons.logging.LogFactory; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import org.springframework.ai.cassandra.SchemaUtil; import org.springframework.ai.document.Document; @@ -78,7 +79,6 @@ import org.springframework.ai.vectorstore.filter.Filter; import org.springframework.ai.vectorstore.filter.FilterExpressionConverter; import org.springframework.ai.vectorstore.observation.AbstractObservationVectorStore; import org.springframework.ai.vectorstore.observation.VectorStoreObservationContext; -import org.springframework.core.log.LogAccessor; import org.springframework.util.Assert; /** @@ -193,7 +193,7 @@ public class CassandraVectorStore extends AbstractObservationVectorStore impleme private static final String QUERY_FORMAT = "select %s,%s,%s%s from %s.%s ? order by %s ann of ? limit ?"; - private static final LogAccessor logger = new LogAccessor(LogFactory.getLog(CassandraVectorStore.class)); + private static final Logger logger = LoggerFactory.getLogger(CassandraVectorStore.class); private static final Map SIMILARITY_TYPE_MAPPING = Map.of( Similarity.COSINE, VectorStoreSimilarityMetric.COSINE, Similarity.EUCLIDEAN, @@ -346,11 +346,11 @@ public class CassandraVectorStore extends AbstractObservationVectorStore impleme throw new IllegalStateException("Failed to delete some documents"); } - logger.debug(() -> "Deleted " + idsToDelete.size() + " documents matching filter expression"); + logger.debug("Deleted {} documents matching filter expression", idsToDelete.size()); } } catch (Exception e) { - logger.error(e, () -> "Failed to delete documents by filter"); + logger.error("Failed to delete documents by filter", e); throw new IllegalStateException("Failed to delete documents by filter", e); } } @@ -371,7 +371,7 @@ public class CassandraVectorStore extends AbstractObservationVectorStore impleme String query = String.format(this.similarityStmt, cqlVector, whereClause, cqlVector, request.getTopK()); List documents = new ArrayList<>(); - logger.trace(() -> "Executing " + query); + logger.trace("Executing {}", query); SimpleStatement s = SimpleStatement.newInstance(query).setExecutionProfileName(DRIVER_PROFILE_SEARCH); for (Row row : this.session.execute(s)) { @@ -483,8 +483,7 @@ public class CassandraVectorStore extends AbstractObservationVectorStore impleme extraSelectFields.toString(), this.schema.keyspace(), this.schema.table(), this.schema.embedding()); query = query.replace("?", "%s"); - String finalQuery = query; - logger.debug("preparing " + finalQuery); + logger.debug("preparing {}", query); return query; } @@ -594,7 +593,7 @@ public class CassandraVectorStore extends AbstractObservationVectorStore impleme .andColumn(this.schema.embedding) .build(); - logger.debug(() -> "Executing " + indexStmt.getQuery()); + logger.debug("Executing {}", indexStmt.getQuery()); this.session.execute(indexStmt); Stream @@ -610,7 +609,7 @@ public class CassandraVectorStore extends AbstractObservationVectorStore impleme .andColumn(metadata.name()) .build(); - logger.debug(() -> "Executing " + indexStatement.getQuery()); + logger.debug("Executing {}", indexStatement.getQuery()); this.session.execute(indexStatement); }); } @@ -648,7 +647,7 @@ public class CassandraVectorStore extends AbstractObservationVectorStore impleme .append(" vector)"); - logger.debug(() -> "Executing " + tableStmt); + logger.debug("Executing {}", tableStmt.toString()); this.session.execute(tableStmt.toString()); } } @@ -701,12 +700,12 @@ public class CassandraVectorStore extends AbstractObservationVectorStore impleme .append(vectorDimension) .append(">)"); - logger.debug(() -> "Executing " + alterTableStmt.toString()); + logger.debug("Executing {}", alterTableStmt.toString()); this.session.execute(alterTableStmt.toString()); } else { SimpleStatement stmt = ((AlterTableAddColumnEnd) alterTable).build(); - logger.debug("Executing " + stmt.getQuery()); + logger.debug("Executing {}", stmt.getQuery()); this.session.execute(stmt); } } diff --git a/vector-stores/spring-ai-cassandra-store/src/test/java/org/springframework/ai/vectorstore/cassandra/CassandraRichSchemaVectorStoreIT.java b/vector-stores/spring-ai-cassandra-store/src/test/java/org/springframework/ai/vectorstore/cassandra/CassandraRichSchemaVectorStoreIT.java index dc5562129..e85a844c0 100644 --- a/vector-stores/spring-ai-cassandra-store/src/test/java/org/springframework/ai/vectorstore/cassandra/CassandraRichSchemaVectorStoreIT.java +++ b/vector-stores/spring-ai-cassandra-store/src/test/java/org/springframework/ai/vectorstore/cassandra/CassandraRichSchemaVectorStoreIT.java @@ -33,9 +33,10 @@ import com.datastax.oss.driver.api.core.CqlSessionBuilder; import com.datastax.oss.driver.api.core.servererrors.InvalidQueryException; import com.datastax.oss.driver.api.core.servererrors.SyntaxError; import com.datastax.oss.driver.api.core.type.DataTypes; -import org.apache.commons.logging.LogFactory; import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.Test; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import org.testcontainers.containers.CassandraContainer; import org.testcontainers.junit.jupiter.Container; import org.testcontainers.junit.jupiter.Testcontainers; @@ -55,7 +56,6 @@ import org.springframework.boot.test.context.runner.ApplicationContextRunner; import org.springframework.context.ApplicationContext; import org.springframework.context.annotation.Bean; import org.springframework.core.io.DefaultResourceLoader; -import org.springframework.core.log.LogAccessor; import static org.assertj.core.api.Assertions.assertThat; @@ -69,8 +69,7 @@ import static org.assertj.core.api.Assertions.assertThat; @Testcontainers class CassandraRichSchemaVectorStoreIT { - private static final LogAccessor logger = new LogAccessor( - LogFactory.getLog(CassandraRichSchemaVectorStoreIT.class)); + private static final Logger logger = LoggerFactory.getLogger(CassandraRichSchemaVectorStoreIT.class); private static final List documents = List.of( @@ -283,7 +282,7 @@ class CassandraRichSchemaVectorStoreIT { } CompletableFuture.allOf(futures).join(); long time = System.nanoTime() - start; - logger.info(() -> "add+search took an average of {} ms" + Duration.ofNanos(time / runs).toMillis()); + logger.info("add+search took an average of {} ms", Duration.ofNanos(time / runs).toMillis()); } } }); @@ -601,7 +600,7 @@ class CassandraRichSchemaVectorStoreIT { } private void executeCqlFile(ApplicationContext context, String filename) throws IOException { - logger.info(() -> "executing " + filename); + logger.info("executing {}", filename); CqlSession session = context.getBean(CqlSession.class); diff --git a/vector-stores/spring-ai-chroma-store/src/main/java/org/springframework/ai/chroma/vectorstore/ChromaVectorStore.java b/vector-stores/spring-ai-chroma-store/src/main/java/org/springframework/ai/chroma/vectorstore/ChromaVectorStore.java index ca5ace322..551847443 100644 --- a/vector-stores/spring-ai-chroma-store/src/main/java/org/springframework/ai/chroma/vectorstore/ChromaVectorStore.java +++ b/vector-stores/spring-ai-chroma-store/src/main/java/org/springframework/ai/chroma/vectorstore/ChromaVectorStore.java @@ -25,6 +25,8 @@ import java.util.Optional; import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.json.JsonMapper; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import org.springframework.ai.chroma.vectorstore.ChromaApi.AddEmbeddingsRequest; import org.springframework.ai.chroma.vectorstore.ChromaApi.DeleteEmbeddingsRequest; @@ -43,7 +45,6 @@ import org.springframework.ai.vectorstore.filter.FilterExpressionConverter; import org.springframework.ai.vectorstore.observation.AbstractObservationVectorStore; import org.springframework.ai.vectorstore.observation.VectorStoreObservationContext; import org.springframework.beans.factory.InitializingBean; -import org.springframework.core.log.LogAccessor; import org.springframework.lang.NonNull; import org.springframework.lang.Nullable; import org.springframework.util.Assert; @@ -81,7 +82,7 @@ public class ChromaVectorStore extends AbstractObservationVectorStore implements private boolean initialized = false; - private static final LogAccessor logger = new LogAccessor(ChromaVectorStore.class); + private static final Logger logger = LoggerFactory.getLogger(ChromaVectorStore.class); /** * @param builder {@link VectorStore.Builder} for chroma vector store @@ -179,7 +180,7 @@ public class ChromaVectorStore extends AbstractObservationVectorStore implements this.chromaApi.deleteEmbeddings(this.collectionId, deleteRequest); } catch (Exception e) { - logger.error(e, "Failed to delete documents by filter: " + e.getMessage()); + logger.error("Failed to delete documents by filter: {}", e.getMessage(), e); throw new IllegalStateException("Failed to delete documents by filter", e); } } diff --git a/vector-stores/spring-ai-elasticsearch-store/src/main/java/org/springframework/ai/vectorstore/elasticsearch/ElasticsearchVectorStore.java b/vector-stores/spring-ai-elasticsearch-store/src/main/java/org/springframework/ai/vectorstore/elasticsearch/ElasticsearchVectorStore.java index 71958f72b..377ce78dc 100644 --- a/vector-stores/spring-ai-elasticsearch-store/src/main/java/org/springframework/ai/vectorstore/elasticsearch/ElasticsearchVectorStore.java +++ b/vector-stores/spring-ai-elasticsearch-store/src/main/java/org/springframework/ai/vectorstore/elasticsearch/ElasticsearchVectorStore.java @@ -35,13 +35,16 @@ import co.elastic.clients.transport.Version; import co.elastic.clients.transport.rest_client.RestClientTransport; import com.fasterxml.jackson.databind.DeserializationFeature; import com.fasterxml.jackson.databind.ObjectMapper; -import org.apache.commons.logging.LogFactory; import org.elasticsearch.client.RestClient; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import org.springframework.ai.document.Document; import org.springframework.ai.document.DocumentMetadata; +import org.springframework.ai.embedding.BatchingStrategy; import org.springframework.ai.embedding.EmbeddingModel; import org.springframework.ai.embedding.EmbeddingOptionsBuilder; +import org.springframework.ai.embedding.TokenCountBatchingStrategy; import org.springframework.ai.model.EmbeddingUtils; import org.springframework.ai.observation.conventions.VectorStoreProvider; import org.springframework.ai.observation.conventions.VectorStoreSimilarityMetric; @@ -52,7 +55,6 @@ import org.springframework.ai.vectorstore.filter.FilterExpressionConverter; import org.springframework.ai.vectorstore.observation.AbstractObservationVectorStore; import org.springframework.ai.vectorstore.observation.VectorStoreObservationContext; import org.springframework.beans.factory.InitializingBean; -import org.springframework.core.log.LogAccessor; import org.springframework.util.Assert; /** @@ -147,7 +149,7 @@ import org.springframework.util.Assert; */ public class ElasticsearchVectorStore extends AbstractObservationVectorStore implements InitializingBean { - private static final LogAccessor logger = new LogAccessor(LogFactory.getLog(ElasticsearchVectorStore.class)); + private static final Logger logger = LoggerFactory.getLogger(ElasticsearchVectorStore.class); private static final Map SIMILARITY_TYPE_MAPPING = Map.of( SimilarityFunction.cosine, VectorStoreSimilarityMetric.COSINE, SimilarityFunction.l2_norm, diff --git a/vector-stores/spring-ai-gemfire-store/src/main/java/org/springframework/ai/vectorstore/gemfire/GemFireVectorStore.java b/vector-stores/spring-ai-gemfire-store/src/main/java/org/springframework/ai/vectorstore/gemfire/GemFireVectorStore.java index 4266827e3..37fc93833 100644 --- a/vector-stores/spring-ai-gemfire-store/src/main/java/org/springframework/ai/vectorstore/gemfire/GemFireVectorStore.java +++ b/vector-stores/spring-ai-gemfire-store/src/main/java/org/springframework/ai/vectorstore/gemfire/GemFireVectorStore.java @@ -27,12 +27,15 @@ import com.fasterxml.jackson.annotation.JsonProperty; import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.json.JsonMapper; -import org.apache.commons.logging.LogFactory; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import org.springframework.ai.document.Document; import org.springframework.ai.document.DocumentMetadata; +import org.springframework.ai.embedding.BatchingStrategy; import org.springframework.ai.embedding.EmbeddingModel; import org.springframework.ai.embedding.EmbeddingOptionsBuilder; +import org.springframework.ai.embedding.TokenCountBatchingStrategy; import org.springframework.ai.observation.conventions.VectorStoreProvider; import org.springframework.ai.util.JacksonUtils; import org.springframework.ai.vectorstore.AbstractVectorStoreBuilder; @@ -40,7 +43,6 @@ import org.springframework.ai.vectorstore.SearchRequest; import org.springframework.ai.vectorstore.observation.AbstractObservationVectorStore; import org.springframework.ai.vectorstore.observation.VectorStoreObservationContext; import org.springframework.beans.factory.InitializingBean; -import org.springframework.core.log.LogAccessor; import org.springframework.http.HttpMethod; import org.springframework.http.MediaType; import org.springframework.lang.Nullable; @@ -63,7 +65,7 @@ import org.springframework.web.util.UriComponentsBuilder; */ public class GemFireVectorStore extends AbstractObservationVectorStore implements InitializingBean { - private static final LogAccessor logger = new LogAccessor(LogFactory.getLog(GemFireVectorStore.class)); + private static final Logger logger = LoggerFactory.getLogger(GemFireVectorStore.class); private static final String DEFAULT_URI = "http{ssl}://{host}:{port}/gemfire-vectordb/v1/indexes"; @@ -239,7 +241,7 @@ public class GemFireVectorStore extends AbstractObservationVectorStore implement .block(); } catch (Exception e) { - logger.warn(e, "Error removing embedding: " + e.getMessage()); + logger.warn("Error removing embedding: {}", e.getMessage(), e); return Optional.of(false); } return Optional.of(true); diff --git a/vector-stores/spring-ai-hanadb-store/src/main/java/org/springframework/ai/vectorstore/hanadb/HanaCloudVectorStore.java b/vector-stores/spring-ai-hanadb-store/src/main/java/org/springframework/ai/vectorstore/hanadb/HanaCloudVectorStore.java index 3821dca98..e5722ad6a 100644 --- a/vector-stores/spring-ai-hanadb-store/src/main/java/org/springframework/ai/vectorstore/hanadb/HanaCloudVectorStore.java +++ b/vector-stores/spring-ai-hanadb-store/src/main/java/org/springframework/ai/vectorstore/hanadb/HanaCloudVectorStore.java @@ -24,7 +24,8 @@ import java.util.stream.Collectors; import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.json.JsonMapper; -import org.apache.commons.logging.LogFactory; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import org.springframework.ai.document.Document; import org.springframework.ai.embedding.EmbeddingModel; @@ -36,7 +37,6 @@ import org.springframework.ai.vectorstore.AbstractVectorStoreBuilder; import org.springframework.ai.vectorstore.SearchRequest; import org.springframework.ai.vectorstore.observation.AbstractObservationVectorStore; import org.springframework.ai.vectorstore.observation.VectorStoreObservationContext; -import org.springframework.core.log.LogAccessor; import org.springframework.lang.Nullable; import org.springframework.util.Assert; @@ -77,7 +77,7 @@ import org.springframework.util.Assert; */ public class HanaCloudVectorStore extends AbstractObservationVectorStore { - private static final LogAccessor logger = new LogAccessor(LogFactory.getLog(HanaCloudVectorStore.class)); + private static final Logger logger = LoggerFactory.getLogger(HanaCloudVectorStore.class); private final HanaVectorRepository repository; @@ -116,25 +116,25 @@ public class HanaCloudVectorStore extends AbstractObservationVectorStore { public void doAdd(List documents) { int count = 1; for (Document document : documents) { - logger.info("[" + count++ + "/" + documents.size() + "] Calling EmbeddingModel for document id = " - + document.getId()); + logger.info("[{}/{}] Calling EmbeddingModel for document id = {}", count++, documents.size(), + document.getId()); String content = document.getText().replaceAll("\\s+", " "); String embedding = getEmbedding(document); this.repository.save(this.tableName, document.getId(), embedding, content); } - logger.info("Embeddings saved in HanaCloudVectorStore for " + (count - 1) + " documents"); + logger.info("Embeddings saved in HanaCloudVectorStore for {} documents", count - 1); } @Override public Optional doDelete(List idList) { int deleteCount = this.repository.deleteEmbeddingsById(this.tableName, idList); - logger.info(deleteCount + " embeddings deleted"); + logger.info("{} embeddings deleted", deleteCount); return Optional.of(deleteCount == idList.size()); } public int purgeEmbeddings() { int deleteCount = this.repository.deleteAllEmbeddings(this.tableName); - logger.info(deleteCount + " embeddings deleted"); + logger.info("{} embeddings deleted", deleteCount); return deleteCount; } @@ -153,8 +153,8 @@ public class HanaCloudVectorStore extends AbstractObservationVectorStore { String queryEmbedding = getEmbedding(request); List searchResult = this.repository.cosineSimilaritySearch(this.tableName, request.getTopK(), queryEmbedding); - logger.info("Hana cosine-similarity for query=" + request.getQuery() + ", with topK=" + request.getTopK() - + " returned " + searchResult.size() + " results"); + logger.info("Hana cosine-similarity for query={}, with topK={} returned {} results", request.getQuery(), + request.getTopK(), searchResult.size()); return searchResult.stream().map(c -> { try { diff --git a/vector-stores/spring-ai-hanadb-store/src/test/java/org/springframework/ai/vectorstore/hanadb/CricketWorldCupHanaController.java b/vector-stores/spring-ai-hanadb-store/src/test/java/org/springframework/ai/vectorstore/hanadb/CricketWorldCupHanaController.java index de5a396de..e3745879a 100644 --- a/vector-stores/spring-ai-hanadb-store/src/test/java/org/springframework/ai/vectorstore/hanadb/CricketWorldCupHanaController.java +++ b/vector-stores/spring-ai-hanadb-store/src/test/java/org/springframework/ai/vectorstore/hanadb/CricketWorldCupHanaController.java @@ -23,7 +23,8 @@ import java.util.function.Function; import java.util.function.Supplier; import java.util.stream.Collectors; -import org.apache.commons.logging.LogFactory; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import org.springframework.ai.chat.messages.UserMessage; import org.springframework.ai.chat.model.ChatModel; @@ -35,7 +36,6 @@ import org.springframework.ai.transformer.splitter.TokenTextSplitter; import org.springframework.ai.vectorstore.VectorStore; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.core.io.Resource; -import org.springframework.core.log.LogAccessor; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PostMapping; @@ -50,7 +50,7 @@ import org.springframework.web.multipart.MultipartFile; @RestController public class CricketWorldCupHanaController { - private static final LogAccessor logger = new LogAccessor(LogFactory.getLog(CricketWorldCupHanaController.class)); + private static final Logger logger = LoggerFactory.getLogger(CricketWorldCupHanaController.class); private final VectorStore hanaCloudVectorStore; @@ -65,7 +65,7 @@ public class CricketWorldCupHanaController { @PostMapping("/ai/hana-vector-store/cricket-world-cup/purge-embeddings") public ResponseEntity purgeEmbeddings() { int deleteCount = ((HanaCloudVectorStore) this.hanaCloudVectorStore).purgeEmbeddings(); - logger.info(deleteCount + " embeddings purged from CRICKET_WORLD_CUP table in Hana DB"); + logger.info("{} embeddings purged from CRICKET_WORLD_CUP table in Hana DB", deleteCount); return ResponseEntity.ok() .body(String.format("%d embeddings purged from CRICKET_WORLD_CUP table in Hana DB", deleteCount)); } @@ -76,7 +76,7 @@ public class CricketWorldCupHanaController { Supplier> reader = new PagePdfDocumentReader(pdf); Function, List> splitter = new TokenTextSplitter(); List documents = splitter.apply(reader.get()); - logger.info(documents.size() + " documents created from pdf file: " + pdf.getFilename()); + logger.info("{} documents created from pdf file: {}", documents.size(), pdf.getFilename()); this.hanaCloudVectorStore.accept(documents); return ResponseEntity.ok() .body(String.format("%d documents created from pdf file: %s", documents.size(), pdf.getFilename())); @@ -92,7 +92,7 @@ public class CricketWorldCupHanaController { var userMessage = new UserMessage(message); Prompt prompt = new Prompt(List.of(similarDocsMessage, userMessage)); String generation = this.chatModel.call(prompt).getResult().getOutput().getText(); - logger.info("Generation: " + generation); + logger.info("Generation: {}", generation); return Map.of("generation", generation); } diff --git a/vector-stores/spring-ai-hanadb-store/src/test/java/org/springframework/ai/vectorstore/hanadb/HanaCloudVectorStoreIT.java b/vector-stores/spring-ai-hanadb-store/src/test/java/org/springframework/ai/vectorstore/hanadb/HanaCloudVectorStoreIT.java index e913c778d..8f0f1d488 100644 --- a/vector-stores/spring-ai-hanadb-store/src/test/java/org/springframework/ai/vectorstore/hanadb/HanaCloudVectorStoreIT.java +++ b/vector-stores/spring-ai-hanadb-store/src/test/java/org/springframework/ai/vectorstore/hanadb/HanaCloudVectorStoreIT.java @@ -22,10 +22,11 @@ import java.util.function.Supplier; import javax.sql.DataSource; -import org.apache.commons.logging.LogFactory; import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.condition.EnabledIfEnvironmentVariable; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import org.springframework.ai.document.Document; import org.springframework.ai.embedding.EmbeddingModel; @@ -38,7 +39,6 @@ import org.springframework.boot.SpringBootConfiguration; import org.springframework.boot.autoconfigure.EnableAutoConfiguration; import org.springframework.boot.test.context.runner.ApplicationContextRunner; import org.springframework.context.annotation.Bean; -import org.springframework.core.log.LogAccessor; import org.springframework.jdbc.datasource.DriverManagerDataSource; import org.springframework.orm.jpa.JpaVendorAdapter; import org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean; @@ -54,7 +54,7 @@ import org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter; @EnabledIfEnvironmentVariable(named = "HANA_DATASOURCE_PASSWORD", matches = ".+") public class HanaCloudVectorStoreIT { - private static final LogAccessor logger = new LogAccessor(LogFactory.getLog(HanaCloudVectorStoreIT.class)); + private static final Logger logger = LoggerFactory.getLogger(HanaCloudVectorStoreIT.class); private final ApplicationContextRunner contextRunner = new ApplicationContextRunner() .withUserConfiguration(HanaTestApplication.class); @@ -65,7 +65,7 @@ public class HanaCloudVectorStoreIT { VectorStore vectorStore = context.getBean(HanaCloudVectorStore.class); int deleteCount = ((HanaCloudVectorStore) vectorStore).purgeEmbeddings(); - logger.info("Purged all embeddings: count=" + deleteCount); + logger.info("Purged all embeddings: count={}", deleteCount); Supplier> reader = new PagePdfDocumentReader("classpath:Cricket_World_Cup.pdf"); Function, List> splitter = new TokenTextSplitter(); diff --git a/vector-stores/spring-ai-mariadb-store/src/main/java/org/springframework/ai/vectorstore/mariadb/MariaDBSchemaValidator.java b/vector-stores/spring-ai-mariadb-store/src/main/java/org/springframework/ai/vectorstore/mariadb/MariaDBSchemaValidator.java index b2391205e..f3be68f08 100644 --- a/vector-stores/spring-ai-mariadb-store/src/main/java/org/springframework/ai/vectorstore/mariadb/MariaDBSchemaValidator.java +++ b/vector-stores/spring-ai-mariadb-store/src/main/java/org/springframework/ai/vectorstore/mariadb/MariaDBSchemaValidator.java @@ -22,10 +22,10 @@ import java.util.List; import java.util.Map; import java.util.regex.Pattern; -import org.apache.commons.logging.LogFactory; import org.mariadb.jdbc.Driver; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; -import org.springframework.core.log.LogAccessor; import org.springframework.dao.DataAccessException; import org.springframework.jdbc.core.JdbcTemplate; @@ -35,7 +35,7 @@ import org.springframework.jdbc.core.JdbcTemplate; */ public class MariaDBSchemaValidator { - private static final LogAccessor logger = new LogAccessor(LogFactory.getLog(MariaDBSchemaValidator.class)); + private static final Logger logger = LoggerFactory.getLogger(MariaDBSchemaValidator.class); private final JdbcTemplate jdbcTemplate; @@ -79,7 +79,7 @@ public class MariaDBSchemaValidator { } try { - logger.info(() -> "Validating MariaDBStore schema for table: " + tableName + " in schema: " + schemaName); + logger.info("Validating MariaDBStore schema for table: {} in schema: {}", tableName, schemaName); List expectedColumns = new ArrayList<>(); expectedColumns.add(idFieldName); diff --git a/vector-stores/spring-ai-mariadb-store/src/main/java/org/springframework/ai/vectorstore/mariadb/MariaDBVectorStore.java b/vector-stores/spring-ai-mariadb-store/src/main/java/org/springframework/ai/vectorstore/mariadb/MariaDBVectorStore.java index c04e3dcd8..145f48773 100644 --- a/vector-stores/spring-ai-mariadb-store/src/main/java/org/springframework/ai/vectorstore/mariadb/MariaDBVectorStore.java +++ b/vector-stores/spring-ai-mariadb-store/src/main/java/org/springframework/ai/vectorstore/mariadb/MariaDBVectorStore.java @@ -28,11 +28,14 @@ import java.util.Optional; import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.json.JsonMapper; -import org.apache.commons.logging.LogFactory; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import org.springframework.ai.document.Document; +import org.springframework.ai.embedding.BatchingStrategy; import org.springframework.ai.embedding.EmbeddingModel; import org.springframework.ai.embedding.EmbeddingOptionsBuilder; +import org.springframework.ai.embedding.TokenCountBatchingStrategy; import org.springframework.ai.observation.conventions.VectorStoreProvider; import org.springframework.ai.observation.conventions.VectorStoreSimilarityMetric; import org.springframework.ai.util.JacksonUtils; @@ -43,7 +46,6 @@ import org.springframework.ai.vectorstore.filter.FilterExpressionConverter; import org.springframework.ai.vectorstore.observation.AbstractObservationVectorStore; import org.springframework.ai.vectorstore.observation.VectorStoreObservationContext; import org.springframework.beans.factory.InitializingBean; -import org.springframework.core.log.LogAccessor; import org.springframework.jdbc.core.BatchPreparedStatementSetter; import org.springframework.jdbc.core.JdbcTemplate; import org.springframework.jdbc.core.RowMapper; @@ -147,7 +149,7 @@ public class MariaDBVectorStore extends AbstractObservationVectorStore implement public static final int MAX_DOCUMENT_BATCH_SIZE = 10_000; - private static final LogAccessor logger = new LogAccessor(LogFactory.getLog(MariaDBVectorStore.class)); + private static final Logger logger = LoggerFactory.getLogger(MariaDBVectorStore.class); public static final String DEFAULT_TABLE_NAME = "vector_store"; @@ -213,8 +215,8 @@ public class MariaDBVectorStore extends AbstractObservationVectorStore implement this.vectorTableName = builder.vectorTableName.isEmpty() ? DEFAULT_TABLE_NAME : MariaDBSchemaValidator.validateAndEnquoteIdentifier(builder.vectorTableName.trim(), false); - logger.info(() -> "Using the vector table name: " + this.vectorTableName + ". Is empty: " - + builder.vectorTableName.isEmpty()); + logger.info("Using the vector table name: {}. Is empty: {}", this.vectorTableName, + builder.vectorTableName.isEmpty()); this.schemaName = builder.schemaName == null ? null : MariaDBSchemaValidator.validateAndEnquoteIdentifier(builder.schemaName, false); @@ -336,12 +338,12 @@ public class MariaDBVectorStore extends AbstractObservationVectorStore implement String sql = String.format("DELETE FROM %s WHERE %s", getFullyQualifiedTableName(), nativeFilterExpression); - logger.debug("Executing delete with filter: " + sql); + logger.debug("Executing delete with filter: {}", sql); this.jdbcTemplate.update(sql); } catch (Exception e) { - logger.error(e, "Failed to delete documents by filter: " + e.getMessage()); + logger.error("Failed to delete documents by filter: {}", e.getMessage(), e); throw new IllegalStateException("Failed to delete documents by filter", e); } } @@ -378,10 +380,10 @@ public class MariaDBVectorStore extends AbstractObservationVectorStore implement @Override public void afterPropertiesSet() { - logger.info(() -> "Initializing MariaDBVectorStore schema for table: " + this.vectorTableName + " in schema: " - + this.schemaName); + logger.info("Initializing MariaDBVectorStore schema for table: {} in schema: {}", this.vectorTableName, + this.schemaName); - logger.info(() -> "vectorTableValidationsEnabled " + this.schemaValidation); + logger.info("vectorTableValidationsEnabled {}", this.schemaValidation); if (this.schemaValidation) { this.schemaValidator.validateTableSchema(this.schemaName, this.vectorTableName, this.idFieldName, @@ -389,8 +391,7 @@ public class MariaDBVectorStore extends AbstractObservationVectorStore implement } if (!this.initializeSchema) { - logger - .debug(() -> "Skipping the schema initialization for the table: " + this.getFullyQualifiedTableName()); + logger.debug("Skipping the schema initialization for the table: {}", this.getFullyQualifiedTableName()); return; } @@ -437,8 +438,8 @@ public class MariaDBVectorStore extends AbstractObservationVectorStore implement } } catch (Exception e) { - logger.warn(e, () -> "Failed to obtain the embedding dimensions from the embedding model and fall backs to" - + " default:" + OPENAI_EMBEDDING_DIMENSION_SIZE); + logger.warn("Failed to obtain the embedding dimensions from the embedding model and fall backs to" + + " default:" + OPENAI_EMBEDDING_DIMENSION_SIZE, e); } return OPENAI_EMBEDDING_DIMENSION_SIZE; } diff --git a/vector-stores/spring-ai-milvus-store/src/main/java/org/springframework/ai/vectorstore/milvus/MilvusVectorStore.java b/vector-stores/spring-ai-milvus-store/src/main/java/org/springframework/ai/vectorstore/milvus/MilvusVectorStore.java index 8da7c515c..326d7ea1d 100644 --- a/vector-stores/spring-ai-milvus-store/src/main/java/org/springframework/ai/vectorstore/milvus/MilvusVectorStore.java +++ b/vector-stores/spring-ai-milvus-store/src/main/java/org/springframework/ai/vectorstore/milvus/MilvusVectorStore.java @@ -49,12 +49,15 @@ import io.milvus.param.index.DescribeIndexParam; import io.milvus.param.index.DropIndexParam; import io.milvus.response.QueryResultsWrapper.RowRecord; import io.milvus.response.SearchResultsWrapper; -import org.apache.commons.logging.LogFactory; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import org.springframework.ai.document.Document; import org.springframework.ai.document.DocumentMetadata; +import org.springframework.ai.embedding.BatchingStrategy; import org.springframework.ai.embedding.EmbeddingModel; import org.springframework.ai.embedding.EmbeddingOptionsBuilder; +import org.springframework.ai.embedding.TokenCountBatchingStrategy; import org.springframework.ai.model.EmbeddingUtils; import org.springframework.ai.observation.conventions.VectorStoreProvider; import org.springframework.ai.observation.conventions.VectorStoreSimilarityMetric; @@ -66,7 +69,6 @@ import org.springframework.ai.vectorstore.filter.FilterExpressionConverter; import org.springframework.ai.vectorstore.observation.AbstractObservationVectorStore; import org.springframework.ai.vectorstore.observation.VectorStoreObservationContext; import org.springframework.beans.factory.InitializingBean; -import org.springframework.core.log.LogAccessor; import org.springframework.util.Assert; import org.springframework.util.StringUtils; @@ -161,7 +163,7 @@ public class MilvusVectorStore extends AbstractObservationVectorStore implements // Metadata, automatically assigned by Milvus. private static final String DISTANCE_FIELD_NAME = "distance"; - private static final LogAccessor logger = new LogAccessor(LogFactory.getLog(MilvusVectorStore.class)); + private static final Logger logger = LoggerFactory.getLogger(MilvusVectorStore.class); private static final Map SIMILARITY_TYPE_MAPPING = Map.of( MetricType.COSINE, VectorStoreSimilarityMetric.COSINE, MetricType.L2, VectorStoreSimilarityMetric.EUCLIDEAN, @@ -310,10 +312,10 @@ public class MilvusVectorStore extends AbstractObservationVectorStore implements } long deleteCount = status.getData().getDeleteCnt(); - logger.debug("Deleted " + deleteCount + " documents matching filter expression"); + logger.debug("Deleted {} documents matching filter expression", deleteCount); } catch (Exception e) { - logger.error(e, "Failed to delete documents by filter: " + e.getMessage()); + logger.error("Failed to delete documents by filter: {}", e.getMessage(), e); throw new IllegalStateException("Failed to delete documents by filter", e); } } @@ -507,9 +509,8 @@ public class MilvusVectorStore extends AbstractObservationVectorStore implements } } catch (Exception e) { - logger.warn(e, - "Failed to obtain the embedding dimensions from the embedding model and fall backs to default:" - + this.embeddingDimension); + logger.warn("Failed to obtain the embedding dimensions from the embedding model and fall backs to default:" + + this.embeddingDimension, e); } return OPENAI_EMBEDDING_DIMENSION_SIZE; } diff --git a/vector-stores/spring-ai-mongodb-atlas-store/src/main/java/org/springframework/ai/vectorstore/mongodb/atlas/MongoDBAtlasVectorStore.java b/vector-stores/spring-ai-mongodb-atlas-store/src/main/java/org/springframework/ai/vectorstore/mongodb/atlas/MongoDBAtlasVectorStore.java index cea8dafde..1be8edc48 100644 --- a/vector-stores/spring-ai-mongodb-atlas-store/src/main/java/org/springframework/ai/vectorstore/mongodb/atlas/MongoDBAtlasVectorStore.java +++ b/vector-stores/spring-ai-mongodb-atlas-store/src/main/java/org/springframework/ai/vectorstore/mongodb/atlas/MongoDBAtlasVectorStore.java @@ -24,7 +24,8 @@ import java.util.Optional; import com.mongodb.MongoCommandException; import com.mongodb.client.result.DeleteResult; -import org.springframework.core.log.LogAccessor; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import org.springframework.ai.document.Document; import org.springframework.ai.document.DocumentMetadata; @@ -127,7 +128,7 @@ import org.springframework.util.Assert; */ public class MongoDBAtlasVectorStore extends AbstractObservationVectorStore implements InitializingBean { - private static final LogAccessor logger = new LogAccessor(MongoDBAtlasVectorStore.class); + private static final Logger logger = LoggerFactory.getLogger(MongoDBAtlasVectorStore.class); public static final String ID_FIELD_NAME = "_id"; diff --git a/vector-stores/spring-ai-neo4j-store/src/main/java/org/springframework/ai/vectorstore/neo4j/Neo4jVectorStore.java b/vector-stores/spring-ai-neo4j-store/src/main/java/org/springframework/ai/vectorstore/neo4j/Neo4jVectorStore.java index f9146f95a..1caccfbd4 100644 --- a/vector-stores/spring-ai-neo4j-store/src/main/java/org/springframework/ai/vectorstore/neo4j/Neo4jVectorStore.java +++ b/vector-stores/spring-ai-neo4j-store/src/main/java/org/springframework/ai/vectorstore/neo4j/Neo4jVectorStore.java @@ -21,11 +21,12 @@ import java.util.List; import java.util.Map; import java.util.Optional; -import org.apache.commons.logging.LogFactory; import org.neo4j.cypherdsl.support.schema_name.SchemaNames; import org.neo4j.driver.Driver; import org.neo4j.driver.SessionConfig; import org.neo4j.driver.Values; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import org.springframework.ai.document.Document; import org.springframework.ai.document.DocumentMetadata; @@ -40,7 +41,6 @@ import org.springframework.ai.vectorstore.neo4j.filter.Neo4jVectorFilterExpressi import org.springframework.ai.vectorstore.observation.AbstractObservationVectorStore; import org.springframework.ai.vectorstore.observation.VectorStoreObservationContext; import org.springframework.beans.factory.InitializingBean; -import org.springframework.core.log.LogAccessor; import org.springframework.util.Assert; import org.springframework.util.StringUtils; @@ -134,7 +134,7 @@ import org.springframework.util.StringUtils; */ public class Neo4jVectorStore extends AbstractObservationVectorStore implements InitializingBean { - private static final LogAccessor logger = new LogAccessor(LogFactory.getLog(Neo4jVectorStore.class)); + private static final Logger logger = LoggerFactory.getLogger(Neo4jVectorStore.class); public static final int DEFAULT_EMBEDDING_DIMENSION = 1536; @@ -253,10 +253,10 @@ public class Neo4jVectorStore extends AbstractObservationVectorStore implements var summary = session.run(cypher, Map.of("transactionSize", DEFAULT_TRANSACTION_SIZE)).consume(); - logger.debug("Deleted " + summary.counters().nodesDeleted() + " nodes matching filter expression"); + logger.debug("Deleted {} nodes matching filter expression", summary.counters().nodesDeleted()); } catch (Exception e) { - logger.error(e, "Failed to delete nodes by filter: " + e.getMessage()); + logger.error("Failed to delete nodes by filter: {}", e.getMessage(), e); throw new IllegalStateException("Failed to delete nodes by filter", e); } } diff --git a/vector-stores/spring-ai-opensearch-store/src/main/java/org/springframework/ai/vectorstore/opensearch/OpenSearchVectorStore.java b/vector-stores/spring-ai-opensearch-store/src/main/java/org/springframework/ai/vectorstore/opensearch/OpenSearchVectorStore.java index 67ebd4bbc..a9953c93b 100644 --- a/vector-stores/spring-ai-opensearch-store/src/main/java/org/springframework/ai/vectorstore/opensearch/OpenSearchVectorStore.java +++ b/vector-stores/spring-ai-opensearch-store/src/main/java/org/springframework/ai/vectorstore/opensearch/OpenSearchVectorStore.java @@ -24,7 +24,6 @@ import java.util.Objects; import java.util.Optional; import java.util.stream.Collectors; -import org.apache.commons.logging.LogFactory; import org.opensearch.client.json.JsonData; import org.opensearch.client.json.JsonpMapper; import org.opensearch.client.opensearch.OpenSearchClient; @@ -39,6 +38,8 @@ import org.opensearch.client.opensearch.core.search.Hit; import org.opensearch.client.opensearch.indices.CreateIndexRequest; import org.opensearch.client.opensearch.indices.CreateIndexResponse; import org.opensearch.client.transport.endpoints.BooleanResponse; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import org.springframework.ai.document.Document; import org.springframework.ai.document.DocumentMetadata; @@ -53,7 +54,6 @@ import org.springframework.ai.vectorstore.filter.FilterExpressionConverter; import org.springframework.ai.vectorstore.observation.AbstractObservationVectorStore; import org.springframework.ai.vectorstore.observation.VectorStoreObservationContext; import org.springframework.beans.factory.InitializingBean; -import org.springframework.core.log.LogAccessor; import org.springframework.util.Assert; /** @@ -141,7 +141,7 @@ import org.springframework.util.Assert; */ public class OpenSearchVectorStore extends AbstractObservationVectorStore implements InitializingBean { - private static final LogAccessor logger = new LogAccessor(LogFactory.getLog(OpenSearchVectorStore.class)); + private static final Logger logger = LoggerFactory.getLogger(OpenSearchVectorStore.class); public static final String COSINE_SIMILARITY_FUNCTION = "cosinesimil"; @@ -254,7 +254,7 @@ public class OpenSearchVectorStore extends AbstractObservationVectorStore implem } } catch (Exception e) { - logger.error(e, "Failed to delete documents by filter: " + e.getMessage()); + logger.error("Failed to delete documents by filter: {}", e.getMessage()); throw new IllegalStateException("Failed to delete documents by filter", e); } } diff --git a/vector-stores/spring-ai-oracle-store/src/main/java/org/springframework/ai/vectorstore/oracle/OracleVectorStore.java b/vector-stores/spring-ai-oracle-store/src/main/java/org/springframework/ai/vectorstore/oracle/OracleVectorStore.java index 08c8604d9..143eebaaa 100644 --- a/vector-stores/spring-ai-oracle-store/src/main/java/org/springframework/ai/vectorstore/oracle/OracleVectorStore.java +++ b/vector-stores/spring-ai-oracle-store/src/main/java/org/springframework/ai/vectorstore/oracle/OracleVectorStore.java @@ -34,11 +34,15 @@ import oracle.sql.json.OracleJsonFactory; import oracle.sql.json.OracleJsonGenerator; import oracle.sql.json.OracleJsonObject; import oracle.sql.json.OracleJsonValue; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import org.springframework.ai.document.Document; import org.springframework.ai.document.DocumentMetadata; +import org.springframework.ai.embedding.BatchingStrategy; import org.springframework.ai.embedding.EmbeddingModel; import org.springframework.ai.embedding.EmbeddingOptionsBuilder; +import org.springframework.ai.embedding.TokenCountBatchingStrategy; import org.springframework.ai.observation.conventions.VectorStoreProvider; import org.springframework.ai.observation.conventions.VectorStoreSimilarityMetric; import org.springframework.ai.vectorstore.AbstractVectorStoreBuilder; @@ -48,7 +52,6 @@ import org.springframework.ai.vectorstore.filter.FilterExpressionConverter; import org.springframework.ai.vectorstore.observation.AbstractObservationVectorStore; import org.springframework.ai.vectorstore.observation.VectorStoreObservationContext; import org.springframework.beans.factory.InitializingBean; -import org.springframework.core.log.LogAccessor; import org.springframework.jdbc.core.BatchPreparedStatementSetter; import org.springframework.jdbc.core.JdbcTemplate; import org.springframework.jdbc.core.RowMapper; @@ -95,7 +98,7 @@ public class OracleVectorStore extends AbstractObservationVectorStore implements public static final int DEFAULT_SEARCH_ACCURACY = -1; - private static final LogAccessor logger = new LogAccessor(OracleVectorStore.class); + private static final Logger logger = LoggerFactory.getLogger(OracleVectorStore.class); private static final Map SIMILARITY_TYPE_MAPPING = Map .of(OracleVectorStoreDistanceType.COSINE, VectorStoreSimilarityMetric.COSINE, @@ -323,7 +326,7 @@ public class OracleVectorStore extends AbstractObservationVectorStore implements logger.debug("Deleted " + deletedCount + " documents matching filter expression"); } catch (Exception e) { - logger.error(e, "Failed to delete documents by filter: " + e.getMessage()); + logger.error("Failed to delete documents by filter: {}", e.getMessage(), e); throw new IllegalStateException("Failed to delete documents by filter", e); } } diff --git a/vector-stores/spring-ai-pgvector-store/src/main/java/org/springframework/ai/vectorstore/pgvector/PgVectorSchemaValidator.java b/vector-stores/spring-ai-pgvector-store/src/main/java/org/springframework/ai/vectorstore/pgvector/PgVectorSchemaValidator.java index 389eaaa93..f0c595167 100644 --- a/vector-stores/spring-ai-pgvector-store/src/main/java/org/springframework/ai/vectorstore/pgvector/PgVectorSchemaValidator.java +++ b/vector-stores/spring-ai-pgvector-store/src/main/java/org/springframework/ai/vectorstore/pgvector/PgVectorSchemaValidator.java @@ -20,9 +20,9 @@ import java.util.ArrayList; import java.util.List; import java.util.Map; -import org.apache.commons.logging.LogFactory; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; -import org.springframework.core.log.LogAccessor; import org.springframework.dao.DataAccessException; import org.springframework.jdbc.core.JdbcTemplate; @@ -35,7 +35,7 @@ import org.springframework.jdbc.core.JdbcTemplate; */ public class PgVectorSchemaValidator { - private static final LogAccessor logger = new LogAccessor(LogFactory.getLog(PgVectorSchemaValidator.class)); + private static final Logger logger = LoggerFactory.getLogger(PgVectorSchemaValidator.class); private final JdbcTemplate jdbcTemplate; @@ -92,7 +92,7 @@ public class PgVectorSchemaValidator { } try { - logger.info("Validating PGVectorStore schema for table: " + tableName + " in schema: " + schemaName); + logger.info("Validating PGVectorStore schema for table: {} in schema: {}", tableName, schemaName); List expectedColumns = new ArrayList<>(); expectedColumns.add("id"); diff --git a/vector-stores/spring-ai-pgvector-store/src/main/java/org/springframework/ai/vectorstore/pgvector/PgVectorStore.java b/vector-stores/spring-ai-pgvector-store/src/main/java/org/springframework/ai/vectorstore/pgvector/PgVectorStore.java index 6fa057258..d3a460546 100644 --- a/vector-stores/spring-ai-pgvector-store/src/main/java/org/springframework/ai/vectorstore/pgvector/PgVectorStore.java +++ b/vector-stores/spring-ai-pgvector-store/src/main/java/org/springframework/ai/vectorstore/pgvector/PgVectorStore.java @@ -29,13 +29,16 @@ import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.json.JsonMapper; import com.pgvector.PGvector; -import org.apache.commons.logging.LogFactory; import org.postgresql.util.PGobject; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import org.springframework.ai.document.Document; import org.springframework.ai.document.DocumentMetadata; +import org.springframework.ai.embedding.BatchingStrategy; import org.springframework.ai.embedding.EmbeddingModel; import org.springframework.ai.embedding.EmbeddingOptionsBuilder; +import org.springframework.ai.embedding.TokenCountBatchingStrategy; import org.springframework.ai.observation.conventions.VectorStoreProvider; import org.springframework.ai.observation.conventions.VectorStoreSimilarityMetric; import org.springframework.ai.util.JacksonUtils; @@ -47,7 +50,6 @@ import org.springframework.ai.vectorstore.filter.FilterExpressionConverter; import org.springframework.ai.vectorstore.observation.AbstractObservationVectorStore; import org.springframework.ai.vectorstore.observation.VectorStoreObservationContext; import org.springframework.beans.factory.InitializingBean; -import org.springframework.core.log.LogAccessor; import org.springframework.jdbc.core.BatchPreparedStatementSetter; import org.springframework.jdbc.core.JdbcTemplate; import org.springframework.jdbc.core.RowMapper; @@ -169,7 +171,7 @@ public class PgVectorStore extends AbstractObservationVectorStore implements Ini public static final int MAX_DOCUMENT_BATCH_SIZE = 10_000; - private static final LogAccessor logger = new LogAccessor(LogFactory.getLog(PgVectorSchemaValidator.class)); + private static final Logger logger = LoggerFactory.getLogger(PgVectorStore.class); private static Map SIMILARITY_TYPE_MAPPING = Map.of( PgDistanceType.COSINE_DISTANCE, VectorStoreSimilarityMetric.COSINE, PgDistanceType.EUCLIDEAN_DISTANCE, @@ -216,8 +218,8 @@ public class PgVectorStore extends AbstractObservationVectorStore implements Ini String vectorTable = builder.vectorTableName; this.vectorTableName = vectorTable.isEmpty() ? DEFAULT_TABLE_NAME : vectorTable.trim(); - logger.info("Using the vector table name: " + this.vectorTableName + " Is empty: " - + this.vectorTableName.isEmpty()); + logger.info("Using the vector table name: {}. Is empty: {}", this.vectorTableName, + this.vectorTableName.isEmpty()); this.vectorIndexName = this.vectorTableName.equals(DEFAULT_TABLE_NAME) ? DEFAULT_VECTOR_INDEX_NAME : this.vectorTableName + "_index"; @@ -380,17 +382,17 @@ public class PgVectorStore extends AbstractObservationVectorStore implements Ini @Override public void afterPropertiesSet() { - logger.info("Initializing PGVectorStore schema for table: " + this.getVectorTableName() + " in schema: " - + this.getSchemaName()); + logger.info("Initializing PGVectorStore schema for table: {} in schema: {}", this.getVectorTableName(), + this.getSchemaName()); - logger.info("vectorTableValidationsEnabled " + this.schemaValidation); + logger.info("vectorTableValidationsEnabled {}", this.schemaValidation); if (this.schemaValidation) { this.schemaValidator.validateTableSchema(this.getSchemaName(), this.getVectorTableName()); } if (!this.initializeSchema) { - logger.debug("Skipping the schema initialization for the table: " + this.getFullyQualifiedTableName()); + logger.debug("Skipping the schema initialization for the table: {}", this.getFullyQualifiedTableName()); return; } @@ -452,9 +454,8 @@ public class PgVectorStore extends AbstractObservationVectorStore implements Ini } } catch (Exception e) { - logger.warn(e, - "Failed to obtain the embedding dimensions from the embedding model and fall backs to default:" - + OPENAI_EMBEDDING_DIMENSION_SIZE); + logger.warn("Failed to obtain the embedding dimensions from the embedding model and fall backs to default:" + + OPENAI_EMBEDDING_DIMENSION_SIZE, e); } return OPENAI_EMBEDDING_DIMENSION_SIZE; } diff --git a/vector-stores/spring-ai-pinecone-store/src/main/java/org/springframework/ai/vectorstore/pinecone/PineconeVectorStore.java b/vector-stores/spring-ai-pinecone-store/src/main/java/org/springframework/ai/vectorstore/pinecone/PineconeVectorStore.java index 596b4803b..04848383c 100644 --- a/vector-stores/spring-ai-pinecone-store/src/main/java/org/springframework/ai/vectorstore/pinecone/PineconeVectorStore.java +++ b/vector-stores/spring-ai-pinecone-store/src/main/java/org/springframework/ai/vectorstore/pinecone/PineconeVectorStore.java @@ -17,7 +17,6 @@ package org.springframework.ai.vectorstore.pinecone; import java.time.Duration; -import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.Optional; @@ -33,19 +32,17 @@ import io.pinecone.PineconeClientConfig; import io.pinecone.PineconeConnection; import io.pinecone.PineconeConnectionConfig; import io.pinecone.proto.DeleteRequest; -import io.pinecone.proto.DeleteResponse; import io.pinecone.proto.QueryRequest; import io.pinecone.proto.QueryResponse; import io.pinecone.proto.UpsertRequest; import io.pinecone.proto.Vector; -import org.apache.commons.logging.LogFactory; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import org.springframework.ai.document.Document; import org.springframework.ai.document.DocumentMetadata; -import org.springframework.ai.embedding.BatchingStrategy; import org.springframework.ai.embedding.EmbeddingModel; import org.springframework.ai.embedding.EmbeddingOptionsBuilder; -import org.springframework.ai.embedding.TokenCountBatchingStrategy; import org.springframework.ai.model.EmbeddingUtils; import org.springframework.ai.observation.conventions.VectorStoreProvider; import org.springframework.ai.vectorstore.AbstractVectorStoreBuilder; @@ -55,7 +52,6 @@ import org.springframework.ai.vectorstore.filter.FilterExpressionConverter; import org.springframework.ai.vectorstore.filter.converter.PineconeFilterExpressionConverter; import org.springframework.ai.vectorstore.observation.AbstractObservationVectorStore; import org.springframework.ai.vectorstore.observation.VectorStoreObservationContext; -import org.springframework.core.log.LogAccessor; import org.springframework.lang.Nullable; import org.springframework.util.Assert; import org.springframework.util.StringUtils; @@ -88,7 +84,7 @@ public class PineconeVectorStore extends AbstractObservationVectorStore { private final ObjectMapper objectMapper; - private static final LogAccessor logger = new LogAccessor(LogFactory.getLog(PineconeVectorStore.class)); + private static final Logger logger = LoggerFactory.getLogger(PineconeVectorStore.class); /** * Creates a new PineconeVectorStore using the builder pattern. @@ -320,11 +316,11 @@ public class PineconeVectorStore extends AbstractObservationVectorStore { throw new IllegalStateException("Failed to delete some documents"); } - logger.debug(() -> "Deleted " + idsToDelete.size() + " documents matching filter expression"); + logger.debug("Deleted {} documents matching filter expression", idsToDelete.size()); } } catch (Exception e) { - logger.error(e, () -> "Failed to delete documents by filter"); + logger.error("Failed to delete documents by filter", e); throw new IllegalStateException("Failed to delete documents by filter", e); } } diff --git a/vector-stores/spring-ai-qdrant-store/src/main/java/org/springframework/ai/vectorstore/qdrant/QdrantVectorStore.java b/vector-stores/spring-ai-qdrant-store/src/main/java/org/springframework/ai/vectorstore/qdrant/QdrantVectorStore.java index 865ce3253..4bff2ce9c 100644 --- a/vector-stores/spring-ai-qdrant-store/src/main/java/org/springframework/ai/vectorstore/qdrant/QdrantVectorStore.java +++ b/vector-stores/spring-ai-qdrant-store/src/main/java/org/springframework/ai/vectorstore/qdrant/QdrantVectorStore.java @@ -32,7 +32,8 @@ import io.qdrant.client.grpc.Points.PointStruct; import io.qdrant.client.grpc.Points.ScoredPoint; import io.qdrant.client.grpc.Points.SearchPoints; import io.qdrant.client.grpc.Points.UpdateStatus; -import org.apache.commons.logging.LogFactory; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import org.springframework.ai.document.Document; import org.springframework.ai.document.DocumentMetadata; @@ -45,7 +46,6 @@ import org.springframework.ai.vectorstore.SearchRequest; import org.springframework.ai.vectorstore.observation.AbstractObservationVectorStore; import org.springframework.ai.vectorstore.observation.VectorStoreObservationContext; import org.springframework.beans.factory.InitializingBean; -import org.springframework.core.log.LogAccessor; import org.springframework.util.Assert; /** @@ -126,7 +126,7 @@ import org.springframework.util.Assert; */ public class QdrantVectorStore extends AbstractObservationVectorStore implements InitializingBean { - private static final LogAccessor logger = new LogAccessor(LogFactory.getLog(QdrantVectorStore.class)); + private static final Logger logger = LoggerFactory.getLogger(QdrantVectorStore.class); public static final String DEFAULT_COLLECTION_NAME = "vector_store"; @@ -234,7 +234,7 @@ public class QdrantVectorStore extends AbstractObservationVectorStore implements logger.debug("Deleted documents matching filter expression"); } catch (Exception e) { - logger.error(e, "Failed to delete documents by filter: " + e.getMessage()); + logger.error("Failed to delete documents by filter: {}", e.getMessage(), e); throw new IllegalStateException("Failed to delete documents by filter", e); } } diff --git a/vector-stores/spring-ai-redis-store/src/main/java/org/springframework/ai/vectorstore/redis/RedisVectorStore.java b/vector-stores/spring-ai-redis-store/src/main/java/org/springframework/ai/vectorstore/redis/RedisVectorStore.java index ff1f94963..b3a396072 100644 --- a/vector-stores/spring-ai-redis-store/src/main/java/org/springframework/ai/vectorstore/redis/RedisVectorStore.java +++ b/vector-stores/spring-ai-redis-store/src/main/java/org/springframework/ai/vectorstore/redis/RedisVectorStore.java @@ -27,7 +27,8 @@ import java.util.function.Function; import java.util.function.Predicate; import java.util.stream.Collectors; -import org.apache.commons.logging.LogFactory; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import redis.clients.jedis.JedisPooled; import redis.clients.jedis.Pipeline; import redis.clients.jedis.json.Path2; @@ -58,7 +59,6 @@ import org.springframework.ai.vectorstore.filter.FilterExpressionConverter; import org.springframework.ai.vectorstore.observation.AbstractObservationVectorStore; import org.springframework.ai.vectorstore.observation.VectorStoreObservationContext; import org.springframework.beans.factory.InitializingBean; -import org.springframework.core.log.LogAccessor; import org.springframework.lang.Nullable; import org.springframework.util.Assert; import org.springframework.util.CollectionUtils; @@ -199,7 +199,7 @@ public class RedisVectorStore extends AbstractObservationVectorStore implements private static final String JSON_PATH_PREFIX = "$."; - private static final LogAccessor logger = new LogAccessor(LogFactory.getLog(RedisVectorStore.class)); + private static final Logger logger = LoggerFactory.getLogger(RedisVectorStore.class); private static final Predicate RESPONSE_OK = Predicate.isEqual("OK"); @@ -289,7 +289,7 @@ public class RedisVectorStore extends AbstractObservationVectorStore implements Optional errResponse = responses.stream().filter(Predicate.not(RESPONSE_DEL_OK)).findAny(); if (errResponse.isPresent()) { if (logger.isErrorEnabled()) { - logger.error("Could not delete document: " + errResponse.get()); + logger.error("Could not delete document: {}", errResponse.get()); } return Optional.of(false); } @@ -322,16 +322,16 @@ public class RedisVectorStore extends AbstractObservationVectorStore implements Optional errResponse = responses.stream().filter(Predicate.not(RESPONSE_DEL_OK)).findAny(); if (errResponse.isPresent()) { - logger.error(() -> "Could not delete document: " + errResponse.get()); + logger.error("Could not delete document: {}", errResponse.get()); throw new IllegalStateException("Failed to delete some documents"); } } - logger.debug(() -> "Deleted " + matchingIds.size() + " documents matching filter expression"); + logger.debug("Deleted {} documents matching filter expression", matchingIds.size()); } } catch (Exception e) { - logger.error(e, () -> "Failed to delete documents by filter"); + logger.error("Failed to delete documents by filter", e); throw new IllegalStateException("Failed to delete documents by filter", e); } } diff --git a/vector-stores/spring-ai-typesense-store/src/main/java/org/springframework/ai/vectorstore/typesense/TypesenseVectorStore.java b/vector-stores/spring-ai-typesense-store/src/main/java/org/springframework/ai/vectorstore/typesense/TypesenseVectorStore.java index d6aec99f0..765943c3a 100644 --- a/vector-stores/spring-ai-typesense-store/src/main/java/org/springframework/ai/vectorstore/typesense/TypesenseVectorStore.java +++ b/vector-stores/spring-ai-typesense-store/src/main/java/org/springframework/ai/vectorstore/typesense/TypesenseVectorStore.java @@ -23,7 +23,8 @@ import java.util.Optional; import java.util.stream.IntStream; import java.util.stream.Stream; -import org.apache.commons.logging.LogFactory; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import org.typesense.api.Client; import org.typesense.api.FieldTypes; import org.typesense.model.CollectionResponse; @@ -48,7 +49,6 @@ import org.springframework.ai.vectorstore.filter.FilterExpressionConverter; import org.springframework.ai.vectorstore.observation.AbstractObservationVectorStore; import org.springframework.ai.vectorstore.observation.VectorStoreObservationContext; import org.springframework.beans.factory.InitializingBean; -import org.springframework.core.log.LogAccessor; import org.springframework.lang.Nullable; import org.springframework.util.Assert; @@ -94,7 +94,7 @@ public class TypesenseVectorStore extends AbstractObservationVectorStore impleme public static final int INVALID_EMBEDDING_DIMENSION = -1; - private static final LogAccessor logger = new LogAccessor(LogFactory.getLog(TypesenseVectorStore.class)); + private static final Logger logger = LoggerFactory.getLogger(TypesenseVectorStore.class); public final FilterExpressionConverter filterExpressionConverter = new TypesenseFilterExpressionConverter(); @@ -159,10 +159,10 @@ public class TypesenseVectorStore extends AbstractObservationVectorStore impleme try { this.client.collections(this.collectionName).documents().import_(documentList, importDocumentsParameters); - logger.info(() -> "Added " + documentList.size() + " documents"); + logger.info("Added {} documents", documentList.size()); } catch (Exception e) { - logger.error(e, "Failed to add documents"); + logger.error("Failed to add documents", e); } } @@ -184,7 +184,7 @@ public class TypesenseVectorStore extends AbstractObservationVectorStore impleme return Optional.of(deletedDocs > 0); } catch (Exception e) { - logger.error(e, "Failed to delete documents"); + logger.error("Failed to delete documents", e); return Optional.of(Boolean.FALSE); } } @@ -204,14 +204,14 @@ public class TypesenseVectorStore extends AbstractObservationVectorStore impleme int deletedDocs = (Integer) response.getOrDefault("num_deleted", 0); if (deletedDocs == 0) { - logger.warn(() -> "No documents were deleted matching filter expression"); + logger.warn("No documents were deleted matching filter expression"); } else { - logger.debug(() -> "Deleted " + deletedDocs + " documents matching filter expression"); + logger.debug("Deleted {} documents matching filter expression", deletedDocs); } } catch (Exception e) { - logger.error(e, () -> "Failed to delete documents by filter"); + logger.error("Failed to delete documents by filter", e); throw new IllegalStateException("Failed to delete documents by filter", e); } } @@ -223,7 +223,7 @@ public class TypesenseVectorStore extends AbstractObservationVectorStore impleme String nativeFilterExpressions = (request.getFilterExpression() != null) ? this.filterExpressionConverter.convertExpression(request.getFilterExpression()) : ""; - logger.info("Filter expression: " + nativeFilterExpressions); + logger.info("Filter expression: {}", nativeFilterExpressions); float[] embedding = this.embeddingModel.embed(request.getQuery()); @@ -265,11 +265,11 @@ public class TypesenseVectorStore extends AbstractObservationVectorStore impleme })) .toList(); - logger.info("Found " + documents.size() + " documents"); + logger.info("Found {} documents", documents.size()); return documents; } catch (Exception e) { - logger.error(e, "Failed to search documents"); + logger.error("Failed to search documents", e); return List.of(); } } @@ -285,9 +285,8 @@ public class TypesenseVectorStore extends AbstractObservationVectorStore impleme } } catch (Exception e) { - logger.warn(e, - () -> "Failed to obtain the embedding dimensions from the embedding model and fall backs to default:" - + this.embeddingDimension); + logger.warn("Failed to obtain the embedding dimensions from the embedding model and fall backs to default:" + + this.embeddingDimension, e); } return OPENAI_EMBEDDING_DIMENSION_SIZE; } @@ -314,7 +313,7 @@ public class TypesenseVectorStore extends AbstractObservationVectorStore impleme void createCollection() { if (this.hasCollection()) { - logger.info("Collection " + this.collectionName + " already exists"); + logger.info("Collection {} already exists", this.collectionName); return; } @@ -332,25 +331,25 @@ public class TypesenseVectorStore extends AbstractObservationVectorStore impleme try { this.client.collections().create(collectionSchema); - logger.info("Collection " + this.collectionName + " created"); + logger.info("Collection {} created", this.collectionName); } catch (Exception e) { - logger.error(e, "Failed to create collection " + this.collectionName); + logger.error("Failed to create collection {}", this.collectionName, e); } } void dropCollection() { if (!this.hasCollection()) { - logger.info("Collection " + this.collectionName + " does not exist"); + logger.info("Collection {} does not exist", this.collectionName); return; } try { this.client.collections(this.collectionName).delete(); - logger.info("Collection " + this.collectionName + " dropped"); + logger.info("Collection {} dropped", this.collectionName); } catch (Exception e) { - logger.error(e, "Failed to drop collection " + this.collectionName); + logger.error("Failed to drop collection {}", this.collectionName, e); } } @@ -362,7 +361,7 @@ public class TypesenseVectorStore extends AbstractObservationVectorStore impleme retrievedCollection.getNumDocuments()); } catch (Exception e) { - logger.error(e, "Failed to retrieve collection info"); + logger.error("Failed to retrieve collection info", e); return null; } diff --git a/vector-stores/spring-ai-weaviate-store/src/main/java/org/springframework/ai/vectorstore/weaviate/WeaviateVectorStore.java b/vector-stores/spring-ai-weaviate-store/src/main/java/org/springframework/ai/vectorstore/weaviate/WeaviateVectorStore.java index 9aface670..ab1f7b7bb 100644 --- a/vector-stores/spring-ai-weaviate-store/src/main/java/org/springframework/ai/vectorstore/weaviate/WeaviateVectorStore.java +++ b/vector-stores/spring-ai-weaviate-store/src/main/java/org/springframework/ai/vectorstore/weaviate/WeaviateVectorStore.java @@ -43,7 +43,8 @@ import io.weaviate.client.v1.graphql.query.builder.GetBuilder; import io.weaviate.client.v1.graphql.query.builder.GetBuilder.GetBuilderBuilder; import io.weaviate.client.v1.graphql.query.fields.Field; import io.weaviate.client.v1.graphql.query.fields.Fields; -import org.apache.commons.logging.LogFactory; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import org.springframework.ai.document.Document; import org.springframework.ai.document.DocumentMetadata; @@ -56,7 +57,6 @@ import org.springframework.ai.vectorstore.SearchRequest; import org.springframework.ai.vectorstore.filter.Filter; import org.springframework.ai.vectorstore.observation.AbstractObservationVectorStore; import org.springframework.ai.vectorstore.observation.VectorStoreObservationContext; -import org.springframework.core.log.LogAccessor; import org.springframework.util.Assert; import org.springframework.util.CollectionUtils; import org.springframework.util.StringUtils; @@ -93,7 +93,7 @@ import org.springframework.util.StringUtils; */ public class WeaviateVectorStore extends AbstractObservationVectorStore { - private static final LogAccessor logger = new LogAccessor(LogFactory.getLog(WeaviateVectorStore.class)); + private static final Logger logger = LoggerFactory.getLogger(WeaviateVectorStore.class); private static final String METADATA_FIELD_PREFIX = "meta_"; @@ -323,14 +323,14 @@ public class WeaviateVectorStore extends AbstractObservationVectorStore { throw new IllegalStateException("Failed to delete some documents"); } - logger.debug(() -> "Deleted " + idsToDelete.size() + " documents matching filter expression"); + logger.debug("Deleted {} documents matching filter expression", idsToDelete.size()); } else { - logger.debug(() -> "No documents found matching filter expression"); + logger.debug("No documents found matching filter expression"); } } catch (Exception e) { - logger.error(e, () -> "Failed to delete documents by filter"); + logger.error("Failed to delete documents by filter", e); throw new IllegalStateException("Failed to delete documents by filter", e); } }