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 724f7ee5c..9af7cf4e8 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.ArrayList;
import java.util.List;
import java.util.stream.Collectors;
+import org.apache.commons.logging.LogFactory;
import org.apache.pdfbox.pdfparser.PDFParser;
import org.apache.pdfbox.pdmodel.PDDocument;
import org.apache.pdfbox.pdmodel.PDPage;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
import org.springframework.ai.document.Document;
import org.springframework.ai.document.DocumentReader;
@@ -34,6 +33,7 @@ import org.springframework.ai.reader.pdf.config.PdfDocumentReaderConfig;
import org.springframework.ai.reader.pdf.layout.PDFLayoutTextStripperByArea;
import org.springframework.core.io.DefaultResourceLoader;
import org.springframework.core.io.Resource;
+import org.springframework.core.log.LogAccessor;
import org.springframework.util.CollectionUtils;
import org.springframework.util.StringUtils;
@@ -55,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 class PagePdfDocumentReader implements DocumentReader {
for (PDPage page : this.document.getDocumentCatalog().getPages()) {
lastPage = page;
if (counter % logFrequency == 0 && counter / logFrequency < 10) {
- logger.info("Processing PDF page: {}", (counter + 1));
+ logger.info("Processing PDF page: " + (counter + 1));
}
counter++;
@@ -154,7 +154,7 @@ public class PagePdfDocumentReader implements DocumentReader {
readDocuments.add(toDocument(lastPage, pageTextGroupList.stream().collect(Collectors.joining()),
startPageNumber, pageNumber));
}
- logger.info("Processing {} 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 95863fff6..1c3e173a2 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 java.util.List;
import org.apache.pdfbox.pdfparser.PDFParser;
import org.apache.pdfbox.pdmodel.PDDocument;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
import org.springframework.ai.document.Document;
import org.springframework.ai.document.DocumentReader;
@@ -34,6 +32,7 @@ import org.springframework.ai.reader.pdf.config.PdfDocumentReaderConfig;
import org.springframework.ai.reader.pdf.layout.PDFLayoutTextStripperByArea;
import org.springframework.core.io.DefaultResourceLoader;
import org.springframework.core.io.Resource;
+import org.springframework.core.log.LogAccessor;
import org.springframework.util.CollectionUtils;
import org.springframework.util.StringUtils;
@@ -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 de2afe6d6..5b32e0d1f 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 94fe45595..b1287e7ee 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 java.util.stream.Collectors;
import io.micrometer.observation.Observation;
import io.micrometer.observation.ObservationRegistry;
import io.micrometer.observation.contextpropagation.ObservationThreadLocalAccessor;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
import reactor.core.publisher.Flux;
import reactor.core.publisher.Mono;
@@ -67,6 +65,7 @@ import org.springframework.ai.model.function.FunctionCallback;
import org.springframework.ai.model.function.FunctionCallbackResolver;
import org.springframework.ai.model.function.FunctionCallingOptions;
import org.springframework.ai.retry.RetryUtils;
+import org.springframework.core.log.LogAccessor;
import org.springframework.http.ResponseEntity;
import org.springframework.retry.support.RetryTemplate;
import org.springframework.util.Assert;
@@ -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 94af5ab14..bda5288be 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.Test;
import org.junit.jupiter.api.condition.EnabledIfEnvironmentVariable;
import org.junit.jupiter.params.ParameterizedTest;
import org.junit.jupiter.params.provider.ValueSource;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
import reactor.core.publisher.Flux;
import org.springframework.ai.anthropic.api.AnthropicApi;
@@ -59,6 +57,7 @@ import org.springframework.context.annotation.Bean;
import org.springframework.core.convert.support.DefaultConversionService;
import org.springframework.core.io.ClassPathResource;
import org.springframework.core.io.Resource;
+import org.springframework.core.log.LogAccessor;
import org.springframework.util.MimeType;
import org.springframework.util.MimeTypeUtils;
import org.springframework.util.StringUtils;
@@ -69,7 +68,7 @@ import static org.assertj.core.api.Assertions.assertThat;
@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 @@ class AnthropicChatModelIT {
ChatResponse response = this.chatModel.call(new Prompt(messages, promptOptions));
- logger.info("Response: {}", response);
+ logger.info("Response: " + response);
Generation generation = response.getResult();
assertThat(generation).isNotNull();
@@ -324,7 +323,7 @@ class AnthropicChatModelIT {
.map(cr -> cr.getResult().getOutput().getText())
.collect(Collectors.joining());
- logger.info("Response: {}", content);
+ logger.info("Response: " + content);
assertThat(content).contains("30", "10", "15");
}
@@ -350,7 +349,7 @@ class AnthropicChatModelIT {
ChatResponse chatResponse = responseFlux.last().block();
- logger.info("Response: {}", chatResponse);
+ logger.info("Response: " + chatResponse);
Usage usage = chatResponse.getMetadata().getUsage();
assertThat(usage).isNotNull();
diff --git a/models/spring-ai-anthropic/src/test/java/org/springframework/ai/anthropic/EventParsingTests.java b/models/spring-ai-anthropic/src/test/java/org/springframework/ai/anthropic/EventParsingTests.java
index 9cd11068b..e5d90d9e9 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 java.util.List;
import com.fasterxml.jackson.core.type.TypeReference;
import com.fasterxml.jackson.databind.ObjectMapper;
import org.junit.jupiter.api.Test;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
import org.springframework.ai.anthropic.api.AnthropicApi.StreamEvent;
import org.springframework.core.io.DefaultResourceLoader;
+import org.springframework.core.log.LogAccessor;
import static org.assertj.core.api.Assertions.assertThat;
@@ -37,7 +36,7 @@ import static org.assertj.core.api.Assertions.assertThat;
*/
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 0be31a138..3cffa70f8 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 java.util.function.Function;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.condition.EnabledIfEnvironmentVariable;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
import org.springframework.ai.anthropic.api.AnthropicApi;
import org.springframework.ai.anthropic.api.AnthropicApi.AnthropicMessage;
@@ -36,6 +34,7 @@ import org.springframework.ai.anthropic.api.tool.XmlHelper.Tools;
import org.springframework.ai.anthropic.api.tool.XmlHelper.Tools.ToolDescription;
import org.springframework.ai.anthropic.api.tool.XmlHelper.Tools.ToolDescription.Parameter;
import org.springframework.ai.model.ModelOptionsUtils;
+import org.springframework.core.log.LogAccessor;
import org.springframework.http.ResponseEntity;
import static org.assertj.core.api.Assertions.assertThat;
@@ -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 079a01b3c..0ffeaccd7 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 java.util.function.Function;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.condition.EnabledIfEnvironmentVariable;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
import org.springframework.ai.anthropic.api.AnthropicApi;
import org.springframework.ai.anthropic.api.AnthropicApi.AnthropicMessage;
@@ -35,6 +33,7 @@ import org.springframework.ai.anthropic.api.AnthropicApi.ContentBlock.Type;
import org.springframework.ai.anthropic.api.AnthropicApi.Role;
import org.springframework.ai.anthropic.api.AnthropicApi.Tool;
import org.springframework.ai.model.ModelOptionsUtils;
+import org.springframework.core.log.LogAccessor;
import org.springframework.http.ResponseEntity;
import org.springframework.util.CollectionUtils;
@@ -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 b1f79e1f5..7d65d2396 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.Test;
import org.junit.jupiter.api.condition.EnabledIfEnvironmentVariable;
import org.junit.jupiter.params.ParameterizedTest;
import org.junit.jupiter.params.provider.ValueSource;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
import reactor.core.publisher.Flux;
import org.springframework.ai.anthropic.AnthropicChatOptions;
@@ -50,6 +48,7 @@ import org.springframework.core.ParameterizedTypeReference;
import org.springframework.core.convert.support.DefaultConversionService;
import org.springframework.core.io.ClassPathResource;
import org.springframework.core.io.Resource;
+import org.springframework.core.log.LogAccessor;
import org.springframework.test.context.ActiveProfiles;
import org.springframework.util.MimeTypeUtils;
@@ -60,7 +59,7 @@ import static org.assertj.core.api.Assertions.assertThat;
@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 @@ class AnthropicChatClientIT {
.content();
// @formatter:on
- logger.info("Response: {}", response);
+ logger.info("Response: " + response);
assertThat(response).contains("30", "10", "15");
}
@@ -239,7 +238,7 @@ class AnthropicChatClientIT {
.content();
// @formatter:on
- logger.info("Response: {}", response);
+ logger.info("Response: " + response);
assertThat(response).contains("30", "10", "15");
}
@@ -261,7 +260,7 @@ class AnthropicChatClientIT {
.content();
// @formatter:on
- logger.info("Response: {}", response);
+ logger.info("Response: " + response);
assertThat(response).contains("30", "10", "15");
}
@@ -282,7 +281,7 @@ class AnthropicChatClientIT {
// @formatter:on
String content = response.collectList().block().stream().collect(Collectors.joining());
- logger.info("Response: {}", content);
+ logger.info("Response: " + content);
assertThat(content).contains("30", "10", "15");
}
@@ -344,7 +343,7 @@ class AnthropicChatClientIT {
String content = response.collectList().block().stream().collect(Collectors.joining());
- logger.info("Response: {}", content);
+ logger.info("Response: " + content);
assertThat(content).contains("bananas", "apple");
assertThat(content).containsAnyOf("bowl", "basket");
}
diff --git a/models/spring-ai-anthropic/src/test/java/org/springframework/ai/anthropic/client/AnthropicChatClientMethodInvokingFunctionCallbackIT.java b/models/spring-ai-anthropic/src/test/java/org/springframework/ai/anthropic/client/AnthropicChatClientMethodInvokingFunctionCallbackIT.java
index 2fcee182d..751efab3c 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 java.util.concurrent.ConcurrentHashMap;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.condition.EnabledIfEnvironmentVariable;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
import org.springframework.ai.anthropic.AnthropicTestConfiguration;
import org.springframework.ai.chat.client.ChatClient;
@@ -34,6 +32,7 @@ import org.springframework.ai.chat.model.ToolContext;
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 @@ import static org.assertj.core.api.AssertionsForClassTypes.assertThatThrownBy;
@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 @@ class AnthropicChatClientMethodInvokingFunctionCallbackIT {
.content();
// @formatter:on
- logger.info("Response: {}", response);
+ logger.info("Response: " + response);
assertThat(response).contains("30", "10", "15");
}
@@ -88,7 +87,7 @@ class AnthropicChatClientMethodInvokingFunctionCallbackIT {
.content();
// @formatter:on
- logger.info("Response: {}", response);
+ logger.info("Response: " + response);
assertThat(response).contains("30", "10", "15");
}
@@ -110,7 +109,7 @@ class AnthropicChatClientMethodInvokingFunctionCallbackIT {
.content();
// @formatter:on
- logger.info("Response: {}", response);
+ logger.info("Response: " + response);
assertThat(arguments).containsEntry("roomName", "living room");
assertThat(arguments).containsEntry("on", true);
@@ -133,7 +132,7 @@ class AnthropicChatClientMethodInvokingFunctionCallbackIT {
.content();
// @formatter:on
- logger.info("Response: {}", response);
+ logger.info("Response: " + response);
assertThat(response).contains("30", "10", "15");
}
@@ -156,7 +155,7 @@ class AnthropicChatClientMethodInvokingFunctionCallbackIT {
.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 @@ class AnthropicChatClientMethodInvokingFunctionCallbackIT {
.content();
// @formatter:on
- logger.info("Response: {}", response);
+ logger.info("Response: " + response);
assertThat(arguments).containsEntry("turnLivingRoomLightOn", true);
}
@@ -264,7 +263,7 @@ class AnthropicChatClientMethodInvokingFunctionCallbackIT {
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 6e312cfca..2203a706c 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 a5f5b3357..f56a0ef1e 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.Embeddings;
import com.azure.ai.openai.models.EmbeddingsOptions;
import com.azure.ai.openai.models.EmbeddingsUsage;
import io.micrometer.observation.ObservationRegistry;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
import org.springframework.ai.chat.metadata.DefaultUsage;
import org.springframework.ai.document.Document;
@@ -42,6 +40,7 @@ import org.springframework.ai.embedding.observation.EmbeddingModelObservationCon
import org.springframework.ai.embedding.observation.EmbeddingModelObservationDocumentation;
import org.springframework.ai.model.EmbeddingUtils;
import org.springframework.ai.observation.conventions.AiProvider;
+import org.springframework.core.log.LogAccessor;
import org.springframework.util.Assert;
import org.springframework.util.CollectionUtils;
@@ -55,7 +54,7 @@ import org.springframework.util.CollectionUtils;
*/
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 88fe6ae6e..676c6952f 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.DeserializationFeature;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.SerializationFeature;
import com.fasterxml.jackson.databind.json.JsonMapper;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
import org.springframework.ai.azure.openai.metadata.AzureOpenAiImageGenerationMetadata;
import org.springframework.ai.azure.openai.metadata.AzureOpenAiImageResponseMetadata;
@@ -42,6 +40,7 @@ import org.springframework.ai.image.ImageResponse;
import org.springframework.ai.image.ImageResponseMetadata;
import org.springframework.ai.model.ModelOptionsUtils;
import org.springframework.ai.util.JacksonUtils;
+import org.springframework.core.log.LogAccessor;
import org.springframework.util.Assert;
/**
@@ -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 class AzureOpenAiImageModel implements ImageModel {
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 d9f6e89a2..2234d3ad6 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.ai.openai.OpenAIServiceVersion;
import com.azure.core.credential.AzureKeyCredential;
import com.azure.core.http.policy.HttpLogOptions;
import org.junit.jupiter.api.Test;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
import org.springframework.ai.chat.client.ChatClient;
import org.springframework.ai.chat.messages.AssistantMessage;
@@ -51,6 +49,7 @@ import org.springframework.context.annotation.Bean;
import org.springframework.core.convert.support.DefaultConversionService;
import org.springframework.core.io.ClassPathResource;
import org.springframework.core.io.Resource;
+import org.springframework.core.log.LogAccessor;
import org.springframework.util.MimeTypeUtils;
import static org.assertj.core.api.Assertions.assertThat;
@@ -59,7 +58,7 @@ import static org.assertj.core.api.Assertions.assertThat;
@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 08d6ae77f..9a4f090e2 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.MockResponse;
import okhttp3.mockwebserver.MockWebServer;
import okhttp3.mockwebserver.RecordedRequest;
import okio.Buffer;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.DisposableBean;
import org.springframework.beans.factory.FactoryBean;
@@ -39,6 +37,7 @@ import org.springframework.beans.factory.InitializingBean;
import org.springframework.context.SmartLifecycle;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
+import org.springframework.core.log.LogAccessor;
import org.springframework.lang.Nullable;
import org.springframework.mock.web.MockHttpServletResponse;
import org.springframework.test.web.servlet.MockMvc;
@@ -206,7 +205,7 @@ public class MockAiTestConfiguration {
*/
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 class MockAiTestConfiguration {
this.dispatcher = dispatcher;
}
- protected Logger getLogger() {
+ protected LogAccessor getLogger() {
return logger;
}
@@ -256,8 +255,8 @@ public class MockAiTestConfiguration {
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 8ce996506..680a30832 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.OpenAIClientBuilder;
import com.azure.ai.openai.models.ChatCompletionStreamOptions;
import com.azure.core.credential.AzureKeyCredential;
import org.junit.jupiter.api.Test;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
import reactor.core.publisher.Flux;
import org.springframework.ai.azure.openai.AzureOpenAiChatModel;
@@ -45,6 +43,7 @@ import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.SpringBootConfiguration;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.context.annotation.Bean;
+import org.springframework.core.log.LogAccessor;
import org.springframework.util.StringUtils;
import static org.assertj.core.api.Assertions.assertThat;
@@ -53,7 +52,7 @@ import static org.assertj.core.api.Assertions.assertThat;
@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 @@ class AzureOpenAiChatModelFunctionCallIT {
ChatResponse response = this.chatModel.call(new Prompt(messages, promptOptions));
- logger.info("Response: {}", response);
+ logger.info("Response: " + response);
assertThat(response.getResult()).isNotNull();
assertThat(response.getResult().getOutput()).isNotNull();
@@ -108,7 +107,7 @@ class AzureOpenAiChatModelFunctionCallIT {
ChatResponse response = this.chatModel.call(new Prompt(messages, promptOptions));
- logger.info("Response: {}", response);
+ logger.info("Response: " + response);
assertThat(response.getResult().getOutput().getText()).contains("30", "10", "15");
}
@@ -140,7 +139,7 @@ class AzureOpenAiChatModelFunctionCallIT {
.map(Generation::getOutput)
.map(AssistantMessage::getText)
.collect(Collectors.joining());
- logger.info("Response: {}", content);
+ logger.info("Response: " + content);
assertThat(counter.get()).isGreaterThan(30).as("The response should be chunked in more than 30 messages");
@@ -170,7 +169,7 @@ class AzureOpenAiChatModelFunctionCallIT {
Flux response = this.chatModel.stream(new Prompt(messages, promptOptions));
ChatResponse chatResponse = response.last().block();
- logger.info("Response: {}", chatResponse);
+ logger.info("Response: " + chatResponse);
assertThat(chatResponse.getMetadata().getUsage().getTotalTokens()).isGreaterThan(600).isLessThan(800);
@@ -207,7 +206,7 @@ class AzureOpenAiChatModelFunctionCallIT {
.filter(Objects::nonNull)
.collect(Collectors.joining());
- logger.info("Response: {}", response);
+ logger.info("Response: " + response);
assertThat(content).contains("30", "10", "15");
}
diff --git a/models/spring-ai-bedrock-converse/src/main/java/org/springframework/ai/bedrock/converse/BedrockProxyChatModel.java b/models/spring-ai-bedrock-converse/src/main/java/org/springframework/ai/bedrock/converse/BedrockProxyChatModel.java
index 37afa84de..68fd6838f 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 java.util.Set;
import io.micrometer.observation.Observation;
import io.micrometer.observation.ObservationRegistry;
import io.micrometer.observation.contextpropagation.ObservationThreadLocalAccessor;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
import reactor.core.publisher.Flux;
import reactor.core.publisher.Mono;
import reactor.core.publisher.Sinks;
@@ -101,6 +99,7 @@ import org.springframework.ai.model.function.FunctionCallback;
import org.springframework.ai.model.function.FunctionCallbackResolver;
import org.springframework.ai.model.function.FunctionCallingOptions;
import org.springframework.ai.observation.conventions.AiProvider;
+import org.springframework.core.log.LogAccessor;
import org.springframework.util.Assert;
import org.springframework.util.CollectionUtils;
import org.springframework.util.StreamUtils;
@@ -134,7 +133,7 @@ import org.springframework.util.StringUtils;
*/
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 @@ public class BedrockProxyChatModel extends AbstractToolCallSupport implements Ch
ConverseResponse converseResponse = this.bedrockRuntimeClient.converse(converseRequest);
- logger.debug("ConverseResponse: {}", converseResponse);
+ logger.debug("ConverseResponse: " + converseResponse);
var response = this.toChatResponse(converseResponse, perviousChatResponse);
@@ -655,7 +654,7 @@ public class BedrockProxyChatModel extends AbstractToolCallSupport implements Ch
ConverseStreamResponseHandler.Visitor visitor = ConverseStreamResponseHandler.Visitor.builder()
.onDefault(output -> {
- logger.debug("Received converse stream output:{}", output);
+ logger.debug("Received converse stream output: " + output);
eventSink.emitNext(output, DEFAULT_EMIT_FAILURE_HANDLER);
})
.build();
@@ -667,7 +666,7 @@ public class BedrockProxyChatModel extends AbstractToolCallSupport implements Ch
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 80f6c9351..99d9ac2e2 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 java.util.stream.Collectors;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.params.ParameterizedTest;
import org.junit.jupiter.params.provider.ValueSource;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
import reactor.core.publisher.Flux;
import org.springframework.ai.chat.client.ChatClient;
@@ -45,6 +43,7 @@ import org.springframework.core.ParameterizedTypeReference;
import org.springframework.core.convert.support.DefaultConversionService;
import org.springframework.core.io.ClassPathResource;
import org.springframework.core.io.Resource;
+import org.springframework.core.log.LogAccessor;
import org.springframework.util.MimeTypeUtils;
import static org.assertj.core.api.Assertions.assertThat;
@@ -53,7 +52,7 @@ import static org.assertj.core.api.Assertions.assertThat;
@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 @@ class BedrockConverseChatClientIT {
.content();
// @formatter:on
- logger.info("Response: {}", response);
+ logger.info("Response: " + response);
assertThat(response).contains("30", "10", "15");
}
@@ -255,7 +254,7 @@ class BedrockConverseChatClientIT {
assertThat(metadata.getUsage().getTotalTokens())
.isEqualTo(metadata.getUsage().getPromptTokens() + metadata.getUsage().getCompletionTokens());
- logger.info("Response: {}", response);
+ logger.info("Response: " + response);
assertThat(response.getResult().getOutput().getText()).contains("30", "10", "15");
}
@@ -276,7 +275,7 @@ class BedrockConverseChatClientIT {
.content();
// @formatter:on
- logger.info("Response: {}", response);
+ logger.info("Response: " + response);
assertThat(response).contains("30", "10", "15");
}
@@ -298,7 +297,7 @@ class BedrockConverseChatClientIT {
.content();
// @formatter:on
- logger.info("Response: {}", response);
+ logger.info("Response: " + response);
assertThat(response).contains("30", "10", "15");
}
@@ -340,7 +339,7 @@ class BedrockConverseChatClientIT {
.filter(cr -> cr.getResult() != null)
.map(cr -> cr.getResult().getOutput().getText())
.collect(Collectors.joining());
- logger.info("Response: {}", content);
+ logger.info("Response: " + content);
assertThat(content).contains("30", "10", "15");
}
@@ -361,7 +360,7 @@ class BedrockConverseChatClientIT {
// @formatter:on
String content = response.collectList().block().stream().collect(Collectors.joining());
- logger.info("Response: {}", content);
+ logger.info("Response: " + content);
assertThat(content).contains("15");
}
@@ -421,7 +420,7 @@ class BedrockConverseChatClientIT {
String content = response.collectList().block().stream().collect(Collectors.joining());
- logger.info("Response: {}", content);
+ logger.info("Response: " + content);
assertThat(content).contains("bananas", "apple");
assertThat(content).containsAnyOf("bowl", "basket");
}
diff --git a/models/spring-ai-bedrock-converse/src/test/java/org/springframework/ai/bedrock/converse/BedrockProxyChatModelIT.java b/models/spring-ai-bedrock-converse/src/test/java/org/springframework/ai/bedrock/converse/BedrockProxyChatModelIT.java
index f4ffbcbdd..cf3078adb 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.Disabled;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.params.ParameterizedTest;
import org.junit.jupiter.params.provider.ValueSource;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
import reactor.core.publisher.Flux;
import org.springframework.ai.chat.client.ChatClient;
@@ -54,6 +52,7 @@ import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.core.convert.support.DefaultConversionService;
import org.springframework.core.io.ClassPathResource;
import org.springframework.core.io.Resource;
+import org.springframework.core.log.LogAccessor;
import org.springframework.util.MimeTypeUtils;
import static org.assertj.core.api.Assertions.assertThat;
@@ -62,7 +61,7 @@ import static org.assertj.core.api.Assertions.assertThat;
@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 @@ class BedrockProxyChatModelIT {
ChatResponse response = this.chatModel.call(new Prompt(messages, promptOptions));
- logger.info("Response: {}", response);
+ logger.info("Response: " + response);
Generation generation = response.getResult();
assertThat(generation.getOutput().getText()).contains("30", "10", "15");
@@ -297,7 +296,7 @@ class BedrockProxyChatModelIT {
.map(cr -> cr.getResult().getOutput().getText())
.collect(Collectors.joining());
- logger.info("Response: {}", content);
+ logger.info("Response: " + content);
assertThat(content).contains("30", "10", "15");
}
diff --git a/models/spring-ai-bedrock-converse/src/test/java/org/springframework/ai/bedrock/converse/client/BedrockNovaChatClientIT.java b/models/spring-ai-bedrock-converse/src/test/java/org/springframework/ai/bedrock/converse/client/BedrockNovaChatClientIT.java
index 326a90425..b62a87df4 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.time.Duration;
import java.util.Set;
import org.junit.jupiter.api.Test;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
import software.amazon.awssdk.auth.credentials.EnvironmentVariableCredentialsProvider;
import software.amazon.awssdk.regions.Region;
@@ -38,6 +36,7 @@ import org.springframework.boot.SpringBootConfiguration;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.context.annotation.Bean;
import org.springframework.core.io.ClassPathResource;
+import org.springframework.core.log.LogAccessor;
import static org.assertj.core.api.Assertions.assertThat;
import static org.junit.jupiter.api.Assertions.assertAll;
@@ -50,7 +49,7 @@ import static org.junit.jupiter.api.Assertions.assertTrue;
@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 @@ public class BedrockNovaChatClientIT {
.content();
// @formatter:on
- logger.info("Response: {}", response);
+ logger.info("Response: " + response);
assertThat(response).contains("30", "10", "15");
}
diff --git a/models/spring-ai-bedrock/src/main/java/org/springframework/ai/bedrock/api/AbstractBedrockApi.java b/models/spring-ai-bedrock/src/main/java/org/springframework/ai/bedrock/api/AbstractBedrockApi.java
index 024f3f4f7..2c22dd58f 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.JsonInclude.Include;
import com.fasterxml.jackson.annotation.JsonProperty;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
import reactor.core.publisher.Flux;
import reactor.core.publisher.Sinks;
import reactor.core.publisher.Sinks.EmitFailureHandler;
@@ -45,6 +43,7 @@ import software.amazon.awssdk.services.bedrockruntime.model.InvokeModelWithRespo
import software.amazon.awssdk.services.bedrockruntime.model.ResponseStream;
import org.springframework.ai.model.ModelOptionsUtils;
+import org.springframework.core.log.LogAccessor;
import org.springframework.util.Assert;
/**
@@ -67,7 +66,7 @@ import org.springframework.util.Assert;
*/
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 @@ public abstract class AbstractBedrockApi {
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 2eabc32d4..e5dd7f3cd 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.ArrayList;
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.Embedding;
import org.springframework.ai.embedding.EmbeddingOptions;
import org.springframework.ai.embedding.EmbeddingRequest;
import org.springframework.ai.embedding.EmbeddingResponse;
+import org.springframework.core.log.LogAccessor;
import org.springframework.util.Assert;
/**
@@ -47,7 +47,7 @@ import org.springframework.util.Assert;
*/
public class BedrockTitanEmbeddingModel extends AbstractEmbeddingModel {
- private 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 54b589256..532e07512 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 java.util.stream.Collectors;
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.boot.test.context.SpringBootTest;
import org.springframework.context.annotation.Bean;
import org.springframework.core.convert.support.DefaultConversionService;
import org.springframework.core.io.Resource;
+import org.springframework.core.log.LogAccessor;
import static org.assertj.core.api.Assertions.assertThat;
@@ -58,7 +57,7 @@ import static org.assertj.core.api.Assertions.assertThat;
@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 42e9b9103..f68a40948 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 java.util.stream.Collectors;
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.RequiresAwsCredentials;
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 @@ import static org.assertj.core.api.Assertions.assertThat;
@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 20f62169a..65f25976a 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 java.util.stream.Collectors;
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.context.annotation.Bean;
import org.springframework.core.convert.support.DefaultConversionService;
import org.springframework.core.io.ClassPathResource;
import org.springframework.core.io.Resource;
+import org.springframework.core.log.LogAccessor;
import org.springframework.util.MimeTypeUtils;
import static org.assertj.core.api.Assertions.assertThat;
@@ -61,7 +60,7 @@ import static org.assertj.core.api.Assertions.assertThat;
@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 529a5e898..59209d9ca 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 java.util.stream.Collectors;
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.An
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 @@ import static org.assertj.core.api.Assertions.assertThat;
@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 1013ecdd6..62807b918 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 8a592901a..dd0164d6d 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 e1660d18a..dcdd24c27 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 java.util.concurrent.ConcurrentHashMap;
import io.micrometer.observation.Observation;
import io.micrometer.observation.ObservationRegistry;
import io.micrometer.observation.contextpropagation.ObservationThreadLocalAccessor;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
import reactor.core.publisher.Flux;
import reactor.core.publisher.Mono;
@@ -66,6 +64,7 @@ import org.springframework.ai.model.function.FunctionCallback;
import org.springframework.ai.model.function.FunctionCallbackResolver;
import org.springframework.ai.model.function.FunctionCallingOptions;
import org.springframework.ai.retry.RetryUtils;
+import org.springframework.core.log.LogAccessor;
import org.springframework.http.ResponseEntity;
import org.springframework.retry.support.RetryTemplate;
import org.springframework.util.Assert;
@@ -84,7 +83,7 @@ import org.springframework.util.CollectionUtils;
*/
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 class MiniMaxChatModel extends AbstractToolCallSupport implements ChatMod
var chatCompletion = completionEntity.getBody();
if (chatCompletion == null) {
- logger.warn("No chat completion returned for prompt: {}", prompt);
+ logger.warn("No chat completion returned for prompt: " + prompt);
return new ChatResponse(List.of());
}
List choices = chatCompletion.choices();
if (choices == null) {
- logger.warn("No choices returned for prompt: {}, 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 class MiniMaxChatModel extends AbstractToolCallSupport implements ChatMod
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 fec3b0c31..5860d31e0 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.ArrayList;
import java.util.List;
import io.micrometer.observation.ObservationRegistry;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
import org.springframework.ai.chat.metadata.DefaultUsage;
import org.springframework.ai.document.Document;
@@ -40,6 +38,7 @@ import org.springframework.ai.minimax.api.MiniMaxApi;
import org.springframework.ai.minimax.api.MiniMaxApiConstants;
import org.springframework.ai.model.ModelOptionsUtils;
import org.springframework.ai.retry.RetryUtils;
+import org.springframework.core.log.LogAccessor;
import org.springframework.lang.Nullable;
import org.springframework.retry.support.RetryTemplate;
import org.springframework.util.Assert;
@@ -53,7 +52,7 @@ import org.springframework.util.Assert;
*/
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 class MiniMaxEmbeddingModel extends AbstractEmbeddingModel {
.execute(ctx -> this.miniMaxApi.embeddings(apiRequest).getBody());
if (apiEmbeddingResponse == null) {
- logger.warn("No embeddings returned for request: {}", request);
+ logger.warn("No embeddings returned for request: " + request);
return new EmbeddingResponse(List.of());
}
diff --git a/models/spring-ai-minimax/src/test/java/org/springframework/ai/minimax/api/MiniMaxApiToolFunctionCallIT.java b/models/spring-ai-minimax/src/test/java/org/springframework/ai/minimax/api/MiniMaxApiToolFunctionCallIT.java
index 86c337a58..18f5763c3 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.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.condition.EnabledIfEnvironmentVariable;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
import org.springframework.ai.minimax.api.MiniMaxApi.ChatCompletion;
import org.springframework.ai.minimax.api.MiniMaxApi.ChatCompletionMessage;
@@ -33,6 +31,7 @@ import org.springframework.ai.minimax.api.MiniMaxApi.ChatCompletionMessage.Role;
import org.springframework.ai.minimax.api.MiniMaxApi.ChatCompletionMessage.ToolCall;
import org.springframework.ai.minimax.api.MiniMaxApi.ChatCompletionRequest;
import org.springframework.ai.minimax.api.MiniMaxApi.ChatCompletionRequest.ToolChoiceBuilder;
+import org.springframework.core.log.LogAccessor;
import org.springframework.http.ResponseEntity;
import static org.assertj.core.api.Assertions.assertThat;
@@ -43,7 +42,7 @@ import static org.assertj.core.api.Assertions.assertThat;
@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 8a7e9ee2e..383daf7a4 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 java.util.stream.Collectors;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.condition.EnabledIfEnvironmentVariable;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
import reactor.core.publisher.Flux;
import org.springframework.ai.chat.messages.AssistantMessage;
@@ -36,6 +34,7 @@ import org.springframework.ai.chat.prompt.Prompt;
import org.springframework.ai.minimax.MiniMaxChatModel;
import org.springframework.ai.minimax.MiniMaxChatOptions;
import org.springframework.ai.minimax.api.MiniMaxApi;
+import org.springframework.core.log.LogAccessor;
import static org.assertj.core.api.Assertions.assertThat;
@@ -45,7 +44,7 @@ import static org.assertj.core.api.Assertions.assertThat;
@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 @@ public class MiniMaxChatOptionsTests {
.map(AssistantMessage::getText)
.filter(Objects::nonNull)
.collect(Collectors.joining());
- logger.info("Response: {}", content);
+ logger.info("Response: " + content);
assertThat(content).contains("40");
}
diff --git a/models/spring-ai-mistral-ai/pom.xml b/models/spring-ai-mistral-ai/pom.xml
index 07e45c48d..06985cb6b 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 804380086..d3dfba3ad 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 java.util.concurrent.ConcurrentHashMap;
import io.micrometer.observation.Observation;
import io.micrometer.observation.ObservationRegistry;
import io.micrometer.observation.contextpropagation.ObservationThreadLocalAccessor;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
import reactor.core.publisher.Flux;
import reactor.core.publisher.Mono;
@@ -66,6 +64,7 @@ import org.springframework.ai.model.function.FunctionCallback;
import org.springframework.ai.model.function.FunctionCallbackResolver;
import org.springframework.ai.model.function.FunctionCallingOptions;
import org.springframework.ai.retry.RetryUtils;
+import org.springframework.core.log.LogAccessor;
import org.springframework.http.ResponseEntity;
import org.springframework.retry.support.RetryTemplate;
import org.springframework.util.Assert;
@@ -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 class MistralAiChatModel extends AbstractToolCallSupport implements ChatM
ChatCompletion chatCompletion = completionEntity.getBody();
if (chatCompletion == null) {
- logger.warn("No chat completion returned for prompt: {}", prompt);
+ logger.warn("No chat completion returned for prompt: " + prompt);
return new ChatResponse(List.of());
}
@@ -300,7 +299,7 @@ public class MistralAiChatModel extends AbstractToolCallSupport implements ChatM
}
}
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 834bcfcd9..f7e642a3f 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 @@ package org.springframework.ai.mistralai;
import java.util.List;
import io.micrometer.observation.ObservationRegistry;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
import org.springframework.ai.chat.metadata.DefaultUsage;
import org.springframework.ai.document.Document;
@@ -39,6 +37,7 @@ import org.springframework.ai.embedding.observation.EmbeddingModelObservationDoc
import org.springframework.ai.mistralai.api.MistralAiApi;
import org.springframework.ai.model.ModelOptionsUtils;
import org.springframework.ai.retry.RetryUtils;
+import org.springframework.core.log.LogAccessor;
import org.springframework.retry.support.RetryTemplate;
import org.springframework.util.Assert;
@@ -52,7 +51,7 @@ import org.springframework.util.Assert;
*/
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 class MistralAiEmbeddingModel extends AbstractEmbeddingModel {
.execute(ctx -> this.mistralAiApi.embeddings(apiRequest).getBody());
if (apiEmbeddingResponse == null) {
- logger.warn("No embeddings returned for request: {}", request);
+ logger.warn("No embeddings returned for request: " + request);
return new EmbeddingResponse(List.of());
}
diff --git a/models/spring-ai-mistral-ai/src/test/java/org/springframework/ai/mistralai/MistralAiChatClientIT.java b/models/spring-ai-mistral-ai/src/test/java/org/springframework/ai/mistralai/MistralAiChatClientIT.java
index 1cd169f34..5ee425793 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 java.util.stream.Collectors;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.condition.EnabledIfEnvironmentVariable;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
import reactor.core.publisher.Flux;
import org.springframework.ai.chat.client.ChatClient;
@@ -41,6 +39,7 @@ import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.core.ParameterizedTypeReference;
import org.springframework.core.convert.support.DefaultConversionService;
import org.springframework.core.io.Resource;
+import org.springframework.core.log.LogAccessor;
import static org.assertj.core.api.Assertions.assertThat;
@@ -48,7 +47,7 @@ import static org.assertj.core.api.Assertions.assertThat;
@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 @@ class MistralAiChatClientIT {
.content();
// @formatter:on
- logger.info("Response: {}", response);
+ logger.info("Response: " + response);
assertThat(response).containsAnyOf("30.0", "30");
assertThat(response).containsAnyOf("10.0", "10");
@@ -257,7 +256,7 @@ class MistralAiChatClientIT {
.prompt().call().content();
// @formatter:on
- logger.info("Response: {}", response);
+ logger.info("Response: " + response);
assertThat(response).containsAnyOf("30.0", "30");
assertThat(response).containsAnyOf("10.0", "10");
@@ -281,7 +280,7 @@ class MistralAiChatClientIT {
// @formatter:on
String content = response.collectList().block().stream().collect(Collectors.joining());
- logger.info("Response: {}", content);
+ logger.info("Response: " + content);
assertThat(content).containsAnyOf("30.0", "30");
assertThat(content).containsAnyOf("10.0", "10");
diff --git a/models/spring-ai-mistral-ai/src/test/java/org/springframework/ai/mistralai/MistralAiChatModelIT.java b/models/spring-ai-mistral-ai/src/test/java/org/springframework/ai/mistralai/MistralAiChatModelIT.java
index 27e111e74..251ae548e 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.Test;
import org.junit.jupiter.api.condition.EnabledIfEnvironmentVariable;
import org.junit.jupiter.params.ParameterizedTest;
import org.junit.jupiter.params.provider.ValueSource;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
import reactor.core.publisher.Flux;
import org.springframework.ai.chat.messages.AssistantMessage;
@@ -55,6 +53,7 @@ import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.core.convert.support.DefaultConversionService;
import org.springframework.core.io.ClassPathResource;
import org.springframework.core.io.Resource;
+import org.springframework.core.log.LogAccessor;
import org.springframework.util.MimeTypeUtils;
import static org.assertj.core.api.Assertions.assertThat;
@@ -69,7 +68,7 @@ import static org.assertj.core.api.Assertions.assertThat;
@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 @@ class MistralAiChatModelIT {
ChatResponse response = this.chatModel.call(new Prompt(messages, promptOptions));
- logger.info("Response: {}", response);
+ logger.info("Response: " + response);
assertThat(response.getResult().getOutput().getText()).containsAnyOf("30.0", "30");
assertThat(response.getMetadata()).isNotNull();
@@ -246,7 +245,7 @@ class MistralAiChatModelIT {
.map(Generation::getOutput)
.map(AssistantMessage::getText)
.collect(Collectors.joining());
- logger.info("Response: {}", content);
+ logger.info("Response: " + content);
assertThat(content).containsAnyOf("10.0", "10");
}
@@ -303,7 +302,7 @@ class MistralAiChatModelIT {
.map(Generation::getOutput)
.map(AssistantMessage::getText)
.collect(Collectors.joining());
- logger.info("Response: {}", content);
+ logger.info("Response: " + content);
assertThat(content).contains("bananas", "apple");
assertThat(content).containsAnyOf("bowl", "basket", "fruit stand");
}
@@ -327,7 +326,7 @@ class MistralAiChatModelIT {
Flux response = this.streamingChatModel.stream(new Prompt(messages, promptOptions));
ChatResponse chatResponse = response.last().block();
- logger.info("Response: {}", chatResponse);
+ logger.info("Response: " + chatResponse);
assertThat(chatResponse.getMetadata()).isNotNull();
assertThat(chatResponse.getMetadata().getUsage()).isNotNull();
assertThat(chatResponse.getMetadata().getUsage().getTotalTokens()).isLessThan(1050).isGreaterThan(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 09406736d..8d0d39a25 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.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.condition.EnabledIfEnvironmentVariable;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
import org.springframework.ai.mistralai.api.MistralAiApi;
import org.springframework.ai.mistralai.api.MistralAiApi.ChatCompletion;
@@ -35,6 +33,7 @@ import org.springframework.ai.mistralai.api.MistralAiApi.ChatCompletionRequest;
import org.springframework.ai.mistralai.api.MistralAiApi.ChatCompletionRequest.ToolChoice;
import org.springframework.ai.mistralai.api.MistralAiApi.FunctionTool.Type;
import org.springframework.ai.model.ModelOptionsUtils;
+import org.springframework.core.log.LogAccessor;
import org.springframework.http.ResponseEntity;
import org.springframework.util.ObjectUtils;
@@ -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 f2c03cd3d..5fae46724 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.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.condition.EnabledIfEnvironmentVariable;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
import org.springframework.ai.mistralai.api.MistralAiApi;
import org.springframework.ai.mistralai.api.MistralAiApi.ChatCompletion;
@@ -38,6 +36,7 @@ import org.springframework.ai.mistralai.api.MistralAiApi.ChatCompletionRequest;
import org.springframework.ai.mistralai.api.MistralAiApi.ChatCompletionRequest.ToolChoice;
import org.springframework.ai.mistralai.api.MistralAiApi.FunctionTool;
import org.springframework.ai.mistralai.api.MistralAiApi.FunctionTool.Type;
+import org.springframework.core.log.LogAccessor;
import org.springframework.http.ResponseEntity;
import static org.assertj.core.api.Assertions.assertThat;
@@ -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 40527b8a1..ec03221b5 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 403c15a46..e75bf718d 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 java.util.concurrent.ConcurrentHashMap;
import io.micrometer.observation.Observation;
import io.micrometer.observation.ObservationRegistry;
import io.micrometer.observation.contextpropagation.ObservationThreadLocalAccessor;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
import reactor.core.publisher.Flux;
import reactor.core.publisher.Mono;
@@ -67,6 +65,7 @@ import org.springframework.ai.moonshot.api.MoonshotApi.ChatCompletionRequest;
import org.springframework.ai.moonshot.api.MoonshotApi.FunctionTool;
import org.springframework.ai.moonshot.api.MoonshotConstants;
import org.springframework.ai.retry.RetryUtils;
+import org.springframework.core.log.LogAccessor;
import org.springframework.http.ResponseEntity;
import org.springframework.retry.support.RetryTemplate;
import org.springframework.util.Assert;
@@ -81,7 +80,7 @@ import org.springframework.util.CollectionUtils;
*/
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 class MoonshotChatModel extends AbstractToolCallSupport implements ChatMo
var chatCompletion = completionEntity.getBody();
if (chatCompletion == null) {
- logger.warn("No chat completion returned for prompt: {}", prompt);
+ logger.warn("No chat completion returned for prompt: " + prompt);
return new ChatResponse(List.of());
}
List choices = chatCompletion.choices();
if (choices == null) {
- logger.warn("No choices returned for prompt: {}", prompt);
+ logger.warn("No choices returned for prompt: " + prompt);
return new ChatResponse(List.of());
}
@@ -312,7 +311,7 @@ public class MoonshotChatModel extends AbstractToolCallSupport implements ChatMo
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 c2597fc1d..4dd1f099d 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.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.condition.EnabledIfEnvironmentVariable;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
import org.springframework.ai.moonshot.api.MoonshotApi.ChatCompletion;
import org.springframework.ai.moonshot.api.MoonshotApi.ChatCompletionMessage;
@@ -35,6 +33,7 @@ import org.springframework.ai.moonshot.api.MoonshotApi.ChatCompletionRequest;
import org.springframework.ai.moonshot.api.MoonshotApi.ChatCompletionRequest.ToolChoiceBuilder;
import org.springframework.ai.moonshot.api.MoonshotApi.FunctionTool;
import org.springframework.ai.moonshot.api.MoonshotApi.FunctionTool.Type;
+import org.springframework.core.log.LogAccessor;
import org.springframework.http.ResponseEntity;
import static org.assertj.core.api.Assertions.assertThat;
@@ -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 f24600653..afebc5a13 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 java.util.stream.Collectors;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.condition.EnabledIfEnvironmentVariable;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
import reactor.core.publisher.Flux;
import org.springframework.ai.chat.messages.AssistantMessage;
@@ -42,6 +40,7 @@ import org.springframework.ai.moonshot.api.MockWeatherService;
import org.springframework.ai.moonshot.api.MoonshotApi;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
+import org.springframework.core.log.LogAccessor;
import static org.assertj.core.api.Assertions.assertThat;
@@ -49,7 +48,7 @@ import static org.assertj.core.api.Assertions.assertThat;
@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 @@ class MoonshotChatModelFunctionCallingIT {
ChatResponse response = this.chatModel.call(new Prompt(messages, promptOptions));
- logger.info("Response: {}", response);
+ logger.info("Response: " + response);
assertThat(response.getResult().getOutput().getText()).contains("30", "10", "15");
}
@@ -132,7 +131,7 @@ class MoonshotChatModelFunctionCallingIT {
.map(AssistantMessage::getText)
.filter(Objects::nonNull)
.collect(Collectors.joining());
- logger.info("Response: {}", content);
+ logger.info("Response: " + content);
assertThat(content).contains("30", "10", "15");
}
diff --git a/models/spring-ai-moonshot/src/test/java/org/springframework/ai/moonshot/chat/MoonshotChatModelIT.java b/models/spring-ai-moonshot/src/test/java/org/springframework/ai/moonshot/chat/MoonshotChatModelIT.java
index c177645b7..199494083 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 java.util.stream.Collectors;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.condition.EnabledIfEnvironmentVariable;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
import org.springframework.ai.chat.messages.AssistantMessage;
import org.springframework.ai.chat.messages.Message;
@@ -45,6 +43,7 @@ import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.core.convert.support.DefaultConversionService;
import org.springframework.core.io.Resource;
+import org.springframework.core.log.LogAccessor;
import static org.assertj.core.api.Assertions.assertThat;
@@ -55,7 +54,7 @@ import static org.assertj.core.api.Assertions.assertThat;
@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 1355d4230..e694ff627 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 9f8e340dd..9aa1ce837 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 e939e69d4..8c1c578fa 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 @@ package org.springframework.ai.ollama.management;
import java.time.Duration;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
import reactor.util.retry.Retry;
import org.springframework.ai.ollama.api.OllamaApi;
import org.springframework.ai.ollama.api.OllamaApi.DeleteModelRequest;
import org.springframework.ai.ollama.api.OllamaApi.ListModelResponse;
import org.springframework.ai.ollama.api.OllamaApi.PullModelRequest;
+import org.springframework.core.log.LogAccessor;
import org.springframework.util.Assert;
import org.springframework.util.CollectionUtils;
@@ -38,7 +37,7 @@ import org.springframework.util.CollectionUtils;
*/
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 @@ public class OllamaModelManager {
}
public void deleteModel(String modelName) {
- logger.info("Start deletion of model: {}", modelName);
+ logger.info("Start deletion of model: " + modelName);
if (!isModelAvailable(modelName)) {
- logger.info("Model {} 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 class OllamaModelManager {
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 class OllamaModelManager {
.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 b3249b0d1..3d8353aec 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.List;
import java.util.stream.Collectors;
import org.junit.jupiter.api.Test;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
import reactor.core.publisher.Flux;
import org.springframework.ai.chat.messages.AssistantMessage;
@@ -40,13 +38,14 @@ import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.SpringBootConfiguration;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.context.annotation.Bean;
+import org.springframework.core.log.LogAccessor;
import static org.assertj.core.api.Assertions.assertThat;
@SpringBootTest(classes = OllamaChatModelFunctionCallingIT.Config.class)
class OllamaChatModelFunctionCallingIT extends BaseOllamaIT {
- private static final 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 @@ class OllamaChatModelFunctionCallingIT extends BaseOllamaIT {
ChatResponse response = this.chatModel.call(new Prompt(messages, promptOptions));
- logger.info("Response: {}", response);
+ logger.info("Response: " + response);
assertThat(response.getResult().getOutput().getText()).contains("30", "10", "15");
}
@@ -104,7 +103,7 @@ class OllamaChatModelFunctionCallingIT extends BaseOllamaIT {
.map(Generation::getOutput)
.map(AssistantMessage::getText)
.collect(Collectors.joining());
- logger.info("Response: {}", content);
+ logger.info("Response: " + content);
assertThat(content).contains("30", "10", "15");
}
diff --git a/models/spring-ai-ollama/src/test/java/org/springframework/ai/ollama/OllamaChatModelMultimodalIT.java b/models/spring-ai-ollama/src/test/java/org/springframework/ai/ollama/OllamaChatModelMultimodalIT.java
index 1fa5828e3..9e5816c25 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 @@ package org.springframework.ai.ollama;
import java.util.List;
import org.junit.jupiter.api.Test;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
import org.springframework.ai.chat.messages.UserMessage;
import org.springframework.ai.chat.prompt.Prompt;
@@ -32,6 +30,7 @@ import org.springframework.boot.SpringBootConfiguration;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.context.annotation.Bean;
import org.springframework.core.io.ClassPathResource;
+import org.springframework.core.log.LogAccessor;
import org.springframework.util.MimeTypeUtils;
import static org.assertj.core.api.Assertions.assertThat;
@@ -40,7 +39,7 @@ import static org.assertj.core.api.AssertionsForClassTypes.assertThatThrownBy;
@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 104cd91ce..5d8d0e6fb 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 java.util.Map;
import org.junit.jupiter.api.BeforeAll;
import org.junit.jupiter.api.Test;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
import org.springframework.ai.model.ModelOptionsUtils;
import org.springframework.ai.ollama.BaseOllamaIT;
@@ -33,6 +31,7 @@ import org.springframework.ai.ollama.api.OllamaApi.ChatResponse;
import org.springframework.ai.ollama.api.OllamaApi.Message;
import org.springframework.ai.ollama.api.OllamaApi.Message.Role;
import org.springframework.ai.ollama.api.OllamaApi.Message.ToolCall;
+import org.springframework.core.log.LogAccessor;
import static org.assertj.core.api.Assertions.assertThat;
@@ -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 a69a0224c..6c1bd4fea 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 baf772ed4..a1981837d 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.audio.speech.StreamingSpeechModel;
import org.springframework.ai.openai.metadata.audio.OpenAiAudioSpeechResponseMetadata;
import org.springframework.ai.openai.metadata.support.OpenAiResponseHeaderExtractor;
import org.springframework.ai.retry.RetryUtils;
+import org.springframework.core.log.LogAccessor;
import org.springframework.http.ResponseEntity;
import org.springframework.retry.support.RetryTemplate;
import org.springframework.util.Assert;
@@ -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 class OpenAiAudioSpeechModel implements SpeechModel, StreamingSpeechModel
var speech = speechEntity.getBody();
if (speech == null) {
- logger.warn("No speech response returned for speechRequest: {}", speechRequest);
+ logger.warn("No speech response returned for speechRequest: " + speechRequest);
return new SpeechResponse(new Speech(new byte[0]));
}
diff --git a/models/spring-ai-openai/src/main/java/org/springframework/ai/openai/OpenAiAudioTranscriptionModel.java b/models/spring-ai-openai/src/main/java/org/springframework/ai/openai/OpenAiAudioTranscriptionModel.java
index 4c7bb1056..7753d13b2 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.audio.OpenAiAudioTranscriptionResp
import org.springframework.ai.openai.metadata.support.OpenAiResponseHeaderExtractor;
import org.springframework.ai.retry.RetryUtils;
import org.springframework.core.io.Resource;
+import org.springframework.core.log.LogAccessor;
import org.springframework.http.ResponseEntity;
import org.springframework.retry.support.RetryTemplate;
import org.springframework.util.Assert;
@@ -47,7 +45,7 @@ import org.springframework.util.Assert;
*/
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 class OpenAiAudioTranscriptionModel implements Model choices = chatCompletion.choices();
if (choices == null) {
- logger.warn("No choices returned for prompt: {}", prompt);
+ logger.warn("No choices returned for prompt: " + prompt);
return new ChatResponse(List.of());
}
@@ -358,7 +357,7 @@ public class OpenAiChatModel extends AbstractToolCallSupport implements ChatMode
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 22c99aefa..5018f3f0c 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 @@ package org.springframework.ai.openai;
import java.util.List;
import io.micrometer.observation.ObservationRegistry;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
import org.springframework.ai.chat.metadata.DefaultUsage;
import org.springframework.ai.document.Document;
@@ -40,6 +38,7 @@ import org.springframework.ai.openai.api.OpenAiApi;
import org.springframework.ai.openai.api.OpenAiApi.EmbeddingList;
import org.springframework.ai.openai.api.common.OpenAiApiConstants;
import org.springframework.ai.retry.RetryUtils;
+import org.springframework.core.log.LogAccessor;
import org.springframework.lang.Nullable;
import org.springframework.retry.support.RetryTemplate;
import org.springframework.util.Assert;
@@ -52,7 +51,7 @@ import org.springframework.util.Assert;
*/
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 class OpenAiEmbeddingModel extends AbstractEmbeddingModel {
.execute(ctx -> this.openAiApi.embeddings(apiRequest).getBody());
if (apiEmbeddingResponse == null) {
- logger.warn("No embeddings returned for request: {}", request);
+ logger.warn("No embeddings returned for request: " + request);
return new EmbeddingResponse(List.of());
}
diff --git a/models/spring-ai-openai/src/main/java/org/springframework/ai/openai/OpenAiImageModel.java b/models/spring-ai-openai/src/main/java/org/springframework/ai/openai/OpenAiImageModel.java
index 336a44d93..43e6f513d 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 @@ package org.springframework.ai.openai;
import java.util.List;
import io.micrometer.observation.ObservationRegistry;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
import org.springframework.ai.image.Image;
import org.springframework.ai.image.ImageGeneration;
@@ -38,6 +36,7 @@ import org.springframework.ai.openai.api.OpenAiImageApi;
import org.springframework.ai.openai.api.common.OpenAiApiConstants;
import org.springframework.ai.openai.metadata.OpenAiImageGenerationMetadata;
import org.springframework.ai.retry.RetryUtils;
+import org.springframework.core.log.LogAccessor;
import org.springframework.http.ResponseEntity;
import org.springframework.lang.Nullable;
import org.springframework.retry.support.RetryTemplate;
@@ -55,7 +54,7 @@ import org.springframework.util.Assert;
*/
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 @@ public class OpenAiImageModel implements ImageModel {
OpenAiImageApi.OpenAiImageRequest openAiImageRequest) {
OpenAiImageApi.OpenAiImageResponse imageApiResponse = imageResponseEntity.getBody();
if (imageApiResponse == null) {
- logger.warn("No image response returned for request: {}", openAiImageRequest);
+ logger.warn("No image response returned for request: " + openAiImageRequest);
return new ImageResponse(List.of());
}
diff --git a/models/spring-ai-openai/src/main/java/org/springframework/ai/openai/OpenAiModerationModel.java b/models/spring-ai-openai/src/main/java/org/springframework/ai/openai/OpenAiModerationModel.java
index 8e00c24b4..a8b55736b 100644
--- a/models/spring-ai-openai/src/main/java/org/springframework/ai/openai/OpenAiModerationModel.java
+++ b/models/spring-ai-openai/src/main/java/org/springframework/ai/openai/OpenAiModerationModel.java
@@ -19,9 +19,6 @@ package org.springframework.ai.openai;
import java.util.ArrayList;
import java.util.List;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
import org.springframework.ai.model.ModelOptionsUtils;
import org.springframework.ai.moderation.Categories;
import org.springframework.ai.moderation.CategoryScores;
@@ -34,6 +31,7 @@ import org.springframework.ai.moderation.ModerationResponse;
import org.springframework.ai.moderation.ModerationResult;
import org.springframework.ai.openai.api.OpenAiModerationApi;
import org.springframework.ai.retry.RetryUtils;
+import org.springframework.core.log.LogAccessor;
import org.springframework.http.ResponseEntity;
import org.springframework.retry.support.RetryTemplate;
import org.springframework.util.Assert;
@@ -47,7 +45,7 @@ import org.springframework.util.Assert;
*/
public class OpenAiModerationModel implements ModerationModel {
- private final Logger logger = LoggerFactory.getLogger(getClass());
+ private final LogAccessor logger = new LogAccessor(getClass());
private final OpenAiModerationApi openAiModerationApi;
@@ -106,7 +104,7 @@ public class OpenAiModerationModel implements ModerationModel {
OpenAiModerationApi.OpenAiModerationRequest openAiModerationRequest) {
OpenAiModerationApi.OpenAiModerationResponse moderationApiResponse = moderationResponseEntity.getBody();
if (moderationApiResponse == null) {
- logger.warn("No moderation response returned for request: {}", openAiModerationRequest);
+ logger.warn("No moderation response returned for request: " + openAiModerationRequest);
return new ModerationResponse(new Generation());
}
diff --git a/models/spring-ai-openai/src/main/java/org/springframework/ai/openai/metadata/support/OpenAiResponseHeaderExtractor.java b/models/spring-ai-openai/src/main/java/org/springframework/ai/openai/metadata/support/OpenAiResponseHeaderExtractor.java
index 7a4d34475..cde5d3b42 100644
--- a/models/spring-ai-openai/src/main/java/org/springframework/ai/openai/metadata/support/OpenAiResponseHeaderExtractor.java
+++ b/models/spring-ai-openai/src/main/java/org/springframework/ai/openai/metadata/support/OpenAiResponseHeaderExtractor.java
@@ -23,11 +23,9 @@ import java.util.function.Predicate;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
import org.springframework.ai.chat.metadata.RateLimit;
import org.springframework.ai.openai.metadata.OpenAiRateLimit;
+import org.springframework.core.log.LogAccessor;
import org.springframework.http.ResponseEntity;
import org.springframework.util.Assert;
import org.springframework.util.CollectionUtils;
@@ -49,7 +47,7 @@ import static org.springframework.ai.openai.metadata.support.OpenAiApiResponseHe
*/
public final class OpenAiResponseHeaderExtractor {
- private static final Logger logger = LoggerFactory.getLogger(OpenAiResponseHeaderExtractor.class);
+ private static final LogAccessor logger = new LogAccessor(OpenAiResponseHeaderExtractor.class);
private OpenAiResponseHeaderExtractor() {
@@ -98,8 +96,8 @@ public final class OpenAiResponseHeaderExtractor {
return Long.parseLong(headerValue.trim());
}
catch (NumberFormatException e) {
- logger.warn("Value [{}] for HTTP header [{}] is not valid: {}", headerName, headerValue,
- e.getMessage());
+ logger.warn("Value [" + headerName + "] for HTTP header [" + headerValue + "] is not valid: "
+ + e.getMessage());
}
}
diff --git a/models/spring-ai-openai/src/test/java/org/springframework/ai/openai/acme/AcmeIT.java b/models/spring-ai-openai/src/test/java/org/springframework/ai/openai/acme/AcmeIT.java
index b0b0205b0..3733b08a6 100644
--- a/models/spring-ai-openai/src/test/java/org/springframework/ai/openai/acme/AcmeIT.java
+++ b/models/spring-ai-openai/src/test/java/org/springframework/ai/openai/acme/AcmeIT.java
@@ -22,8 +22,6 @@ import java.util.stream.Collectors;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.condition.EnabledIfEnvironmentVariable;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
import org.springframework.ai.chat.messages.Message;
import org.springframework.ai.chat.messages.UserMessage;
@@ -43,6 +41,7 @@ import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.core.io.Resource;
+import org.springframework.core.log.LogAccessor;
import static org.assertj.core.api.Assertions.assertThat;
@@ -50,7 +49,7 @@ import static org.assertj.core.api.Assertions.assertThat;
@EnabledIfEnvironmentVariable(named = "OPENAI_API_KEY", matches = ".+")
public class AcmeIT extends AbstractIT {
- private static final Logger logger = LoggerFactory.getLogger(AcmeIT.class);
+ private static final LogAccessor logger = new LogAccessor(AcmeIT.class);
@Value("classpath:/data/acme/bikes.json")
private Resource bikesResource;
diff --git a/models/spring-ai-openai/src/test/java/org/springframework/ai/openai/api/tool/OpenAiApiToolFunctionCallIT.java b/models/spring-ai-openai/src/test/java/org/springframework/ai/openai/api/tool/OpenAiApiToolFunctionCallIT.java
index 33f50b1f4..1f0c3ab42 100644
--- a/models/spring-ai-openai/src/test/java/org/springframework/ai/openai/api/tool/OpenAiApiToolFunctionCallIT.java
+++ b/models/spring-ai-openai/src/test/java/org/springframework/ai/openai/api/tool/OpenAiApiToolFunctionCallIT.java
@@ -23,8 +23,6 @@ import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.condition.EnabledIfEnvironmentVariable;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
import org.springframework.ai.model.ModelOptionsUtils;
import org.springframework.ai.openai.api.OpenAiApi;
@@ -34,6 +32,7 @@ import org.springframework.ai.openai.api.OpenAiApi.ChatCompletionMessage.Role;
import org.springframework.ai.openai.api.OpenAiApi.ChatCompletionMessage.ToolCall;
import org.springframework.ai.openai.api.OpenAiApi.ChatCompletionRequest;
import org.springframework.ai.openai.api.OpenAiApi.ChatCompletionRequest.ToolChoiceBuilder;
+import org.springframework.core.log.LogAccessor;
import org.springframework.http.ResponseEntity;
import static org.assertj.core.api.Assertions.assertThat;
@@ -48,7 +47,7 @@ import static org.assertj.core.api.Assertions.assertThat;
@EnabledIfEnvironmentVariable(named = "OPENAI_API_KEY", matches = ".+")
public class OpenAiApiToolFunctionCallIT {
- private final Logger logger = LoggerFactory.getLogger(OpenAiApiToolFunctionCallIT.class);
+ private static final LogAccessor logger = new LogAccessor(OpenAiApiToolFunctionCallIT.class);
MockWeatherService weatherService = new MockWeatherService();
diff --git a/models/spring-ai-openai/src/test/java/org/springframework/ai/openai/chat/OpenAiChatModelFunctionCallingIT.java b/models/spring-ai-openai/src/test/java/org/springframework/ai/openai/chat/OpenAiChatModelFunctionCallingIT.java
index 799b76ea1..00723f5de 100644
--- a/models/spring-ai-openai/src/test/java/org/springframework/ai/openai/chat/OpenAiChatModelFunctionCallingIT.java
+++ b/models/spring-ai-openai/src/test/java/org/springframework/ai/openai/chat/OpenAiChatModelFunctionCallingIT.java
@@ -25,8 +25,6 @@ import java.util.stream.Collectors;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.condition.EnabledIfEnvironmentVariable;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
import reactor.core.publisher.Flux;
import org.springframework.ai.chat.client.ChatClient;
@@ -49,6 +47,7 @@ import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.SpringBootConfiguration;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.context.annotation.Bean;
+import org.springframework.core.log.LogAccessor;
import static org.assertj.core.api.Assertions.assertThat;
@@ -56,7 +55,7 @@ import static org.assertj.core.api.Assertions.assertThat;
@EnabledIfEnvironmentVariable(named = "OPENAI_API_KEY", matches = ".+")
class OpenAiChatModelFunctionCallingIT {
- private static final Logger logger = LoggerFactory.getLogger(OpenAiChatModelFunctionCallingIT.class);
+ private static final LogAccessor logger = new LogAccessor(OpenAiChatModelFunctionCallingIT.class);
@Autowired
ChatModel chatModel;
@@ -76,7 +75,7 @@ class OpenAiChatModelFunctionCallingIT {
.content();
// @formatter:on
- logger.info("Response: {}", response);
+ logger.info("Response: " + response);
assertThat(state).containsEntry("Light", "ON");
}
@@ -137,7 +136,7 @@ class OpenAiChatModelFunctionCallingIT {
ChatResponse response = this.chatModel.call(new Prompt(messages, promptOptions));
- logger.info("Response: {}", response);
+ logger.info("Response: " + response);
assertThat(response.getResult().getOutput().getText()).contains("30", "10", "15");
}
@@ -209,7 +208,7 @@ class OpenAiChatModelFunctionCallingIT {
.map(Generation::getOutput)
.map(AssistantMessage::getText)
.collect(Collectors.joining());
- logger.info("Response: {}", content);
+ logger.info("Response: " + content);
assertThat(content).contains("30", "10", "15");
}
diff --git a/models/spring-ai-openai/src/test/java/org/springframework/ai/openai/chat/OpenAiChatModelIT.java b/models/spring-ai-openai/src/test/java/org/springframework/ai/openai/chat/OpenAiChatModelIT.java
index ff1a5ff2a..db0baf2cc 100644
--- a/models/spring-ai-openai/src/test/java/org/springframework/ai/openai/chat/OpenAiChatModelIT.java
+++ b/models/spring-ai-openai/src/test/java/org/springframework/ai/openai/chat/OpenAiChatModelIT.java
@@ -32,8 +32,6 @@ import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.condition.EnabledIfEnvironmentVariable;
import org.junit.jupiter.params.ParameterizedTest;
import org.junit.jupiter.params.provider.ValueSource;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
import reactor.core.publisher.Flux;
import org.springframework.ai.chat.client.ChatClient;
@@ -67,6 +65,7 @@ import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.core.convert.support.DefaultConversionService;
import org.springframework.core.io.ClassPathResource;
import org.springframework.core.io.Resource;
+import org.springframework.core.log.LogAccessor;
import org.springframework.util.MimeTypeUtils;
import static org.assertj.core.api.Assertions.assertThat;
@@ -76,7 +75,7 @@ import static org.assertj.core.api.Assertions.assertThatThrownBy;
@EnabledIfEnvironmentVariable(named = "OPENAI_API_KEY", matches = ".+")
public class OpenAiChatModelIT extends AbstractIT {
- private static final Logger logger = LoggerFactory.getLogger(OpenAiChatModelIT.class);
+ private static final LogAccessor logger = new LogAccessor(OpenAiChatModelIT.class);
@Value("classpath:/prompts/system-message.st")
private Resource systemResource;
@@ -349,7 +348,7 @@ public class OpenAiChatModelIT extends AbstractIT {
ChatResponse response = this.chatModel.call(new Prompt(messages, promptOptions));
- logger.info("Response: {}", response);
+ logger.info("Response: " + response);
assertThat(response.getResult().getOutput().getText()).containsAnyOf("30.0", "30");
assertThat(response.getResult().getOutput().getText()).containsAnyOf("10.0", "10");
@@ -382,7 +381,7 @@ public class OpenAiChatModelIT extends AbstractIT {
.map(Generation::getOutput)
.map(AssistantMessage::getText)
.collect(Collectors.joining());
- logger.info("Response: {}", content);
+ logger.info("Response: " + content);
assertThat(content).containsAnyOf("30.0", "30");
assertThat(content).containsAnyOf("10.0", "10");
@@ -406,10 +405,10 @@ public class OpenAiChatModelIT extends AbstractIT {
.build();
ChatResponse chatResponse = this.chatModel.call(new Prompt(messages, promptOptions));
- logger.info("Response: {}", chatResponse);
+ logger.info("Response: " + chatResponse);
Usage usage = chatResponse.getMetadata().getUsage();
- logger.info("Usage: {}", usage);
+ logger.info("Usage: " + usage);
assertThat(usage).isNotNull();
assertThat(usage).isNotInstanceOf(EmptyUsage.class);
assertThat(usage).isInstanceOf(DefaultUsage.class);
@@ -438,7 +437,7 @@ public class OpenAiChatModelIT extends AbstractIT {
Flux response = this.streamingChatModel.stream(new Prompt(messages, promptOptions));
Usage usage = response.last().block().getMetadata().getUsage();
- logger.info("Usage: {}", usage);
+ logger.info("Usage: " + usage);
assertThat(usage).isNotNull();
assertThat(usage).isNotInstanceOf(EmptyUsage.class);
assertThat(usage).isInstanceOf(DefaultUsage.class);
@@ -502,7 +501,7 @@ public class OpenAiChatModelIT extends AbstractIT {
.map(Generation::getOutput)
.map(AssistantMessage::getText)
.collect(Collectors.joining());
- logger.info("Response: {}", content);
+ logger.info("Response: " + content);
assertThat(content).containsAnyOf("bananas", "apple", "bowl", "basket", "fruit stand");
}
@@ -577,7 +576,7 @@ public class OpenAiChatModelIT extends AbstractIT {
.map(Generation::getOutput)
.map(AssistantMessage::getText)
.collect(Collectors.joining());
- logger.info("Response: {}", content);
+ logger.info("Response: " + content);
assertThat(content).containsIgnoringCase("hobbits");
}
diff --git a/models/spring-ai-openai/src/test/java/org/springframework/ai/openai/chat/OpenAiChatModelProxyToolCallsIT.java b/models/spring-ai-openai/src/test/java/org/springframework/ai/openai/chat/OpenAiChatModelProxyToolCallsIT.java
index db047a3cf..adffce2ba 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 com.fasterxml.jackson.databind.ObjectMapper;
import io.micrometer.observation.ObservationRegistry;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.condition.EnabledIfEnvironmentVariable;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
import reactor.core.publisher.Flux;
import org.springframework.ai.chat.messages.AssistantMessage;
@@ -52,6 +50,7 @@ import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.SpringBootConfiguration;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.context.annotation.Bean;
+import org.springframework.core.log.LogAccessor;
import org.springframework.util.CollectionUtils;
import static org.assertj.core.api.Assertions.assertThat;
@@ -60,7 +59,7 @@ import static org.assertj.core.api.Assertions.assertThat;
@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 @@ class OpenAiChatModelProxyToolCallsIT {
}
while (isToolCall);
- logger.info("Response: {}", chatResponse);
+ logger.info("Response: " + chatResponse);
assertThat(chatResponse.getResult().getOutput().getText()).contains("30", "10", "15");
}
@@ -223,7 +222,7 @@ class OpenAiChatModelProxyToolCallsIT {
.map(cr -> cr.getResult().getOutput().getText())
.collect(Collectors.joining());
- logger.info("Response: {}", response);
+ logger.info("Response: " + response);
assertThat(response).contains("30", "10", "15");
@@ -304,7 +303,7 @@ class OpenAiChatModelProxyToolCallsIT {
return functionResponse;
});
- logger.info("Response: {}", chatResponse);
+ logger.info("Response: " + chatResponse);
assertThat(chatResponse.getResult().getOutput().getText()).contains("30", "10", "15");
}
@@ -344,7 +343,7 @@ class OpenAiChatModelProxyToolCallsIT {
.map(cr -> cr.getResult().getOutput().getText())
.collect(Collectors.joining());
- logger.info("Response: {}", response);
+ logger.info("Response: " + response);
assertThat(response).contains("30", "10", "15");
diff --git a/models/spring-ai-openai/src/test/java/org/springframework/ai/openai/chat/OpenAiChatModelResponseFormatIT.java b/models/spring-ai-openai/src/test/java/org/springframework/ai/openai/chat/OpenAiChatModelResponseFormatIT.java
index f2f286496..eaaff36f1 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.JsonMappingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.condition.EnabledIfEnvironmentVariable;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
import org.springframework.ai.chat.model.ChatResponse;
import org.springframework.ai.chat.prompt.Prompt;
@@ -40,6 +38,7 @@ import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.SpringBootConfiguration;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.context.annotation.Bean;
+import org.springframework.core.log.LogAccessor;
import static org.assertj.core.api.Assertions.assertThat;
@@ -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 @@ public class OpenAiChatModelResponseFormatIT {
String content = response.getResult().getOutput().getText();
- logger.info("Response content: {}", content);
+ logger.info("Response content: " + content);
assertThat(isValidJson(content)).isTrue();
}
@@ -134,7 +133,7 @@ public class OpenAiChatModelResponseFormatIT {
String content = response.getResult().getOutput().getText();
- logger.info("Response content: {}", content);
+ logger.info("Response content: " + content);
assertThat(isValidJson(content)).isTrue();
}
@@ -215,7 +214,7 @@ public class OpenAiChatModelResponseFormatIT {
String content = response.getResult().getOutput().getText();
- logger.info("Response content: {}", content);
+ logger.info("Response content: " + content);
assertThat(isValidJson(content)).isTrue();
diff --git a/models/spring-ai-openai/src/test/java/org/springframework/ai/openai/chat/OpenAiChatModelTypeReferenceBeanOutputConverterIT.java b/models/spring-ai-openai/src/test/java/org/springframework/ai/openai/chat/OpenAiChatModelTypeReferenceBeanOutputConverterIT.java
index 1831095ab..549295494 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 java.util.stream.Collectors;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.condition.EnabledIfEnvironmentVariable;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
import org.springframework.ai.chat.messages.AssistantMessage;
import org.springframework.ai.chat.model.ChatResponse;
@@ -35,6 +33,7 @@ import org.springframework.ai.openai.OpenAiTestConfiguration;
import org.springframework.ai.openai.testutils.AbstractIT;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.core.ParameterizedTypeReference;
+import org.springframework.core.log.LogAccessor;
import static org.assertj.core.api.Assertions.assertThat;
@@ -42,8 +41,7 @@ import static org.assertj.core.api.Assertions.assertThat;
@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 f2a92a1ef..fee7902fc 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 java.util.stream.Collectors;
import org.junit.jupiter.api.condition.EnabledIfEnvironmentVariable;
import org.junit.jupiter.params.ParameterizedTest;
import org.junit.jupiter.params.provider.ValueSource;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
import reactor.core.publisher.Flux;
import org.springframework.ai.chat.client.ChatClient;
@@ -48,6 +46,7 @@ import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Description;
import org.springframework.core.ParameterizedTypeReference;
+import org.springframework.core.log.LogAccessor;
import static org.assertj.core.api.Assertions.assertThat;
@@ -58,7 +57,7 @@ import static org.assertj.core.api.Assertions.assertThat;
@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 @@ public class OpenAiPaymentTransactionIT {
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 20ca78309..1c3d4e5ff 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.Test;
import org.junit.jupiter.api.extension.ExtendWith;
import org.mockito.Mock;
import org.mockito.junit.jupiter.MockitoExtension;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
import reactor.core.publisher.Flux;
import org.springframework.ai.audio.transcription.AudioTranscriptionPrompt;
@@ -64,6 +62,7 @@ import org.springframework.ai.openai.api.OpenAiImageApi.OpenAiImageResponse;
import org.springframework.ai.retry.RetryUtils;
import org.springframework.ai.retry.TransientAiException;
import org.springframework.core.io.ClassPathResource;
+import org.springframework.core.log.LogAccessor;
import org.springframework.http.ResponseEntity;
import org.springframework.retry.RetryCallback;
import org.springframework.retry.RetryContext;
@@ -84,7 +83,7 @@ import static org.mockito.BDDMockito.given;
@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 ff4bbd732..cf152c687 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.Test;
import org.junit.jupiter.api.condition.EnabledIfEnvironmentVariable;
import org.junit.jupiter.params.ParameterizedTest;
import org.junit.jupiter.params.provider.ValueSource;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
import reactor.core.publisher.Flux;
import org.springframework.ai.chat.client.ChatClient;
@@ -50,6 +48,7 @@ import org.springframework.core.ParameterizedTypeReference;
import org.springframework.core.convert.support.DefaultConversionService;
import org.springframework.core.io.ClassPathResource;
import org.springframework.core.io.Resource;
+import org.springframework.core.log.LogAccessor;
import org.springframework.test.context.ActiveProfiles;
import org.springframework.util.MimeTypeUtils;
@@ -60,7 +59,7 @@ import static org.assertj.core.api.Assertions.assertThat;
@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 @@ class OpenAiChatClientIT extends AbstractIT {
.content();
// @formatter:on
- logger.info("Response: {}", response);
+ logger.info("Response: " + response);
assertThat(response).contains("30", "10", "15");
}
@@ -280,7 +279,7 @@ class OpenAiChatClientIT extends AbstractIT {
.prompt().call().content();
// @formatter:on
- logger.info("Response: {}", response);
+ logger.info("Response: " + response);
assertThat(response).contains("30", "10", "15");
}
@@ -301,7 +300,7 @@ class OpenAiChatClientIT extends AbstractIT {
// @formatter:on
String content = response.collectList().block().stream().collect(Collectors.joining());
- logger.info("Response: {}", content);
+ logger.info("Response: " + content);
assertThat(content).contains("30", "10", "15");
}
@@ -363,7 +362,7 @@ class OpenAiChatClientIT extends AbstractIT {
String content = response.collectList().block().stream().collect(Collectors.joining());
- logger.info("Response: {}", content);
+ logger.info("Response: " + content);
assertThat(content).contains("bananas", "apple");
assertThat(content).containsAnyOf("bowl", "basket");
}
diff --git a/models/spring-ai-openai/src/test/java/org/springframework/ai/openai/chat/client/OpenAiChatClientMethodInvokingFunctionCallbackIT.java b/models/spring-ai-openai/src/test/java/org/springframework/ai/openai/chat/client/OpenAiChatClientMethodInvokingFunctionCallbackIT.java
index 5d5e69188..ec78c50c3 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 java.util.concurrent.ConcurrentHashMap;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.condition.EnabledIfEnvironmentVariable;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
import org.springframework.ai.chat.client.ChatClient;
import org.springframework.ai.chat.model.ChatModel;
@@ -32,6 +30,7 @@ import org.springframework.ai.model.function.FunctionCallback;
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 @@ import static org.assertj.core.api.AssertionsForClassTypes.assertThatThrownBy;
@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 @@ class OpenAiChatClientMethodInvokingFunctionCallbackIT {
.content();
// @formatter:on
- logger.info("Response: {}", response);
+ logger.info("Response: " + response);
assertThat(response).contains("30", "10", "15");
}
@@ -91,7 +89,7 @@ class OpenAiChatClientMethodInvokingFunctionCallbackIT {
.content();
// @formatter:on
- logger.info("Response: {}", response);
+ logger.info("Response: " + response);
assertThat(arguments).containsEntry("roomName", "living room");
assertThat(arguments).containsEntry("on", true);
@@ -114,7 +112,7 @@ class OpenAiChatClientMethodInvokingFunctionCallbackIT {
.content();
// @formatter:on
- logger.info("Response: {}", response);
+ logger.info("Response: " + response);
assertThat(response).contains("30", "10", "15");
}
@@ -137,7 +135,7 @@ class OpenAiChatClientMethodInvokingFunctionCallbackIT {
.content();
// @formatter:on
- logger.info("Response: {}", response);
+ logger.info("Response: " + response);
assertThat(response).contains("30", "10", "15");
assertThat(arguments).containsEntry("tool", "value");
@@ -181,7 +179,7 @@ class OpenAiChatClientMethodInvokingFunctionCallbackIT {
.content();
// @formatter:on
- logger.info("Response: {}", response);
+ logger.info("Response: " + response);
assertThat(arguments).containsEntry("turnLivingRoomLightOn", true);
}
@@ -234,7 +232,7 @@ class OpenAiChatClientMethodInvokingFunctionCallbackIT {
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 915d68845..e4f9b8502 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 java.util.stream.Collectors;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.condition.EnabledIfEnvironmentVariable;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
import reactor.core.publisher.Flux;
import org.springframework.ai.chat.client.ChatClient;
@@ -40,6 +38,7 @@ import org.springframework.ai.openai.testutils.AbstractIT;
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 @@ import static org.assertj.core.api.Assertions.assertThat;
@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 @@ class OpenAiChatClientMultipleFunctionCallsIT extends AbstractIT {
.content();
// @formatter:on
- logger.info("Response: {}", response);
+ logger.info("Response: " + response);
assertThat(response).doesNotContain("30", "10", "15");
@@ -93,7 +92,7 @@ class OpenAiChatClientMultipleFunctionCallsIT extends AbstractIT {
.content();
// @formatter:on
- logger.info("Response: {}", response);
+ logger.info("Response: " + response);
assertThat(response).contains("30", "10", "15");
@@ -104,7 +103,7 @@ class OpenAiChatClientMultipleFunctionCallsIT extends AbstractIT {
.content();
// @formatter:on
- logger.info("Response: {}", response);
+ logger.info("Response: " + response);
assertThat(response).doesNotContain("30", "10", "15");
@@ -125,7 +124,7 @@ class OpenAiChatClientMultipleFunctionCallsIT extends AbstractIT {
.prompt().call().content();
// @formatter:on
- logger.info("Response: {}", response);
+ logger.info("Response: " + response);
assertThat(response).contains("30", "10", "15");
}
@@ -169,7 +168,7 @@ class OpenAiChatClientMultipleFunctionCallsIT extends AbstractIT {
.prompt().call().content();
// @formatter:on
- logger.info("Response: {}", response);
+ logger.info("Response: " + response);
assertThat(response).contains("30", "10", "15");
}
@@ -214,7 +213,7 @@ class OpenAiChatClientMultipleFunctionCallsIT extends AbstractIT {
.call().content();
// @formatter:on
- logger.info("Response: {}", response);
+ logger.info("Response: " + response);
assertThat(response).contains("30", "10", "15");
}
@@ -235,7 +234,7 @@ class OpenAiChatClientMultipleFunctionCallsIT extends AbstractIT {
// @formatter:on
String content = response.collectList().block().stream().collect(Collectors.joining());
- logger.info("Response: {}", content);
+ logger.info("Response: " + content);
assertThat(content).contains("30", "10", "15");
diff --git a/models/spring-ai-openai/src/test/java/org/springframework/ai/openai/chat/client/OpenAiChatClientProxyFunctionCallsIT.java b/models/spring-ai-openai/src/test/java/org/springframework/ai/openai/chat/client/OpenAiChatClientProxyFunctionCallsIT.java
index d3e022ada..a173eb755 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.JsonMappingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.condition.EnabledIfEnvironmentVariable;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
import org.springframework.ai.chat.client.ChatClient;
import org.springframework.ai.chat.messages.AssistantMessage;
@@ -49,6 +47,7 @@ import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.core.io.Resource;
+import org.springframework.core.log.LogAccessor;
import org.springframework.test.context.ActiveProfiles;
import org.springframework.util.CollectionUtils;
@@ -59,7 +58,7 @@ import static org.assertj.core.api.Assertions.assertThat;
@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 @@ class OpenAiChatClientProxyFunctionCallsIT extends AbstractIT {
}
while (isToolCall);
- logger.info("Response: {}", chatResponse);
+ logger.info("Response: " + chatResponse);
assertThat(chatResponse.getResult().getOutput().getText()).contains("30", "10", "15");
}
diff --git a/models/spring-ai-openai/src/test/java/org/springframework/ai/openai/chat/proxy/GroqWithOpenAiChatModelIT.java b/models/spring-ai-openai/src/test/java/org/springframework/ai/openai/chat/proxy/GroqWithOpenAiChatModelIT.java
index cce105b78..1f4866c23 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.Test;
import org.junit.jupiter.api.condition.EnabledIfEnvironmentVariable;
import org.junit.jupiter.params.ParameterizedTest;
import org.junit.jupiter.params.provider.ValueSource;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
import reactor.core.publisher.Flux;
import org.springframework.ai.chat.client.ChatClient;
@@ -60,6 +58,7 @@ import org.springframework.context.annotation.Bean;
import org.springframework.core.convert.support.DefaultConversionService;
import org.springframework.core.io.ClassPathResource;
import org.springframework.core.io.Resource;
+import org.springframework.core.log.LogAccessor;
import org.springframework.util.MimeTypeUtils;
import static org.assertj.core.api.Assertions.assertThat;
@@ -69,7 +68,7 @@ import static org.assertj.core.api.Assertions.assertThat;
@Disabled("Due to rate limiting it is hard to run it in one go")
class GroqWithOpenAiChatModelIT {
- private static final 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 @@ class GroqWithOpenAiChatModelIT {
ChatResponse response = this.chatModel.call(new Prompt(messages, promptOptions));
- logger.info("Response: {}", response);
+ logger.info("Response: " + response);
assertThat(response.getResult().getOutput().getText()).contains("30", "10", "15");
}
@@ -289,7 +288,7 @@ class GroqWithOpenAiChatModelIT {
.map(Generation::getOutput)
.map(AssistantMessage::getText)
.collect(Collectors.joining());
- logger.info("Response: {}", content);
+ logger.info("Response: " + content);
assertThat(content).contains("30", "10", "15");
}
@@ -351,7 +350,7 @@ class GroqWithOpenAiChatModelIT {
.map(Generation::getOutput)
.map(AssistantMessage::getText)
.collect(Collectors.joining());
- logger.info("Response: {}", content);
+ logger.info("Response: " + content);
assertThat(content).contains("bananas", "apple");
assertThat(content).containsAnyOf("bowl", "basket");
}
diff --git a/models/spring-ai-openai/src/test/java/org/springframework/ai/openai/chat/proxy/MistralWithOpenAiChatModelIT.java b/models/spring-ai-openai/src/test/java/org/springframework/ai/openai/chat/proxy/MistralWithOpenAiChatModelIT.java
index 7071f3608..cfb073c68 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.Test;
import org.junit.jupiter.api.condition.EnabledIfEnvironmentVariable;
import org.junit.jupiter.params.ParameterizedTest;
import org.junit.jupiter.params.provider.ValueSource;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
import reactor.core.publisher.Flux;
import org.springframework.ai.chat.client.ChatClient;
@@ -60,6 +58,7 @@ import org.springframework.context.annotation.Bean;
import org.springframework.core.convert.support.DefaultConversionService;
import org.springframework.core.io.ClassPathResource;
import org.springframework.core.io.Resource;
+import org.springframework.core.log.LogAccessor;
import org.springframework.util.MimeTypeUtils;
import static org.assertj.core.api.Assertions.assertThat;
@@ -68,7 +67,7 @@ import static org.assertj.core.api.Assertions.assertThat;
@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 @@ class MistralWithOpenAiChatModelIT {
ChatResponse response = this.chatModel.call(new Prompt(messages, promptOptions));
- logger.info("Response: {}", response);
+ logger.info("Response: " + response);
assertThat(response.getResult().getOutput().getText()).contains("30", "10", "15");
}
@@ -293,7 +292,7 @@ class MistralWithOpenAiChatModelIT {
.map(Generation::getOutput)
.map(AssistantMessage::getText)
.collect(Collectors.joining());
- logger.info("Response: {}", content);
+ logger.info("Response: " + content);
assertThat(content).contains("30", "10", "15");
}
@@ -355,7 +354,7 @@ class MistralWithOpenAiChatModelIT {
.map(Generation::getOutput)
.map(AssistantMessage::getText)
.collect(Collectors.joining());
- logger.info("Response: {}", content);
+ logger.info("Response: " + content);
assertThat(content).contains("bananas", "apple");
assertThat(content).containsAnyOf("bowl", "basket");
}
diff --git a/models/spring-ai-openai/src/test/java/org/springframework/ai/openai/chat/proxy/NvidiaWithOpenAiChatModelIT.java b/models/spring-ai-openai/src/test/java/org/springframework/ai/openai/chat/proxy/NvidiaWithOpenAiChatModelIT.java
index 4983e96c7..a339af3fd 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 java.util.stream.Collectors;
import org.junit.jupiter.api.Disabled;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.condition.EnabledIfEnvironmentVariable;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
import reactor.core.publisher.Flux;
import org.springframework.ai.chat.client.ChatClient;
@@ -54,6 +52,7 @@ import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.context.annotation.Bean;
import org.springframework.core.convert.support.DefaultConversionService;
import org.springframework.core.io.Resource;
+import org.springframework.core.log.LogAccessor;
import static org.assertj.core.api.Assertions.assertThat;
@@ -66,7 +65,7 @@ import static org.assertj.core.api.Assertions.assertThat;
@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 @@ class NvidiaWithOpenAiChatModelIT {
ChatResponse response = this.chatModel.call(new Prompt(messages, promptOptions));
- logger.info("Response: {}", response);
+ logger.info("Response: " + response);
assertThat(response.getResult().getOutput().getText()).contains("30", "10", "15");
}
@@ -286,7 +285,7 @@ class NvidiaWithOpenAiChatModelIT {
.map(Generation::getOutput)
.map(AssistantMessage::getText)
.collect(Collectors.joining());
- logger.info("Response: {}", content);
+ logger.info("Response: " + content);
assertThat(content).contains("30", "10", "15");
}
diff --git a/models/spring-ai-openai/src/test/java/org/springframework/ai/openai/chat/proxy/OllamaWithOpenAiChatModelIT.java b/models/spring-ai-openai/src/test/java/org/springframework/ai/openai/chat/proxy/OllamaWithOpenAiChatModelIT.java
index c4637097f..c52bfd50d 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.Disabled;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.params.ParameterizedTest;
import org.junit.jupiter.params.provider.ValueSource;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
import org.testcontainers.junit.jupiter.Container;
import org.testcontainers.junit.jupiter.Testcontainers;
import org.testcontainers.ollama.OllamaContainer;
@@ -63,6 +61,7 @@ import org.springframework.context.annotation.Bean;
import org.springframework.core.convert.support.DefaultConversionService;
import org.springframework.core.io.ClassPathResource;
import org.springframework.core.io.Resource;
+import org.springframework.core.log.LogAccessor;
import org.springframework.util.MimeTypeUtils;
import static org.assertj.core.api.Assertions.assertThat;
@@ -72,7 +71,7 @@ import static org.assertj.core.api.Assertions.assertThat;
@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 @@ class OllamaWithOpenAiChatModelIT {
ChatResponse response = this.chatModel.call(new Prompt(messages, promptOptions));
- logger.info("Response: {}", response);
+ logger.info("Response: " + response);
assertThat(response.getResult().getOutput().getText()).contains("30", "10", "15");
}
@@ -317,7 +316,7 @@ class OllamaWithOpenAiChatModelIT {
.map(Generation::getOutput)
.map(AssistantMessage::getText)
.collect(Collectors.joining());
- logger.info("Response: {}", content);
+ logger.info("Response: " + content);
assertThat(content).contains("30", "10", "15");
}
@@ -380,7 +379,7 @@ class OllamaWithOpenAiChatModelIT {
.map(Generation::getOutput)
.map(AssistantMessage::getText)
.collect(Collectors.joining());
- logger.info("Response: {}", content);
+ logger.info("Response: " + content);
assertThat(content).contains("bananas", "apple");
assertThat(content).containsAnyOf("bowl", "basket");
}
diff --git a/models/spring-ai-openai/src/test/java/org/springframework/ai/openai/chat/proxy/PerplexityWithOpenAiChatModelIT.java b/models/spring-ai-openai/src/test/java/org/springframework/ai/openai/chat/proxy/PerplexityWithOpenAiChatModelIT.java
index ceb6c9441..03c0bf67c 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 java.util.stream.Collectors;
import org.junit.jupiter.api.Disabled;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.condition.EnabledIfEnvironmentVariable;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
import reactor.core.publisher.Flux;
import org.springframework.ai.chat.client.ChatClient;
@@ -55,6 +53,7 @@ import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.context.annotation.Bean;
import org.springframework.core.convert.support.DefaultConversionService;
import org.springframework.core.io.Resource;
+import org.springframework.core.log.LogAccessor;
import org.springframework.web.client.RestClient;
import org.springframework.web.reactive.function.client.WebClient;
@@ -77,7 +76,7 @@ import static org.assertj.core.api.Assertions.assertThat;
@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 @@ class PerplexityWithOpenAiChatModelIT {
ChatResponse response = this.chatModel.call(new Prompt(messages, promptOptions));
- logger.info("Response: {}", response);
+ logger.info("Response: " + response);
assertThat(response.getResults().stream().mapToLong(r -> r.getOutput().getToolCalls().size()).sum()).isZero();
}
@@ -297,7 +296,7 @@ class PerplexityWithOpenAiChatModelIT {
.map(Generation::getOutput)
.map(AssistantMessage::getText)
.collect(Collectors.joining());
- logger.info("Response: {}", content);
+ logger.info("Response: " + content);
assertThat(content).doesNotContain("toolCalls");
}
diff --git a/models/spring-ai-openai/src/test/java/org/springframework/ai/openai/testutils/AbstractIT.java b/models/spring-ai-openai/src/test/java/org/springframework/ai/openai/testutils/AbstractIT.java
index 90a0de6b6..adeb757ce 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 @@ package org.springframework.ai.openai.testutils;
import java.util.List;
import java.util.Map;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
import org.springframework.ai.chat.messages.Message;
import org.springframework.ai.chat.messages.SystemMessage;
import org.springframework.ai.chat.model.ChatModel;
@@ -38,13 +35,14 @@ import org.springframework.ai.openai.OpenAiModerationModel;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.core.io.Resource;
+import org.springframework.core.log.LogAccessor;
import static org.assertj.core.api.Assertions.assertThat;
import static org.assertj.core.api.Assertions.fail;
public abstract class AbstractIT {
- private static final 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 a2483861c..c29935b28 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 5f3d1ab71..0d6058e2c 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 java.util.Map;
import io.micrometer.observation.Observation;
import io.micrometer.observation.ObservationRegistry;
import io.micrometer.observation.contextpropagation.ObservationThreadLocalAccessor;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
import reactor.core.publisher.Flux;
import reactor.core.publisher.Mono;
@@ -52,6 +50,7 @@ import org.springframework.ai.qianfan.api.QianFanApi.ChatCompletionMessage.Role;
import org.springframework.ai.qianfan.api.QianFanApi.ChatCompletionRequest;
import org.springframework.ai.qianfan.api.QianFanConstants;
import org.springframework.ai.retry.RetryUtils;
+import org.springframework.core.log.LogAccessor;
import org.springframework.http.ResponseEntity;
import org.springframework.retry.support.RetryTemplate;
import org.springframework.util.Assert;
@@ -69,7 +68,7 @@ import org.springframework.util.Assert;
*/
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 class QianFanChatModel implements ChatModel, StreamingChatModel {
var chatCompletion = completionEntity.getBody();
if (chatCompletion == null) {
- logger.warn("No chat completion returned for prompt: {}", prompt);
+ logger.warn("No chat completion returned for prompt: " + prompt);
return new ChatResponse(List.of());
}
diff --git a/models/spring-ai-qianfan/src/main/java/org/springframework/ai/qianfan/QianFanEmbeddingModel.java b/models/spring-ai-qianfan/src/main/java/org/springframework/ai/qianfan/QianFanEmbeddingModel.java
index a77635d4a..758ee9f43 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 @@ package org.springframework.ai.qianfan;
import java.util.List;
import io.micrometer.observation.ObservationRegistry;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
import org.springframework.ai.chat.metadata.DefaultUsage;
import org.springframework.ai.document.Document;
@@ -40,6 +38,7 @@ import org.springframework.ai.qianfan.api.QianFanApi;
import org.springframework.ai.qianfan.api.QianFanApi.EmbeddingList;
import org.springframework.ai.qianfan.api.QianFanConstants;
import org.springframework.ai.retry.RetryUtils;
+import org.springframework.core.log.LogAccessor;
import org.springframework.lang.Nullable;
import org.springframework.retry.support.RetryTemplate;
import org.springframework.util.Assert;
@@ -53,7 +52,7 @@ import org.springframework.util.Assert;
*/
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 class QianFanEmbeddingModel extends AbstractEmbeddingModel {
.execute(ctx -> this.qianFanApi.embeddings(apiRequest).getBody());
if (apiEmbeddingResponse == null) {
- logger.warn("No embeddings returned for request: {}", request);
+ logger.warn("No embeddings returned for request: " + request);
return new EmbeddingResponse(List.of());
}
if (apiEmbeddingResponse.errorNsg() != null) {
- logger.error("Error message returned for request: {}", apiEmbeddingResponse.errorNsg());
+ logger.error("Error message returned for request: " + apiEmbeddingResponse.errorNsg());
throw new RuntimeException("Embedding failed: error code:" + apiEmbeddingResponse.errorCode()
+ ", message:" + apiEmbeddingResponse.errorNsg());
}
diff --git a/models/spring-ai-qianfan/src/main/java/org/springframework/ai/qianfan/QianFanImageModel.java b/models/spring-ai-qianfan/src/main/java/org/springframework/ai/qianfan/QianFanImageModel.java
index 91214f58b..db5d74e49 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 @@ package org.springframework.ai.qianfan;
import java.util.List;
import io.micrometer.observation.ObservationRegistry;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
import org.springframework.ai.image.Image;
import org.springframework.ai.image.ImageGeneration;
@@ -36,6 +34,7 @@ import org.springframework.ai.model.ModelOptionsUtils;
import org.springframework.ai.qianfan.api.QianFanConstants;
import org.springframework.ai.qianfan.api.QianFanImageApi;
import org.springframework.ai.retry.RetryUtils;
+import org.springframework.core.log.LogAccessor;
import org.springframework.http.ResponseEntity;
import org.springframework.lang.Nullable;
import org.springframework.retry.support.RetryTemplate;
@@ -50,7 +49,7 @@ import org.springframework.util.Assert;
*/
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 @@ public class QianFanImageModel implements ImageModel {
QianFanImageApi.QianFanImageRequest qianFanImageRequest) {
QianFanImageApi.QianFanImageResponse imageApiResponse = imageResponseEntity.getBody();
if (imageApiResponse == null) {
- logger.warn("No image response returned for request: {}", qianFanImageRequest);
+ logger.warn("No image response returned for request: " + qianFanImageRequest);
return new ImageResponse(List.of());
}
diff --git a/models/spring-ai-stability-ai/pom.xml b/models/spring-ai-stability-ai/pom.xml
index 0307df28d..182ccbead 100644
--- a/models/spring-ai-stability-ai/pom.xml
+++ b/models/spring-ai-stability-ai/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-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 5fd6f4a8b..e5951ff99 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.OrtEnvironment;
import ai.onnxruntime.OrtException;
import ai.onnxruntime.OrtSession;
import io.micrometer.observation.ObservationRegistry;
-import org.apache.commons.logging.Log;
-import org.apache.commons.logging.LogFactory;
import org.springframework.ai.document.Document;
import org.springframework.ai.document.MetadataMode;
@@ -55,6 +53,7 @@ import org.springframework.ai.observation.conventions.AiProvider;
import org.springframework.beans.factory.InitializingBean;
import org.springframework.core.io.DefaultResourceLoader;
import org.springframework.core.io.Resource;
+import org.springframework.core.log.LogAccessor;
import org.springframework.util.Assert;
import org.springframework.util.StringUtils;
@@ -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 5327e48b4..4ff85a918 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 9062f6ba3..d81410aaf 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.PredictResponse;
import com.google.cloud.aiplatform.v1.PredictionServiceClient;
import com.google.protobuf.InvalidProtocolBufferException;
import com.google.protobuf.Value;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
import org.springframework.ai.chat.metadata.DefaultUsage;
import org.springframework.ai.chat.metadata.Usage;
@@ -49,6 +47,7 @@ import org.springframework.ai.vertexai.embedding.VertexAiEmbeddingUtils;
import org.springframework.ai.vertexai.embedding.VertexAiEmbeddingUtils.ImageBuilder;
import org.springframework.ai.vertexai.embedding.VertexAiEmbeddingUtils.MultimodalInstanceBuilder;
import org.springframework.ai.vertexai.embedding.VertexAiEmbeddingUtils.VideoBuilder;
+import org.springframework.core.log.LogAccessor;
import org.springframework.util.Assert;
import org.springframework.util.MimeType;
import org.springframework.util.MimeTypeUtils;
@@ -64,7 +63,7 @@ import org.springframework.util.StringUtils;
*/
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 @@ public class VertexAiMultimodalEmbeddingModel implements DocumentEmbeddingModel
new DocumentMetadata(document.getId(), media.getMimeType(), media.getData()));
}
else {
- logger.warn("Unsupported image mime type: {}", media.getMimeType());
+ logger.warn("Unsupported image mime type: " + media.getMimeType());
throw new IllegalArgumentException("Unsupported image mime type: " + media.getMimeType());
}
}
@@ -179,7 +178,7 @@ public class VertexAiMultimodalEmbeddingModel implements DocumentEmbeddingModel
new DocumentMetadata(document.getId(), media.getMimeType(), media.getData()));
}
else {
- logger.warn("Unsupported media type: {}", media.getMimeType());
+ logger.warn("Unsupported media type: " + media.getMimeType());
throw new IllegalArgumentException("Unsupported media type: " + media.getMimeType());
}
}
diff --git a/models/spring-ai-vertex-ai-gemini/pom.xml b/models/spring-ai-vertex-ai-gemini/pom.xml
index cc184d54b..d17fd38c7 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 d79b317cd..fff34d698 100644
--- a/models/spring-ai-vertex-ai-gemini/src/test/java/org/springframework/ai/vertexai/gemini/function/MockWeatherService.java
+++ b/models/spring-ai-vertex-ai-gemini/src/test/java/org/springframework/ai/vertexai/gemini/function/MockWeatherService.java
@@ -23,15 +23,15 @@ import com.fasterxml.jackson.annotation.JsonInclude;
import com.fasterxml.jackson.annotation.JsonInclude.Include;
import com.fasterxml.jackson.annotation.JsonProperty;
import com.fasterxml.jackson.annotation.JsonPropertyDescription;
-import org.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 @@ public class MockWeatherService implements Function DATASET = Map.of(new Transaction("001"), new Status("pending"),
new Transaction("002"), new Status("approved"), new Transaction("003"), new Status("rejected"));
@@ -117,7 +116,7 @@ public class VertexAiGeminiPaymentTransactionIT {
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 c81cde7ea..fa0c128d1 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 169307400..0a10ca9a5 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 @@ package org.springframework.ai.watsonx;
import java.util.List;
import java.util.concurrent.atomic.AtomicInteger;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
import org.springframework.ai.document.Document;
import org.springframework.ai.embedding.AbstractEmbeddingModel;
import org.springframework.ai.embedding.Embedding;
@@ -32,6 +29,7 @@ import org.springframework.ai.embedding.EmbeddingResponse;
import org.springframework.ai.watsonx.api.WatsonxAiApi;
import org.springframework.ai.watsonx.api.WatsonxAiEmbeddingRequest;
import org.springframework.ai.watsonx.api.WatsonxAiEmbeddingResponse;
+import org.springframework.core.log.LogAccessor;
import org.springframework.util.Assert;
import org.springframework.util.StringUtils;
@@ -51,7 +49,7 @@ import org.springframework.util.StringUtils;
*/
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 f0f6a920f..85deca0f1 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 17d562852..47c9d5e69 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 java.util.concurrent.ConcurrentHashMap;
import io.micrometer.observation.Observation;
import io.micrometer.observation.ObservationRegistry;
import io.micrometer.observation.contextpropagation.ObservationThreadLocalAccessor;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
import reactor.core.publisher.Flux;
import reactor.core.publisher.Mono;
@@ -69,6 +67,7 @@ import org.springframework.ai.zhipuai.api.ZhiPuAiApi.ChatCompletionMessage.Role;
import org.springframework.ai.zhipuai.api.ZhiPuAiApi.ChatCompletionMessage.ToolCall;
import org.springframework.ai.zhipuai.api.ZhiPuAiApi.ChatCompletionRequest;
import org.springframework.ai.zhipuai.api.ZhiPuApiConstants;
+import org.springframework.core.log.LogAccessor;
import org.springframework.http.ResponseEntity;
import org.springframework.retry.support.RetryTemplate;
import org.springframework.util.Assert;
@@ -88,7 +87,7 @@ import org.springframework.util.MimeType;
*/
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 class ZhiPuAiChatModel extends AbstractToolCallSupport implements ChatMod
var chatCompletion = completionEntity.getBody();
if (chatCompletion == null) {
- logger.warn("No chat completion returned for prompt: {}", prompt);
+ logger.warn("No chat completion returned for prompt: " + prompt);
return new ChatResponse(List.of());
}
@@ -297,7 +296,7 @@ public class ZhiPuAiChatModel extends AbstractToolCallSupport implements ChatMod
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 0ba5666e7..2bc97e297 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.List;
import java.util.concurrent.atomic.AtomicInteger;
import io.micrometer.observation.ObservationRegistry;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
import org.springframework.ai.chat.metadata.DefaultUsage;
import org.springframework.ai.document.Document;
@@ -41,6 +39,7 @@ import org.springframework.ai.model.ModelOptionsUtils;
import org.springframework.ai.retry.RetryUtils;
import org.springframework.ai.zhipuai.api.ZhiPuAiApi;
import org.springframework.ai.zhipuai.api.ZhiPuApiConstants;
+import org.springframework.core.log.LogAccessor;
import org.springframework.lang.Nullable;
import org.springframework.retry.support.RetryTemplate;
import org.springframework.util.Assert;
@@ -53,7 +52,7 @@ import org.springframework.util.Assert;
*/
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 class ZhiPuAiEmbeddingModel extends AbstractEmbeddingModel {
ZhiPuAiApi.EmbeddingList response = this.retryTemplate
.execute(ctx -> this.zhiPuAiApi.embeddings(apiRequest).getBody());
if (response == null || response.data() == null || response.data().isEmpty()) {
- logger.warn("No embeddings returned for input: {}", inputContent);
+ logger.warn("No embeddings returned for input: " + inputContent);
embeddingList.add(new float[0]);
}
else {
diff --git a/models/spring-ai-zhipuai/src/main/java/org/springframework/ai/zhipuai/ZhiPuAiImageModel.java b/models/spring-ai-zhipuai/src/main/java/org/springframework/ai/zhipuai/ZhiPuAiImageModel.java
index 406221e7d..7dc3753ae 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 @@ package org.springframework.ai.zhipuai;
import java.util.List;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
import org.springframework.ai.image.Image;
import org.springframework.ai.image.ImageGeneration;
import org.springframework.ai.image.ImageModel;
@@ -30,6 +27,7 @@ import org.springframework.ai.image.ImageResponse;
import org.springframework.ai.model.ModelOptionsUtils;
import org.springframework.ai.retry.RetryUtils;
import org.springframework.ai.zhipuai.api.ZhiPuAiImageApi;
+import org.springframework.core.log.LogAccessor;
import org.springframework.http.ResponseEntity;
import org.springframework.retry.support.RetryTemplate;
import org.springframework.util.Assert;
@@ -43,7 +41,7 @@ import org.springframework.util.Assert;
*/
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 @@ public class ZhiPuAiImageModel implements ImageModel {
ZhiPuAiImageApi.ZhiPuAiImageRequest zhiPuAiImageRequest) {
ZhiPuAiImageApi.ZhiPuAiImageResponse imageApiResponse = imageResponseEntity.getBody();
if (imageApiResponse == null) {
- logger.warn("No image response returned for request: {}", zhiPuAiImageRequest);
+ logger.warn("No image response returned for request: " + zhiPuAiImageRequest);
return new ImageResponse(List.of());
}
diff --git a/models/spring-ai-zhipuai/src/test/java/org/springframework/ai/zhipuai/api/ZhiPuAiApiToolFunctionCallIT.java b/models/spring-ai-zhipuai/src/test/java/org/springframework/ai/zhipuai/api/ZhiPuAiApiToolFunctionCallIT.java
index c45b8b017..11b9029c1 100644
--- a/models/spring-ai-zhipuai/src/test/java/org/springframework/ai/zhipuai/api/ZhiPuAiApiToolFunctionCallIT.java
+++ b/models/spring-ai-zhipuai/src/test/java/org/springframework/ai/zhipuai/api/ZhiPuAiApiToolFunctionCallIT.java
@@ -24,8 +24,6 @@ import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.condition.EnabledIfEnvironmentVariable;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
import org.springframework.ai.model.ModelOptionsUtils;
import org.springframework.ai.zhipuai.api.ZhiPuAiApi.ChatCompletion;
@@ -34,6 +32,7 @@ import org.springframework.ai.zhipuai.api.ZhiPuAiApi.ChatCompletionMessage.Role;
import org.springframework.ai.zhipuai.api.ZhiPuAiApi.ChatCompletionMessage.ToolCall;
import org.springframework.ai.zhipuai.api.ZhiPuAiApi.ChatCompletionRequest;
import org.springframework.ai.zhipuai.api.ZhiPuAiApi.ChatCompletionRequest.ToolChoiceBuilder;
+import org.springframework.core.log.LogAccessor;
import org.springframework.http.ResponseEntity;
import static org.assertj.core.api.Assertions.assertThat;
@@ -44,7 +43,7 @@ import static org.assertj.core.api.Assertions.assertThat;
@EnabledIfEnvironmentVariable(named = "ZHIPU_AI_API_KEY", matches = ".+")
public class ZhiPuAiApiToolFunctionCallIT {
- private final Logger logger = LoggerFactory.getLogger(ZhiPuAiApiToolFunctionCallIT.class);
+ private static final LogAccessor logger = new LogAccessor(ZhiPuAiApiToolFunctionCallIT.class);
MockWeatherService weatherService = new MockWeatherService();
diff --git a/models/spring-ai-zhipuai/src/test/java/org/springframework/ai/zhipuai/chat/ZhiPuAiChatModelIT.java b/models/spring-ai-zhipuai/src/test/java/org/springframework/ai/zhipuai/chat/ZhiPuAiChatModelIT.java
index 40aa97419..cd0da6dbf 100644
--- a/models/spring-ai-zhipuai/src/test/java/org/springframework/ai/zhipuai/chat/ZhiPuAiChatModelIT.java
+++ b/models/spring-ai-zhipuai/src/test/java/org/springframework/ai/zhipuai/chat/ZhiPuAiChatModelIT.java
@@ -29,8 +29,6 @@ import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.condition.EnabledIfEnvironmentVariable;
import org.junit.jupiter.params.ParameterizedTest;
import org.junit.jupiter.params.provider.ValueSource;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
import reactor.core.publisher.Flux;
import org.springframework.ai.chat.messages.AssistantMessage;
@@ -58,6 +56,7 @@ import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.core.convert.support.DefaultConversionService;
import org.springframework.core.io.ClassPathResource;
import org.springframework.core.io.Resource;
+import org.springframework.core.log.LogAccessor;
import org.springframework.util.MimeTypeUtils;
import static org.assertj.core.api.Assertions.assertThat;
@@ -69,7 +68,7 @@ import static org.assertj.core.api.Assertions.assertThat;
@EnabledIfEnvironmentVariable(named = "ZHIPU_AI_API_KEY", matches = ".+")
class ZhiPuAiChatModelIT {
- private static final Logger logger = LoggerFactory.getLogger(ZhiPuAiChatModelIT.class);
+ private static final LogAccessor logger = new LogAccessor(ZhiPuAiChatModelIT.class);
@Autowired
protected ChatModel chatModel;
@@ -239,7 +238,7 @@ class ZhiPuAiChatModelIT {
ChatResponse response = this.chatModel.call(new Prompt(messages, promptOptions));
- logger.info("Response: {}", response);
+ logger.info("Response: " + response);
assertThat(response.getResult().getOutput().getText()).containsAnyOf("30.0", "30");
assertThat(response.getResult().getOutput().getText()).containsAnyOf("10.0", "10");
@@ -272,7 +271,7 @@ class ZhiPuAiChatModelIT {
.map(Generation::getOutput)
.map(AssistantMessage::getText)
.collect(Collectors.joining());
- logger.info("Response: {}", content);
+ logger.info("Response: " + content);
assertThat(content).containsAnyOf("30.0", "30");
assertThat(content).containsAnyOf("10.0", "10");
@@ -333,7 +332,7 @@ class ZhiPuAiChatModelIT {
.map(Generation::getOutput)
.map(AssistantMessage::getText)
.collect(Collectors.joining());
- logger.info("Response: {}", content);
+ logger.info("Response: " + content);
assertThat(content).contains("bananas", "apple");
assertThat(content).containsAnyOf("bowl", "basket");
}
diff --git a/spring-ai-core/src/main/java/org/springframework/ai/aot/AiRuntimeHints.java b/spring-ai-core/src/main/java/org/springframework/ai/aot/AiRuntimeHints.java
index 286059bd3..744d84286 100644
--- a/spring-ai-core/src/main/java/org/springframework/ai/aot/AiRuntimeHints.java
+++ b/spring-ai-core/src/main/java/org/springframework/ai/aot/AiRuntimeHints.java
@@ -25,11 +25,10 @@ import java.util.stream.Collectors;
import com.fasterxml.jackson.annotation.JsonInclude;
import com.fasterxml.jackson.annotation.JsonProperty;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
import org.springframework.aot.hint.TypeReference;
import org.springframework.context.annotation.ClassPathScanningCandidateComponentProvider;
+import org.springframework.core.log.LogAccessor;
import org.springframework.core.type.filter.AnnotationTypeFilter;
import org.springframework.core.type.filter.TypeFilter;
@@ -43,7 +42,7 @@ import org.springframework.core.type.filter.TypeFilter;
*/
public abstract class AiRuntimeHints {
- private static final Logger log = LoggerFactory.getLogger(AiRuntimeHints.class);
+ private static final LogAccessor logger = new LogAccessor(AiRuntimeHints.class);
/**
* Finds classes in a package that are annotated with JsonInclude or have Jackson
@@ -91,8 +90,8 @@ public abstract class AiRuntimeHints {
.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 c6fc0d794..17c3ff648 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 @@ package org.springframework.ai.chat.client.advisor;
import java.util.function.Function;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
import reactor.core.publisher.Flux;
import org.springframework.ai.chat.client.advisor.api.AdvisedRequest;
@@ -31,6 +29,7 @@ import org.springframework.ai.chat.client.advisor.api.StreamAroundAdvisorChain;
import org.springframework.ai.chat.model.ChatResponse;
import org.springframework.ai.chat.model.MessageAggregator;
import org.springframework.ai.model.ModelOptionsUtils;
+import org.springframework.core.log.LogAccessor;
/**
* A simple logger advisor that logs the request and response messages.
@@ -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 class SimpleLoggerAdvisor implements CallAroundAdvisor, StreamAroundAdvis
}
private AdvisedRequest before(AdvisedRequest request) {
- logger.debug("request: {}", this.requestToString.apply(request));
+ logger.debug("request: " + this.requestToString.apply(request));
return request;
}
private void observeAfter(AdvisedResponse advisedResponse) {
- logger.debug("response: {}", this.responseToString.apply(advisedResponse.response()));
+ logger.debug("response: " + this.responseToString.apply(advisedResponse.response()));
}
@Override
diff --git a/spring-ai-core/src/main/java/org/springframework/ai/chat/metadata/ChatResponseMetadata.java b/spring-ai-core/src/main/java/org/springframework/ai/chat/metadata/ChatResponseMetadata.java
index b8392c7ed..61ad0d068 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 @@ package org.springframework.ai.chat.metadata;
import java.util.Map;
import java.util.Objects;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
import org.springframework.ai.model.AbstractResponseMetadata;
import org.springframework.ai.model.ResponseMetadata;
+import org.springframework.core.log.LogAccessor;
/**
* Models common AI provider metadata returned in an AI response.
@@ -36,7 +34,7 @@ import org.springframework.ai.model.ResponseMetadata;
*/
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 class ChatResponseMetadata extends AbstractResponseMetadata implements Re
this.chatResponseMetadata.map.put(key, value);
}
else {
- logger.debug("Ignore null value for key [{}]", key);
+ logger.debug("Ignore null value for key [" + key + "]");
}
return this;
}
diff --git a/spring-ai-core/src/main/java/org/springframework/ai/chat/model/MessageAggregator.java b/spring-ai-core/src/main/java/org/springframework/ai/chat/model/MessageAggregator.java
index b94a91f6d..dc0a6019d 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.Map;
import java.util.concurrent.atomic.AtomicReference;
import java.util.function.Consumer;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
import reactor.core.publisher.Flux;
import org.springframework.ai.chat.client.advisor.api.AdvisedResponse;
@@ -34,6 +32,7 @@ import org.springframework.ai.chat.metadata.EmptyRateLimit;
import org.springframework.ai.chat.metadata.PromptMetadata;
import org.springframework.ai.chat.metadata.RateLimit;
import org.springframework.ai.chat.metadata.Usage;
+import org.springframework.core.log.LogAccessor;
import org.springframework.util.StringUtils;
/**
@@ -46,7 +45,7 @@ import org.springframework.util.StringUtils;
*/
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 class MessageAggregator {
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 ea7cf3141..a5010824d 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.SchemaGeneratorConfig;
import com.github.victools.jsonschema.generator.SchemaGeneratorConfigBuilder;
import com.github.victools.jsonschema.module.jackson.JacksonModule;
import com.github.victools.jsonschema.module.jackson.JacksonOption;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
import org.springframework.ai.util.JacksonUtils;
import org.springframework.core.ParameterizedTypeReference;
+import org.springframework.core.log.LogAccessor;
import org.springframework.lang.NonNull;
/**
@@ -59,7 +58,7 @@ import org.springframework.lang.NonNull;
*/
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 class BeanOutputConverter implements StructuredOutputConverter {
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 d18e0bf5d..bef09e773 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.Consumer;
import java.util.function.Function;
import java.util.function.Supplier;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
import org.springframework.ai.chat.model.ToolContext;
import org.springframework.ai.model.ModelOptionsUtils;
import org.springframework.ai.model.function.FunctionCallback.FunctionInvokingSpec;
@@ -35,6 +32,7 @@ import org.springframework.ai.tool.function.FunctionToolCallback;
import org.springframework.ai.tool.method.MethodToolCallback;
import org.springframework.ai.util.ParsingUtils;
import org.springframework.core.ParameterizedTypeReference;
+import org.springframework.core.log.LogAccessor;
import org.springframework.util.Assert;
import org.springframework.util.ReflectionUtils;
import org.springframework.util.StringUtils;
@@ -50,7 +48,7 @@ import org.springframework.util.StringUtils;
@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 @@ public class DefaultFunctionCallbackBuilder implements FunctionCallback.Builder
String generatedDescription = ParsingUtils.reConcatenateCamelCase(fromName, " ");
- logger.info("Description is not set! A best effort attempt to generate a description:'{}' 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 e3a724b15..a02637916 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.ObjectMapper;
import com.fasterxml.jackson.databind.node.ObjectNode;
import com.fasterxml.jackson.module.jsonSchema.JsonSchema;
import com.fasterxml.jackson.module.jsonSchema.JsonSchemaGenerator;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
import org.springframework.ai.chat.model.ToolContext;
import org.springframework.ai.model.ModelOptionsUtils;
import org.springframework.ai.tool.method.MethodToolCallback;
+import org.springframework.core.log.LogAccessor;
import org.springframework.util.Assert;
import org.springframework.util.ClassUtils;
import org.springframework.util.CollectionUtils;
@@ -57,7 +56,7 @@ import org.springframework.util.ReflectionUtils;
@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 0e6cd80d5..62a802d55 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.Observation.Context;
import io.micrometer.observation.ObservationHandler;
import io.micrometer.tracing.Tracer;
import io.micrometer.tracing.handler.TracingObservationHandler.TracingContext;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
+import org.springframework.core.log.LogAccessor;
import org.springframework.util.Assert;
/**
@@ -38,7 +37,7 @@ import org.springframework.util.Assert;
@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 a675fd98e..bcccb6456 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 java.util.StringJoiner;
import io.micrometer.tracing.handler.TracingObservationHandler;
import io.opentelemetry.api.trace.Span;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
+import org.springframework.core.log.LogAccessor;
import org.springframework.lang.Nullable;
/**
@@ -36,7 +35,7 @@ import org.springframework.lang.Nullable;
*/
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 final class TracingHelper {
}
}
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 42ab33d4d..fa1cd582f 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.List;
import java.util.Map;
import java.util.stream.Collectors;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
import org.springframework.ai.chat.prompt.PromptTemplate;
import org.springframework.ai.document.Document;
import org.springframework.ai.rag.Query;
import org.springframework.ai.util.PromptAssert;
+import org.springframework.core.log.LogAccessor;
import org.springframework.lang.Nullable;
import org.springframework.util.Assert;
@@ -47,7 +45,7 @@ import org.springframework.util.Assert;
*/
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 aa64f46cf..20094bbed 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.Arrays;
import java.util.List;
import java.util.stream.Collectors;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
import org.springframework.ai.chat.client.ChatClient;
import org.springframework.ai.chat.prompt.PromptTemplate;
import org.springframework.ai.rag.Query;
import org.springframework.ai.util.PromptAssert;
+import org.springframework.core.log.LogAccessor;
import org.springframework.lang.Nullable;
import org.springframework.util.Assert;
import org.springframework.util.CollectionUtils;
@@ -51,7 +49,7 @@ import org.springframework.util.StringUtils;
*/
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 final class MultiQueryExpander implements QueryExpander {
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 final class MultiQueryExpander implements QueryExpander {
var queryVariants = Arrays.asList(response.split("\n"));
if (CollectionUtils.isEmpty(queryVariants) || this.numberOfQueries != queryVariants.size()) {
- logger.warn(
- "Query expansion result does not contain the requested {} 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 11cb23b22..53aaf8b4d 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 @@ package org.springframework.ai.rag.preretrieval.query.transformation;
import java.util.List;
import java.util.stream.Collectors;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
import org.springframework.ai.chat.client.ChatClient;
import org.springframework.ai.chat.messages.Message;
import org.springframework.ai.chat.messages.MessageType;
@@ -29,6 +26,7 @@ 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;
@@ -45,7 +43,7 @@ import org.springframework.util.StringUtils;
*/
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 8dd495029..c7d87a8bf 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 @@ import org.springframework.util.StringUtils;
*/
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 class RewriteQueryTransformer implements QueryTransformer {
public Query transform(Query query) {
Assert.notNull(query, "query cannot be null");
- logger.debug("Rewriting query to optimize for querying a {}.", this.targetSearchSystem);
+ logger.debug("Rewriting query to optimize for querying a " + this.targetSearchSystem + ".");
var rewrittenQueryText = this.chatClient.prompt()
.user(user -> user.text(this.promptTemplate.getTemplate())
diff --git a/spring-ai-core/src/main/java/org/springframework/ai/rag/preretrieval/query/transformation/TranslationQueryTransformer.java b/spring-ai-core/src/main/java/org/springframework/ai/rag/preretrieval/query/transformation/TranslationQueryTransformer.java
index 7ddf2c7d6..1a151e286 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 @@ import org.springframework.util.StringUtils;
*/
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 final class TranslationQueryTransformer implements QueryTransformer {
public Query transform(Query query) {
Assert.notNull(query, "query cannot be null");
- logger.debug("Translating query to target language: {}", this.targetLanguage);
+ logger.debug("Translating query to target language: " + this.targetLanguage);
var translatedQueryText = this.chatClient.prompt()
.user(user -> user.text(this.promptTemplate.getTemplate())
diff --git a/spring-ai-core/src/main/java/org/springframework/ai/rag/retrieval/join/ConcatenationDocumentJoiner.java b/spring-ai-core/src/main/java/org/springframework/ai/rag/retrieval/join/ConcatenationDocumentJoiner.java
index 56038587f..5c7c8dc90 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.Map;
import java.util.function.Function;
import java.util.stream.Collectors;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
import org.springframework.ai.document.Document;
import org.springframework.ai.rag.Query;
+import org.springframework.core.log.LogAccessor;
import org.springframework.util.Assert;
/**
@@ -39,7 +37,7 @@ import org.springframework.util.Assert;
*/
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 70137e2d3..c59fef184 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.ToolCallResultConverter;
import org.springframework.ai.tool.execution.ToolExecutionException;
import org.springframework.ai.tool.metadata.ToolMetadata;
import org.springframework.ai.util.json.JsonParser;
+import org.springframework.core.log.LogAccessor;
import org.springframework.lang.Nullable;
import org.springframework.util.Assert;
import org.springframework.util.ClassUtils;
import org.springframework.util.CollectionUtils;
-import 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 @@ import java.util.stream.Stream;
*/
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 class MethodToolCallback implements ToolCallback {
public String call(String toolInput, @Nullable ToolContext toolContext) {
Assert.hasText(toolInput, "toolInput cannot be null or empty");
- logger.debug("Starting execution of tool: {}", toolDefinition.name());
+ logger.debug("Starting execution of tool: " + toolDefinition.name());
validateToolContextSupport(toolContext);
@@ -105,7 +105,7 @@ public class MethodToolCallback implements ToolCallback {
Object result = callMethod(methodArguments);
- logger.debug("Successful execution of tool: {}", toolDefinition.name());
+ logger.debug("Successful execution of tool: " + toolDefinition.name());
Type returnType = toolMethod.getGenericReturnType();
diff --git a/spring-ai-core/src/main/java/org/springframework/ai/tool/method/MethodToolCallbackProvider.java b/spring-ai-core/src/main/java/org/springframework/ai/tool/method/MethodToolCallbackProvider.java
index ab89f2d73..dc130a937 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,18 +16,6 @@
package org.springframework.ai.tool.method;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.springframework.ai.tool.ToolCallback;
-import org.springframework.ai.tool.ToolCallbackProvider;
-import org.springframework.ai.tool.annotation.Tool;
-import org.springframework.ai.tool.definition.ToolDefinition;
-import org.springframework.ai.tool.metadata.ToolMetadata;
-import org.springframework.ai.tool.util.ToolUtils;
-import org.springframework.util.Assert;
-import org.springframework.util.ClassUtils;
-import org.springframework.util.ReflectionUtils;
-
import java.lang.reflect.Method;
import java.util.Arrays;
import java.util.List;
@@ -37,6 +25,17 @@ import java.util.function.Supplier;
import java.util.stream.Collectors;
import java.util.stream.Stream;
+import org.springframework.ai.tool.ToolCallback;
+import org.springframework.ai.tool.ToolCallbackProvider;
+import org.springframework.ai.tool.annotation.Tool;
+import org.springframework.ai.tool.definition.ToolDefinition;
+import org.springframework.ai.tool.metadata.ToolMetadata;
+import org.springframework.ai.tool.util.ToolUtils;
+import org.springframework.core.log.LogAccessor;
+import org.springframework.util.Assert;
+import org.springframework.util.ClassUtils;
+import org.springframework.util.ReflectionUtils;
+
/**
* A {@link ToolCallbackProvider} that builds {@link ToolCallback} instances from
* {@link Tool}-annotated methods.
@@ -46,7 +45,7 @@ import java.util.stream.Stream;
*/
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