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 724f7ee5c0a..9af7cf4e866 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,11 +22,10 @@ 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; @@ -34,6 +33,7 @@ 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,9 +55,9 @@ public class PagePdfDocumentReader implements DocumentReader { private static final String PDF_PAGE_REGION = "pdfPageRegion"; - protected final PDDocument document; + private static final LogAccessor logger = new LogAccessor(LogFactory.getLog(PagePdfDocumentReader.class)); - private final Logger logger = LoggerFactory.getLogger(getClass()); + protected final PDDocument document; protected String resourceFileName; @@ -112,7 +112,7 @@ public List get() { 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 List get() { readDocuments.add(toDocument(lastPage, pageTextGroupList.stream().collect(Collectors.joining()), startPageNumber, pageNumber)); } - logger.info("Processing {} pages", totalPages); + logger.info("Processing " + totalPages + " pages"); 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 95863fff649..1c3e173a210 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,8 +23,6 @@ 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; @@ -34,6 +32,7 @@ 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; @@ -62,7 +61,7 @@ public class ParagraphPdfDocumentReader implements DocumentReader { protected final PDDocument document; - private final Logger logger = LoggerFactory.getLogger(getClass()); + private static final LogAccessor logger = new LogAccessor(ParagraphPdfDocumentReader.class); private final ParagraphManager paragraphTextExtractor; diff --git a/models/spring-ai-anthropic/pom.xml b/models/spring-ai-anthropic/pom.xml index de2afe6d6a9..5b32e0d1f5c 100644 --- a/models/spring-ai-anthropic/pom.xml +++ b/models/spring-ai-anthropic/pom.xml @@ -76,10 +76,6 @@ org.springframework spring-context-support - - org.springframework.boot - spring-boot-starter-logging - 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 94fe45595a9..b1287e7eedc 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,8 +27,6 @@ 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,6 +65,7 @@ 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; @@ -92,7 +91,7 @@ public class AnthropicChatModel extends AbstractToolCallSupport implements ChatM public static final Double DEFAULT_TEMPERATURE = 0.8; - private static final Logger logger = LoggerFactory.getLogger(AnthropicChatModel.class); + private static final LogAccessor logger = new LogAccessor(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 94af5ab14fe..bda5288be72 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,8 +27,6 @@ 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; @@ -59,6 +57,7 @@ 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; @@ -69,7 +68,7 @@ @EnabledIfEnvironmentVariable(named = "ANTHROPIC_API_KEY", matches = ".+") class AnthropicChatModelIT { - private static final Logger logger = LoggerFactory.getLogger(AnthropicChatModelIT.class); + private static final LogAccessor logger = new LogAccessor(AnthropicChatModelIT.class); @Autowired protected ChatModel chatModel; @@ -284,7 +283,7 @@ void functionCallTest() { ChatResponse response = this.chatModel.call(new Prompt(messages, promptOptions)); - logger.info("Response: {}", response); + logger.info("Response: " + response); Generation generation = response.getResult(); assertThat(generation).isNotNull(); @@ -324,7 +323,7 @@ void streamFunctionCallTest() { .map(cr -> cr.getResult().getOutput().getText()) .collect(Collectors.joining()); - logger.info("Response: {}", content); + logger.info("Response: " + content); assertThat(content).contains("30", "10", "15"); } @@ -350,7 +349,7 @@ void streamFunctionCallUsageTest() { 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 9cd11068bfa..e5d90d9e946 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,11 +23,10 @@ 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; @@ -37,7 +36,7 @@ */ public class EventParsingTests { - private static final Logger logger = LoggerFactory.getLogger(EventParsingTests.class); + private static final LogAccessor logger = new LogAccessor(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 0be31a1386d..3cffa70f87d 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,8 +22,6 @@ 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; @@ -36,6 +34,7 @@ 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; @@ -81,7 +80,7 @@ public class AnthropicApiLegacyToolIT { public static final ConcurrentHashMap FUNCTIONS = new ConcurrentHashMap<>(); - private static final Logger logger = LoggerFactory.getLogger(AnthropicApiLegacyToolIT.class); + private static final LogAccessor logger = new LogAccessor(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 079a01b3caf..0ffeaccd733 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,8 +23,6 @@ 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; @@ -35,6 +33,7 @@ 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; @@ -56,7 +55,7 @@ public class AnthropicApiToolIT { public static final ConcurrentHashMap FUNCTIONS = new ConcurrentHashMap<>(); - private static final Logger logger = LoggerFactory.getLogger(AnthropicApiToolIT.class); + private static final LogAccessor logger = new LogAccessor(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 b1f79e1f5bc..7d65d239663 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,8 +28,6 @@ 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; @@ -50,6 +48,7 @@ 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; @@ -60,7 +59,7 @@ @ActiveProfiles("logging-test") class AnthropicChatClientIT { - private static final Logger logger = LoggerFactory.getLogger(AnthropicChatClientIT.class); + private static final LogAccessor logger = new LogAccessor(AnthropicChatClientIT.class); @Autowired ChatModel chatModel; @@ -220,7 +219,7 @@ void functionCallTest() { .content(); // @formatter:on - logger.info("Response: {}", response); + logger.info("Response: " + response); assertThat(response).contains("30", "10", "15"); } @@ -239,7 +238,7 @@ void functionCallWithGeneratedDescription() { .content(); // @formatter:on - logger.info("Response: {}", response); + logger.info("Response: " + response); assertThat(response).contains("30", "10", "15"); } @@ -261,7 +260,7 @@ void defaultFunctionCallTest() { .content(); // @formatter:on - logger.info("Response: {}", response); + logger.info("Response: " + response); assertThat(response).contains("30", "10", "15"); } @@ -282,7 +281,7 @@ void streamFunctionCallTest() { // @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"); } @@ -344,7 +343,7 @@ void streamingMultiModality() throws IOException { 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 2fcee182dd2..751efab3c65 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,8 +23,6 @@ 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,6 +32,7 @@ import org.springframework.ai.model.function.FunctionCallback; 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 static org.assertj.core.api.Assertions.assertThat; @@ -44,8 +43,8 @@ @ActiveProfiles("logging-test") class AnthropicChatClientMethodInvokingFunctionCallbackIT { - private static final Logger logger = LoggerFactory - .getLogger(AnthropicChatClientMethodInvokingFunctionCallbackIT.class); + private static final LogAccessor logger = new LogAccessor( + AnthropicChatClientMethodInvokingFunctionCallbackIT.class); public static Map arguments = new ConcurrentHashMap<>(); @@ -68,7 +67,7 @@ void methodGetWeatherGeneratedDescription() { .content(); // @formatter:on - logger.info("Response: {}", response); + logger.info("Response: " + response); assertThat(response).contains("30", "10", "15"); } @@ -88,7 +87,7 @@ void methodGetWeatherStatic() { .content(); // @formatter:on - logger.info("Response: {}", response); + logger.info("Response: " + response); assertThat(response).contains("30", "10", "15"); } @@ -110,7 +109,7 @@ void methodTurnLightNoResponse() { .content(); // @formatter:on - logger.info("Response: {}", response); + logger.info("Response: " + response); assertThat(arguments).containsEntry("roomName", "living room"); assertThat(arguments).containsEntry("on", true); @@ -133,7 +132,7 @@ void methodGetWeatherNonStatic() { .content(); // @formatter:on - logger.info("Response: {}", response); + logger.info("Response: " + response); assertThat(response).contains("30", "10", "15"); } @@ -156,7 +155,7 @@ void methodGetWeatherToolContext() { .content(); // @formatter:on - logger.info("Response: {}", response); + logger.info("Response: " + response); assertThat(response).contains("30", "10", "15"); assertThat(arguments).containsEntry("tool", "value"); @@ -203,7 +202,7 @@ void methodNoParameters() { .content(); // @formatter:on - logger.info("Response: {}", response); + logger.info("Response: " + response); assertThat(arguments).containsEntry("turnLivingRoomLightOn", true); } @@ -264,7 +263,7 @@ public String getWeatherWithContext(String city, Unit unit, ToolContext context) public void turnLight(String roomName, boolean on) { arguments.put("roomName", roomName); arguments.put("on", on); - logger.info("Turn light in room: {} to: {}", roomName, on); + logger.info("Turn light in room: " + roomName + " to: " + on); } public void turnLivingRoomLightOn() { diff --git a/models/spring-ai-azure-openai/pom.xml b/models/spring-ai-azure-openai/pom.xml index 6e312cfca8a..2203a706ce1 100644 --- a/models/spring-ai-azure-openai/pom.xml +++ b/models/spring-ai-azure-openai/pom.xml @@ -59,11 +59,6 @@ spring-context-support - - org.springframework.boot - spring-boot-starter-logging - - 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 a5f5b335781..f56a0ef1e1b 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,8 +25,6 @@ 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; @@ -42,6 +40,7 @@ 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; @@ -55,7 +54,7 @@ */ public class AzureOpenAiEmbeddingModel extends AbstractEmbeddingModel { - private static final Logger logger = LoggerFactory.getLogger(AzureOpenAiEmbeddingModel.class); + private static final LogAccessor logger = new LogAccessor(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 88fe6ae6e51..676c6952fd3 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,8 +29,6 @@ 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; @@ -42,6 +40,7 @@ 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; /** @@ -58,7 +57,7 @@ public class AzureOpenAiImageModel implements ImageModel { private static final String DEFAULT_DEPLOYMENT_NAME = AzureOpenAiImageOptions.DEFAULT_IMAGE_MODEL; - private final Logger logger = LoggerFactory.getLogger(getClass()); + private final LogAccessor logger = new LogAccessor(getClass()); private final OpenAIClient openAIClient; @@ -91,14 +90,14 @@ public ImageResponse call(ImagePrompt imagePrompt) { ImageGenerationOptions imageGenerationOptions = toOpenAiImageOptions(imagePrompt); String deploymentOrModelName = getDeploymentName(imagePrompt); if (logger.isTraceEnabled()) { - logger.trace("Azure ImageGenerationOptions call {} with the following options : {} ", deploymentOrModelName, - toPrettyJson(imageGenerationOptions)); + logger.trace("Azure ImageGenerationOptions call " + deploymentOrModelName + " with the following options : " + + 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 d9f6e89a2c2..2234d3ad6b9 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,8 +29,6 @@ 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; @@ -51,6 +49,7 @@ 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; @@ -59,7 +58,7 @@ @RequiresAzureCredentials class AzureOpenAiChatModelIT { - private static final Logger logger = LoggerFactory.getLogger(AzureOpenAiChatModelIT.class); + private static final LogAccessor logger = new LogAccessor(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 08d6ae77f6b..9a4f090e22e 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,8 +30,6 @@ 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; @@ -39,6 +37,7 @@ 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; @@ -206,7 +205,7 @@ private String getBody(MockHttpServletResponse response) { */ static class MockWebServerFactoryBean implements FactoryBean, InitializingBean, DisposableBean { - private final Logger logger = LoggerFactory.getLogger(getClass().getName()); + private final LogAccessor logger = new LogAccessor(getClass().getName()); private final Queue queuedResponses = new ConcurrentLinkedDeque<>(); @@ -222,7 +221,7 @@ public void setDispatcher(@Nullable Dispatcher dispatcher) { this.dispatcher = dispatcher; } - protected Logger getLogger() { + protected LogAccessor getLogger() { return logger; } @@ -256,8 +255,8 @@ public void destroy() { this.mockWebServer.shutdown(); } catch (IOException e) { - getLogger().warn("MockWebServer was not shutdown correctly: {}", e.getMessage()); - getLogger().trace("MockWebServer shutdown failure", e); + getLogger().warn("MockWebServer was not shutdown correctly: " + e.getMessage()); + getLogger().trace(e, "MockWebServer shutdown failure"); } } 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 8ce99650638..680a308326d 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,8 +27,6 @@ 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; @@ -45,6 +43,7 @@ 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; @@ -53,7 +52,7 @@ @RequiresAzureCredentials class AzureOpenAiChatModelFunctionCallIT { - private static final Logger logger = LoggerFactory.getLogger(AzureOpenAiChatModelFunctionCallIT.class); + private static final LogAccessor logger = new LogAccessor(AzureOpenAiChatModelFunctionCallIT.class); @Autowired private String selectedModel; @@ -79,7 +78,7 @@ void functionCallTest() { 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(); @@ -108,7 +107,7 @@ void functionCallSequentialTest() { 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"); } @@ -140,7 +139,7 @@ void streamFunctionCallTest() { .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"); @@ -170,7 +169,7 @@ void streamFunctionCallUsageTest() { 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); @@ -207,7 +206,7 @@ void functionCallSequentialAndStreamTest() { .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 37afa84de43..68fd6838ffd 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,8 +32,6 @@ 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; @@ -101,6 +99,7 @@ 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; @@ -134,7 +133,7 @@ */ public class BedrockProxyChatModel extends AbstractToolCallSupport implements ChatModel { - private static final Logger logger = LoggerFactory.getLogger(BedrockProxyChatModel.class); + private static final LogAccessor logger = new LogAccessor(BedrockProxyChatModel.class); private static final ChatModelObservationConvention DEFAULT_OBSERVATION_CONVENTION = new DefaultChatModelObservationConvention(); @@ -200,7 +199,7 @@ private ChatResponse internalCall(Prompt prompt, ChatResponse perviousChatRespon ConverseResponse converseResponse = this.bedrockRuntimeClient.converse(converseRequest); - logger.debug("ConverseResponse: {}", converseResponse); + logger.debug("ConverseResponse: " + converseResponse); var response = this.toChatResponse(converseResponse, perviousChatResponse); @@ -655,7 +654,7 @@ public Flux converseStream(ConverseStreamRequest converseS 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(); @@ -667,7 +666,7 @@ public Flux converseStream(ConverseStreamRequest converseS logger.info("Completed streaming response."); }) .onError(error -> { - logger.error("Error handling Bedrock converse stream response", error); + logger.error(error, "Error handling Bedrock converse stream response"); 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 80f6c935134..99d9ac2e2d5 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,8 +26,6 @@ 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; @@ -45,6 +43,7 @@ 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; @@ -53,7 +52,7 @@ @RequiresAwsCredentials class BedrockConverseChatClientIT { - private static final Logger logger = LoggerFactory.getLogger(BedrockConverseChatClientIT.class); + private static final LogAccessor logger = new LogAccessor(BedrockConverseChatClientIT.class); @Value("classpath:/prompts/system-message.st") private Resource systemTextResource; @@ -220,7 +219,7 @@ void functionCallTest() { .content(); // @formatter:on - logger.info("Response: {}", response); + logger.info("Response: " + response); assertThat(response).contains("30", "10", "15"); } @@ -255,7 +254,7 @@ void functionCallWithUsageMetadataTest() { 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"); } @@ -276,7 +275,7 @@ void functionCallWithAdvisorTest() { .content(); // @formatter:on - logger.info("Response: {}", response); + logger.info("Response: " + response); assertThat(response).contains("30", "10", "15"); } @@ -298,7 +297,7 @@ void defaultFunctionCallTest() { .content(); // @formatter:on - logger.info("Response: {}", response); + logger.info("Response: " + response); assertThat(response).contains("30", "10", "15"); } @@ -340,7 +339,7 @@ void streamFunctionCallTest() { .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"); } @@ -361,7 +360,7 @@ void singularStreamFunctionCallTest() { // @formatter:on String content = response.collectList().block().stream().collect(Collectors.joining()); - logger.info("Response: {}", content); + logger.info("Response: " + content); assertThat(content).contains("15"); } @@ -421,7 +420,7 @@ void streamingMultiModalityImageUrl() throws IOException { 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 f4ffbcbdd21..cf3078adbf5 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,8 +27,6 @@ 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; @@ -54,6 +52,7 @@ 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; @@ -62,7 +61,7 @@ @RequiresAwsCredentials class BedrockProxyChatModelIT { - private static final Logger logger = LoggerFactory.getLogger(BedrockProxyChatModelIT.class); + private static final LogAccessor logger = new LogAccessor(BedrockProxyChatModelIT.class); @Autowired protected ChatModel chatModel; @@ -262,7 +261,7 @@ void functionCallTest() { 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"); @@ -297,7 +296,7 @@ void streamFunctionCallTest() { .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 326a90425a9..b62a87df48a 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,8 +21,6 @@ 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; @@ -38,6 +36,7 @@ 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; @@ -50,7 +49,7 @@ @RequiresAwsCredentials public class BedrockNovaChatClientIT { - private static final Logger logger = LoggerFactory.getLogger(BedrockNovaChatClientIT.class); + private static final LogAccessor logger = new LogAccessor(BedrockNovaChatClientIT.class); @Autowired ChatModel chatModel; @@ -167,7 +166,7 @@ else if (request.location().contains("San Francisco")) { .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 024f3f4f7d0..2c22dd58f18 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,8 +27,6 @@ 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; @@ -45,6 +43,7 @@ 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; /** @@ -67,7 +66,7 @@ */ public abstract class AbstractBedrockApi { - private static final Logger logger = LoggerFactory.getLogger(AbstractBedrockApi.class); + private static final LogAccessor logger = new LogAccessor(AbstractBedrockApi.class); /** * Default emit failure handler. @@ -290,7 +289,7 @@ protected Flux internalInvocationStream(I request, Class clazz) { eventSink.emitNext(response, DEFAULT_EMIT_FAILURE_HANDLER); } catch (Exception e) { - logger.error("Failed to unmarshall", e); + logger.error(e, "Failed to unmarshall"); 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 2eabc32d4f1..e5dd7f3cdba 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-2024 the original author or authors. + * Copyright 2023-2025 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -20,8 +20,7 @@ import java.util.List; import java.util.concurrent.atomic.AtomicInteger; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; +import org.apache.commons.logging.LogFactory; import org.springframework.ai.bedrock.titan.api.TitanEmbeddingBedrockApi; import org.springframework.ai.bedrock.titan.api.TitanEmbeddingBedrockApi.TitanEmbeddingRequest; @@ -32,6 +31,7 @@ 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 @@ */ public class BedrockTitanEmbeddingModel extends AbstractEmbeddingModel { - private final Logger logger = LoggerFactory.getLogger(getClass()); + private static final LogAccessor logger = new LogAccessor(LogFactory.getLog(BedrockTitanEmbeddingModel.class)); private final TitanEmbeddingBedrockApi embeddingApi; diff --git a/models/spring-ai-bedrock/src/test/java/org/springframework/ai/bedrock/anthropic/BedrockAnthropicChatModelIT.java b/models/spring-ai-bedrock/src/test/java/org/springframework/ai/bedrock/anthropic/BedrockAnthropicChatModelIT.java index 54b589256f3..532e0751248 100644 --- a/models/spring-ai-bedrock/src/test/java/org/springframework/ai/bedrock/anthropic/BedrockAnthropicChatModelIT.java +++ b/models/spring-ai-bedrock/src/test/java/org/springframework/ai/bedrock/anthropic/BedrockAnthropicChatModelIT.java @@ -25,8 +25,6 @@ import com.fasterxml.jackson.databind.ObjectMapper; import org.junit.jupiter.api.Disabled; import org.junit.jupiter.api.Test; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; import reactor.core.publisher.Flux; import software.amazon.awssdk.auth.credentials.EnvironmentVariableCredentialsProvider; import software.amazon.awssdk.regions.Region; @@ -51,6 +49,7 @@ 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; @@ -58,7 +57,7 @@ @RequiresAwsCredentials class BedrockAnthropicChatModelIT { - private static final Logger logger = LoggerFactory.getLogger(BedrockAnthropicChatModelIT.class); + private static final LogAccessor logger = new LogAccessor(BedrockAnthropicChatModelIT.class); @Autowired private BedrockAnthropicChatModel chatModel; diff --git a/models/spring-ai-bedrock/src/test/java/org/springframework/ai/bedrock/anthropic/api/AnthropicChatBedrockApiIT.java b/models/spring-ai-bedrock/src/test/java/org/springframework/ai/bedrock/anthropic/api/AnthropicChatBedrockApiIT.java index 42e9b910394..f68a4094844 100644 --- a/models/spring-ai-bedrock/src/test/java/org/springframework/ai/bedrock/anthropic/api/AnthropicChatBedrockApiIT.java +++ b/models/spring-ai-bedrock/src/test/java/org/springframework/ai/bedrock/anthropic/api/AnthropicChatBedrockApiIT.java @@ -22,8 +22,6 @@ import com.fasterxml.jackson.databind.ObjectMapper; import org.junit.jupiter.api.Test; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; import reactor.core.publisher.Flux; import software.amazon.awssdk.auth.credentials.EnvironmentVariableCredentialsProvider; import software.amazon.awssdk.regions.Region; @@ -32,6 +30,7 @@ import org.springframework.ai.bedrock.anthropic.api.AnthropicChatBedrockApi.AnthropicChatModel; import org.springframework.ai.bedrock.anthropic.api.AnthropicChatBedrockApi.AnthropicChatRequest; import org.springframework.ai.bedrock.anthropic.api.AnthropicChatBedrockApi.AnthropicChatResponse; +import org.springframework.core.log.LogAccessor; import static org.assertj.core.api.Assertions.assertThat; @@ -41,7 +40,7 @@ @RequiresAwsCredentials public class AnthropicChatBedrockApiIT { - private final Logger logger = LoggerFactory.getLogger(AnthropicChatBedrockApiIT.class); + private static final LogAccessor logger = new LogAccessor(AnthropicChatBedrockApiIT.class); private AnthropicChatBedrockApi anthropicChatApi = new AnthropicChatBedrockApi(AnthropicChatModel.CLAUDE_V2.id(), EnvironmentVariableCredentialsProvider.create(), Region.US_EAST_1.id(), new ObjectMapper(), diff --git a/models/spring-ai-bedrock/src/test/java/org/springframework/ai/bedrock/anthropic3/BedrockAnthropic3ChatModelIT.java b/models/spring-ai-bedrock/src/test/java/org/springframework/ai/bedrock/anthropic3/BedrockAnthropic3ChatModelIT.java index 20f62169aaa..65f25976a83 100644 --- a/models/spring-ai-bedrock/src/test/java/org/springframework/ai/bedrock/anthropic3/BedrockAnthropic3ChatModelIT.java +++ b/models/spring-ai-bedrock/src/test/java/org/springframework/ai/bedrock/anthropic3/BedrockAnthropic3ChatModelIT.java @@ -25,8 +25,6 @@ import com.fasterxml.jackson.databind.ObjectMapper; import org.junit.jupiter.api.Test; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; import reactor.core.publisher.Flux; import software.amazon.awssdk.auth.credentials.EnvironmentVariableCredentialsProvider; import software.amazon.awssdk.regions.Region; @@ -53,6 +51,7 @@ 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 +60,7 @@ @RequiresAwsCredentials class BedrockAnthropic3ChatModelIT { - private static final Logger logger = LoggerFactory.getLogger(BedrockAnthropic3ChatModelIT.class); + private static final LogAccessor logger = new LogAccessor(BedrockAnthropic3ChatModelIT.class); @Autowired private BedrockAnthropic3ChatModel chatModel; diff --git a/models/spring-ai-bedrock/src/test/java/org/springframework/ai/bedrock/anthropic3/api/Anthropic3ChatBedrockApiIT.java b/models/spring-ai-bedrock/src/test/java/org/springframework/ai/bedrock/anthropic3/api/Anthropic3ChatBedrockApiIT.java index 529a5e898e7..59209d9cadd 100644 --- a/models/spring-ai-bedrock/src/test/java/org/springframework/ai/bedrock/anthropic3/api/Anthropic3ChatBedrockApiIT.java +++ b/models/spring-ai-bedrock/src/test/java/org/springframework/ai/bedrock/anthropic3/api/Anthropic3ChatBedrockApiIT.java @@ -22,8 +22,6 @@ import com.fasterxml.jackson.databind.ObjectMapper; import org.junit.jupiter.api.Test; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; import reactor.core.publisher.Flux; import software.amazon.awssdk.auth.credentials.EnvironmentVariableCredentialsProvider; import software.amazon.awssdk.regions.Region; @@ -36,6 +34,7 @@ import org.springframework.ai.bedrock.anthropic3.api.Anthropic3ChatBedrockApi.ChatCompletionMessage; import org.springframework.ai.bedrock.anthropic3.api.Anthropic3ChatBedrockApi.ChatCompletionMessage.Role; import org.springframework.ai.bedrock.anthropic3.api.Anthropic3ChatBedrockApi.MediaContent; +import org.springframework.core.log.LogAccessor; import static org.assertj.core.api.Assertions.assertThat; @@ -45,7 +44,7 @@ @RequiresAwsCredentials public class Anthropic3ChatBedrockApiIT { - private final Logger logger = LoggerFactory.getLogger(Anthropic3ChatBedrockApiIT.class); + private static final LogAccessor logger = new LogAccessor(Anthropic3ChatBedrockApiIT.class); private Anthropic3ChatBedrockApi anthropicChatApi = new Anthropic3ChatBedrockApi( AnthropicChatModel.CLAUDE_INSTANT_V1.id(), EnvironmentVariableCredentialsProvider.create(), diff --git a/models/spring-ai-huggingface/pom.xml b/models/spring-ai-huggingface/pom.xml index 1013ecdd604..62807b918c3 100644 --- a/models/spring-ai-huggingface/pom.xml +++ b/models/spring-ai-huggingface/pom.xml @@ -72,11 +72,6 @@ spring-context-support - - org.springframework.boot - spring-boot-starter-logging - - org.springframework.boot diff --git a/models/spring-ai-minimax/pom.xml b/models/spring-ai-minimax/pom.xml index 8a592901a91..dd0164d6d6f 100644 --- a/models/spring-ai-minimax/pom.xml +++ b/models/spring-ai-minimax/pom.xml @@ -60,11 +60,6 @@ spring-context-support - - org.springframework.boot - spring-boot-starter-logging - - 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 e1660d18ae1..dcdd24c2780 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,8 +26,6 @@ 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; @@ -66,6 +64,7 @@ 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; @@ -84,7 +83,7 @@ */ public class MiniMaxChatModel extends AbstractToolCallSupport implements ChatModel, StreamingChatModel { - private static final Logger logger = LoggerFactory.getLogger(MiniMaxChatModel.class); + private static final LogAccessor logger = new LogAccessor(MiniMaxChatModel.class); private static final ChatModelObservationConvention DEFAULT_OBSERVATION_CONVENTION = new DefaultChatModelObservationConvention(); @@ -229,14 +228,14 @@ public ChatResponse call(Prompt prompt) { 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: {}, because: {}}", prompt, - chatCompletion.baseResponse().message()); + logger.warn("No choices returned for prompt: " + prompt + ", because: " + + chatCompletion.baseResponse().message()); return new ChatResponse(List.of()); } @@ -329,7 +328,7 @@ public Flux stream(Prompt prompt) { return new ChatResponse(generations, from(chatCompletion2)); } catch (Exception e) { - logger.error("Error processing chat completion", e); + logger.error(e, "Error processing chat completion"); 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 fec3b0c310b..5860d31e0e6 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,8 +20,6 @@ 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; @@ -40,6 +38,7 @@ 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; @@ -53,7 +52,7 @@ */ public class MiniMaxEmbeddingModel extends AbstractEmbeddingModel { - private static final Logger logger = LoggerFactory.getLogger(MiniMaxEmbeddingModel.class); + private static final LogAccessor logger = new LogAccessor(MiniMaxEmbeddingModel.class); private static final EmbeddingModelObservationConvention DEFAULT_OBSERVATION_CONVENTION = new DefaultEmbeddingModelObservationConvention(); @@ -167,7 +166,7 @@ public EmbeddingResponse call(EmbeddingRequest request) { .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 86c337a58e4..18f5763c334 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,8 +24,6 @@ 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; @@ -33,6 +31,7 @@ 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; @@ -43,7 +42,7 @@ @EnabledIfEnvironmentVariable(named = "MINIMAX_API_KEY", matches = ".+") public class MiniMaxApiToolFunctionCallIT { - private final Logger logger = LoggerFactory.getLogger(MiniMaxApiToolFunctionCallIT.class); + private static final LogAccessor logger = new LogAccessor(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 8a7e9ee2efa..383daf7a48d 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,8 +23,6 @@ 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; @@ -36,6 +34,7 @@ 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; @@ -45,7 +44,7 @@ @EnabledIfEnvironmentVariable(named = "MINIMAX_API_KEY", matches = ".+") public class MiniMaxChatOptionsTests { - private static final Logger logger = LoggerFactory.getLogger(MiniMaxChatOptionsTests.class); + private static final LogAccessor logger = new LogAccessor(MiniMaxChatOptionsTests.class); private final MiniMaxChatModel chatModel = new MiniMaxChatModel(new MiniMaxApi(System.getenv("MINIMAX_API_KEY"))); @@ -135,7 +134,7 @@ void testWebSearchStream() { .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 07e45c48d80..06985cb6b4b 100644 --- a/models/spring-ai-mistral-ai/pom.xml +++ b/models/spring-ai-mistral-ai/pom.xml @@ -61,11 +61,6 @@ spring-context-support - - org.springframework.boot - spring-boot-starter-logging - - 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 80438008666..d3dfba3ad7e 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,8 +27,6 @@ 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; @@ -66,6 +64,7 @@ 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; @@ -88,7 +87,7 @@ public class MistralAiChatModel extends AbstractToolCallSupport implements ChatM private static final ChatModelObservationConvention DEFAULT_OBSERVATION_CONVENTION = new DefaultChatModelObservationConvention(); - private final Logger logger = LoggerFactory.getLogger(getClass()); + private final LogAccessor logger = new LogAccessor(getClass()); /** * The default options used for the chat completion requests. @@ -203,7 +202,7 @@ public ChatResponse internalCall(Prompt prompt, ChatResponse previousChatRespons 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()); } @@ -300,7 +299,7 @@ public Flux internalStream(Prompt prompt, ChatResponse previousCha } } catch (Exception e) { - logger.error("Error processing chat completion", e); + logger.error(e, "Error processing chat completion"); 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 834bcfcd926..f7e642a3fa1 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,8 +19,6 @@ 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; @@ -39,6 +37,7 @@ 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; @@ -52,7 +51,7 @@ */ public class MistralAiEmbeddingModel extends AbstractEmbeddingModel { - private static final Logger logger = LoggerFactory.getLogger(MistralAiEmbeddingModel.class); + private static final LogAccessor logger = new LogAccessor(MistralAiEmbeddingModel.class); private static final EmbeddingModelObservationConvention DEFAULT_OBSERVATION_CONVENTION = new DefaultEmbeddingModelObservationConvention(); @@ -126,7 +125,7 @@ public EmbeddingResponse call(EmbeddingRequest request) { .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 1cd169f3419..5ee42579366 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,8 +23,6 @@ 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; @@ -41,6 +39,7 @@ 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; @@ -48,7 +47,7 @@ @EnabledIfEnvironmentVariable(named = "MISTRAL_AI_API_KEY", matches = ".+") class MistralAiChatClientIT { - private static final Logger logger = LoggerFactory.getLogger(MistralAiChatClientIT.class); + private static final LogAccessor logger = new LogAccessor(MistralAiChatClientIT.class); @Autowired MistralAiChatModel chatModel; @@ -234,7 +233,7 @@ void functionCallTest() { .content(); // @formatter:on - logger.info("Response: {}", response); + logger.info("Response: " + response); assertThat(response).containsAnyOf("30.0", "30"); assertThat(response).containsAnyOf("10.0", "10"); @@ -257,7 +256,7 @@ void defaultFunctionCallTest() { .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"); @@ -281,7 +280,7 @@ void streamFunctionCallTest() { // @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 27e111e742f..251ae548e09 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,8 +28,6 @@ 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; @@ -55,6 +53,7 @@ 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 +68,7 @@ @EnabledIfEnvironmentVariable(named = "MISTRAL_AI_API_KEY", matches = ".+") class MistralAiChatModelIT { - private static final Logger logger = LoggerFactory.getLogger(MistralAiChatModelIT.class); + private static final LogAccessor logger = new LogAccessor(MistralAiChatModelIT.class); @Autowired protected ChatModel chatModel; @@ -212,7 +211,7 @@ void functionCallTest() { 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(); @@ -246,7 +245,7 @@ void streamFunctionCallTest() { .map(Generation::getOutput) .map(AssistantMessage::getText) .collect(Collectors.joining()); - logger.info("Response: {}", content); + logger.info("Response: " + content); assertThat(content).containsAnyOf("10.0", "10"); } @@ -303,7 +302,7 @@ void streamingMultiModalityImageUrl() throws IOException { .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"); } @@ -327,7 +326,7 @@ void streamFunctionCallUsageTest() { 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(800); 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 09406736d2d..8d0d39a25cd 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,8 +23,6 @@ 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; @@ -35,6 +33,7 @@ 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; @@ -49,7 +48,7 @@ public class MistralAiApiToolFunctionCallIT { static final String MISTRAL_AI_CHAT_MODEL = MistralAiApi.ChatModel.LARGE.getValue(); - private final Logger logger = LoggerFactory.getLogger(MistralAiApiToolFunctionCallIT.class); + private final LogAccessor logger = new LogAccessor(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 f2c03cd3d90..5fae467249b 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,8 +26,6 @@ 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; @@ -38,6 +36,7 @@ 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; @@ -64,7 +63,7 @@ public class PaymentStatusFunctionCallingIT { static Map> functions = Map.of("retrieve_payment_status", new RetrievePaymentStatus(), "retrieve_payment_date", new RetrievePaymentDate()); - private final Logger logger = LoggerFactory.getLogger(PaymentStatusFunctionCallingIT.class); + private final LogAccessor logger = new LogAccessor(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 40527b8a171..ec03221b56f 100644 --- a/models/spring-ai-moonshot/pom.xml +++ b/models/spring-ai-moonshot/pom.xml @@ -61,11 +61,6 @@ spring-context-support - - org.springframework.boot - spring-boot-starter-logging - - 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 403c15a468c..e75bf718d74 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,8 +25,6 @@ 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,6 +65,7 @@ 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; @@ -81,7 +80,7 @@ */ public class MoonshotChatModel extends AbstractToolCallSupport implements ChatModel, StreamingChatModel { - private static final Logger logger = LoggerFactory.getLogger(MoonshotChatModel.class); + private static final LogAccessor logger = new LogAccessor(MoonshotChatModel.class); private static final ChatModelObservationConvention DEFAULT_OBSERVATION_CONVENTION = new DefaultChatModelObservationConvention(); @@ -205,13 +204,13 @@ public ChatResponse internalCall(Prompt prompt, ChatResponse previousChatRespons 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()); } @@ -312,7 +311,7 @@ public Flux internalStream(Prompt prompt, ChatResponse previousCha return new ChatResponse(generations, from(chatCompletion2, cumulativeUsage)); } catch (Exception e) { - logger.error("Error processing chat completion", e); + logger.error(e, "Error processing chat completion"); 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 c2597fc1da5..4dd1f099d32 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,8 +24,6 @@ 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; @@ -35,6 +33,7 @@ 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; @@ -71,7 +70,7 @@ public class MoonshotApiToolFunctionCallIT { } """)); - private final Logger logger = LoggerFactory.getLogger(MoonshotApiToolFunctionCallIT.class); + private static final LogAccessor logger = new LogAccessor(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 f24600653a4..afebc5a132a 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,8 +24,6 @@ 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; @@ -42,6 +40,7 @@ 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; @@ -49,7 +48,7 @@ @EnabledIfEnvironmentVariable(named = "MOONSHOT_API_KEY", matches = ".+") class MoonshotChatModelFunctionCallingIT { - private static final Logger logger = LoggerFactory.getLogger(MoonshotChatModelFunctionCallingIT.class); + private static final LogAccessor logger = new LogAccessor(MoonshotChatModelFunctionCallingIT.class); @Autowired ChatModel chatModel; @@ -100,7 +99,7 @@ void functionCallTest() { 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"); } @@ -132,7 +131,7 @@ void streamFunctionCallTest() { .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 c177645b734..199494083a0 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,8 +23,6 @@ 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; @@ -45,6 +43,7 @@ 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; @@ -55,7 +54,7 @@ @EnabledIfEnvironmentVariable(named = "MOONSHOT_API_KEY", matches = ".+") public class MoonshotChatModelIT { - private static final Logger logger = LoggerFactory.getLogger(MoonshotChatModelIT.class); + private static final LogAccessor logger = new LogAccessor(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 1355d4230cc..e694ff627c4 100644 --- a/models/spring-ai-oci-genai/pom.xml +++ b/models/spring-ai-oci-genai/pom.xml @@ -64,10 +64,6 @@ org.springframework spring-context-support - - org.springframework.boot - spring-boot-starter-logging - diff --git a/models/spring-ai-ollama/pom.xml b/models/spring-ai-ollama/pom.xml index 9f8e340dd81..9aa1ce8370d 100644 --- a/models/spring-ai-ollama/pom.xml +++ b/models/spring-ai-ollama/pom.xml @@ -62,11 +62,6 @@ ${jackson.version} - - org.springframework.boot - spring-boot-starter-logging - - 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 e939e69d425..8c1c578fa0c 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,14 +18,13 @@ 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; @@ -38,7 +37,7 @@ */ public class OllamaModelManager { - private final Logger logger = LoggerFactory.getLogger(OllamaModelManager.class); + private static final LogAccessor logger = new LogAccessor(OllamaModelManager.class); private final OllamaApi ollamaApi; @@ -81,13 +80,13 @@ private String normalizeModelName(String modelName) { } 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 {} not found", modelName); + logger.info("Model " + modelName + " not found"); 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) { @@ -101,20 +100,20 @@ public void pullModel(String modelName, PullModelStrategy pullModelStrategy) { if (PullModelStrategy.WHEN_MISSING.equals(pullModelStrategy)) { if (isModelAvailable(modelName)) { - logger.debug("Model '{}' already available. Skipping pull operation.", modelName); + logger.debug("Model '" + modelName + "' already available. Skipping pull operation."); 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 '{}' model - Status: {}", modelName, progressResponses.get(progressResponses.size() - 1).status()); + logger.info("Pulling the '"+ modelName +"' model - Status: "+ progressResponses.get(progressResponses.size() - 1).status()); } }) .takeUntil(progressResponses -> @@ -122,7 +121,7 @@ public void pullModel(String modelName, PullModelStrategy pullModelStrategy) { .timeout(this.options.timeout()) .retryWhen(Retry.backoff(this.options.maxRetries(), Duration.ofSeconds(5))) .blockLast(); - logger.info("Completed pulling the '{}' model", modelName); + logger.info("Completed pulling the '"+ modelName +"' model"); // @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 b3249b0d101..3d8353aec4f 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,8 +21,6 @@ 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; @@ -40,13 +38,14 @@ 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 Logger logger = LoggerFactory.getLogger(OllamaChatModelFunctionCallingIT.class); + private static final LogAccessor logger = new LogAccessor(OllamaChatModelFunctionCallingIT.class); private static final String MODEL = "qwen2.5:3b"; @@ -72,7 +71,7 @@ void functionCallTest() { 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"); } @@ -104,7 +103,7 @@ void streamFunctionCallTest() { .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 1fa5828e323..9e5816c2514 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,8 +19,6 @@ 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; @@ -32,6 +30,7 @@ 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; @@ -40,7 +39,7 @@ @SpringBootTest class OllamaChatModelMultimodalIT extends BaseOllamaIT { - private static final Logger logger = LoggerFactory.getLogger(OllamaChatModelMultimodalIT.class); + private static final LogAccessor logger = new LogAccessor(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 104cd91ce08..5d8d0e6fb34 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,8 +23,6 @@ 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; @@ -33,6 +31,7 @@ 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; @@ -44,7 +43,7 @@ public class OllamaApiToolFunctionCallIT extends BaseOllamaIT { private static final String MODEL = "qwen2.5:3b"; - private static final Logger logger = LoggerFactory.getLogger(OllamaApiToolFunctionCallIT.class); + private static final LogAccessor logger = new LogAccessor(OllamaApiToolFunctionCallIT.class); static OllamaApi ollamaApi; diff --git a/models/spring-ai-openai/pom.xml b/models/spring-ai-openai/pom.xml index a69a0224c08..6c1bd4fea64 100644 --- a/models/spring-ai-openai/pom.xml +++ b/models/spring-ai-openai/pom.xml @@ -75,10 +75,6 @@ org.springframework spring-context-support - - org.springframework.boot - spring-boot-starter-logging - 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 baf772ed4e7..a1981837d05 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,8 +17,6 @@ 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; @@ -32,6 +30,7 @@ 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; @@ -53,7 +52,7 @@ public class OpenAiAudioSpeechModel implements SpeechModel, StreamingSpeechModel */ private static final Float SPEED = 1.0f; - private final Logger logger = LoggerFactory.getLogger(getClass()); + private final LogAccessor logger = new LogAccessor(getClass()); /** * The default options used for the audio completion requests. @@ -132,7 +131,7 @@ public SpeechResponse call(SpeechPrompt speechPrompt) { 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 4c7bb105648..7753d13b292 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,9 +16,6 @@ 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; @@ -30,6 +27,7 @@ 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; @@ -47,7 +45,7 @@ */ public class OpenAiAudioTranscriptionModel implements Model { - private final Logger logger = LoggerFactory.getLogger(getClass()); + private static final LogAccessor logger = new LogAccessor(OpenAiAudioTranscriptionModel.class); private final OpenAiAudioTranscriptionOptions defaultOptions; @@ -118,7 +116,7 @@ public AudioTranscriptionResponse call(AudioTranscriptionPrompt transcriptionPro var transcription = transcriptionEntity.getBody(); if (transcription == null) { - logger.warn("No transcription returned for request: {}", audioResource); + logger.warn("No transcription returned for request: " + audioResource); return new AudioTranscriptionResponse(null); } @@ -139,7 +137,7 @@ public AudioTranscriptionResponse call(AudioTranscriptionPrompt transcriptionPro var transcription = transcriptionEntity.getBody(); if (transcription == null) { - logger.warn("No transcription returned for request: {}", audioResource); + logger.warn("No transcription returned for request: " + audioResource); return new AudioTranscriptionResponse(null); } diff --git a/models/spring-ai-openai/src/main/java/org/springframework/ai/openai/OpenAiChatModel.java b/models/spring-ai-openai/src/main/java/org/springframework/ai/openai/OpenAiChatModel.java index fdb7f2020c4..2c151f546fc 100644 --- a/models/spring-ai-openai/src/main/java/org/springframework/ai/openai/OpenAiChatModel.java +++ b/models/spring-ai-openai/src/main/java/org/springframework/ai/openai/OpenAiChatModel.java @@ -29,8 +29,6 @@ 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; @@ -76,6 +74,7 @@ import org.springframework.ai.retry.RetryUtils; import org.springframework.core.io.ByteArrayResource; 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; @@ -108,7 +107,7 @@ */ public class OpenAiChatModel extends AbstractToolCallSupport implements ChatModel { - private static final Logger logger = LoggerFactory.getLogger(OpenAiChatModel.class); + private static final LogAccessor logger = new LogAccessor(OpenAiChatModel.class); private static final ChatModelObservationConvention DEFAULT_OBSERVATION_CONVENTION = new DefaultChatModelObservationConvention(); @@ -241,13 +240,13 @@ public ChatResponse internalCall(Prompt prompt, ChatResponse previousChatRespons 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()); } @@ -358,7 +357,7 @@ public Flux internalStream(Prompt prompt, ChatResponse previousCha return new ChatResponse(generations, from(chatCompletion2, null, accumulatedUsage)); } catch (Exception e) { - logger.error("Error processing chat completion", e); + logger.error(e, "Error processing chat completion"); 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 22c99aefaa8..5018f3f0c17 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,8 +19,6 @@ 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; @@ -40,6 +38,7 @@ 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; @@ -52,7 +51,7 @@ */ public class OpenAiEmbeddingModel extends AbstractEmbeddingModel { - private static final Logger logger = LoggerFactory.getLogger(OpenAiEmbeddingModel.class); + private static final LogAccessor logger = new LogAccessor(OpenAiEmbeddingModel.class); private static final EmbeddingModelObservationConvention DEFAULT_OBSERVATION_CONVENTION = new DefaultEmbeddingModelObservationConvention(); @@ -163,7 +162,7 @@ public EmbeddingResponse call(EmbeddingRequest request) { .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 336a44d93bd..43e6f513d64 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,8 +19,6 @@ 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; @@ -38,6 +36,7 @@ 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; @@ -55,7 +54,7 @@ */ public class OpenAiImageModel implements ImageModel { - private static final Logger logger = LoggerFactory.getLogger(OpenAiImageModel.class); + private static final LogAccessor logger = new LogAccessor(OpenAiImageModel.class); private static final ImageModelObservationConvention DEFAULT_OBSERVATION_CONVENTION = new DefaultImageModelObservationConvention(); @@ -165,7 +164,7 @@ private ImageResponse convertResponse(ResponseEntity 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); @@ -502,7 +501,7 @@ void streamingMultiModalityImageUrl() throws IOException { .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"); } @@ -577,7 +576,7 @@ void streamingMultiModalityInputAudio(String modelName) { .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 db047a3cfbb..adffce2bab5 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,8 +30,6 @@ 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; @@ -52,6 +50,7 @@ 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; @@ -60,7 +59,7 @@ @EnabledIfEnvironmentVariable(named = "OPENAI_API_KEY", matches = ".+") class OpenAiChatModelProxyToolCallsIT { - private static final Logger logger = LoggerFactory.getLogger(OpenAiChatModelProxyToolCallsIT.class); + private static final LogAccessor logger = new LogAccessor(OpenAiChatModelProxyToolCallsIT.class); private static final String DEFAULT_MODEL = "gpt-4o-mini"; @@ -186,7 +185,7 @@ void functionCall() throws JsonMappingException, JsonProcessingException { } while (isToolCall); - logger.info("Response: {}", chatResponse); + logger.info("Response: " + chatResponse); assertThat(chatResponse.getResult().getOutput().getText()).contains("30", "10", "15"); } @@ -223,7 +222,7 @@ void functionStream() throws JsonMappingException, JsonProcessingException { .map(cr -> cr.getResult().getOutput().getText()) .collect(Collectors.joining()); - logger.info("Response: {}", response); + logger.info("Response: " + response); assertThat(response).contains("30", "10", "15"); @@ -304,7 +303,7 @@ void functionCall2() throws JsonMappingException, JsonProcessingException { return functionResponse; }); - logger.info("Response: {}", chatResponse); + logger.info("Response: " + chatResponse); assertThat(chatResponse.getResult().getOutput().getText()).contains("30", "10", "15"); } @@ -344,7 +343,7 @@ void functionStream2() throws JsonMappingException, JsonProcessingException { .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 f2f2864969f..eaaff36f18d 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,8 +25,6 @@ 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; @@ -40,6 +38,7 @@ 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; @@ -53,7 +52,7 @@ public class OpenAiChatModelResponseFormatIT { private static ObjectMapper MAPPER = new ObjectMapper().enable(DeserializationFeature.FAIL_ON_TRAILING_TOKENS); - private final Logger logger = LoggerFactory.getLogger(getClass()); + private final LogAccessor logger = new LogAccessor(getClass()); @Autowired private OpenAiChatModel openAiChatModel; @@ -91,7 +90,7 @@ void jsonObject() throws JsonMappingException, JsonProcessingException { String content = response.getResult().getOutput().getText(); - logger.info("Response content: {}", content); + logger.info("Response content: " + content); assertThat(isValidJson(content)).isTrue(); } @@ -134,7 +133,7 @@ void jsonSchema() throws JsonMappingException, JsonProcessingException { String content = response.getResult().getOutput().getText(); - logger.info("Response content: {}", content); + logger.info("Response content: " + content); assertThat(isValidJson(content)).isTrue(); } @@ -215,7 +214,7 @@ record Items(@JsonProperty(required = true, value = "explanation") String explan 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 1831095ab63..5492954943c 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,8 +22,6 @@ 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; @@ -35,6 +33,7 @@ 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; @@ -42,8 +41,7 @@ @EnabledIfEnvironmentVariable(named = "OPENAI_API_KEY", matches = ".+") class OpenAiChatModelTypeReferenceBeanOutputConverterIT extends AbstractIT { - private static final Logger logger = LoggerFactory - .getLogger(OpenAiChatModelTypeReferenceBeanOutputConverterIT.class); + private static final LogAccessor logger = new LogAccessor(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 f2a92a1efe9..fee7902fc57 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,8 +24,6 @@ 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,6 +46,7 @@ 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; @@ -58,7 +57,7 @@ @EnabledIfEnvironmentVariable(named = "OPENAI_API_KEY", matches = ".*") public class OpenAiPaymentTransactionIT { - private static final Logger logger = LoggerFactory.getLogger(OpenAiPaymentTransactionIT.class); + private static final LogAccessor logger = new LogAccessor(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")); @@ -132,7 +131,7 @@ record TransactionStatusResponse(String id, String status) { private static class LoggingAdvisor implements CallAroundAdvisor { - private final Logger logger = LoggerFactory.getLogger(LoggingAdvisor.class); + private static final LogAccessor logger = new LogAccessor(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 20ca78309c1..1c3d4e5ffaf 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,8 +25,6 @@ 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; @@ -64,6 +62,7 @@ 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; @@ -84,7 +83,7 @@ @ExtendWith(MockitoExtension.class) public class OpenAiRetryTests { - private static final Logger logger = LoggerFactory.getLogger(OpenAiRetryTests.class); + private static final LogAccessor logger = new LogAccessor(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 ff4bbd7321a..cf152c68781 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,8 +28,6 @@ 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; @@ -50,6 +48,7 @@ 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; @@ -60,7 +59,7 @@ @ActiveProfiles("logging-test") class OpenAiChatClientIT extends AbstractIT { - private static final Logger logger = LoggerFactory.getLogger(OpenAiChatClientIT.class); + private static final LogAccessor logger = new LogAccessor(OpenAiChatClientIT.class); @Value("classpath:/prompts/system-message.st") private Resource systemTextResource; @@ -260,7 +259,7 @@ void functionCallTest() { .content(); // @formatter:on - logger.info("Response: {}", response); + logger.info("Response: " + response); assertThat(response).contains("30", "10", "15"); } @@ -280,7 +279,7 @@ void defaultFunctionCallTest() { .prompt().call().content(); // @formatter:on - logger.info("Response: {}", response); + logger.info("Response: " + response); assertThat(response).contains("30", "10", "15"); } @@ -301,7 +300,7 @@ void streamFunctionCallTest() { // @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"); } @@ -363,7 +362,7 @@ void streamingMultiModalityImageUrl() throws IOException { 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 5d5e6918890..ec78c50c31c 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,8 +22,6 @@ 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; @@ -32,6 +30,7 @@ import org.springframework.ai.openai.OpenAiTestConfiguration; 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 static org.assertj.core.api.Assertions.assertThat; @@ -42,8 +41,7 @@ @ActiveProfiles("logging-test") class OpenAiChatClientMethodInvokingFunctionCallbackIT { - private static final Logger logger = LoggerFactory - .getLogger(OpenAiChatClientMethodInvokingFunctionCallbackIT.class); + private static final LogAccessor logger = new LogAccessor(OpenAiChatClientMethodInvokingFunctionCallbackIT.class); public static Map arguments = new ConcurrentHashMap<>(); @@ -69,7 +67,7 @@ void methodGetWeatherStatic() { .content(); // @formatter:on - logger.info("Response: {}", response); + logger.info("Response: " + response); assertThat(response).contains("30", "10", "15"); } @@ -91,7 +89,7 @@ void methodTurnLightNoResponse() { .content(); // @formatter:on - logger.info("Response: {}", response); + logger.info("Response: " + response); assertThat(arguments).containsEntry("roomName", "living room"); assertThat(arguments).containsEntry("on", true); @@ -114,7 +112,7 @@ void methodGetWeatherNonStatic() { .content(); // @formatter:on - logger.info("Response: {}", response); + logger.info("Response: " + response); assertThat(response).contains("30", "10", "15"); } @@ -137,7 +135,7 @@ void methodGetWeatherToolContext() { .content(); // @formatter:on - logger.info("Response: {}", response); + logger.info("Response: " + response); assertThat(response).contains("30", "10", "15"); assertThat(arguments).containsEntry("tool", "value"); @@ -181,7 +179,7 @@ void methodNoParameters() { .content(); // @formatter:on - logger.info("Response: {}", response); + logger.info("Response: " + response); assertThat(arguments).containsEntry("turnLivingRoomLightOn", true); } @@ -234,7 +232,7 @@ public String getWeatherWithContext(String city, Unit unit, ToolContext context) public void turnLight(String roomName, boolean on) { arguments.put("roomName", roomName); arguments.put("on", on); - logger.info("Turn light in room: {} to: {}", roomName, on); + logger.info("Turn light in room: " + roomName + " to: " + 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 915d6884561..e4f9b8502cf 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,8 +25,6 @@ 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; @@ -40,6 +38,7 @@ 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; @@ -49,7 +48,7 @@ @ActiveProfiles("logging-test") class OpenAiChatClientMultipleFunctionCallsIT extends AbstractIT { - private static final Logger logger = LoggerFactory.getLogger(OpenAiChatClientMultipleFunctionCallsIT.class); + private static final LogAccessor logger = new LogAccessor(OpenAiChatClientMultipleFunctionCallsIT.class); @Value("classpath:/prompts/system-message.st") private Resource systemTextResource; @@ -77,7 +76,7 @@ void turnFunctionsOnAndOffTest() { .content(); // @formatter:on - logger.info("Response: {}", response); + logger.info("Response: " + response); assertThat(response).doesNotContain("30", "10", "15"); @@ -93,7 +92,7 @@ void turnFunctionsOnAndOffTest() { .content(); // @formatter:on - logger.info("Response: {}", response); + logger.info("Response: " + response); assertThat(response).contains("30", "10", "15"); @@ -104,7 +103,7 @@ void turnFunctionsOnAndOffTest() { .content(); // @formatter:on - logger.info("Response: {}", response); + logger.info("Response: " + response); assertThat(response).doesNotContain("30", "10", "15"); @@ -125,7 +124,7 @@ void defaultFunctionCallTest() { .prompt().call().content(); // @formatter:on - logger.info("Response: {}", response); + logger.info("Response: " + response); assertThat(response).contains("30", "10", "15"); } @@ -169,7 +168,7 @@ else if (request.location().contains("San Francisco")) { .prompt().call().content(); // @formatter:on - logger.info("Response: {}", response); + logger.info("Response: " + response); assertThat(response).contains("30", "10", "15"); } @@ -214,7 +213,7 @@ else if (request.location().contains("San Francisco")) { .call().content(); // @formatter:on - logger.info("Response: {}", response); + logger.info("Response: " + response); assertThat(response).contains("30", "10", "15"); } @@ -235,7 +234,7 @@ void streamFunctionCallTest() { // @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 d3e022ada22..a173eb75594 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,8 +27,6 @@ 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; @@ -49,6 +47,7 @@ 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; @@ -59,7 +58,7 @@ @ActiveProfiles("logging-test") class OpenAiChatClientProxyFunctionCallsIT extends AbstractIT { - private static final Logger logger = LoggerFactory.getLogger(OpenAiChatClientMultipleFunctionCallsIT.class); + private static final LogAccessor logger = new LogAccessor(OpenAiChatClientMultipleFunctionCallsIT.class); @Value("classpath:/prompts/system-message.st") private Resource systemTextResource; @@ -177,7 +176,7 @@ void toolProxyFunctionCall() throws JsonMappingException, JsonProcessingExceptio } 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/GroqWithOpenAiChatModelIT.java b/models/spring-ai-openai/src/test/java/org/springframework/ai/openai/chat/proxy/GroqWithOpenAiChatModelIT.java index cce105b7876..1f4866c23ef 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,8 +29,6 @@ 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; @@ -60,6 +58,7 @@ 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 +68,7 @@ @Disabled("Due to rate limiting it is hard to run it in one go") class GroqWithOpenAiChatModelIT { - private static final Logger logger = LoggerFactory.getLogger(GroqWithOpenAiChatModelIT.class); + private static final LogAccessor logger = new LogAccessor(GroqWithOpenAiChatModelIT.class); private static final String GROQ_BASE_URL = "https://api.groq.com/openai"; @@ -258,7 +257,7 @@ void functionCallTest() { 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"); } @@ -289,7 +288,7 @@ void streamFunctionCallTest() { .map(Generation::getOutput) .map(AssistantMessage::getText) .collect(Collectors.joining()); - logger.info("Response: {}", content); + logger.info("Response: " + content); assertThat(content).contains("30", "10", "15"); } @@ -351,7 +350,7 @@ void streamingMultiModalityImageUrl() throws IOException { .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 7071f3608be..cfb073c68ff 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,8 +29,6 @@ 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; @@ -60,6 +58,7 @@ 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 +67,7 @@ @EnabledIfEnvironmentVariable(named = "MISTRAL_AI_API_KEY", matches = ".+") class MistralWithOpenAiChatModelIT { - private static final Logger logger = LoggerFactory.getLogger(MistralWithOpenAiChatModelIT.class); + private static final LogAccessor logger = new LogAccessor(MistralWithOpenAiChatModelIT.class); private static final String MISTRAL_BASE_URL = "https://api.mistral.ai"; @@ -260,7 +259,7 @@ void functionCallTest(String modelName) { 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"); } @@ -293,7 +292,7 @@ void streamFunctionCallTest(String modelName) { .map(Generation::getOutput) .map(AssistantMessage::getText) .collect(Collectors.joining()); - logger.info("Response: {}", content); + logger.info("Response: " + content); assertThat(content).contains("30", "10", "15"); } @@ -355,7 +354,7 @@ void streamingMultiModalityImageUrl() throws IOException { .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 4983e96c7e9..a339af3fd1c 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,8 +25,6 @@ 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; @@ -54,6 +52,7 @@ 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; @@ -66,7 +65,7 @@ @Disabled("Requires NVIDIA credits") class NvidiaWithOpenAiChatModelIT { - private static final Logger logger = LoggerFactory.getLogger(NvidiaWithOpenAiChatModelIT.class); + private static final LogAccessor logger = new LogAccessor(NvidiaWithOpenAiChatModelIT.class); private static final String NVIDIA_BASE_URL = "https://integrate.api.nvidia.com"; @@ -255,7 +254,7 @@ void functionCallTest() { 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"); } @@ -286,7 +285,7 @@ void streamFunctionCallTest() { .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 c4637097fd8..c52bfd50df3 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-2024 the original author or authors. + * Copyright 2023-2025 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -29,8 +29,6 @@ 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; @@ -63,6 +61,7 @@ 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; @@ -72,7 +71,7 @@ @SpringBootTest(classes = OllamaWithOpenAiChatModelIT.Config.class) class OllamaWithOpenAiChatModelIT { - private static final Logger logger = LoggerFactory.getLogger(OllamaWithOpenAiChatModelIT.class); + private static final LogAccessor logger = new LogAccessor(OllamaWithOpenAiChatModelIT.class); private static final String DEFAULT_OLLAMA_MODEL = "mistral"; @@ -281,7 +280,7 @@ void functionCallTest(String modelName) { 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"); } @@ -317,7 +316,7 @@ void streamFunctionCallTest(String modelName) { .map(Generation::getOutput) .map(AssistantMessage::getText) .collect(Collectors.joining()); - logger.info("Response: {}", content); + logger.info("Response: " + content); assertThat(content).contains("30", "10", "15"); } @@ -380,7 +379,7 @@ void streamingMultiModalityImageUrl(String modelName) throws IOException { .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 ceb6c944121..03c0bf67c77 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,8 +25,6 @@ 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; @@ -55,6 +53,7 @@ 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; @@ -77,7 +76,7 @@ @Disabled("Requires Perplexity credits") class PerplexityWithOpenAiChatModelIT { - private static final Logger logger = LoggerFactory.getLogger(PerplexityWithOpenAiChatModelIT.class); + private static final LogAccessor logger = new LogAccessor(PerplexityWithOpenAiChatModelIT.class); private static final String PERPLEXITY_BASE_URL = "https://api.perplexity.ai"; @@ -267,7 +266,7 @@ void functionCallTest() { 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(); } @@ -297,7 +296,7 @@ void streamFunctionCallTest() { .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 90a0de6b674..adeb757ced0 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,9 +19,6 @@ 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; @@ -38,13 +35,14 @@ 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 Logger logger = LoggerFactory.getLogger(AbstractIT.class); + private static final LogAccessor logger = new LogAccessor(AbstractIT.class); @Autowired protected ChatModel chatModel; diff --git a/models/spring-ai-qianfan/pom.xml b/models/spring-ai-qianfan/pom.xml index a2483861c68..c29935b280b 100644 --- a/models/spring-ai-qianfan/pom.xml +++ b/models/spring-ai-qianfan/pom.xml @@ -60,11 +60,6 @@ spring-context-support - - org.springframework.boot - spring-boot-starter-logging - - 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 5f3d1ab71a3..0d6058e2cb7 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,8 +23,6 @@ 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; @@ -52,6 +50,7 @@ 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; @@ -69,7 +68,7 @@ */ public class QianFanChatModel implements ChatModel, StreamingChatModel { - private static final Logger logger = LoggerFactory.getLogger(QianFanChatModel.class); + private static final LogAccessor logger = new LogAccessor(QianFanChatModel.class); private static final ChatModelObservationConvention DEFAULT_OBSERVATION_CONVENTION = new DefaultChatModelObservationConvention(); @@ -169,7 +168,7 @@ public ChatResponse call(Prompt prompt) { 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 a77635d4a39..758ee9f4310 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,8 +19,6 @@ 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; @@ -40,6 +38,7 @@ 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; @@ -53,7 +52,7 @@ */ public class QianFanEmbeddingModel extends AbstractEmbeddingModel { - private static final Logger logger = LoggerFactory.getLogger(QianFanEmbeddingModel.class); + private static final LogAccessor logger = new LogAccessor(QianFanEmbeddingModel.class); private static final EmbeddingModelObservationConvention DEFAULT_OBSERVATION_CONVENTION = new DefaultEmbeddingModelObservationConvention(); @@ -165,12 +164,12 @@ public EmbeddingResponse call(EmbeddingRequest request) { .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 91214f58bbe..db5d74e4996 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,8 +19,6 @@ 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,6 +34,7 @@ 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; @@ -50,7 +49,7 @@ */ public class QianFanImageModel implements ImageModel { - private static final Logger logger = LoggerFactory.getLogger(QianFanImageModel.class); + private static final LogAccessor logger = new LogAccessor(QianFanImageModel.class); private static final ImageModelObservationConvention DEFAULT_OBSERVATION_CONVENTION = new DefaultImageModelObservationConvention(); @@ -175,7 +174,7 @@ private ImageResponse convertResponse(ResponseEntityspring-context-support - - org.springframework.boot - spring-boot-starter-logging - - 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 5fd6f4a8bf9..e5951ff99c1 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,8 +37,6 @@ 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; @@ -55,6 +53,7 @@ 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; @@ -89,7 +88,7 @@ public class TransformersEmbeddingModel extends AbstractEmbeddingModel implement public static final String DEFAULT_MODEL_OUTPUT_NAME = "last_hidden_state"; - private static final Log logger = LogFactory.getLog(TransformersEmbeddingModel.class); + private static final LogAccessor logger = new LogAccessor(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 5327e48b45e..4ff85a91838 100644 --- a/models/spring-ai-vertex-ai-embedding/pom.xml +++ b/models/spring-ai-vertex-ai-embedding/pom.xml @@ -83,11 +83,6 @@ spring-context-support - - org.springframework.boot - spring-boot-starter-logging - - 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 9062f6ba35b..d81410aaf47 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,8 +29,6 @@ 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; @@ -49,6 +47,7 @@ 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; @@ -64,7 +63,7 @@ */ public class VertexAiMultimodalEmbeddingModel implements DocumentEmbeddingModel { - private static final Logger logger = LoggerFactory.getLogger(VertexAiMultimodalEmbeddingModel.class); + private static final LogAccessor logger = new LogAccessor(VertexAiMultimodalEmbeddingModel.class); private static final MimeType TEXT_MIME_TYPE = MimeTypeUtils.parseMimeType("text/*"); @@ -164,7 +163,7 @@ else if (media.getMimeType().isCompatibleWith(IMAGE_MIME_TYPE)) { 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()); } } @@ -179,7 +178,7 @@ else if (media.getMimeType().isCompatibleWith(VIDEO_MIME_TYPE)) { 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 cc184d54b22..d17fd38c72b 100644 --- a/models/spring-ai-vertex-ai-gemini/pom.xml +++ b/models/spring-ai-vertex-ai-gemini/pom.xml @@ -84,11 +84,6 @@ spring-context-support - - org.springframework.boot - spring-boot-starter-logging - - org.springframework.ai 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 d79b317cda1..fff34d69854 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.Include; import com.fasterxml.jackson.annotation.JsonProperty; import com.fasterxml.jackson.annotation.JsonPropertyDescription; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; + +import org.springframework.core.log.LogAccessor; /** * @author Christian Tzolov */ public class MockWeatherService implements Function { - private final Logger logger = LoggerFactory.getLogger(getClass()); + private final LogAccessor logger = new LogAccessor(getClass()); @Override public Response apply(Request request) { @@ -47,7 +47,7 @@ else if (request.location().contains("San Francisco")) { temperature = 30; } - logger.info("Request is {}, response temperature is {}", request, temperature); + logger.info("Request is " + request + ", response temperature is " + temperature); return new Response(temperature, Unit.C); } diff --git a/models/spring-ai-vertex-ai-gemini/src/test/java/org/springframework/ai/vertexai/gemini/function/VertexAiGeminiChatModelFunctionCallingIT.java b/models/spring-ai-vertex-ai-gemini/src/test/java/org/springframework/ai/vertexai/gemini/function/VertexAiGeminiChatModelFunctionCallingIT.java index cf05a5a5257..de41a33b570 100644 --- a/models/spring-ai-vertex-ai-gemini/src/test/java/org/springframework/ai/vertexai/gemini/function/VertexAiGeminiChatModelFunctionCallingIT.java +++ b/models/spring-ai-vertex-ai-gemini/src/test/java/org/springframework/ai/vertexai/gemini/function/VertexAiGeminiChatModelFunctionCallingIT.java @@ -25,8 +25,6 @@ import com.google.cloud.vertexai.VertexAI; 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; @@ -43,6 +41,7 @@ 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; @@ -51,7 +50,7 @@ @EnabledIfEnvironmentVariable(named = "VERTEX_AI_GEMINI_LOCATION", matches = ".*") public class VertexAiGeminiChatModelFunctionCallingIT { - private final Logger logger = LoggerFactory.getLogger(getClass()); + private final LogAccessor logger = new LogAccessor(getClass()); @Autowired private VertexAiGeminiChatModel chatModel; @@ -93,7 +92,7 @@ public void functionCallExplicitOpenApiSchema() { 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"); } @@ -125,14 +124,14 @@ public void functionCallTestInferredOpenApiSchema() { ChatResponse response = this.chatModel.call(new Prompt(messages, promptOptions)); - logger.info("Response: {}", response); + logger.info("Response: " + response); assertThat(response.getResult().getOutput().getText()).containsAnyOf("15.0", "15"); ChatResponse response2 = this.chatModel .call(new Prompt("What is the payment status for transaction 696?", promptOptions)); - logger.info("Response: {}", response2); + logger.info("Response: " + response2); assertThat(response2.getResult().getOutput().getText()).containsIgnoringCase("transaction 696 is PAYED"); @@ -166,14 +165,14 @@ public void functionCallTestInferredOpenApiSchema2() { 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"); ChatResponse response2 = this.chatModel .call(new Prompt("What is the payment status for transaction 696?", promptOptions)); - logger.info("Response: {}", response2); + logger.info("Response: " + response2); assertThat(response2.getResult().getOutput().getText()).containsIgnoringCase("transaction 696 is PAYED"); @@ -208,7 +207,7 @@ public void functionCallTestInferredOpenApiSchemaStream() { .map(AssistantMessage::getText) .collect(Collectors.joining()); - logger.info("Response: {}", responseString); + logger.info("Response: " + responseString); assertThat(responseString).contains("30", "10", "15"); diff --git a/models/spring-ai-vertex-ai-gemini/src/test/java/org/springframework/ai/vertexai/gemini/function/VertexAiGeminiPaymentTransactionIT.java b/models/spring-ai-vertex-ai-gemini/src/test/java/org/springframework/ai/vertexai/gemini/function/VertexAiGeminiPaymentTransactionIT.java index 89873ce6dcd..f6c6606a179 100644 --- a/models/spring-ai-vertex-ai-gemini/src/test/java/org/springframework/ai/vertexai/gemini/function/VertexAiGeminiPaymentTransactionIT.java +++ b/models/spring-ai-vertex-ai-gemini/src/test/java/org/springframework/ai/vertexai/gemini/function/VertexAiGeminiPaymentTransactionIT.java @@ -26,8 +26,6 @@ import org.junit.jupiter.api.RepeatedTest; 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; @@ -46,6 +44,7 @@ import org.springframework.context.ApplicationContext; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Description; +import org.springframework.core.log.LogAccessor; import static org.assertj.core.api.Assertions.assertThat; @@ -57,7 +56,7 @@ @EnabledIfEnvironmentVariable(named = "VERTEX_AI_GEMINI_LOCATION", matches = ".*") public class VertexAiGeminiPaymentTransactionIT { - private static final Logger logger = LoggerFactory.getLogger(VertexAiGeminiPaymentTransactionIT.class); + private static final LogAccessor logger = new LogAccessor(VertexAiGeminiPaymentTransactionIT.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")); @@ -117,7 +116,7 @@ record TransactionStatusResponse(String id, String status) { private static class LoggingAdvisor implements CallAroundAdvisor { - private final Logger logger = LoggerFactory.getLogger(LoggingAdvisor.class); + private static final LogAccessor logger = new LogAccessor(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 c81cde7ea9a..fa0c128d181 100644 --- a/models/spring-ai-watsonx-ai/pom.xml +++ b/models/spring-ai-watsonx-ai/pom.xml @@ -50,11 +50,6 @@ ${project.parent.version} - - org.springframework.boot - spring-boot-starter-logging - - 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 169307400d7..0a10ca9a5ac 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,9 +19,6 @@ 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; @@ -32,6 +29,7 @@ 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; @@ -51,7 +49,7 @@ */ public class WatsonxAiEmbeddingModel extends AbstractEmbeddingModel { - private final Logger logger = LoggerFactory.getLogger(getClass()); + private static final LogAccessor logger = new LogAccessor(WatsonxAiEmbeddingModel.class); private final WatsonxAiApi watsonxAiApi; diff --git a/models/spring-ai-zhipuai/pom.xml b/models/spring-ai-zhipuai/pom.xml index f0f6a920fc9..85deca0f13a 100644 --- a/models/spring-ai-zhipuai/pom.xml +++ b/models/spring-ai-zhipuai/pom.xml @@ -58,11 +58,6 @@ spring-context-support - - org.springframework.boot - spring-boot-starter-logging - - 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 17d56285277..47c9d5e6910 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,8 +27,6 @@ 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; @@ -69,6 +67,7 @@ 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; @@ -88,7 +87,7 @@ */ public class ZhiPuAiChatModel extends AbstractToolCallSupport implements ChatModel, StreamingChatModel { - private static final Logger logger = LoggerFactory.getLogger(ZhiPuAiChatModel.class); + private static final LogAccessor logger = new LogAccessor(ZhiPuAiChatModel.class); private static final ChatModelObservationConvention DEFAULT_OBSERVATION_CONVENTION = new DefaultChatModelObservationConvention(); @@ -212,7 +211,7 @@ public ChatResponse call(Prompt prompt) { 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()); } @@ -297,7 +296,7 @@ public Flux stream(Prompt prompt) { return new ChatResponse(generations, from(chatCompletion2)); } catch (Exception e) { - logger.error("Error processing chat completion", e); + logger.error(e, "Error processing chat completion"); 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 0ba5666e72f..2bc97e29706 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,8 +21,6 @@ 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; @@ -41,6 +39,7 @@ 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; @@ -53,7 +52,7 @@ */ public class ZhiPuAiEmbeddingModel extends AbstractEmbeddingModel { - private static final Logger logger = LoggerFactory.getLogger(ZhiPuAiEmbeddingModel.class); + private static final LogAccessor logger = new LogAccessor(ZhiPuAiEmbeddingModel.class); private static final EmbeddingModelObservationConvention DEFAULT_OBSERVATION_CONVENTION = new DefaultEmbeddingModelObservationConvention(); @@ -175,7 +174,7 @@ public EmbeddingResponse call(EmbeddingRequest request) { 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 406221e7d8a..7dc3753ae3f 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,9 +18,6 @@ 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; @@ -30,6 +27,7 @@ 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; @@ -43,7 +41,7 @@ */ public class ZhiPuAiImageModel implements ImageModel { - private static final Logger logger = LoggerFactory.getLogger(ZhiPuAiImageModel.class); + private static final LogAccessor logger = new LogAccessor(ZhiPuAiImageModel.class); public final RetryTemplate retryTemplate; @@ -101,7 +99,7 @@ private ImageResponse convertResponse(ResponseEntity findClassesInPackage(String packageName, TypeFi .stream()// .map(bd -> TypeReference.of(Objects.requireNonNull(bd.getBeanClassName())))// .peek(tr -> { - if (log.isDebugEnabled()) { - log.debug("registering [" + tr.getName() + ']'); + if (logger.isDebugEnabled()) { + logger.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 c6fc0d794b8..17c3ff6485f 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,8 +18,6 @@ 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; @@ -31,6 +29,7 @@ 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. @@ -44,7 +43,7 @@ public class SimpleLoggerAdvisor implements CallAroundAdvisor, StreamAroundAdvis public static final Function DEFAULT_RESPONSE_TO_STRING = response -> ModelOptionsUtils .toJsonStringPrettyPrinter(response); - private static final Logger logger = LoggerFactory.getLogger(SimpleLoggerAdvisor.class); + private static final LogAccessor logger = new LogAccessor(SimpleLoggerAdvisor.class); private final Function requestToString; @@ -78,12 +77,12 @@ public int getOrder() { } 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 b8392c7ede2..61ad0d0689b 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,11 +19,9 @@ 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. @@ -36,7 +34,7 @@ */ public class ChatResponseMetadata extends AbstractResponseMetadata implements ResponseMetadata { - private static final Logger logger = LoggerFactory.getLogger(ChatResponseMetadata.class); + private static final LogAccessor logger = new LogAccessor(ChatResponseMetadata.class); private String id = ""; // Set to blank to preserve backward compat with previous @@ -140,7 +138,7 @@ public Builder keyValue(String key, Object value) { 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 b94a91f6dbd..dc0a6019d8c 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,8 +22,6 @@ 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; @@ -34,6 +32,7 @@ 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; /** @@ -46,7 +45,7 @@ */ public class MessageAggregator { - private static final Logger logger = LoggerFactory.getLogger(MessageAggregator.class); + private static final LogAccessor logger = new LogAccessor(MessageAggregator.class); public Flux aggregateAdvisedResponse(Flux advisedResponses, Consumer aggregationHandler) { @@ -168,7 +167,7 @@ public Flux aggregate(Flux fluxChatResponse, metadataPromptMetadataRef.set(PromptMetadata.empty()); metadataRateLimitRef.set(new EmptyRateLimit()); - }).doOnError(e -> logger.error("Aggregation Error", e)); + }).doOnError(e -> logger.error(e, "Aggregation Error")); } 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 ea7cf314194..a5010824d6b 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,11 +34,10 @@ 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; /** @@ -59,7 +58,7 @@ */ public class BeanOutputConverter implements StructuredOutputConverter { - private final Logger logger = LoggerFactory.getLogger(BeanOutputConverter.class); + private static final LogAccessor logger = new LogAccessor(BeanOutputConverter.class); /** * The target class type reference to which the output will be converted. @@ -227,7 +226,7 @@ public Map getJsonSchemaMap() { return this.objectMapper.readValue(this.jsonSchema, Map.class); } catch (JsonProcessingException ex) { - logger.error("Could not parse the JSON Schema to a Map object", ex); + logger.error(ex, "Could not parse the JSON Schema to a Map object"); 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 d18e0bf5dae..bef09e773b6 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,9 +23,6 @@ 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; @@ -35,6 +32,7 @@ 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; @@ -50,7 +48,7 @@ @Deprecated public class DefaultFunctionCallbackBuilder implements FunctionCallback.Builder { - private static final Logger logger = LoggerFactory.getLogger(DefaultFunctionCallbackBuilder.class); + private static final LogAccessor logger = new LogAccessor(DefaultFunctionCallbackBuilder.class); @Override public FunctionInvokingSpec function(String name, Function function) { @@ -85,8 +83,8 @@ private String generateDescription(String fromName) { String generatedDescription = ParsingUtils.reConcatenateCamelCase(fromName, " "); - logger.info("Description is not set! A best effort attempt to generate a description:'{}' from the:'{}'", - generatedDescription, fromName); + logger.info("Description is not set! A best effort attempt to generate a description:'" + generatedDescription + + "' from the:'" + 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 e3a724b1548..a026379169b 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,12 +29,11 @@ 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; @@ -57,7 +56,7 @@ @Deprecated public class MethodInvokingFunctionCallback implements FunctionCallback { - private static final Logger logger = LoggerFactory.getLogger(MethodInvokingFunctionCallback.class); + private static final LogAccessor logger = new LogAccessor(MethodInvokingFunctionCallback.class); /** * Object instance that contains the method to be invoked. If the method is static @@ -125,7 +124,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 0e6cd80d519..62a802d554b 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,9 +24,8 @@ 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; /** @@ -38,7 +37,7 @@ @SuppressWarnings({ "rawtypes", "null" }) public class ErrorLoggingObservationHandler implements ObservationHandler { - private static final Logger logger = LoggerFactory.getLogger(ErrorLoggingObservationHandler.class); + private static final LogAccessor logger = new LogAccessor(ErrorLoggingObservationHandler.class); private final Tracer tracer; @@ -48,7 +47,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 a675fd98ed4..bcccb645647 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,9 +24,8 @@ 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; /** @@ -36,7 +35,7 @@ */ public final class TracingHelper { - private static final Logger logger = LoggerFactory.getLogger(TracingHelper.class); + private static final LogAccessor logger = new LogAccessor(TracingHelper.class); private TracingHelper() { } @@ -59,7 +58,7 @@ public static Span extractOtelSpan(@Nullable TracingObservationHandler.TracingCo } } catch (NoSuchMethodException | InvocationTargetException | IllegalAccessException ex) { - logger.warn("It wasn't possible to extract the OpenTelemetry Span object from Micrometer", ex); + logger.warn(ex, "It wasn't possible to extract the OpenTelemetry Span object from Micrometer"); 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 42ab33d4d4f..fa1cd582fa0 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,13 +20,11 @@ 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; @@ -47,7 +45,7 @@ */ public final class ContextualQueryAugmenter implements QueryAugmenter { - private static final Logger logger = LoggerFactory.getLogger(ContextualQueryAugmenter.class); + private static final LogAccessor logger = new LogAccessor(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 aa64f46cf0d..20094bbed13 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,13 +20,11 @@ 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; @@ -51,7 +49,7 @@ */ public final class MultiQueryExpander implements QueryExpander { - private static final Logger logger = LoggerFactory.getLogger(MultiQueryExpander.class); + private static final LogAccessor logger = new LogAccessor(MultiQueryExpander.class); private static final PromptTemplate DEFAULT_PROMPT_TEMPLATE = new PromptTemplate(""" You are an expert at information retrieval and search optimization. @@ -97,7 +95,7 @@ public MultiQueryExpander(ChatClient.Builder chatClientBuilder, @Nullable Prompt public List expand(Query query) { Assert.notNull(query, "query cannot be null"); - logger.debug("Generating {} query variants", this.numberOfQueries); + logger.debug("Generating " + this.numberOfQueries + " query variants"); var response = this.chatClient.prompt() .user(user -> user.text(this.promptTemplate.getTemplate()) @@ -114,9 +112,8 @@ public List expand(Query query) { 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 {} variants. Returning the input query unchanged.", - this.numberOfQueries); + logger.warn("Query expansion result does not contain the requested " + this.numberOfQueries + + " variants. Returning the input query unchanged."); 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 11cb23b2271..53aaf8b4d92 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,9 +19,6 @@ 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; @@ -29,6 +26,7 @@ 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; @@ -45,7 +43,7 @@ */ public class CompressionQueryTransformer implements QueryTransformer { - private static final Logger logger = LoggerFactory.getLogger(CompressionQueryTransformer.class); + private static final LogAccessor logger = new LogAccessor(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 8dd495029ec..c7d87a8bf74 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,14 +16,12 @@ 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; @@ -41,7 +39,7 @@ */ public class RewriteQueryTransformer implements QueryTransformer { - private static final Logger logger = LoggerFactory.getLogger(RewriteQueryTransformer.class); + private static final LogAccessor logger = new LogAccessor(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}. @@ -76,7 +74,7 @@ public RewriteQueryTransformer(ChatClient.Builder chatClientBuilder, @Nullable P 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 7ddf2c7d673..1a151e286b9 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,14 +16,12 @@ 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; @@ -50,7 +48,7 @@ */ public final class TranslationQueryTransformer implements QueryTransformer { - private static final Logger logger = LoggerFactory.getLogger(TranslationQueryTransformer.class); + private static final LogAccessor logger = new LogAccessor(TranslationQueryTransformer.class); private static final PromptTemplate DEFAULT_PROMPT_TEMPLATE = new PromptTemplate(""" Given a user query, translate it to {targetLanguage}. @@ -85,7 +83,7 @@ public TranslationQueryTransformer(ChatClient.Builder chatClientBuilder, @Nullab 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 56038587fa6..5c7c8dc902a 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,11 +22,9 @@ 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; /** @@ -39,7 +37,7 @@ */ public class ConcatenationDocumentJoiner implements DocumentJoiner { - private static final Logger logger = LoggerFactory.getLogger(ConcatenationDocumentJoiner.class); + private static final LogAccessor logger = new LogAccessor(ConcatenationDocumentJoiner.class); @Override public List join(Map>> documentsForQuery) { 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 70137e2d37d..c59fef184c8 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,9 +16,15 @@ 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; @@ -27,18 +33,12 @@ 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 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. * @@ -47,7 +47,7 @@ */ public class MethodToolCallback implements ToolCallback { - private static final Logger logger = LoggerFactory.getLogger(MethodToolCallback.class); + private static final LogAccessor logger = new LogAccessor(MethodToolCallback.class); private static final ToolCallResultConverter DEFAULT_RESULT_CONVERTER = new DefaultToolCallResultConverter(); @@ -95,7 +95,7 @@ public String call(String toolInput) { 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); @@ -105,7 +105,7 @@ public String call(String toolInput, @Nullable ToolContext toolContext) { 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 ab89f2d73ef..dc130a937b3 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,27 +16,26 @@ package org.springframework.ai.tool.method; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; +import java.lang.reflect.Method; +import java.util.Arrays; +import java.util.List; +import java.util.function.Consumer; +import java.util.function.Function; +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; -import java.lang.reflect.Method; -import java.util.Arrays; -import java.util.List; -import java.util.function.Consumer; -import java.util.function.Function; -import java.util.function.Supplier; -import java.util.stream.Collectors; -import java.util.stream.Stream; - /** * A {@link ToolCallbackProvider} that builds {@link ToolCallback} instances from * {@link Tool}-annotated methods. @@ -46,7 +45,7 @@ */ public class MethodToolCallbackProvider implements ToolCallbackProvider { - private static final Logger logger = LoggerFactory.getLogger(MethodToolCallbackProvider.class); + private static final LogAccessor logger = new LogAccessor(MethodToolCallbackProvider.class); private final List toolObjects; @@ -84,8 +83,8 @@ private boolean isFunctionalType(Method toolMethod) { || ClassUtils.isAssignable(toolMethod.getReturnType(), Consumer.class); if (isFunction) { - logger.warn("Method {} is annotated with @Tool but returns a functional type. " - + "This is not supported and the method will be ignored.", toolMethod.getName()); + logger.warn("Method " + toolMethod.getName() + " is annotated with @Tool but returns a functional type. " + + "This is not supported and the method will be ignored."); } 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 793c3fb7589..7d8c3a7f967 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,16 +21,14 @@ 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 Logger logger = LoggerFactory.getLogger(TextSplitter.class); + private static final LogAccessor logger = new LogAccessor(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 c550b131397..76d2359ac55 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,8 +38,6 @@ 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; @@ -49,6 +47,7 @@ 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. @@ -70,7 +69,7 @@ */ public class SimpleVectorStore extends AbstractObservationVectorStore { - private static final Logger logger = LoggerFactory.getLogger(SimpleVectorStore.class); + private static final LogAccessor logger = new LogAccessor(SimpleVectorStore.class); private final ObjectMapper objectMapper; @@ -97,7 +96,7 @@ public void doAdd(List documents) { } 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); @@ -139,7 +138,7 @@ public void save(File file) { 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()); } @@ -151,7 +150,7 @@ public void save(File file) { } } 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)) { @@ -160,15 +159,15 @@ public void save(File file) { } } catch (IOException ex) { - logger.error("IOException occurred while saving vector store file.", ex); + logger.error(ex, "IOException occurred while saving vector store file."); throw new RuntimeException(ex); } catch (SecurityException ex) { - logger.error("SecurityException occurred while saving vector store file.", ex); + logger.error(ex, "SecurityException occurred while saving vector store file."); throw new RuntimeException(ex); } catch (NullPointerException ex) { - logger.error("NullPointerException occurred while saving vector store file.", ex); + logger.error(ex, "NullPointerException occurred while saving vector store file."); throw new RuntimeException(ex); } } 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 d1bc8fb5689..51905258c51 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,10 +16,13 @@ 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.openai.OpenAiChatModel; @@ -28,10 +31,7 @@ import org.springframework.ai.tool.method.MethodToolCallback; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; - -import java.util.List; -import java.util.Map; -import java.util.concurrent.ConcurrentHashMap; +import org.springframework.core.log.LogAccessor; import static org.assertj.core.api.Assertions.assertThat; @@ -126,7 +126,7 @@ void chatMethodCallbackDefault() { static class Tools { - private static final Logger logger = LoggerFactory.getLogger(Tools.class); + private static final LogAccessor logger = new LogAccessor(Tools.class); private final BookService bookService; @@ -141,18 +141,18 @@ void welcome() { @Tool(description = "Welcome a specific user to the library") void welcomeUser(String user) { - logger.info("Welcoming {} to the library", user); + logger.info("Welcoming " + user + " to the library"); } @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-retry/src/main/java/org/springframework/ai/retry/RetryUtils.java b/spring-ai-retry/src/main/java/org/springframework/ai/retry/RetryUtils.java index 960382d5c96..5ae5c327c33 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.nio.charset.StandardCharsets; import java.time.Duration; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; +import org.apache.commons.logging.LogFactory; +import org.springframework.core.log.LogAccessor; import org.springframework.http.client.ClientHttpResponse; import org.springframework.lang.NonNull; import org.springframework.retry.RetryCallback; @@ -41,6 +41,8 @@ */ 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 @@ -67,8 +69,6 @@ public void handleError(@NonNull ClientHttpResponse response) throws IOException } }; - 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 void handleError(@NonNull ClientHttpResponse response) throws IOException @Override public void onError(RetryContext context, RetryCallback callback, Throwable throwable) { - logger.warn("Retry error. Retry count:" + context.getRetryCount(), throwable); + logger.warn(throwable, "Retry error. Retry count:" + context.getRetryCount()); } }) .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 f815dde2e37..d1e44c569a2 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,8 +17,6 @@ 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; @@ -34,6 +32,7 @@ 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}. @@ -56,7 +55,7 @@ matchIfMissing = true) public class ChatClientAutoConfiguration { - private static final Logger logger = LoggerFactory.getLogger(ChatClientAutoConfiguration.class); + private static final LogAccessor logger = new LogAccessor(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 96a4c4ee325..a69f2d8e4b5 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,12 +18,10 @@ 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; /** @@ -38,7 +36,7 @@ public class CassandraChatMemoryProperties extends CommonChatMemoryProperties { public static final String CONFIG_PREFIX = "spring.ai.chat.memory.cassandra"; - private static final Logger logger = LoggerFactory.getLogger(CassandraChatMemoryProperties.class); + private static final LogAccessor logger = new LogAccessor(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 f439263fdad..0349773f11a 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,8 +21,6 @@ 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; @@ -47,6 +45,7 @@ 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. @@ -60,7 +59,7 @@ @EnableConfigurationProperties({ ChatObservationProperties.class }) public class ChatObservationAutoConfiguration { - private static final Logger logger = LoggerFactory.getLogger(ChatObservationAutoConfiguration.class); + private static final LogAccessor logger = new LogAccessor(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 a89a42102a3..971b7d4f145 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-2024 the original author or authors. + * Copyright 2023-2025 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -16,9 +16,6 @@ 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; @@ -27,6 +24,7 @@ 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. @@ -40,7 +38,7 @@ @EnableConfigurationProperties({ ImageObservationProperties.class }) public class ImageObservationAutoConfiguration { - private static final Logger logger = LoggerFactory.getLogger(ImageObservationAutoConfiguration.class); + private static final LogAccessor logger = new LogAccessor(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 b17b4bfc871..dd4103755c5 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,9 +19,6 @@ 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; @@ -30,6 +27,7 @@ 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; @@ -50,7 +48,7 @@ @EnableConfigurationProperties({ SpringAiRetryProperties.class }) public class SpringAiRetryAutoConfiguration { - private static final Logger logger = LoggerFactory.getLogger(SpringAiRetryAutoConfiguration.class); + private static final LogAccessor logger = new LogAccessor(SpringAiRetryAutoConfiguration.class); @Bean @ConditionalOnMissingBean @@ -65,7 +63,7 @@ public RetryTemplate retryTemplate(SpringAiRetryProperties properties) { @Override public void onError(RetryContext context, RetryCallback callback, Throwable throwable) { - logger.warn("Retry error. Retry count:" + context.getRetryCount(), throwable); + logger.warn(throwable, "Retry error. Retry count:" + context.getRetryCount()); } }) .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 19174772f6b..49b42ba2a2c 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-2024 the original author or authors. + * Copyright 2023-2025 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -17,12 +17,12 @@ package org.springframework.ai.autoconfigure.vectorstore.cassandra; import com.google.api.client.util.Preconditions; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; +import org.apache.commons.logging.LogFactory; 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 Logger logger = LoggerFactory.getLogger(CassandraVectorStoreProperties.class); + private static final LogAccessor logger = new LogAccessor(LogFactory.getLog(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 b69a48e1beb..7b2561c7149 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,8 +17,7 @@ package org.springframework.ai.autoconfigure.vectorstore.observation; import io.micrometer.tracing.otel.bridge.OtelTracer; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; +import org.apache.commons.logging.LogFactory; import org.springframework.ai.vectorstore.VectorStore; import org.springframework.ai.vectorstore.observation.VectorStoreQueryResponseObservationFilter; @@ -32,6 +31,7 @@ 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,7 +46,8 @@ @EnableConfigurationProperties({ VectorStoreObservationProperties.class }) public class VectorStoreObservationAutoConfiguration { - private static final Logger logger = LoggerFactory.getLogger(VectorStoreObservationAutoConfiguration.class); + private static final LogAccessor logger = new LogAccessor( + LogFactory.getLog(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 5b41f15aee7..b4084ac0ba0 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,8 +19,6 @@ 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; @@ -35,13 +33,14 @@ 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 Log logger = LogFactory.getLog(AnthropicAutoConfigurationIT.class); + private static final LogAccessor logger = new LogAccessor(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 51e9e39be2f..ee110e5541e 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,8 +21,6 @@ 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; @@ -39,13 +37,14 @@ 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 Logger logger = LoggerFactory.getLogger(FunctionCallWithFunctionBeanIT.class); + private final LogAccessor logger = new LogAccessor(FunctionCallWithFunctionBeanIT.class); private final ApplicationContextRunner contextRunner = new ApplicationContextRunner() .withPropertyValues("spring.ai.anthropic.apiKey=" + System.getenv("ANTHROPIC_API_KEY")) @@ -68,14 +67,14 @@ void functionCallTest() { 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"); @@ -98,7 +97,7 @@ void functionCallWithPortableFunctionCallingOptions() { 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 76d58b8b57a..332f1e55a7b 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,8 +20,6 @@ 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; @@ -33,13 +31,14 @@ import org.springframework.ai.model.function.FunctionCallback; 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 final Logger logger = LoggerFactory.getLogger(FunctionCallWithPromptFunctionIT.class); + private static final LogAccessor logger = new LogAccessor(FunctionCallWithPromptFunctionIT.class); private final ApplicationContextRunner contextRunner = new ApplicationContextRunner() .withPropertyValues("spring.ai.anthropic.apiKey=" + System.getenv("ANTHROPIC_API_KEY")) @@ -67,7 +66,7 @@ void functionCallTest() { 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 3841ffe04d9..1a09f9b6306 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,8 +21,6 @@ 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; @@ -37,6 +35,7 @@ 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; @@ -44,7 +43,7 @@ @EnabledIfEnvironmentVariable(named = "AZURE_OPENAI_ENDPOINT", matches = ".+") class FunctionCallWithFunctionBeanIT { - private final Logger logger = LoggerFactory.getLogger(FunctionCallWithFunctionBeanIT.class); + private static final LogAccessor logger = new LogAccessor(FunctionCallWithFunctionBeanIT.class); private final ApplicationContextRunner contextRunner = new ApplicationContextRunner().withPropertyValues( // @formatter:off @@ -69,14 +68,14 @@ void functionCallTest() { 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"); @@ -98,7 +97,7 @@ void functionCallWithPortableFunctionCallingOptions() { 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/azure/tool/FunctionCallWithFunctionWrapperIT.java b/spring-ai-spring-boot-autoconfigure/src/test/java/org/springframework/ai/autoconfigure/azure/tool/FunctionCallWithFunctionWrapperIT.java index fa9b39c1fe5..64c2831857e 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,8 +20,6 @@ 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; @@ -34,6 +32,7 @@ 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 +40,7 @@ @EnabledIfEnvironmentVariable(named = "AZURE_OPENAI_ENDPOINT", matches = ".+") public class FunctionCallWithFunctionWrapperIT { - private final Logger logger = LoggerFactory.getLogger(FunctionCallWithFunctionWrapperIT.class); + private static final LogAccessor logger = new LogAccessor(FunctionCallWithFunctionWrapperIT.class); private final ApplicationContextRunner contextRunner = new ApplicationContextRunner().withPropertyValues( // @formatter:off @@ -66,7 +65,7 @@ void functionCallTest() { 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 31f00954fa2..8d7c8399878 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,8 +20,6 @@ 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; @@ -32,6 +30,7 @@ import org.springframework.ai.model.function.FunctionCallback; 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 +38,7 @@ @EnabledIfEnvironmentVariable(named = "AZURE_OPENAI_ENDPOINT", matches = ".+") public class FunctionCallWithPromptFunctionIT { - private final Logger logger = LoggerFactory.getLogger(FunctionCallWithPromptFunctionIT.class); + private final LogAccessor logger = new LogAccessor(FunctionCallWithPromptFunctionIT.class); private final ApplicationContextRunner contextRunner = new ApplicationContextRunner().withPropertyValues( // @formatter:off @@ -70,7 +69,7 @@ void functionCallTest() { 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 936f4b59f6e..8125fa759f8 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,8 +19,6 @@ 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; @@ -34,13 +32,14 @@ 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 Log logger = LogFactory.getLog(BedrockConverseProxyChatAutoConfigurationIT.class); + private static final LogAccessor logger = new LogAccessor(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 3cf71bec9dd..f7eda1d82aa 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,8 +21,6 @@ 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; @@ -38,13 +36,14 @@ 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 final Logger logger = LoggerFactory.getLogger(FunctionCallWithFunctionBeanIT.class); + private static final LogAccessor logger = new LogAccessor(FunctionCallWithFunctionBeanIT.class); private final ApplicationContextRunner contextRunner = BedrockTestUtils.getContextRunner() .withConfiguration(AutoConfigurations.of(BedrockConverseProxyChatAutoConfiguration.class)) @@ -66,14 +65,14 @@ void functionCallTest() { 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), FunctionCallingOptions.builder().function("weatherFunction3").build())); - logger.info("Response: {}", response); + logger.info("Response: " + response); assertThat(response.getResult().getOutput().getText()).contains("30", "10", "15"); }); @@ -102,7 +101,7 @@ void functionStreamTest() { .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 5066c0a8950..b9e6b59dc97 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,8 +19,6 @@ 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; @@ -33,13 +31,14 @@ import org.springframework.ai.model.function.FunctionCallingOptions; 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 final Logger logger = LoggerFactory.getLogger(FunctionCallWithPromptFunctionIT.class); + private static final LogAccessor logger = new LogAccessor(FunctionCallWithPromptFunctionIT.class); private final ApplicationContextRunner contextRunner = BedrockTestUtils.getContextRunner() .withConfiguration(AutoConfigurations.of(BedrockConverseProxyChatAutoConfiguration.class)); @@ -66,7 +65,7 @@ void functionCallTest() { 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 ae04bbd8659..097135a452e 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,8 +18,6 @@ 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; @@ -32,6 +30,7 @@ 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 +40,7 @@ @EnabledIfEnvironmentVariable(named = "OPENAI_API_KEY", matches = ".*") public class ChatClientAutoConfigurationIT { - private static final Log logger = LogFactory.getLog(ChatClientAutoConfigurationIT.class); + private static final LogAccessor logger = new LogAccessor(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 e3980a13ab0..6bdbddea7e4 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,8 +19,6 @@ 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; @@ -34,6 +32,7 @@ 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; @@ -41,7 +40,7 @@ @EnabledIfEnvironmentVariable(named = "HUGGINGFACE_CHAT_URL", matches = ".+") public class HuggingfaceChatAutoConfigurationIT { - private static final Log logger = LogFactory.getLog(HuggingfaceChatAutoConfigurationIT.class); + private static final LogAccessor logger = new LogAccessor(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 5e9c88ad9ff..309a12f73a1 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,8 +21,6 @@ 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,6 +35,7 @@ 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 +45,7 @@ @EnabledIfEnvironmentVariable(named = "MINIMAX_API_KEY", matches = ".*") public class FunctionCallbackInPromptIT { - private final Logger logger = LoggerFactory.getLogger(FunctionCallbackInPromptIT.class); + private static final LogAccessor logger = new LogAccessor(FunctionCallbackInPromptIT.class); private final ApplicationContextRunner contextRunner = new ApplicationContextRunner() .withPropertyValues("spring.ai.minimax.apiKey=" + System.getenv("MINIMAX_API_KEY")) @@ -72,7 +71,7 @@ void functionCallTest() { 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"); }); @@ -106,7 +105,7 @@ void streamingFunctionCallTest() { .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 bedb41f5d7b..631c4270de3 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,8 +22,6 @@ 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; @@ -41,6 +39,7 @@ 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 +49,7 @@ @EnabledIfEnvironmentVariable(named = "MINIMAX_API_KEY", matches = ".*") class FunctionCallbackWithPlainFunctionBeanIT { - private final Logger logger = LoggerFactory.getLogger(FunctionCallbackWithPlainFunctionBeanIT.class); + private static final LogAccessor logger = new LogAccessor(FunctionCallbackWithPlainFunctionBeanIT.class); private final ApplicationContextRunner contextRunner = new ApplicationContextRunner() .withPropertyValues("spring.ai.minimax.apiKey=" + System.getenv("MINIMAX_API_KEY")) @@ -72,7 +71,7 @@ void functionCallTest() { 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"); @@ -80,7 +79,7 @@ void functionCallTest() { 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"); @@ -103,7 +102,7 @@ void functionCallWithPortableFunctionCallingOptions() { ChatResponse response = chatModel.call(new Prompt(List.of(userMessage), functionOptions)); - logger.info("Response: {}", response); + logger.info("Response: " + response); }); } @@ -129,7 +128,7 @@ void streamFunctionCallTest() { .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"); @@ -147,7 +146,7 @@ void streamFunctionCallTest() { .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 6a3893274a6..9107511ffc1 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,8 +19,6 @@ 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; @@ -35,6 +33,7 @@ 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; @@ -44,7 +43,7 @@ @EnabledIfEnvironmentVariable(named = "MINIMAX_API_KEY", matches = ".*") public class MiniMaxAutoConfigurationIT { - private static final Log logger = LogFactory.getLog(MiniMaxAutoConfigurationIT.class); + private static final LogAccessor logger = new LogAccessor(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 c3937895cdf..f977689e182 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,8 +21,6 @@ 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,6 +37,7 @@ 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 +47,7 @@ @EnabledIfEnvironmentVariable(named = "MINIMAX_API_KEY", matches = ".*") public class MiniMaxFunctionCallbackIT { - private final Logger logger = LoggerFactory.getLogger(MiniMaxFunctionCallbackIT.class); + private static final LogAccessor logger = new LogAccessor(MiniMaxFunctionCallbackIT.class); private final ApplicationContextRunner contextRunner = new ApplicationContextRunner() .withPropertyValues("spring.ai.minimax.apiKey=" + System.getenv("MINIMAX_API_KEY")) @@ -68,7 +67,7 @@ void functionCallTest() { 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"); @@ -95,7 +94,7 @@ void streamFunctionCallTest() { .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 99d91c6f3b0..29b823a2004 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,8 +19,6 @@ 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,6 +31,7 @@ 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; @@ -43,7 +42,7 @@ @EnabledIfEnvironmentVariable(named = "MISTRAL_AI_API_KEY", matches = ".*") public class MistralAiAutoConfigurationIT { - private static final Log logger = LogFactory.getLog(MistralAiAutoConfigurationIT.class); + private static final LogAccessor logger = new LogAccessor(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 36f7c8b3880..20bb516b06d 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,8 +23,6 @@ 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; @@ -38,6 +36,7 @@ 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 +48,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 final Logger logger = LoggerFactory.getLogger(PaymentStatusBeanIT.class); + private static final LogAccessor logger = new LogAccessor(PaymentStatusBeanIT.class); private final ApplicationContextRunner contextRunner = new ApplicationContextRunner() .withPropertyValues("spring.ai.mistralai.apiKey=" + System.getenv("MISTRAL_AI_API_KEY")) @@ -72,7 +71,7 @@ void functionCallTest() { .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 321d00f646b..550a1bcab4d 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,8 +23,6 @@ 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; @@ -38,6 +36,7 @@ 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; @@ -55,7 +54,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 final Logger logger = LoggerFactory.getLogger(PaymentStatusBeanIT.class); + private static final LogAccessor logger = new LogAccessor(PaymentStatusBeanIT.class); private final ApplicationContextRunner contextRunner = new ApplicationContextRunner() .withPropertyValues("spring.ai.openai.apiKey=" + System.getenv("MISTRAL_AI_API_KEY"), @@ -79,7 +78,7 @@ void functionCallTest() { .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 292b7549c1f..93b6b46b172 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,8 +22,6 @@ 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; @@ -35,6 +33,7 @@ import org.springframework.ai.model.function.FunctionCallback; 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; @@ -47,7 +46,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 final Logger logger = LoggerFactory.getLogger(WeatherServicePromptIT.class); + private static final LogAccessor logger = new LogAccessor(WeatherServicePromptIT.class); private final ApplicationContextRunner contextRunner = new ApplicationContextRunner() .withPropertyValues("spring.ai.mistralai.apiKey=" + System.getenv("MISTRAL_AI_API_KEY")) @@ -74,7 +73,7 @@ void functionCallTest() { 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 3c3874c723f..0fa7e93e47e 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,8 +24,6 @@ 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; @@ -41,6 +39,7 @@ import org.springframework.ai.model.function.FunctionCallingOptions; 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; @@ -52,7 +51,7 @@ @EnabledIfEnvironmentVariable(named = "MISTRAL_AI_API_KEY", matches = ".*") public class WeatherServicePromptIT { - private final Logger logger = LoggerFactory.getLogger(WeatherServicePromptIT.class); + private static final LogAccessor logger = new LogAccessor(WeatherServicePromptIT.class); private final ApplicationContextRunner contextRunner = new ApplicationContextRunner() .withPropertyValues("spring.ai.mistralai.api-key=" + System.getenv("MISTRAL_AI_API_KEY")) @@ -82,7 +81,7 @@ void promptFunctionCall() { 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"); }); @@ -109,7 +108,7 @@ void functionCallWithPortableFunctionCallingOptions() { 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 cf8cdd647a3..0c8580218fd 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,8 +19,6 @@ 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; @@ -33,6 +31,7 @@ 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; @@ -42,7 +41,7 @@ @EnabledIfEnvironmentVariable(named = "MOONSHOT_API_KEY", matches = ".*") public class MoonshotAutoConfigurationIT { - private static final Log logger = LogFactory.getLog(MoonshotAutoConfigurationIT.class); + private static final LogAccessor logger = new LogAccessor(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 bd20fbb9d16..123374fa8f3 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,8 +21,6 @@ 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; @@ -38,6 +36,7 @@ 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; @@ -48,7 +47,7 @@ @EnabledIfEnvironmentVariable(named = "MOONSHOT_API_KEY", matches = ".*") public class FunctionCallbackInPromptIT { - private final Logger logger = LoggerFactory.getLogger(FunctionCallbackInPromptIT.class); + private static final LogAccessor logger = new LogAccessor(FunctionCallbackInPromptIT.class); private final ApplicationContextRunner contextRunner = new ApplicationContextRunner() .withPropertyValues("spring.ai.moonshot.apiKey=" + System.getenv("MOONSHOT_API_KEY")) @@ -74,7 +73,7 @@ void functionCallTest() { 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 +107,7 @@ void streamingFunctionCallTest() { .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 a9beae2cf90..1dad6079b0d 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,8 +22,6 @@ 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; @@ -42,6 +40,7 @@ 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 +51,7 @@ @EnabledIfEnvironmentVariable(named = "MOONSHOT_API_KEY", matches = ".*") class FunctionCallbackWithPlainFunctionBeanIT { - private final Logger logger = LoggerFactory.getLogger(FunctionCallbackWithPlainFunctionBeanIT.class); + private static final LogAccessor logger = new LogAccessor(FunctionCallbackWithPlainFunctionBeanIT.class); private final ApplicationContextRunner contextRunner = new ApplicationContextRunner() .withPropertyValues("spring.ai.moonshot.apiKey=" + System.getenv("MOONSHOT_API_KEY")) @@ -73,7 +72,7 @@ void functionCallTest() { 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"); @@ -81,7 +80,7 @@ void functionCallTest() { 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"); @@ -104,7 +103,7 @@ void functionCallWithPortableFunctionCallingOptions() { ChatResponse response = chatModel.call(new Prompt(List.of(userMessage), functionOptions)); - logger.info("Response: {}", response); + logger.info("Response: " + response); }); } @@ -129,7 +128,7 @@ void streamFunctionCallTest() { .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"); @@ -147,7 +146,7 @@ void streamFunctionCallTest() { .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 fed437ef665..dab3784ec83 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,8 +22,6 @@ 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; @@ -41,6 +39,7 @@ 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; @@ -51,7 +50,7 @@ @EnabledIfEnvironmentVariable(named = "MOONSHOT_API_KEY", matches = ".*") public class MoonshotFunctionCallbackIT { - private final Logger logger = LoggerFactory.getLogger(MoonshotFunctionCallbackIT.class); + private static final LogAccessor logger = new LogAccessor(MoonshotFunctionCallbackIT.class); private final ApplicationContextRunner contextRunner = new ApplicationContextRunner() .withPropertyValues("spring.ai.moonshot.apiKey=" + System.getenv("MOONSHOT_API_KEY")) @@ -71,7 +70,7 @@ void functionCallTest() { 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"); @@ -99,7 +98,7 @@ void streamFunctionCallTest() { .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 a5abc72702d..23ad3daaacc 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,8 +21,6 @@ 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; @@ -37,12 +35,13 @@ import org.springframework.ai.ollama.api.OllamaOptions; 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 Logger logger = LoggerFactory.getLogger(FunctionCallbackInPromptIT.class); + private static final LogAccessor logger = new LogAccessor(FunctionCallbackInPromptIT.class); private static final String MODEL_NAME = "qwen2.5:3b"; @@ -80,7 +79,7 @@ void functionCallTest() { 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"); }); @@ -114,7 +113,7 @@ void streamingFunctionCallTest() { .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 6e0ad7d1c6a..736c9308c96 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,8 +21,6 @@ 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; @@ -40,12 +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.core.log.LogAccessor; import static org.assertj.core.api.Assertions.assertThat; public class OllamaFunctionCallbackIT extends BaseOllamaIT { - private static final Logger logger = LoggerFactory.getLogger(OllamaFunctionCallbackIT.class); + private static final LogAccessor logger = new LogAccessor(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/openai/OpenAiAutoConfigurationIT.java b/spring-ai-spring-boot-autoconfigure/src/test/java/org/springframework/ai/autoconfigure/openai/OpenAiAutoConfigurationIT.java index 0ebe376bcaf..2a14e0e20e1 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,8 +20,6 @@ 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; @@ -43,13 +41,14 @@ 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 Log logger = LogFactory.getLog(OpenAiAutoConfigurationIT.class); + private static final LogAccessor logger = new LogAccessor(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 0eaaf47627f..19f87a3d94b 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,8 +22,6 @@ 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; @@ -32,13 +30,14 @@ import org.springframework.ai.openai.api.OpenAiApi.ChatModel; 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 final Logger logger = LoggerFactory.getLogger(FunctionCallbackInPromptIT.class); + private static final LogAccessor logger = new LogAccessor(FunctionCallbackInPromptIT.class); private final ApplicationContextRunner contextRunner = new ApplicationContextRunner() .withPropertyValues("spring.ai.openai.apiKey=" + System.getenv("OPENAI_API_KEY")) @@ -68,7 +67,7 @@ void functionCallTest() { .call().content(); // @formatter:on - logger.info("Response: {}", content); + logger.info("Response: " + content); assertThat(content).contains("30", "10", "15"); }); @@ -98,7 +97,7 @@ record LightInfo(String roomName, boolean isOn) { .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); }); @@ -121,7 +120,7 @@ void functionCallTest2() { .build()) .call().content(); // @formatter:on - logger.info("Response: {}", content); + logger.info("Response: " + content); assertThat(content).contains("18"); }); @@ -147,7 +146,7 @@ void streamingFunctionCallTest() { .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 9c073bb5cfa..539e137e14f 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,8 +21,6 @@ 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; @@ -37,13 +35,14 @@ import org.springframework.ai.openai.api.OpenAiApi.ChatModel; 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 final Logger logger = LoggerFactory.getLogger(FunctionCallbackInPromptIT.class); + private static final LogAccessor logger = new LogAccessor(FunctionCallbackInPromptIT.class); private final ApplicationContextRunner contextRunner = new ApplicationContextRunner() .withPropertyValues("spring.ai.openai.apiKey=" + System.getenv("OPENAI_API_KEY")) @@ -71,7 +70,7 @@ void functionCallTest() { 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 +107,7 @@ void streamingFunctionCallTest() { .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 9bc4b3b7995..039790be542 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,8 +28,6 @@ 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; @@ -49,13 +47,14 @@ 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 Logger logger = LoggerFactory.getLogger(FunctionCallbackWithPlainFunctionBeanIT.class); + private static final LogAccessor logger = new LogAccessor(FunctionCallbackWithPlainFunctionBeanIT.class); private final ApplicationContextRunner contextRunner = new ApplicationContextRunner() .withPropertyValues("spring.ai.openai.apiKey=" + System.getenv("OPENAI_API_KEY"), @@ -82,7 +81,7 @@ void functionCallingVoidInput() { 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)); }); @@ -100,7 +99,7 @@ void functionCallingSupplier() { 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)); }); @@ -118,7 +117,7 @@ void functionCallingVoidOutput() { 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)); @@ -137,7 +136,7 @@ void functionCallingConsumer() { 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)); @@ -161,7 +160,7 @@ void trainScheduler() { ChatResponse response = chatModel.call(new Prompt(List.of(userMessage), functionOptions)); - logger.info("Response: {}", response.getResult().getOutput().getText()); + logger.info("Response: " + response.getResult().getOutput().getText()); }); } @@ -190,7 +189,7 @@ void functionCallWithDirectBiFunction() { .toolContext(Map.of("sessionId", "123")) .build())); - logger.info("Response: {}", response); + logger.info("Response: " + response); assertThat(response.getResult().getOutput().getText()).contains("30", "10", "15"); @@ -222,7 +221,7 @@ void functionCallWithBiFunctionClass() { .toolContext(Map.of("sessionId", "123")) .build())); - logger.info("Response: {}", response); + logger.info("Response: " + response); assertThat(response.getResult().getOutput().getText()).contains("30", "10", "15"); @@ -242,7 +241,7 @@ void functionCallTest() { 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"); @@ -250,7 +249,7 @@ void functionCallTest() { 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"); @@ -272,7 +271,7 @@ void functionCallWithPortableFunctionCallingOptions() { 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"); }); @@ -299,7 +298,7 @@ void streamFunctionCallTest() { .map(Generation::getOutput) .map(AssistantMessage::getText) .collect(Collectors.joining()); - logger.info("Response: {}", content); + logger.info("Response: " + content); assertThat(content).contains("30", "10", "15"); @@ -315,7 +314,7 @@ void streamFunctionCallTest() { .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 3499278e938..49dfeca8704 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,8 +20,6 @@ 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; @@ -32,13 +30,14 @@ 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 final Logger logger = LoggerFactory.getLogger(OpenAiFunctionCallback2IT.class); + private static final LogAccessor logger = new LogAccessor(OpenAiFunctionCallback2IT.class); private final ApplicationContextRunner contextRunner = new ApplicationContextRunner() .withPropertyValues("spring.ai.openai.apiKey=" + System.getenv("OPENAI_API_KEY"), @@ -63,7 +62,7 @@ void functionCallTest() { .call().content(); // @formatter:on - logger.info("Response: {}", content); + logger.info("Response: " + content); assertThat(content).contains("30", "10", "15"); }); @@ -83,7 +82,7 @@ void streamFunctionCallTest() { .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 fee427db38a..dbb6eea2357 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,8 +21,6 @@ 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; @@ -39,13 +37,14 @@ 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 final Logger logger = LoggerFactory.getLogger(OpenAiFunctionCallbackIT.class); + private static final LogAccessor logger = new LogAccessor(OpenAiFunctionCallbackIT.class); private final ApplicationContextRunner contextRunner = new ApplicationContextRunner() .withPropertyValues("spring.ai.openai.apiKey=" + System.getenv("OPENAI_API_KEY"), @@ -64,7 +63,7 @@ void functionCallTest() { 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 +90,7 @@ void streamFunctionCallTest() { .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 78842991257..f04ed5d815c 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,8 +20,6 @@ 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; @@ -40,6 +38,7 @@ 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; @@ -50,7 +49,7 @@ @EnabledIfEnvironmentVariable(named = "QIANFAN_SECRET_KEY", matches = ".+") }) public class QianFanAutoConfigurationIT { - private static final Log logger = LogFactory.getLog(QianFanAutoConfigurationIT.class); + private static final LogAccessor logger = new LogAccessor(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 ca2cdeb3a02..5ad44895e60 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,8 +18,6 @@ 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; @@ -30,6 +28,7 @@ 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; @@ -37,7 +36,7 @@ @EnabledIfEnvironmentVariable(named = "VERTEX_AI_GEMINI_LOCATION", matches = ".*") public class VertexAiGeminiAutoConfigurationIT { - private static final Log logger = LogFactory.getLog(VertexAiGeminiAutoConfigurationIT.class); + private static final LogAccessor logger = new LogAccessor(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 92769b23488..304bff8fcfc 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,8 +21,6 @@ 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; @@ -36,6 +34,7 @@ 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 +42,7 @@ @EnabledIfEnvironmentVariable(named = "VERTEX_AI_GEMINI_LOCATION", matches = ".*") class FunctionCallWithFunctionBeanIT { - private final Logger logger = LoggerFactory.getLogger(FunctionCallWithFunctionBeanIT.class); + private static final LogAccessor logger = new LogAccessor(FunctionCallWithFunctionBeanIT.class); private final ApplicationContextRunner contextRunner = new ApplicationContextRunner() .withPropertyValues("spring.ai.vertex.ai.gemini.project-id=" + System.getenv("VERTEX_AI_GEMINI_PROJECT_ID"), @@ -71,21 +70,21 @@ void functionCallTest() { 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"); @@ -111,14 +110,14 @@ void functionCallWithPortableFunctionCallingOptions() { 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 4747e6af870..497894fd555 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,8 +20,6 @@ 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; @@ -35,6 +33,7 @@ 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; @@ -42,7 +41,7 @@ @EnabledIfEnvironmentVariable(named = "VERTEX_AI_GEMINI_LOCATION", matches = ".*") public class FunctionCallWithFunctionWrapperIT { - private final Logger logger = LoggerFactory.getLogger(FunctionCallWithFunctionWrapperIT.class); + private static final LogAccessor logger = new LogAccessor(FunctionCallWithFunctionWrapperIT.class); private final ApplicationContextRunner contextRunner = new ApplicationContextRunner() .withPropertyValues("spring.ai.vertex.ai.gemini.project-id=" + System.getenv("VERTEX_AI_GEMINI_PROJECT_ID"), @@ -67,7 +66,7 @@ void functionCallTest() { 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 99e524f5219..f3cad660d11 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,8 +20,6 @@ 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,6 +31,7 @@ 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; @@ -40,7 +39,7 @@ @EnabledIfEnvironmentVariable(named = "VERTEX_AI_GEMINI_LOCATION", matches = ".*") public class FunctionCallWithPromptFunctionIT { - private final Logger logger = LoggerFactory.getLogger(FunctionCallWithPromptFunctionIT.class); + private static final LogAccessor logger = new LogAccessor(FunctionCallWithPromptFunctionIT.class); private final ApplicationContextRunner contextRunner = new ApplicationContextRunner() .withPropertyValues("spring.ai.vertex.ai.gemini.project-id=" + System.getenv("VERTEX_AI_GEMINI_PROJECT_ID"), @@ -78,7 +77,7 @@ void functionCallTest() { 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"); @@ -86,7 +85,7 @@ void functionCallTest() { 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 f60814cb4cf..8b00bace4c0 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,8 +19,6 @@ 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; @@ -38,6 +36,7 @@ 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 +46,7 @@ @EnabledIfEnvironmentVariable(named = "ZHIPU_AI_API_KEY", matches = ".*") public class ZhiPuAiAutoConfigurationIT { - private static final Log logger = LogFactory.getLog(ZhiPuAiAutoConfigurationIT.class); + private static final LogAccessor logger = new LogAccessor(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 556e7df8c19..22cebfb3c75 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,8 +21,6 @@ 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,6 +36,7 @@ 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 +46,7 @@ @EnabledIfEnvironmentVariable(named = "ZHIPU_AI_API_KEY", matches = ".*") public class FunctionCallbackInPromptIT { - private final Logger logger = LoggerFactory.getLogger(FunctionCallbackInPromptIT.class); + private static final LogAccessor logger = new LogAccessor(FunctionCallbackInPromptIT.class); private final ApplicationContextRunner contextRunner = new ApplicationContextRunner() .withPropertyValues("spring.ai.zhipuai.apiKey=" + System.getenv("ZHIPU_AI_API_KEY")) @@ -75,7 +74,7 @@ void functionCallTest() { 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"); }); @@ -109,7 +108,7 @@ void streamingFunctionCallTest() { .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 714ea619c44..20c04423401 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,8 +22,6 @@ 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; @@ -42,6 +40,7 @@ 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 +50,7 @@ @EnabledIfEnvironmentVariable(named = "ZHIPU_AI_API_KEY", matches = ".*") class FunctionCallbackWithPlainFunctionBeanIT { - private final Logger logger = LoggerFactory.getLogger(FunctionCallbackWithPlainFunctionBeanIT.class); + private static final LogAccessor logger = new LogAccessor(FunctionCallbackWithPlainFunctionBeanIT.class); private final ApplicationContextRunner contextRunner = new ApplicationContextRunner() .withPropertyValues("spring.ai.zhipuai.apiKey=" + System.getenv("ZHIPU_AI_API_KEY")) @@ -72,7 +71,7 @@ void functionCallTest() { 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"); @@ -80,7 +79,7 @@ void functionCallTest() { 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"); @@ -103,7 +102,7 @@ void functionCallWithPortableFunctionCallingOptions() { ChatResponse response = chatModel.call(new Prompt(List.of(userMessage), functionOptions)); - logger.info("Response: {}", response); + logger.info("Response: " + response); }); } @@ -128,7 +127,7 @@ void streamFunctionCallTest() { .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 +145,7 @@ void streamFunctionCallTest() { .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 6b258e98d1a..d73535ca2a9 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,8 +21,6 @@ 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,6 +38,7 @@ 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; @@ -49,7 +48,7 @@ @EnabledIfEnvironmentVariable(named = "ZHIPU_AI_API_KEY", matches = ".*") public class ZhipuAiFunctionCallbackIT { - private final Logger logger = LoggerFactory.getLogger(ZhipuAiFunctionCallbackIT.class); + private static final LogAccessor logger = new LogAccessor(ZhipuAiFunctionCallbackIT.class); private final ApplicationContextRunner contextRunner = new ApplicationContextRunner() .withPropertyValues("spring.ai.zhipuai.apiKey=" + System.getenv("ZHIPU_AI_API_KEY")) @@ -69,7 +68,7 @@ void functionCallTest() { 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"); @@ -96,7 +95,7 @@ void streamFunctionCallTest() { .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 884d40d0309..83b2ce73fcb 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,21 +19,19 @@ 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() { @@ -48,7 +46,7 @@ class FunctionCallbackResolverKotlinIT : BaseOllamaIT() { } } - private val logger = LoggerFactory.getLogger(FunctionCallbackResolverKotlinIT::class.java) + private val logger = LogAccessor(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 691c22bf957..990a98b5444 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,8 +19,6 @@ 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 @@ -33,6 +31,7 @@ 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() { @@ -47,7 +46,7 @@ class FunctionCallbackKotlinIT : BaseOllamaIT() { } } - private val logger = LoggerFactory.getLogger(FunctionCallbackKotlinIT::class.java) + private val logger = LogAccessor(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 4a9b6824d91..0cd31f60507 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,8 +22,6 @@ 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; @@ -36,6 +34,7 @@ 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; @@ -54,7 +53,7 @@ class OllamaContainerConnectionDetailsFactoryIT { static final String MODEL_NAME = "nomic-embed-text"; - private static final Logger logger = LoggerFactory.getLogger(OllamaContainerConnectionDetailsFactoryIT.class); + private static final LogAccessor logger = new LogAccessor(OllamaContainerConnectionDetailsFactoryIT.class); @Container @ServiceConnection @@ -65,9 +64,9 @@ class OllamaContainerConnectionDetailsFactoryIT { @BeforeAll public static void beforeAll() throws IOException, InterruptedException { - logger.info("Start pulling the '{}' model. The operation can take several minutes...", MODEL_NAME); + logger.info("Start pulling the '" + MODEL_NAME + "' model. The operation can take several minutes..."); ollama.execInContainer("ollama", "pull", MODEL_NAME); - logger.info("Completed pulling the '{}' model", MODEL_NAME); + logger.info("Completed pulling the '" + MODEL_NAME + "' model"); } @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 69e50493c17..c38bc6ea267 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,9 +19,6 @@ 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; @@ -30,13 +27,14 @@ 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 Logger logger = LoggerFactory.getLogger(BasicEvaluationTest.class); + private static final LogAccessor logger = new LogAccessor(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 ec40ee9d239..45f8e8d01bf 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,12 +52,9 @@ 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; @@ -66,6 +63,7 @@ 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; @@ -79,7 +77,7 @@ */ public class CosmosDBVectorStore extends AbstractObservationVectorStore implements AutoCloseable { - private static final Logger logger = LoggerFactory.getLogger(CosmosDBVectorStore.class); + private static final LogAccessor logger = new LogAccessor(CosmosDBVectorStore.class); private final CosmosAsyncClient cosmosClient; @@ -253,19 +251,19 @@ public void doAdd(List documents) { // 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("Exception occurred during bulk add operation: {}", e.getMessage(), e); + logger.error(e, "Exception occurred during bulk add operation: " + e.getMessage()); throw e; // Rethrow the exception after logging } } @@ -281,15 +279,15 @@ public Optional doDelete(List idList) { // 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); } } @@ -309,7 +307,7 @@ public List doSimilaritySearch(SearchRequest request) { // 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]) @@ -345,7 +343,7 @@ public List doSimilaritySearch(SearchRequest request) { 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() @@ -360,7 +358,7 @@ public List doSimilaritySearch(SearchRequest request) { 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 f983b79b905..e7dfb531d1a 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,8 +42,7 @@ import com.azure.search.documents.models.SearchOptions; import com.azure.search.documents.models.VectorSearchOptions; import com.azure.search.documents.models.VectorizedQuery; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; +import org.apache.commons.logging.LogFactory; import org.springframework.ai.document.Document; import org.springframework.ai.document.DocumentMetadata; @@ -58,6 +57,7 @@ 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 Logger logger = LoggerFactory.getLogger(AzureVectorStore.class); + private static final LogAccessor logger = new LogAccessor(LogFactory.getLog(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 ebaf90de296..694674f7b36 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,8 +21,9 @@ 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.slf4j.Logger; -import org.slf4j.LoggerFactory; +import org.apache.commons.logging.LogFactory; + +import org.springframework.core.log.LogAccessor; /** * Utility class for working with Cassandra schema. @@ -32,7 +33,7 @@ */ public final class SchemaUtil { - private static final Logger logger = LoggerFactory.getLogger(SchemaUtil.class); + private static final LogAccessor logger = new LogAccessor(LogFactory.getLog(SchemaUtil.class)); private SchemaUtil() { @@ -61,7 +62,7 @@ public static void ensureKeyspaceExists(CqlSession session, String keyspaceName) .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 fa62afe5950..a95d1796fe5 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.CreateTableWithOptions; import com.datastax.oss.driver.shaded.guava.common.annotations.VisibleForTesting; import com.datastax.oss.driver.shaded.guava.common.base.Preconditions; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; +import org.apache.commons.logging.LogFactory; 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 Logger logger = LoggerFactory.getLogger(CassandraChatMemoryConfig.class); + private static final LogAccessor logger = new LogAccessor(LogFactory.getLog(CassandraChatMemoryConfig.class)); final CqlSession session; @@ -193,7 +193,7 @@ private void ensureTableColumnsExist() { 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 d5ecc6f6c3c..a60ef527cb2 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 @@ -60,16 +60,13 @@ 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.slf4j.Logger; -import org.slf4j.LoggerFactory; +import org.apache.commons.logging.LogFactory; import org.springframework.ai.cassandra.SchemaUtil; 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; @@ -79,6 +76,7 @@ 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 +191,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 Logger logger = LoggerFactory.getLogger(CassandraVectorStore.class); + private static final LogAccessor logger = new LogAccessor(LogFactory.getLog(CassandraVectorStore.class)); private static final Map SIMILARITY_TYPE_MAPPING = Map.of( Similarity.COSINE, VectorStoreSimilarityMetric.COSINE, Similarity.EUCLIDEAN, @@ -333,7 +331,7 @@ public List doSimilaritySearch(SearchRequest request) { 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)) { @@ -445,7 +443,8 @@ private String similaritySearchStatement() { extraSelectFields.toString(), this.schema.keyspace(), this.schema.table(), this.schema.embedding()); query = query.replace("?", "%s"); - logger.debug("preparing {}", query); + String finalQuery = query; + logger.debug("preparing " + finalQuery); return query; } @@ -555,7 +554,7 @@ private void ensureIndexesExists() { .andColumn(this.schema.embedding) .build(); - logger.debug("Executing {}", indexStmt.getQuery()); + logger.debug(() -> "Executing " + indexStmt.getQuery()); this.session.execute(indexStmt); Stream @@ -571,7 +570,7 @@ private void ensureIndexesExists() { .andColumn(metadata.name()) .build(); - logger.debug("Executing {}", indexStatement.getQuery()); + logger.debug(() -> "Executing " + indexStatement.getQuery()); this.session.execute(indexStatement); }); } @@ -609,7 +608,7 @@ private void ensureTableExists(int vectorDimension) { .append(" vector)"); - logger.debug("Executing {}", tableStmt.toString()); + logger.debug(() -> "Executing " + tableStmt); this.session.execute(tableStmt.toString()); } } @@ -662,12 +661,12 @@ private void ensureTableColumnsExist(int vectorDimension) { .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 e85a844c047..dc5562129d9 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,10 +33,9 @@ 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; @@ -56,6 +55,7 @@ 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,7 +69,8 @@ @Testcontainers class CassandraRichSchemaVectorStoreIT { - private static final Logger logger = LoggerFactory.getLogger(CassandraRichSchemaVectorStoreIT.class); + private static final LogAccessor logger = new LogAccessor( + LogFactory.getLog(CassandraRichSchemaVectorStoreIT.class)); private static final List documents = List.of( @@ -282,7 +283,7 @@ void addAndSearchPoormansBench() { } 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()); } } }); @@ -600,7 +601,7 @@ private CassandraVectorStore.Builder createBuilder(ApplicationContext context, L } 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-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 3e7514ea3bf..4d2a1924209 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,16 +35,13 @@ 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; @@ -55,6 +52,7 @@ 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; /** @@ -149,7 +147,7 @@ */ public class ElasticsearchVectorStore extends AbstractObservationVectorStore implements InitializingBean { - private static final Logger logger = LoggerFactory.getLogger(ElasticsearchVectorStore.class); + private static final LogAccessor logger = new LogAccessor(LogFactory.getLog(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 37fc9383310..4266827e303 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,15 +27,12 @@ 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.apache.commons.logging.LogFactory; 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; @@ -43,6 +40,7 @@ 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; @@ -65,7 +63,7 @@ */ public class GemFireVectorStore extends AbstractObservationVectorStore implements InitializingBean { - private static final Logger logger = LoggerFactory.getLogger(GemFireVectorStore.class); + private static final LogAccessor logger = new LogAccessor(LogFactory.getLog(GemFireVectorStore.class)); private static final String DEFAULT_URI = "http{ssl}://{host}:{port}/gemfire-vectordb/v1/indexes"; @@ -241,7 +239,7 @@ public Optional doDelete(List idList) { .block(); } catch (Exception e) { - logger.warn("Error removing embedding: {}", e.getMessage(), e); + logger.warn(e, "Error removing embedding: " + e.getMessage()); 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 e5722ad6ac6..3821dca9864 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,8 +24,7 @@ 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.apache.commons.logging.LogFactory; import org.springframework.ai.document.Document; import org.springframework.ai.embedding.EmbeddingModel; @@ -37,6 +36,7 @@ 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 @@ */ public class HanaCloudVectorStore extends AbstractObservationVectorStore { - private static final Logger logger = LoggerFactory.getLogger(HanaCloudVectorStore.class); + private static final LogAccessor logger = new LogAccessor(LogFactory.getLog(HanaCloudVectorStore.class)); private final HanaVectorRepository repository; @@ -116,25 +116,25 @@ public static Builder builder(HanaVectorRepository r public void doAdd(List documents) { int count = 1; for (Document document : documents) { - logger.info("[{}/{}] Calling EmbeddingModel for document id = {}", count++, documents.size(), - document.getId()); + logger.info("[" + count++ + "/" + documents.size() + "] Calling EmbeddingModel for document id = " + + 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 {} documents", count - 1); + logger.info("Embeddings saved in HanaCloudVectorStore for " + (count - 1) + " documents"); } @Override public Optional doDelete(List idList) { int deleteCount = this.repository.deleteEmbeddingsById(this.tableName, idList); - logger.info("{} embeddings deleted", deleteCount); + logger.info(deleteCount + " embeddings deleted"); return Optional.of(deleteCount == idList.size()); } public int purgeEmbeddings() { int deleteCount = this.repository.deleteAllEmbeddings(this.tableName); - logger.info("{} embeddings deleted", deleteCount); + logger.info(deleteCount + " embeddings deleted"); return deleteCount; } @@ -153,8 +153,8 @@ public List doSimilaritySearch(SearchRequest request) { String queryEmbedding = getEmbedding(request); List searchResult = this.repository.cosineSimilaritySearch(this.tableName, request.getTopK(), queryEmbedding); - logger.info("Hana cosine-similarity for query={}, with topK={} returned {} results", request.getQuery(), - request.getTopK(), searchResult.size()); + logger.info("Hana cosine-similarity for query=" + request.getQuery() + ", with topK=" + request.getTopK() + + " returned " + searchResult.size() + " results"); 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 e3745879a58..de5a396de6a 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,8 +23,7 @@ import java.util.function.Supplier; import java.util.stream.Collectors; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; +import org.apache.commons.logging.LogFactory; import org.springframework.ai.chat.messages.UserMessage; import org.springframework.ai.chat.model.ChatModel; @@ -36,6 +35,7 @@ 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 @@ @RestController public class CricketWorldCupHanaController { - private static final Logger logger = LoggerFactory.getLogger(CricketWorldCupHanaController.class); + private static final LogAccessor logger = new LogAccessor(LogFactory.getLog(CricketWorldCupHanaController.class)); private final VectorStore hanaCloudVectorStore; @@ -65,7 +65,7 @@ public CricketWorldCupHanaController(ChatModel chatModel, VectorStore hanaCloudV @PostMapping("/ai/hana-vector-store/cricket-world-cup/purge-embeddings") public ResponseEntity purgeEmbeddings() { int deleteCount = ((HanaCloudVectorStore) this.hanaCloudVectorStore).purgeEmbeddings(); - logger.info("{} embeddings purged from CRICKET_WORLD_CUP table in Hana DB", deleteCount); + logger.info(deleteCount + " embeddings purged from CRICKET_WORLD_CUP table in Hana DB"); return ResponseEntity.ok() .body(String.format("%d embeddings purged from CRICKET_WORLD_CUP table in Hana DB", deleteCount)); } @@ -76,7 +76,7 @@ public ResponseEntity handleFileUpload(@RequestParam("pdf") MultipartFil Supplier> reader = new PagePdfDocumentReader(pdf); Function, List> splitter = new TokenTextSplitter(); List documents = splitter.apply(reader.get()); - logger.info("{} documents created from pdf file: {}", documents.size(), pdf.getFilename()); + logger.info(documents.size() + " documents created from pdf file: " + 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 Map hanaVectorStoreSearch(@RequestParam("message") String 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 8f0f1d488d1..e913c778d56 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,11 +22,10 @@ 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; @@ -39,6 +38,7 @@ 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 @@ @EnabledIfEnvironmentVariable(named = "HANA_DATASOURCE_PASSWORD", matches = ".+") public class HanaCloudVectorStoreIT { - private static final Logger logger = LoggerFactory.getLogger(HanaCloudVectorStoreIT.class); + private static final LogAccessor logger = new LogAccessor(LogFactory.getLog(HanaCloudVectorStoreIT.class)); private final ApplicationContextRunner contextRunner = new ApplicationContextRunner() .withUserConfiguration(HanaTestApplication.class); @@ -65,7 +65,7 @@ public void vectorStoreTest() { 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 f3be68f087c..b2391205e1b 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.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 @@ */ public class MariaDBSchemaValidator { - private static final Logger logger = LoggerFactory.getLogger(MariaDBSchemaValidator.class); + private static final LogAccessor logger = new LogAccessor(LogFactory.getLog(MariaDBSchemaValidator.class)); private final JdbcTemplate jdbcTemplate; @@ -79,7 +79,7 @@ void validateTableSchema(String schemaName, String tableName, String idFieldName } try { - logger.info("Validating MariaDBStore schema for table: {} in schema: {}", tableName, schemaName); + logger.info(() -> "Validating MariaDBStore schema for table: " + tableName + " in schema: " + 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 e58be350898..7f7a2b477d6 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,14 +28,11 @@ 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.apache.commons.logging.LogFactory; 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; @@ -45,6 +42,7 @@ 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 +145,7 @@ public class MariaDBVectorStore extends AbstractObservationVectorStore implement public static final int MAX_DOCUMENT_BATCH_SIZE = 10_000; - private static final Logger logger = LoggerFactory.getLogger(MariaDBVectorStore.class); + private static final LogAccessor logger = new LogAccessor(LogFactory.getLog(MariaDBVectorStore.class)); public static final String DEFAULT_TABLE_NAME = "vector_store"; @@ -213,8 +211,8 @@ protected MariaDBVectorStore(MariaDBBuilder builder) { this.vectorTableName = builder.vectorTableName.isEmpty() ? DEFAULT_TABLE_NAME : MariaDBSchemaValidator.validateAndEnquoteIdentifier(builder.vectorTableName.trim(), false); - logger.info("Using the vector table name: {}. Is empty: {}", this.vectorTableName, - builder.vectorTableName.isEmpty()); + logger.info(() -> "Using the vector table name: " + this.vectorTableName + ". Is empty: " + + builder.vectorTableName.isEmpty()); this.schemaName = builder.schemaName == null ? null : MariaDBSchemaValidator.validateAndEnquoteIdentifier(builder.schemaName, false); @@ -359,10 +357,10 @@ public List doSimilaritySearch(SearchRequest request) { @Override public void afterPropertiesSet() { - logger.info("Initializing MariaDBVectorStore schema for table: {} in schema: {}", this.vectorTableName, - this.schemaName); + logger.info(() -> "Initializing MariaDBVectorStore schema for table: " + this.vectorTableName + " in schema: " + + this.schemaName); - logger.info("vectorTableValidationsEnabled {}", this.schemaValidation); + logger.info(() -> "vectorTableValidationsEnabled " + this.schemaValidation); if (this.schemaValidation) { this.schemaValidator.validateTableSchema(this.schemaName, this.vectorTableName, this.idFieldName, @@ -370,7 +368,8 @@ public void afterPropertiesSet() { } 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; } @@ -417,8 +416,8 @@ int embeddingDimensions() { } } catch (Exception e) { - logger.warn("Failed to obtain the embedding dimensions from the embedding model and fall backs to" - + " default:" + OPENAI_EMBEDDING_DIMENSION_SIZE, e); + logger.warn(e, () -> "Failed to obtain the embedding dimensions from the embedding model and fall backs to" + + " default:" + OPENAI_EMBEDDING_DIMENSION_SIZE); } 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 e16a5de72ce..f270193024e 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,15 +49,12 @@ import io.milvus.param.index.DropIndexParam; import io.milvus.response.QueryResultsWrapper.RowRecord; import io.milvus.response.SearchResultsWrapper; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; +import org.apache.commons.logging.LogFactory; 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; @@ -68,6 +65,7 @@ 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; @@ -162,7 +160,7 @@ public class MilvusVectorStore extends AbstractObservationVectorStore implements // Metadata, automatically assigned by Milvus. private static final String DISTANCE_FIELD_NAME = "distance"; - private static final Logger logger = LoggerFactory.getLogger(MilvusVectorStore.class); + private static final LogAccessor logger = new LogAccessor(LogFactory.getLog(MilvusVectorStore.class)); private static final Map SIMILARITY_TYPE_MAPPING = Map.of( MetricType.COSINE, VectorStoreSimilarityMetric.COSINE, MetricType.L2, VectorStoreSimilarityMetric.EUCLIDEAN, @@ -482,8 +480,9 @@ int embeddingDimensions() { } } catch (Exception e) { - logger.warn("Failed to obtain the embedding dimensions from the embedding model and fall backs to default:" - + this.embeddingDimension, e); + logger.warn(e, + "Failed to obtain the embedding dimensions from the embedding model and fall backs to default:" + + this.embeddingDimension); } return OPENAI_EMBEDDING_DIMENSION_SIZE; } 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 feac0ece8c9..e12ff32a333 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,15 +34,11 @@ 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; @@ -51,6 +47,7 @@ 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; @@ -97,7 +94,7 @@ public class OracleVectorStore extends AbstractObservationVectorStore implements public static final int DEFAULT_SEARCH_ACCURACY = -1; - private static final Logger logger = LoggerFactory.getLogger(OracleVectorStore.class); + private static final LogAccessor logger = new LogAccessor(OracleVectorStore.class); private static final Map SIMILARITY_TYPE_MAPPING = Map .of(OracleVectorStoreDistanceType.COSINE, VectorStoreSimilarityMetric.COSINE, 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 f0c5951676b..389eaaa93db 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.List; import java.util.Map; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; +import org.apache.commons.logging.LogFactory; +import org.springframework.core.log.LogAccessor; import org.springframework.dao.DataAccessException; import org.springframework.jdbc.core.JdbcTemplate; @@ -35,7 +35,7 @@ */ public class PgVectorSchemaValidator { - private static final Logger logger = LoggerFactory.getLogger(PgVectorSchemaValidator.class); + private static final LogAccessor logger = new LogAccessor(LogFactory.getLog(PgVectorSchemaValidator.class)); private final JdbcTemplate jdbcTemplate; @@ -92,7 +92,7 @@ void validateTableSchema(String schemaName, String tableName) { } try { - logger.info("Validating PGVectorStore schema for table: {} in schema: {}", tableName, schemaName); + logger.info("Validating PGVectorStore schema for table: " + tableName + " in schema: " + 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 f091bf5879e..00a32457147 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,16 +29,13 @@ 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; @@ -50,6 +47,7 @@ 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; @@ -171,7 +169,7 @@ public class PgVectorStore extends AbstractObservationVectorStore implements Ini public static final int MAX_DOCUMENT_BATCH_SIZE = 10_000; - private static final Logger logger = LoggerFactory.getLogger(PgVectorStore.class); + private static final LogAccessor logger = new LogAccessor(LogFactory.getLog(PgVectorSchemaValidator.class)); private static Map SIMILARITY_TYPE_MAPPING = Map.of( PgDistanceType.COSINE_DISTANCE, VectorStoreSimilarityMetric.COSINE, PgDistanceType.EUCLIDEAN_DISTANCE, @@ -218,8 +216,8 @@ protected PgVectorStore(PgVectorStoreBuilder builder) { String vectorTable = builder.vectorTableName; this.vectorTableName = vectorTable.isEmpty() ? DEFAULT_TABLE_NAME : vectorTable.trim(); - logger.info("Using the vector table name: {}. Is empty: {}", this.vectorTableName, - this.vectorTableName.isEmpty()); + logger.info("Using the vector table name: " + this.vectorTableName + " Is empty: " + + this.vectorTableName.isEmpty()); this.vectorIndexName = this.vectorTableName.equals(DEFAULT_TABLE_NAME) ? DEFAULT_VECTOR_INDEX_NAME : this.vectorTableName + "_index"; @@ -382,17 +380,17 @@ private String comparisonOperator() { @Override public void afterPropertiesSet() { - logger.info("Initializing PGVectorStore schema for table: {} in schema: {}", this.getVectorTableName(), - this.getSchemaName()); + logger.info("Initializing PGVectorStore schema for table: " + this.getVectorTableName() + " in schema: " + + 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; } @@ -454,8 +452,9 @@ int embeddingDimensions() { } } catch (Exception e) { - logger.warn("Failed to obtain the embedding dimensions from the embedding model and fall backs to default:" - + OPENAI_EMBEDDING_DIMENSION_SIZE, e); + logger.warn(e, + "Failed to obtain the embedding dimensions from the embedding model and fall backs to default:" + + OPENAI_EMBEDDING_DIMENSION_SIZE); } return OPENAI_EMBEDDING_DIMENSION_SIZE; } 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 fd28c7fc571..6fbc3cf992f 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,8 +27,7 @@ import java.util.function.Predicate; import java.util.stream.Collectors; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; +import org.apache.commons.logging.LogFactory; import redis.clients.jedis.JedisPooled; import redis.clients.jedis.Pipeline; import redis.clients.jedis.json.Path2; @@ -47,10 +46,8 @@ 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; @@ -60,6 +57,7 @@ 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; @@ -200,7 +198,7 @@ public class RedisVectorStore extends AbstractObservationVectorStore implements private static final String JSON_PATH_PREFIX = "$."; - private static final Logger logger = LoggerFactory.getLogger(RedisVectorStore.class); + private static final LogAccessor logger = new LogAccessor(LogFactory.getLog(RedisVectorStore.class)); private static final Predicate RESPONSE_OK = Predicate.isEqual("OK"); @@ -290,7 +288,7 @@ public Optional doDelete(List idList) { 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); } 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 e32ef4e55c6..a60fd20e474 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,8 +23,7 @@ import java.util.stream.IntStream; import java.util.stream.Stream; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; +import org.apache.commons.logging.LogFactory; import org.typesense.api.Client; import org.typesense.api.FieldTypes; import org.typesense.model.CollectionResponse; @@ -38,10 +37,8 @@ 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; @@ -50,6 +47,7 @@ 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 +92,7 @@ public class TypesenseVectorStore extends AbstractObservationVectorStore impleme public static final int INVALID_EMBEDDING_DIMENSION = -1; - private static final Logger logger = LoggerFactory.getLogger(TypesenseVectorStore.class); + private static final LogAccessor logger = new LogAccessor(LogFactory.getLog(TypesenseVectorStore.class)); public final FilterExpressionConverter filterExpressionConverter = new TypesenseFilterExpressionConverter(); @@ -159,10 +157,10 @@ public void doAdd(List documents) { try { this.client.collections(this.collectionName).documents().import_(documentList, importDocumentsParameters); - logger.info("Added {} documents", documentList.size()); + logger.info(() -> "Added " + documentList.size() + " documents"); } catch (Exception e) { - logger.error("Failed to add documents", e); + logger.error(e, "Failed to add documents"); } } @@ -184,7 +182,7 @@ public Optional doDelete(List idList) { return Optional.of(deletedDocs > 0); } catch (Exception e) { - logger.error("Failed to delete documents", e); + logger.error(e, "Failed to delete documents"); return Optional.of(Boolean.FALSE); } } @@ -196,7 +194,7 @@ public List doSimilaritySearch(SearchRequest request) { 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()); @@ -238,11 +236,11 @@ public List doSimilaritySearch(SearchRequest request) { })) .toList(); - logger.info("Found {} documents", documents.size()); + logger.info("Found " + documents.size() + " documents"); return documents; } catch (Exception e) { - logger.error("Failed to search documents", e); + logger.error(e, "Failed to search documents"); return List.of(); } } @@ -258,8 +256,9 @@ int embeddingDimensions() { } } catch (Exception e) { - logger.warn("Failed to obtain the embedding dimensions from the embedding model and fall backs to default:" - + this.embeddingDimension, e); + logger.warn(e, + () -> "Failed to obtain the embedding dimensions from the embedding model and fall backs to default:" + + this.embeddingDimension); } return OPENAI_EMBEDDING_DIMENSION_SIZE; } @@ -286,7 +285,7 @@ private boolean hasCollection() { void createCollection() { if (this.hasCollection()) { - logger.info("Collection {} already exists", this.collectionName); + logger.info("Collection " + this.collectionName + " already exists"); return; } @@ -304,25 +303,25 @@ void createCollection() { try { this.client.collections().create(collectionSchema); - logger.info("Collection {} created", this.collectionName); + logger.info("Collection " + this.collectionName + " created"); } catch (Exception e) { - logger.error("Failed to create collection {}", this.collectionName, e); + logger.error(e, "Failed to create collection " + this.collectionName); } } void dropCollection() { if (!this.hasCollection()) { - logger.info("Collection {} does not exist", this.collectionName); + logger.info("Collection " + this.collectionName + " does not exist"); return; } try { this.client.collections(this.collectionName).delete(); - logger.info("Collection {} dropped", this.collectionName); + logger.info("Collection " + this.collectionName + " dropped"); } catch (Exception e) { - logger.error("Failed to drop collection {}", this.collectionName, e); + logger.error(e, "Failed to drop collection " + this.collectionName); } } @@ -334,7 +333,7 @@ Map getCollectionInfo() { retrievedCollection.getNumDocuments()); } catch (Exception e) { - logger.error("Failed to retrieve collection info", e); + logger.error(e, "Failed to retrieve collection info"); return null; }