From a2f46beb3dc97b56bdc1f342bdcb3fcdfc455afb Mon Sep 17 00:00:00 2001 From: Ilayaperumal Gopinathan Date: Sat, 1 Feb 2025 08:13:28 +0000 Subject: [PATCH] Re-add slf4j logging - This PR reverts the changes to update Apache Commons Logging and re-add the previously used slf4j logging --- .../ai/reader/pdf/PagePdfDocumentReader.java | 12 +++--- .../pdf/ParagraphPdfDocumentReader.java | 5 ++- models/spring-ai-anthropic/pom.xml | 4 ++ .../ai/anthropic/AnthropicChatModel.java | 5 ++- .../ai/anthropic/AnthropicChatModelIT.java | 11 ++--- .../ai/anthropic/EventParsingTests.java | 5 ++- .../api/tool/AnthropicApiLegacyToolIT.java | 5 ++- .../api/tool/AnthropicApiToolIT.java | 5 ++- .../client/AnthropicChatClientIT.java | 15 ++++--- ...lientMethodInvokingFunctionCallbackIT.java | 25 +++++------ models/spring-ai-azure-openai/pom.xml | 5 +++ .../openai/AzureOpenAiEmbeddingModel.java | 5 ++- .../azure/openai/AzureOpenAiImageModel.java | 11 ++--- .../azure/openai/AzureOpenAiChatModelIT.java | 5 ++- .../azure/openai/MockAiTestConfiguration.java | 11 ++--- .../AzureOpenAiChatModelFunctionCallIT.java | 15 ++++--- .../converse/BedrockProxyChatModel.java | 11 ++--- .../converse/BedrockConverseChatClientIT.java | 19 ++++---- .../converse/BedrockProxyChatModelIT.java | 9 ++-- .../client/BedrockNovaChatClientIT.java | 7 +-- .../ai/bedrock/api/AbstractBedrockApi.java | 7 +-- .../titan/BedrockTitanEmbeddingModel.java | 8 ++-- models/spring-ai-huggingface/pom.xml | 5 +++ models/spring-ai-minimax/pom.xml | 5 +++ .../ai/minimax/MiniMaxChatModel.java | 13 +++--- .../ai/minimax/MiniMaxEmbeddingModel.java | 7 +-- .../api/MiniMaxApiToolFunctionCallIT.java | 5 ++- .../minimax/chat/MiniMaxChatOptionsTests.java | 7 +-- models/spring-ai-mistral-ai/pom.xml | 5 +++ .../ai/mistralai/MistralAiChatModel.java | 9 ++-- .../ai/mistralai/MistralAiEmbeddingModel.java | 7 +-- .../ai/mistralai/MistralAiChatClientIT.java | 11 ++--- .../ai/mistralai/MistralAiChatModelIT.java | 13 +++--- .../tool/MistralAiApiToolFunctionCallIT.java | 5 ++- .../tool/PaymentStatusFunctionCallingIT.java | 5 ++- models/spring-ai-moonshot/pom.xml | 5 +++ .../ai/moonshot/MoonshotChatModel.java | 11 ++--- .../api/MoonshotApiToolFunctionCallIT.java | 5 ++- .../MoonshotChatModelFunctionCallingIT.java | 9 ++-- .../ai/moonshot/chat/MoonshotChatModelIT.java | 5 ++- models/spring-ai-oci-genai/pom.xml | 4 ++ models/spring-ai-ollama/pom.xml | 5 +++ .../ollama/management/OllamaModelManager.java | 19 ++++---- .../OllamaChatModelFunctionCallingIT.java | 9 ++-- .../ollama/OllamaChatModelMultimodalIT.java | 5 ++- .../api/tool/OllamaApiToolFunctionCallIT.java | 5 ++- models/spring-ai-openai/pom.xml | 4 ++ .../ai/openai/OpenAiAudioSpeechModel.java | 7 +-- .../openai/OpenAiAudioTranscriptionModel.java | 10 +++-- .../ai/openai/OpenAiChatModel.java | 11 ++--- .../ai/openai/OpenAiEmbeddingModel.java | 7 +-- .../ai/openai/OpenAiImageModel.java | 7 +-- .../ai/openai/OpenAiModerationModel.java | 8 ++-- .../OpenAiResponseHeaderExtractor.java | 10 +++-- .../ai/openai/acme/AcmeIT.java | 5 ++- .../api/tool/OpenAiApiToolFunctionCallIT.java | 5 ++- .../OpenAiChatModelFunctionCallingIT.java | 11 ++--- .../ai/openai/chat/OpenAiChatModelIT.java | 19 ++++---- .../chat/OpenAiChatModelProxyToolCallsIT.java | 13 +++--- .../chat/OpenAiChatModelResponseFormatIT.java | 11 ++--- ...delTypeReferenceBeanOutputConverterIT.java | 6 ++- .../chat/OpenAiPaymentTransactionIT.java | 7 +-- .../ai/openai/chat/OpenAiRetryTests.java | 5 ++- .../chat/client/OpenAiChatClientIT.java | 13 +++--- ...lientMethodInvokingFunctionCallbackIT.java | 18 ++++---- ...enAiChatClientMultipleFunctionCallsIT.java | 19 ++++---- .../OpenAiChatClientProxyFunctionCallsIT.java | 7 +-- .../proxy/DeepSeekWithOpenAiChatModelIT.java | 13 +++--- .../chat/proxy/GroqWithOpenAiChatModelIT.java | 11 ++--- .../proxy/MistralWithOpenAiChatModelIT.java | 11 ++--- .../proxy/NvidiaWithOpenAiChatModelIT.java | 9 ++-- .../proxy/OllamaWithOpenAiChatModelIT.java | 13 +++--- .../PerplexityWithOpenAiChatModelIT.java | 9 ++-- .../ai/openai/testutils/AbstractIT.java | 6 ++- models/spring-ai-qianfan/pom.xml | 5 +++ .../ai/qianfan/QianFanChatModel.java | 7 +-- .../ai/qianfan/QianFanEmbeddingModel.java | 9 ++-- .../ai/qianfan/QianFanImageModel.java | 7 +-- models/spring-ai-stability-ai/pom.xml | 5 +++ .../TransformersEmbeddingModel.java | 5 ++- models/spring-ai-vertex-ai-embedding/pom.xml | 5 +++ .../VertexAiMultimodalEmbeddingModel.java | 9 ++-- models/spring-ai-vertex-ai-gemini/pom.xml | 5 +++ .../gemini/VertexAiGeminiChatModelIT.java | 4 +- .../gemini/function/MockWeatherService.java | 8 ++-- ...texAiGeminiChatModelFunctionCallingIT.java | 13 +++--- .../VertexAiGeminiPaymentTransactionIT.java | 7 +-- models/spring-ai-watsonx-ai/pom.xml | 5 +++ .../ai/watsonx/WatsonxAiEmbeddingModel.java | 6 ++- models/spring-ai-zhipuai/pom.xml | 5 +++ .../ai/zhipuai/ZhiPuAiChatModel.java | 9 ++-- .../ai/zhipuai/ZhiPuAiEmbeddingModel.java | 7 +-- .../ai/zhipuai/ZhiPuAiImageModel.java | 8 ++-- .../api/ZhiPuAiApiToolFunctionCallIT.java | 5 ++- .../ai/zhipuai/chat/ZhiPuAiChatModelIT.java | 11 ++--- .../ai/aot/AiRuntimeHints.java | 9 ++-- .../client/advisor/SimpleLoggerAdvisor.java | 9 ++-- .../chat/metadata/ChatResponseMetadata.java | 8 ++-- .../ai/chat/model/MessageAggregator.java | 7 +-- .../ai/converter/BeanOutputConverter.java | 7 +-- .../DefaultFunctionCallbackBuilder.java | 10 +++-- .../MethodInvokingFunctionCallback.java | 7 +-- .../ErrorLoggingObservationHandler.java | 7 +-- .../ai/observation/tracing/TracingHelper.java | 7 +-- .../ContextualQueryAugmenter.java | 6 ++- .../query/expansion/MultiQueryExpander.java | 13 +++--- .../CompressionQueryTransformer.java | 6 ++- .../RewriteQueryTransformer.java | 8 ++-- .../TranslationQueryTransformer.java | 8 ++-- .../join/ConcatenationDocumentJoiner.java | 6 ++- .../DefaultToolCallResultConverter.java | 6 +-- .../tool/function/FunctionToolCallback.java | 10 ++--- .../ai/tool/method/MethodToolCallback.java | 24 +++++------ .../method/MethodToolCallbackProvider.java | 27 ++++++------ .../ai/transformer/splitter/TextSplitter.java | 6 ++- .../ai/vectorstore/SimpleVectorStore.java | 17 ++++---- .../tests/tool/FunctionToolCallbackTests.java | 18 ++++---- .../tests/tool/MethodToolCallbackTests.java | 20 ++++----- .../tests/tool/ToolCallingManagerTests.java | 8 ++-- .../springframework/ai/retry/RetryUtils.java | 10 ++--- .../client/ChatClientAutoConfiguration.java | 5 ++- .../CassandraChatMemoryProperties.java | 6 ++- .../ChatObservationAutoConfiguration.java | 5 ++- .../ImageObservationAutoConfiguration.java | 8 ++-- .../retry/SpringAiRetryAutoConfiguration.java | 8 ++-- .../CassandraVectorStoreProperties.java | 8 ++-- ...ctorStoreObservationAutoConfiguration.java | 7 ++- .../AnthropicAutoConfigurationIT.java | 5 ++- .../tool/FunctionCallWithFunctionBeanIT.java | 11 ++--- .../FunctionCallWithPromptFunctionIT.java | 7 +-- .../tool/FunctionCallWithFunctionBeanIT.java | 11 ++--- .../FunctionCallWithFunctionWrapperIT.java | 7 +-- .../FunctionCallWithPromptFunctionIT.java | 7 +-- ...kConverseProxyChatAutoConfigurationIT.java | 5 ++- .../tool/FunctionCallWithFunctionBeanIT.java | 11 ++--- .../FunctionCallWithPromptFunctionIT.java | 7 +-- .../client/ChatClientAutoConfigurationIT.java | 5 ++- .../HuggingfaceChatAutoConfigurationIT.java | 5 ++- .../minimax/FunctionCallbackInPromptIT.java | 9 ++-- ...nctionCallbackWithPlainFunctionBeanIT.java | 15 ++++--- .../minimax/MiniMaxAutoConfigurationIT.java | 5 ++- .../minimax/MiniMaxFunctionCallbackIT.java | 9 ++-- .../MistralAiAutoConfigurationIT.java | 5 ++- .../mistralai/tool/PaymentStatusBeanIT.java | 7 +-- .../tool/PaymentStatusBeanOpenAiIT.java | 7 +-- .../mistralai/tool/PaymentStatusPromptIT.java | 7 +-- .../tool/WeatherServicePromptIT.java | 9 ++-- .../moonshot/MoonshotAutoConfigurationIT.java | 5 ++- .../tool/FunctionCallbackInPromptIT.java | 9 ++-- ...nctionCallbackWithPlainFunctionBeanIT.java | 15 ++++--- .../tool/MoonshotFunctionCallbackIT.java | 9 ++-- .../tool/FunctionCallbackInPromptIT.java | 9 ++-- .../ollama/tool/OllamaFunctionCallbackIT.java | 5 ++- .../ollama/tool/OllamaFunctionToolBeanIT.java | 13 +++--- .../openai/OpenAiAutoConfigurationIT.java | 5 ++- .../tool/FunctionCallbackInPrompt2IT.java | 13 +++--- .../tool/FunctionCallbackInPromptIT.java | 9 ++-- ...nctionCallbackWithPlainFunctionBeanIT.java | 29 +++++++------ .../tool/OpenAiFunctionCallback2IT.java | 9 ++-- .../openai/tool/OpenAiFunctionCallbackIT.java | 9 ++-- .../qianfan/QianFanAutoConfigurationIT.java | 5 ++- .../VertexAiGeminiAutoConfigurationIT.java | 5 ++- .../tool/FunctionCallWithFunctionBeanIT.java | 15 ++++--- .../FunctionCallWithFunctionWrapperIT.java | 7 +-- .../FunctionCallWithPromptFunctionIT.java | 9 ++-- .../zhipuai/ZhiPuAiAutoConfigurationIT.java | 5 ++- .../tool/FunctionCallbackInPromptIT.java | 9 ++-- ...nctionCallbackWithPlainFunctionBeanIT.java | 15 ++++--- .../tool/ZhipuAiFunctionCallbackIT.java | 9 ++-- .../tool/FunctionCallbackContextKotlinIT.kt | 6 ++- .../ollama/tool/FunctionCallbackKotlinIT.kt | 5 ++- ...maContainerConnectionDetailsFactoryIT.java | 9 ++-- .../ai/evaluation/BasicEvaluationTest.java | 6 ++- .../cosmosdb/CosmosDBVectorStore.java | 26 +++++------ .../vectorstore/azure/AzureVectorStore.java | 6 +-- .../ai/cassandra/SchemaUtil.java | 9 ++-- .../cassandra/CassandraChatMemoryConfig.java | 8 ++-- .../cassandra/CassandraVectorStore.java | 25 ++++++----- .../CassandraRichSchemaVectorStoreIT.java | 11 +++-- .../chroma/vectorstore/ChromaVectorStore.java | 7 +-- .../ElasticsearchVectorStore.java | 8 ++-- .../gemfire/GemFireVectorStore.java | 10 +++-- .../hanadb/HanaCloudVectorStore.java | 20 ++++----- .../hanadb/CricketWorldCupHanaController.java | 12 +++--- .../hanadb/HanaCloudVectorStoreIT.java | 8 ++-- .../mariadb/MariaDBSchemaValidator.java | 8 ++-- .../mariadb/MariaDBVectorStore.java | 29 +++++++------ .../vectorstore/milvus/MilvusVectorStore.java | 17 ++++---- .../atlas/MongoDBAtlasVectorStore.java | 5 ++- .../vectorstore/neo4j/Neo4jVectorStore.java | 10 ++--- .../opensearch/OpenSearchVectorStore.java | 8 ++-- .../vectorstore/oracle/OracleVectorStore.java | 9 ++-- .../pgvector/PgVectorSchemaValidator.java | 8 ++-- .../vectorstore/pgvector/PgVectorStore.java | 25 +++++------ .../pinecone/PineconeVectorStore.java | 14 +++--- .../vectorstore/qdrant/QdrantVectorStore.java | 8 ++-- .../vectorstore/redis/RedisVectorStore.java | 14 +++--- .../typesense/TypesenseVectorStore.java | 43 +++++++++---------- .../weaviate/WeaviateVectorStore.java | 12 +++--- 199 files changed, 1059 insertions(+), 814 deletions(-) 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 9af7cf4e866..724f7ee5c0a 100644 --- a/document-readers/pdf-reader/src/main/java/org/springframework/ai/reader/pdf/PagePdfDocumentReader.java +++ b/document-readers/pdf-reader/src/main/java/org/springframework/ai/reader/pdf/PagePdfDocumentReader.java @@ -22,10 +22,11 @@ import java.util.List; import java.util.stream.Collectors; -import org.apache.commons.logging.LogFactory; import org.apache.pdfbox.pdfparser.PDFParser; import org.apache.pdfbox.pdmodel.PDDocument; import org.apache.pdfbox.pdmodel.PDPage; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import org.springframework.ai.document.Document; import org.springframework.ai.document.DocumentReader; @@ -33,7 +34,6 @@ import org.springframework.ai.reader.pdf.layout.PDFLayoutTextStripperByArea; import org.springframework.core.io.DefaultResourceLoader; import org.springframework.core.io.Resource; -import org.springframework.core.log.LogAccessor; import org.springframework.util.CollectionUtils; import org.springframework.util.StringUtils; @@ -55,10 +55,10 @@ public class PagePdfDocumentReader implements DocumentReader { private static final String PDF_PAGE_REGION = "pdfPageRegion"; - private static final LogAccessor logger = new LogAccessor(LogFactory.getLog(PagePdfDocumentReader.class)); - protected final PDDocument document; + private final Logger logger = LoggerFactory.getLogger(getClass()); + protected String resourceFileName; private PdfDocumentReaderConfig config; @@ -112,7 +112,7 @@ public List get() { for (PDPage page : this.document.getDocumentCatalog().getPages()) { lastPage = page; if (counter % logFrequency == 0 && counter / logFrequency < 10) { - logger.info("Processing PDF page: " + (counter + 1)); + logger.info("Processing PDF page: {}", (counter + 1)); } counter++; @@ -154,7 +154,7 @@ public List get() { readDocuments.add(toDocument(lastPage, pageTextGroupList.stream().collect(Collectors.joining()), startPageNumber, pageNumber)); } - logger.info("Processing " + totalPages + " pages"); + logger.info("Processing {} pages", totalPages); return readDocuments; } diff --git a/document-readers/pdf-reader/src/main/java/org/springframework/ai/reader/pdf/ParagraphPdfDocumentReader.java b/document-readers/pdf-reader/src/main/java/org/springframework/ai/reader/pdf/ParagraphPdfDocumentReader.java index 1c3e173a210..95863fff649 100644 --- a/document-readers/pdf-reader/src/main/java/org/springframework/ai/reader/pdf/ParagraphPdfDocumentReader.java +++ b/document-readers/pdf-reader/src/main/java/org/springframework/ai/reader/pdf/ParagraphPdfDocumentReader.java @@ -23,6 +23,8 @@ import org.apache.pdfbox.pdfparser.PDFParser; import org.apache.pdfbox.pdmodel.PDDocument; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import org.springframework.ai.document.Document; import org.springframework.ai.document.DocumentReader; @@ -32,7 +34,6 @@ import org.springframework.ai.reader.pdf.layout.PDFLayoutTextStripperByArea; import org.springframework.core.io.DefaultResourceLoader; import org.springframework.core.io.Resource; -import org.springframework.core.log.LogAccessor; import org.springframework.util.CollectionUtils; import org.springframework.util.StringUtils; @@ -61,7 +62,7 @@ public class ParagraphPdfDocumentReader implements DocumentReader { protected final PDDocument document; - private static final LogAccessor logger = new LogAccessor(ParagraphPdfDocumentReader.class); + private final Logger logger = LoggerFactory.getLogger(getClass()); private final ParagraphManager paragraphTextExtractor; diff --git a/models/spring-ai-anthropic/pom.xml b/models/spring-ai-anthropic/pom.xml index 5b32e0d1f5c..de2afe6d6a9 100644 --- a/models/spring-ai-anthropic/pom.xml +++ b/models/spring-ai-anthropic/pom.xml @@ -76,6 +76,10 @@ 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 b1287e7eedc..94fe45595a9 100644 --- a/models/spring-ai-anthropic/src/main/java/org/springframework/ai/anthropic/AnthropicChatModel.java +++ b/models/spring-ai-anthropic/src/main/java/org/springframework/ai/anthropic/AnthropicChatModel.java @@ -27,6 +27,8 @@ import io.micrometer.observation.Observation; import io.micrometer.observation.ObservationRegistry; import io.micrometer.observation.contextpropagation.ObservationThreadLocalAccessor; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import reactor.core.publisher.Flux; import reactor.core.publisher.Mono; @@ -65,7 +67,6 @@ import org.springframework.ai.model.function.FunctionCallbackResolver; import org.springframework.ai.model.function.FunctionCallingOptions; import org.springframework.ai.retry.RetryUtils; -import org.springframework.core.log.LogAccessor; import org.springframework.http.ResponseEntity; import org.springframework.retry.support.RetryTemplate; import org.springframework.util.Assert; @@ -91,7 +92,7 @@ public class AnthropicChatModel extends AbstractToolCallSupport implements ChatM public static final Double DEFAULT_TEMPERATURE = 0.8; - private static final LogAccessor logger = new LogAccessor(AnthropicChatModel.class); + private static final Logger logger = LoggerFactory.getLogger(AnthropicChatModel.class); private static final ChatModelObservationConvention DEFAULT_OBSERVATION_CONVENTION = new DefaultChatModelObservationConvention(); diff --git a/models/spring-ai-anthropic/src/test/java/org/springframework/ai/anthropic/AnthropicChatModelIT.java b/models/spring-ai-anthropic/src/test/java/org/springframework/ai/anthropic/AnthropicChatModelIT.java index dca4c7ddb81..a006d802cd8 100644 --- a/models/spring-ai-anthropic/src/test/java/org/springframework/ai/anthropic/AnthropicChatModelIT.java +++ b/models/spring-ai-anthropic/src/test/java/org/springframework/ai/anthropic/AnthropicChatModelIT.java @@ -27,6 +27,8 @@ import org.junit.jupiter.api.condition.EnabledIfEnvironmentVariable; import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.provider.ValueSource; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import reactor.core.publisher.Flux; import org.springframework.ai.anthropic.api.AnthropicApi; @@ -57,7 +59,6 @@ import org.springframework.core.convert.support.DefaultConversionService; import org.springframework.core.io.ClassPathResource; import org.springframework.core.io.Resource; -import org.springframework.core.log.LogAccessor; import org.springframework.util.MimeType; import org.springframework.util.MimeTypeUtils; import org.springframework.util.StringUtils; @@ -68,7 +69,7 @@ @EnabledIfEnvironmentVariable(named = "ANTHROPIC_API_KEY", matches = ".+") class AnthropicChatModelIT { - private static final LogAccessor logger = new LogAccessor(AnthropicChatModelIT.class); + private static final Logger logger = LoggerFactory.getLogger(AnthropicChatModelIT.class); @Autowired protected ChatModel chatModel; @@ -282,7 +283,7 @@ void functionCallTest() { ChatResponse response = this.chatModel.call(new Prompt(messages, promptOptions)); - logger.info("Response: " + response); + logger.info("Response: {}", response); Generation generation = response.getResult(); assertThat(generation).isNotNull(); @@ -321,7 +322,7 @@ void streamFunctionCallTest() { .map(cr -> cr.getResult().getOutput().getText()) .collect(Collectors.joining()); - logger.info("Response: " + content); + logger.info("Response: {}", content); assertThat(content).contains("30", "10", "15"); } @@ -346,7 +347,7 @@ void streamFunctionCallUsageTest() { ChatResponse chatResponse = responseFlux.last().block(); - logger.info("Response: " + chatResponse); + logger.info("Response: {}", chatResponse); Usage usage = chatResponse.getMetadata().getUsage(); assertThat(usage).isNotNull(); diff --git a/models/spring-ai-anthropic/src/test/java/org/springframework/ai/anthropic/EventParsingTests.java b/models/spring-ai-anthropic/src/test/java/org/springframework/ai/anthropic/EventParsingTests.java index e5d90d9e946..9cd11068bfa 100644 --- a/models/spring-ai-anthropic/src/test/java/org/springframework/ai/anthropic/EventParsingTests.java +++ b/models/spring-ai-anthropic/src/test/java/org/springframework/ai/anthropic/EventParsingTests.java @@ -23,10 +23,11 @@ import com.fasterxml.jackson.core.type.TypeReference; import com.fasterxml.jackson.databind.ObjectMapper; import org.junit.jupiter.api.Test; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import org.springframework.ai.anthropic.api.AnthropicApi.StreamEvent; import org.springframework.core.io.DefaultResourceLoader; -import org.springframework.core.log.LogAccessor; import static org.assertj.core.api.Assertions.assertThat; @@ -36,7 +37,7 @@ */ public class EventParsingTests { - private static final LogAccessor logger = new LogAccessor(EventParsingTests.class); + private static final Logger logger = LoggerFactory.getLogger(EventParsingTests.class); @Test public void readEvents() throws IOException { diff --git a/models/spring-ai-anthropic/src/test/java/org/springframework/ai/anthropic/api/tool/AnthropicApiLegacyToolIT.java b/models/spring-ai-anthropic/src/test/java/org/springframework/ai/anthropic/api/tool/AnthropicApiLegacyToolIT.java index 3cffa70f87d..0be31a1386d 100644 --- a/models/spring-ai-anthropic/src/test/java/org/springframework/ai/anthropic/api/tool/AnthropicApiLegacyToolIT.java +++ b/models/spring-ai-anthropic/src/test/java/org/springframework/ai/anthropic/api/tool/AnthropicApiLegacyToolIT.java @@ -22,6 +22,8 @@ import org.junit.jupiter.api.Test; import org.junit.jupiter.api.condition.EnabledIfEnvironmentVariable; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import org.springframework.ai.anthropic.api.AnthropicApi; import org.springframework.ai.anthropic.api.AnthropicApi.AnthropicMessage; @@ -34,7 +36,6 @@ import org.springframework.ai.anthropic.api.tool.XmlHelper.Tools.ToolDescription; import org.springframework.ai.anthropic.api.tool.XmlHelper.Tools.ToolDescription.Parameter; import org.springframework.ai.model.ModelOptionsUtils; -import org.springframework.core.log.LogAccessor; import org.springframework.http.ResponseEntity; import static org.assertj.core.api.Assertions.assertThat; @@ -80,7 +81,7 @@ public class AnthropicApiLegacyToolIT { public static final ConcurrentHashMap FUNCTIONS = new ConcurrentHashMap<>(); - private static final LogAccessor logger = new LogAccessor(AnthropicApiLegacyToolIT.class); + private static final Logger logger = LoggerFactory.getLogger(AnthropicApiLegacyToolIT.class); AnthropicApi anthropicApi = new AnthropicApi(System.getenv("ANTHROPIC_API_KEY")); diff --git a/models/spring-ai-anthropic/src/test/java/org/springframework/ai/anthropic/api/tool/AnthropicApiToolIT.java b/models/spring-ai-anthropic/src/test/java/org/springframework/ai/anthropic/api/tool/AnthropicApiToolIT.java index 0ffeaccd733..079a01b3caf 100644 --- a/models/spring-ai-anthropic/src/test/java/org/springframework/ai/anthropic/api/tool/AnthropicApiToolIT.java +++ b/models/spring-ai-anthropic/src/test/java/org/springframework/ai/anthropic/api/tool/AnthropicApiToolIT.java @@ -23,6 +23,8 @@ import org.junit.jupiter.api.Test; import org.junit.jupiter.api.condition.EnabledIfEnvironmentVariable; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import org.springframework.ai.anthropic.api.AnthropicApi; import org.springframework.ai.anthropic.api.AnthropicApi.AnthropicMessage; @@ -33,7 +35,6 @@ import org.springframework.ai.anthropic.api.AnthropicApi.Role; import org.springframework.ai.anthropic.api.AnthropicApi.Tool; import org.springframework.ai.model.ModelOptionsUtils; -import org.springframework.core.log.LogAccessor; import org.springframework.http.ResponseEntity; import org.springframework.util.CollectionUtils; @@ -55,7 +56,7 @@ public class AnthropicApiToolIT { public static final ConcurrentHashMap FUNCTIONS = new ConcurrentHashMap<>(); - private static final LogAccessor logger = new LogAccessor(AnthropicApiToolIT.class); + private static final Logger logger = LoggerFactory.getLogger(AnthropicApiToolIT.class); AnthropicApi anthropicApi = new AnthropicApi(System.getenv("ANTHROPIC_API_KEY")); diff --git a/models/spring-ai-anthropic/src/test/java/org/springframework/ai/anthropic/client/AnthropicChatClientIT.java b/models/spring-ai-anthropic/src/test/java/org/springframework/ai/anthropic/client/AnthropicChatClientIT.java index f03a24ccc78..f685b190a8a 100644 --- a/models/spring-ai-anthropic/src/test/java/org/springframework/ai/anthropic/client/AnthropicChatClientIT.java +++ b/models/spring-ai-anthropic/src/test/java/org/springframework/ai/anthropic/client/AnthropicChatClientIT.java @@ -28,6 +28,8 @@ import org.junit.jupiter.api.condition.EnabledIfEnvironmentVariable; import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.provider.ValueSource; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import reactor.core.publisher.Flux; import org.springframework.ai.anthropic.AnthropicChatOptions; @@ -48,7 +50,6 @@ import org.springframework.core.convert.support.DefaultConversionService; import org.springframework.core.io.ClassPathResource; import org.springframework.core.io.Resource; -import org.springframework.core.log.LogAccessor; import org.springframework.test.context.ActiveProfiles; import org.springframework.util.MimeTypeUtils; @@ -59,7 +60,7 @@ @ActiveProfiles("logging-test") class AnthropicChatClientIT { - private static final LogAccessor logger = new LogAccessor(AnthropicChatClientIT.class); + private static final Logger logger = LoggerFactory.getLogger(AnthropicChatClientIT.class); @Autowired ChatModel chatModel; @@ -218,7 +219,7 @@ void functionCallTest() { .content(); // @formatter:on - logger.info("Response: " + response); + logger.info("Response: {}", response); assertThat(response).contains("30", "10", "15"); } @@ -236,7 +237,7 @@ void functionCallWithGeneratedDescription() { .content(); // @formatter:on - logger.info("Response: " + response); + logger.info("Response: {}", response); assertThat(response).contains("30", "10", "15"); } @@ -257,7 +258,7 @@ void defaultFunctionCallTest() { .content(); // @formatter:on - logger.info("Response: " + response); + logger.info("Response: {}", response); assertThat(response).contains("30", "10", "15"); } @@ -277,7 +278,7 @@ void streamFunctionCallTest() { // @formatter:on String content = response.collectList().block().stream().collect(Collectors.joining()); - logger.info("Response: " + content); + logger.info("Response: {}", content); assertThat(content).contains("30", "10", "15"); } @@ -339,7 +340,7 @@ void streamingMultiModality() throws IOException { String content = response.collectList().block().stream().collect(Collectors.joining()); - logger.info("Response: " + content); + logger.info("Response: {}", content); assertThat(content).contains("bananas", "apple"); assertThat(content).containsAnyOf("bowl", "basket"); } diff --git a/models/spring-ai-anthropic/src/test/java/org/springframework/ai/anthropic/client/AnthropicChatClientMethodInvokingFunctionCallbackIT.java b/models/spring-ai-anthropic/src/test/java/org/springframework/ai/anthropic/client/AnthropicChatClientMethodInvokingFunctionCallbackIT.java index d1a72e5e355..8828c7ffe9b 100644 --- a/models/spring-ai-anthropic/src/test/java/org/springframework/ai/anthropic/client/AnthropicChatClientMethodInvokingFunctionCallbackIT.java +++ b/models/spring-ai-anthropic/src/test/java/org/springframework/ai/anthropic/client/AnthropicChatClientMethodInvokingFunctionCallbackIT.java @@ -23,6 +23,8 @@ import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.condition.EnabledIfEnvironmentVariable; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import org.springframework.ai.anthropic.AnthropicTestConfiguration; import org.springframework.ai.chat.client.ChatClient; @@ -34,7 +36,6 @@ import org.springframework.ai.tool.method.MethodToolCallback; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; -import org.springframework.core.log.LogAccessor; import org.springframework.test.context.ActiveProfiles; import org.springframework.util.ReflectionUtils; @@ -47,8 +48,8 @@ @SuppressWarnings("null") class AnthropicChatClientMethodInvokingFunctionCallbackIT { - private static final LogAccessor logger = new LogAccessor( - AnthropicChatClientMethodInvokingFunctionCallbackIT.class); + private static final Logger logger = LoggerFactory + .getLogger(AnthropicChatClientMethodInvokingFunctionCallbackIT.class); public static Map arguments = new ConcurrentHashMap<>(); @@ -74,7 +75,7 @@ void methodGetWeatherGeneratedDescription() { .content(); // @formatter:on - logger.info("Response: " + response); + logger.info("Response: {}", response); assertThat(response).contains("30", "10", "15"); } @@ -98,7 +99,7 @@ void methodGetWeatherStatic() { .content(); // @formatter:on - logger.info("Response: " + response); + logger.info("Response: {}", response); assertThat(response).contains("30", "10", "15"); } @@ -126,7 +127,7 @@ void methodTurnLightNoResponse() { .content(); // @formatter:on - logger.info("Response: " + response); + logger.info("Response: {}", response); assertThat(arguments).containsEntry("roomName", "living room"); assertThat(arguments).containsEntry("on", true); @@ -154,7 +155,7 @@ void methodGetWeatherNonStatic() { .content(); // @formatter:on - logger.info("Response: " + response); + logger.info("Response: {}", response); assertThat(response).contains("30", "10", "15"); } @@ -181,7 +182,7 @@ void methodGetWeatherToolContext() { .call() .content(); - logger.info("Response: " + response); + logger.info("Response: {}", response); assertThat(response).contains("30", "10", "15"); assertThat(arguments).containsEntry("tool", "value"); @@ -238,7 +239,7 @@ void methodNoParameters() { .content(); // @formatter:on - logger.info("Response: " + response); + logger.info("Response: {}", response); assertThat(arguments).containsEntry("turnLivingRoomLightOn", true); } @@ -256,7 +257,7 @@ void toolAnnotation() { .content(); // @formatter:on - logger.info("Response:" + response); + logger.info("Response: {}", response); assertThat(arguments).containsEntry("roomName", "living room") .containsEntry("color", TestFunctionClass.LightColor.RED); @@ -318,7 +319,7 @@ public String getWeatherWithContext(String city, Unit unit, ToolContext context) public void turnLight(String roomName, boolean on) { arguments.put("roomName", roomName); arguments.put("on", on); - logger.info("Turn light in room: " + roomName + " to: " + on); + logger.info("Turn light in room: {} to: {}", roomName, on); } public void turnLivingRoomLightOn() { @@ -335,7 +336,7 @@ enum LightColor { public void changeRoomLightColor(String roomName, LightColor color) { arguments.put("roomName", roomName); arguments.put("color", color); - logger.info("Change light colur in room: " + roomName + " to color: " + color); + logger.info("Change light colur in room: {} to color: {}", roomName, color); } } diff --git a/models/spring-ai-azure-openai/pom.xml b/models/spring-ai-azure-openai/pom.xml index 2203a706ce1..6e312cfca8a 100644 --- a/models/spring-ai-azure-openai/pom.xml +++ b/models/spring-ai-azure-openai/pom.xml @@ -59,6 +59,11 @@ spring-context-support + + org.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 f56a0ef1e1b..a5f5b335781 100644 --- a/models/spring-ai-azure-openai/src/main/java/org/springframework/ai/azure/openai/AzureOpenAiEmbeddingModel.java +++ b/models/spring-ai-azure-openai/src/main/java/org/springframework/ai/azure/openai/AzureOpenAiEmbeddingModel.java @@ -25,6 +25,8 @@ import com.azure.ai.openai.models.EmbeddingsOptions; import com.azure.ai.openai.models.EmbeddingsUsage; import io.micrometer.observation.ObservationRegistry; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import org.springframework.ai.chat.metadata.DefaultUsage; import org.springframework.ai.document.Document; @@ -40,7 +42,6 @@ import org.springframework.ai.embedding.observation.EmbeddingModelObservationDocumentation; import org.springframework.ai.model.EmbeddingUtils; import org.springframework.ai.observation.conventions.AiProvider; -import org.springframework.core.log.LogAccessor; import org.springframework.util.Assert; import org.springframework.util.CollectionUtils; @@ -54,7 +55,7 @@ */ public class AzureOpenAiEmbeddingModel extends AbstractEmbeddingModel { - private static final LogAccessor logger = new LogAccessor(AzureOpenAiEmbeddingModel.class); + private static final Logger logger = LoggerFactory.getLogger(AzureOpenAiEmbeddingModel.class); private static final EmbeddingModelObservationConvention DEFAULT_OBSERVATION_CONVENTION = new DefaultEmbeddingModelObservationConvention(); diff --git a/models/spring-ai-azure-openai/src/main/java/org/springframework/ai/azure/openai/AzureOpenAiImageModel.java b/models/spring-ai-azure-openai/src/main/java/org/springframework/ai/azure/openai/AzureOpenAiImageModel.java index 676c6952fd3..88fe6ae6e51 100644 --- a/models/spring-ai-azure-openai/src/main/java/org/springframework/ai/azure/openai/AzureOpenAiImageModel.java +++ b/models/spring-ai-azure-openai/src/main/java/org/springframework/ai/azure/openai/AzureOpenAiImageModel.java @@ -29,6 +29,8 @@ import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.SerializationFeature; import com.fasterxml.jackson.databind.json.JsonMapper; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import org.springframework.ai.azure.openai.metadata.AzureOpenAiImageGenerationMetadata; import org.springframework.ai.azure.openai.metadata.AzureOpenAiImageResponseMetadata; @@ -40,7 +42,6 @@ import org.springframework.ai.image.ImageResponseMetadata; import org.springframework.ai.model.ModelOptionsUtils; import org.springframework.ai.util.JacksonUtils; -import org.springframework.core.log.LogAccessor; import org.springframework.util.Assert; /** @@ -57,7 +58,7 @@ public class AzureOpenAiImageModel implements ImageModel { private static final String DEFAULT_DEPLOYMENT_NAME = AzureOpenAiImageOptions.DEFAULT_IMAGE_MODEL; - private final LogAccessor logger = new LogAccessor(getClass()); + private final Logger logger = LoggerFactory.getLogger(getClass()); private final OpenAIClient openAIClient; @@ -90,14 +91,14 @@ public ImageResponse call(ImagePrompt imagePrompt) { ImageGenerationOptions imageGenerationOptions = toOpenAiImageOptions(imagePrompt); String deploymentOrModelName = getDeploymentName(imagePrompt); if (logger.isTraceEnabled()) { - logger.trace("Azure ImageGenerationOptions call " + deploymentOrModelName + " with the following options : " - + toPrettyJson(imageGenerationOptions)); + logger.trace("Azure ImageGenerationOptions call {} with the following options : {} ", deploymentOrModelName, + toPrettyJson(imageGenerationOptions)); } var images = this.openAIClient.getImageGenerations(deploymentOrModelName, imageGenerationOptions); if (logger.isTraceEnabled()) { - logger.trace("Azure ImageGenerations: " + toPrettyJson(images)); + logger.trace("Azure ImageGenerations: {}", toPrettyJson(images)); } List imageGenerations = images.getData().stream().map(entry -> { diff --git a/models/spring-ai-azure-openai/src/test/java/org/springframework/ai/azure/openai/AzureOpenAiChatModelIT.java b/models/spring-ai-azure-openai/src/test/java/org/springframework/ai/azure/openai/AzureOpenAiChatModelIT.java index 2234d3ad6b9..d9f6e89a2c2 100644 --- a/models/spring-ai-azure-openai/src/test/java/org/springframework/ai/azure/openai/AzureOpenAiChatModelIT.java +++ b/models/spring-ai-azure-openai/src/test/java/org/springframework/ai/azure/openai/AzureOpenAiChatModelIT.java @@ -29,6 +29,8 @@ import com.azure.core.credential.AzureKeyCredential; import com.azure.core.http.policy.HttpLogOptions; import org.junit.jupiter.api.Test; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import org.springframework.ai.chat.client.ChatClient; import org.springframework.ai.chat.messages.AssistantMessage; @@ -49,7 +51,6 @@ import org.springframework.core.convert.support.DefaultConversionService; import org.springframework.core.io.ClassPathResource; import org.springframework.core.io.Resource; -import org.springframework.core.log.LogAccessor; import org.springframework.util.MimeTypeUtils; import static org.assertj.core.api.Assertions.assertThat; @@ -58,7 +59,7 @@ @RequiresAzureCredentials class AzureOpenAiChatModelIT { - private static final LogAccessor logger = new LogAccessor(AzureOpenAiChatModelIT.class); + private static final Logger logger = LoggerFactory.getLogger(AzureOpenAiChatModelIT.class); @Autowired private AzureOpenAiChatModel chatModel; diff --git a/models/spring-ai-azure-openai/src/test/java/org/springframework/ai/azure/openai/MockAiTestConfiguration.java b/models/spring-ai-azure-openai/src/test/java/org/springframework/ai/azure/openai/MockAiTestConfiguration.java index 9a4f090e22e..08d6ae77f6b 100644 --- a/models/spring-ai-azure-openai/src/test/java/org/springframework/ai/azure/openai/MockAiTestConfiguration.java +++ b/models/spring-ai-azure-openai/src/test/java/org/springframework/ai/azure/openai/MockAiTestConfiguration.java @@ -30,6 +30,8 @@ import okhttp3.mockwebserver.MockWebServer; import okhttp3.mockwebserver.RecordedRequest; import okio.Buffer; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import org.springframework.beans.factory.DisposableBean; import org.springframework.beans.factory.FactoryBean; @@ -37,7 +39,6 @@ import org.springframework.context.SmartLifecycle; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; -import org.springframework.core.log.LogAccessor; import org.springframework.lang.Nullable; import org.springframework.mock.web.MockHttpServletResponse; import org.springframework.test.web.servlet.MockMvc; @@ -205,7 +206,7 @@ private String getBody(MockHttpServletResponse response) { */ static class MockWebServerFactoryBean implements FactoryBean, InitializingBean, DisposableBean { - private final LogAccessor logger = new LogAccessor(getClass().getName()); + private final Logger logger = LoggerFactory.getLogger(getClass().getName()); private final Queue queuedResponses = new ConcurrentLinkedDeque<>(); @@ -221,7 +222,7 @@ public void setDispatcher(@Nullable Dispatcher dispatcher) { this.dispatcher = dispatcher; } - protected LogAccessor getLogger() { + protected Logger getLogger() { return logger; } @@ -255,8 +256,8 @@ public void destroy() { this.mockWebServer.shutdown(); } catch (IOException e) { - getLogger().warn("MockWebServer was not shutdown correctly: " + e.getMessage()); - getLogger().trace(e, "MockWebServer shutdown failure"); + getLogger().warn("MockWebServer was not shutdown correctly: {}", e.getMessage()); + getLogger().trace("MockWebServer shutdown failure", e); } } diff --git a/models/spring-ai-azure-openai/src/test/java/org/springframework/ai/azure/openai/function/AzureOpenAiChatModelFunctionCallIT.java b/models/spring-ai-azure-openai/src/test/java/org/springframework/ai/azure/openai/function/AzureOpenAiChatModelFunctionCallIT.java index e25b7a25350..e88573d4fc5 100644 --- a/models/spring-ai-azure-openai/src/test/java/org/springframework/ai/azure/openai/function/AzureOpenAiChatModelFunctionCallIT.java +++ b/models/spring-ai-azure-openai/src/test/java/org/springframework/ai/azure/openai/function/AzureOpenAiChatModelFunctionCallIT.java @@ -27,6 +27,8 @@ import com.azure.ai.openai.models.ChatCompletionStreamOptions; import com.azure.core.credential.AzureKeyCredential; import org.junit.jupiter.api.Test; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import reactor.core.publisher.Flux; import org.springframework.ai.azure.openai.AzureOpenAiChatModel; @@ -43,7 +45,6 @@ import org.springframework.boot.SpringBootConfiguration; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.context.annotation.Bean; -import org.springframework.core.log.LogAccessor; import org.springframework.util.StringUtils; import static org.assertj.core.api.Assertions.assertThat; @@ -52,7 +53,7 @@ @RequiresAzureCredentials class AzureOpenAiChatModelFunctionCallIT { - private static final LogAccessor logger = new LogAccessor(AzureOpenAiChatModelFunctionCallIT.class); + private static final Logger logger = LoggerFactory.getLogger(AzureOpenAiChatModelFunctionCallIT.class); @Autowired private String selectedModel; @@ -77,7 +78,7 @@ void functionCallTest() { ChatResponse response = this.chatModel.call(new Prompt(messages, promptOptions)); - logger.info("Response: " + response); + logger.info("Response: {}", response); assertThat(response.getResult()).isNotNull(); assertThat(response.getResult().getOutput()).isNotNull(); @@ -105,7 +106,7 @@ void functionCallSequentialTest() { ChatResponse response = this.chatModel.call(new Prompt(messages, promptOptions)); - logger.info("Response: " + response); + logger.info("Response: {}", response); assertThat(response.getResult().getOutput().getText()).contains("30", "10", "15"); } @@ -136,7 +137,7 @@ void streamFunctionCallTest() { .map(Generation::getOutput) .map(AssistantMessage::getText) .collect(Collectors.joining()); - logger.info("Response: " + content); + logger.info("Response: {}", content); assertThat(counter.get()).isGreaterThan(30).as("The response should be chunked in more than 30 messages"); @@ -165,7 +166,7 @@ void streamFunctionCallUsageTest() { Flux response = this.chatModel.stream(new Prompt(messages, promptOptions)); ChatResponse chatResponse = response.last().block(); - logger.info("Response: " + chatResponse); + logger.info("Response: {}", chatResponse); assertThat(chatResponse.getMetadata().getUsage().getTotalTokens()).isGreaterThan(600).isLessThan(800); @@ -201,7 +202,7 @@ void functionCallSequentialAndStreamTest() { .filter(Objects::nonNull) .collect(Collectors.joining()); - logger.info("Response: " + response); + logger.info("Response: {}", response); assertThat(content).contains("30", "10", "15"); } diff --git a/models/spring-ai-bedrock-converse/src/main/java/org/springframework/ai/bedrock/converse/BedrockProxyChatModel.java b/models/spring-ai-bedrock-converse/src/main/java/org/springframework/ai/bedrock/converse/BedrockProxyChatModel.java index 68fd6838ffd..37afa84de43 100644 --- a/models/spring-ai-bedrock-converse/src/main/java/org/springframework/ai/bedrock/converse/BedrockProxyChatModel.java +++ b/models/spring-ai-bedrock-converse/src/main/java/org/springframework/ai/bedrock/converse/BedrockProxyChatModel.java @@ -32,6 +32,8 @@ import io.micrometer.observation.Observation; import io.micrometer.observation.ObservationRegistry; import io.micrometer.observation.contextpropagation.ObservationThreadLocalAccessor; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import reactor.core.publisher.Flux; import reactor.core.publisher.Mono; import reactor.core.publisher.Sinks; @@ -99,7 +101,6 @@ import org.springframework.ai.model.function.FunctionCallbackResolver; import org.springframework.ai.model.function.FunctionCallingOptions; import org.springframework.ai.observation.conventions.AiProvider; -import org.springframework.core.log.LogAccessor; import org.springframework.util.Assert; import org.springframework.util.CollectionUtils; import org.springframework.util.StreamUtils; @@ -133,7 +134,7 @@ */ public class BedrockProxyChatModel extends AbstractToolCallSupport implements ChatModel { - private static final LogAccessor logger = new LogAccessor(BedrockProxyChatModel.class); + private static final Logger logger = LoggerFactory.getLogger(BedrockProxyChatModel.class); private static final ChatModelObservationConvention DEFAULT_OBSERVATION_CONVENTION = new DefaultChatModelObservationConvention(); @@ -199,7 +200,7 @@ private ChatResponse internalCall(Prompt prompt, ChatResponse perviousChatRespon ConverseResponse converseResponse = this.bedrockRuntimeClient.converse(converseRequest); - logger.debug("ConverseResponse: " + converseResponse); + logger.debug("ConverseResponse: {}", converseResponse); var response = this.toChatResponse(converseResponse, perviousChatResponse); @@ -654,7 +655,7 @@ public Flux converseStream(ConverseStreamRequest converseS ConverseStreamResponseHandler.Visitor visitor = ConverseStreamResponseHandler.Visitor.builder() .onDefault(output -> { - logger.debug("Received converse stream output: " + output); + logger.debug("Received converse stream output:{}", output); eventSink.emitNext(output, DEFAULT_EMIT_FAILURE_HANDLER); }) .build(); @@ -666,7 +667,7 @@ public Flux converseStream(ConverseStreamRequest converseS logger.info("Completed streaming response."); }) .onError(error -> { - logger.error(error, "Error handling Bedrock converse stream response"); + logger.error("Error handling Bedrock converse stream response", error); eventSink.emitError(error, DEFAULT_EMIT_FAILURE_HANDLER); }) .build(); diff --git a/models/spring-ai-bedrock-converse/src/test/java/org/springframework/ai/bedrock/converse/BedrockConverseChatClientIT.java b/models/spring-ai-bedrock-converse/src/test/java/org/springframework/ai/bedrock/converse/BedrockConverseChatClientIT.java index 93edb429ef5..fcd4044339e 100644 --- a/models/spring-ai-bedrock-converse/src/test/java/org/springframework/ai/bedrock/converse/BedrockConverseChatClientIT.java +++ b/models/spring-ai-bedrock-converse/src/test/java/org/springframework/ai/bedrock/converse/BedrockConverseChatClientIT.java @@ -26,6 +26,8 @@ import org.junit.jupiter.api.Test; import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.provider.ValueSource; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import reactor.core.publisher.Flux; import org.springframework.ai.chat.client.ChatClient; @@ -43,7 +45,6 @@ import org.springframework.core.convert.support.DefaultConversionService; import org.springframework.core.io.ClassPathResource; import org.springframework.core.io.Resource; -import org.springframework.core.log.LogAccessor; import org.springframework.util.MimeTypeUtils; import static org.assertj.core.api.Assertions.assertThat; @@ -52,7 +53,7 @@ @RequiresAwsCredentials class BedrockConverseChatClientIT { - private static final LogAccessor logger = new LogAccessor(BedrockConverseChatClientIT.class); + private static final Logger logger = LoggerFactory.getLogger(BedrockConverseChatClientIT.class); @Value("classpath:/prompts/system-message.st") private Resource systemTextResource; @@ -218,7 +219,7 @@ void functionCallTest() { .content(); // @formatter:on - logger.info("Response: " + response); + logger.info("Response: {}", response); assertThat(response).contains("30", "10", "15"); } @@ -252,7 +253,7 @@ void functionCallWithUsageMetadataTest() { assertThat(metadata.getUsage().getTotalTokens()) .isEqualTo(metadata.getUsage().getPromptTokens() + metadata.getUsage().getCompletionTokens()); - logger.info("Response: " + response); + logger.info("Response: {}", response); assertThat(response.getResult().getOutput().getText()).contains("30", "10", "15"); } @@ -272,7 +273,7 @@ void functionCallWithAdvisorTest() { .content(); // @formatter:on - logger.info("Response: " + response); + logger.info("Response: {}", response); assertThat(response).contains("30", "10", "15"); } @@ -293,7 +294,7 @@ void defaultFunctionCallTest() { .content(); // @formatter:on - logger.info("Response: " + response); + logger.info("Response: {}", response); assertThat(response).contains("30", "10", "15"); } @@ -334,7 +335,7 @@ void streamFunctionCallTest() { .filter(cr -> cr.getResult() != null) .map(cr -> cr.getResult().getOutput().getText()) .collect(Collectors.joining()); - logger.info("Response: " + content); + logger.info("Response: {}", content); assertThat(content).contains("30", "10", "15"); } @@ -354,7 +355,7 @@ void singularStreamFunctionCallTest() { // @formatter:on String content = response.collectList().block().stream().collect(Collectors.joining()); - logger.info("Response: " + content); + logger.info("Response: {}", content); assertThat(content).contains("15"); } @@ -414,7 +415,7 @@ void streamingMultiModalityImageUrl() throws IOException { String content = response.collectList().block().stream().collect(Collectors.joining()); - logger.info("Response: " + content); + logger.info("Response: {}", content); assertThat(content).contains("bananas", "apple"); assertThat(content).containsAnyOf("bowl", "basket"); } diff --git a/models/spring-ai-bedrock-converse/src/test/java/org/springframework/ai/bedrock/converse/BedrockProxyChatModelIT.java b/models/spring-ai-bedrock-converse/src/test/java/org/springframework/ai/bedrock/converse/BedrockProxyChatModelIT.java index cf3078adbf5..f4ffbcbdd21 100644 --- a/models/spring-ai-bedrock-converse/src/test/java/org/springframework/ai/bedrock/converse/BedrockProxyChatModelIT.java +++ b/models/spring-ai-bedrock-converse/src/test/java/org/springframework/ai/bedrock/converse/BedrockProxyChatModelIT.java @@ -27,6 +27,8 @@ import org.junit.jupiter.api.Test; import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.provider.ValueSource; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import reactor.core.publisher.Flux; import org.springframework.ai.chat.client.ChatClient; @@ -52,7 +54,6 @@ import org.springframework.core.convert.support.DefaultConversionService; import org.springframework.core.io.ClassPathResource; import org.springframework.core.io.Resource; -import org.springframework.core.log.LogAccessor; import org.springframework.util.MimeTypeUtils; import static org.assertj.core.api.Assertions.assertThat; @@ -61,7 +62,7 @@ @RequiresAwsCredentials class BedrockProxyChatModelIT { - private static final LogAccessor logger = new LogAccessor(BedrockProxyChatModelIT.class); + private static final Logger logger = LoggerFactory.getLogger(BedrockProxyChatModelIT.class); @Autowired protected ChatModel chatModel; @@ -261,7 +262,7 @@ void functionCallTest() { ChatResponse response = this.chatModel.call(new Prompt(messages, promptOptions)); - logger.info("Response: " + response); + logger.info("Response: {}", response); Generation generation = response.getResult(); assertThat(generation.getOutput().getText()).contains("30", "10", "15"); @@ -296,7 +297,7 @@ void streamFunctionCallTest() { .map(cr -> cr.getResult().getOutput().getText()) .collect(Collectors.joining()); - logger.info("Response: " + content); + logger.info("Response: {}", content); assertThat(content).contains("30", "10", "15"); } diff --git a/models/spring-ai-bedrock-converse/src/test/java/org/springframework/ai/bedrock/converse/client/BedrockNovaChatClientIT.java b/models/spring-ai-bedrock-converse/src/test/java/org/springframework/ai/bedrock/converse/client/BedrockNovaChatClientIT.java index b3d6e0bed23..8bd422c0880 100644 --- a/models/spring-ai-bedrock-converse/src/test/java/org/springframework/ai/bedrock/converse/client/BedrockNovaChatClientIT.java +++ b/models/spring-ai-bedrock-converse/src/test/java/org/springframework/ai/bedrock/converse/client/BedrockNovaChatClientIT.java @@ -21,6 +21,8 @@ import java.util.Set; import org.junit.jupiter.api.Test; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import software.amazon.awssdk.auth.credentials.EnvironmentVariableCredentialsProvider; import software.amazon.awssdk.regions.Region; @@ -36,7 +38,6 @@ import org.springframework.boot.test.context.SpringBootTest; import org.springframework.context.annotation.Bean; import org.springframework.core.io.ClassPathResource; -import org.springframework.core.log.LogAccessor; import static org.assertj.core.api.Assertions.assertThat; import static org.junit.jupiter.api.Assertions.assertAll; @@ -49,7 +50,7 @@ @RequiresAwsCredentials public class BedrockNovaChatClientIT { - private static final LogAccessor logger = new LogAccessor(BedrockNovaChatClientIT.class); + private static final Logger logger = LoggerFactory.getLogger(BedrockNovaChatClientIT.class); @Autowired ChatModel chatModel; @@ -165,7 +166,7 @@ else if (request.location().contains("San Francisco")) { .content(); // @formatter:on - logger.info("Response: " + response); + logger.info("Response: {}", response); assertThat(response).contains("30", "10", "15"); } diff --git a/models/spring-ai-bedrock/src/main/java/org/springframework/ai/bedrock/api/AbstractBedrockApi.java b/models/spring-ai-bedrock/src/main/java/org/springframework/ai/bedrock/api/AbstractBedrockApi.java index 2c22dd58f18..024f3f4f7d0 100644 --- a/models/spring-ai-bedrock/src/main/java/org/springframework/ai/bedrock/api/AbstractBedrockApi.java +++ b/models/spring-ai-bedrock/src/main/java/org/springframework/ai/bedrock/api/AbstractBedrockApi.java @@ -27,6 +27,8 @@ import com.fasterxml.jackson.annotation.JsonProperty; import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.ObjectMapper; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import reactor.core.publisher.Flux; import reactor.core.publisher.Sinks; import reactor.core.publisher.Sinks.EmitFailureHandler; @@ -43,7 +45,6 @@ import software.amazon.awssdk.services.bedrockruntime.model.ResponseStream; import org.springframework.ai.model.ModelOptionsUtils; -import org.springframework.core.log.LogAccessor; import org.springframework.util.Assert; /** @@ -66,7 +67,7 @@ */ public abstract class AbstractBedrockApi { - private static final LogAccessor logger = new LogAccessor(AbstractBedrockApi.class); + private static final Logger logger = LoggerFactory.getLogger(AbstractBedrockApi.class); /** * Default emit failure handler. @@ -289,7 +290,7 @@ protected Flux internalInvocationStream(I request, Class clazz) { eventSink.emitNext(response, DEFAULT_EMIT_FAILURE_HANDLER); } catch (Exception e) { - logger.error(e, "Failed to unmarshall"); + logger.error("Failed to unmarshall", e); eventSink.emitError(e, DEFAULT_EMIT_FAILURE_HANDLER); } }) diff --git a/models/spring-ai-bedrock/src/main/java/org/springframework/ai/bedrock/titan/BedrockTitanEmbeddingModel.java b/models/spring-ai-bedrock/src/main/java/org/springframework/ai/bedrock/titan/BedrockTitanEmbeddingModel.java index e5dd7f3cdba..2eabc32d4f1 100644 --- a/models/spring-ai-bedrock/src/main/java/org/springframework/ai/bedrock/titan/BedrockTitanEmbeddingModel.java +++ b/models/spring-ai-bedrock/src/main/java/org/springframework/ai/bedrock/titan/BedrockTitanEmbeddingModel.java @@ -1,5 +1,5 @@ /* - * Copyright 2023-2025 the original author or authors. + * Copyright 2023-2024 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -20,7 +20,8 @@ import java.util.List; import java.util.concurrent.atomic.AtomicInteger; -import org.apache.commons.logging.LogFactory; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import org.springframework.ai.bedrock.titan.api.TitanEmbeddingBedrockApi; import org.springframework.ai.bedrock.titan.api.TitanEmbeddingBedrockApi.TitanEmbeddingRequest; @@ -31,7 +32,6 @@ import org.springframework.ai.embedding.EmbeddingOptions; import org.springframework.ai.embedding.EmbeddingRequest; import org.springframework.ai.embedding.EmbeddingResponse; -import org.springframework.core.log.LogAccessor; import org.springframework.util.Assert; /** @@ -47,7 +47,7 @@ */ public class BedrockTitanEmbeddingModel extends AbstractEmbeddingModel { - private static final LogAccessor logger = new LogAccessor(LogFactory.getLog(BedrockTitanEmbeddingModel.class)); + private final Logger logger = LoggerFactory.getLogger(getClass()); private final TitanEmbeddingBedrockApi embeddingApi; diff --git a/models/spring-ai-huggingface/pom.xml b/models/spring-ai-huggingface/pom.xml index 62807b918c3..1013ecdd604 100644 --- a/models/spring-ai-huggingface/pom.xml +++ b/models/spring-ai-huggingface/pom.xml @@ -72,6 +72,11 @@ 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 dd0164d6d6f..8a592901a91 100644 --- a/models/spring-ai-minimax/pom.xml +++ b/models/spring-ai-minimax/pom.xml @@ -60,6 +60,11 @@ 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 dcdd24c2780..e1660d18ae1 100644 --- a/models/spring-ai-minimax/src/main/java/org/springframework/ai/minimax/MiniMaxChatModel.java +++ b/models/spring-ai-minimax/src/main/java/org/springframework/ai/minimax/MiniMaxChatModel.java @@ -26,6 +26,8 @@ import io.micrometer.observation.Observation; import io.micrometer.observation.ObservationRegistry; import io.micrometer.observation.contextpropagation.ObservationThreadLocalAccessor; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import reactor.core.publisher.Flux; import reactor.core.publisher.Mono; @@ -64,7 +66,6 @@ import org.springframework.ai.model.function.FunctionCallbackResolver; import org.springframework.ai.model.function.FunctionCallingOptions; import org.springframework.ai.retry.RetryUtils; -import org.springframework.core.log.LogAccessor; import org.springframework.http.ResponseEntity; import org.springframework.retry.support.RetryTemplate; import org.springframework.util.Assert; @@ -83,7 +84,7 @@ */ public class MiniMaxChatModel extends AbstractToolCallSupport implements ChatModel, StreamingChatModel { - private static final LogAccessor logger = new LogAccessor(MiniMaxChatModel.class); + private static final Logger logger = LoggerFactory.getLogger(MiniMaxChatModel.class); private static final ChatModelObservationConvention DEFAULT_OBSERVATION_CONVENTION = new DefaultChatModelObservationConvention(); @@ -228,14 +229,14 @@ public ChatResponse call(Prompt prompt) { var chatCompletion = completionEntity.getBody(); if (chatCompletion == null) { - logger.warn("No chat completion returned for prompt: " + prompt); + logger.warn("No chat completion returned for prompt: {}", prompt); return new ChatResponse(List.of()); } List choices = chatCompletion.choices(); if (choices == null) { - logger.warn("No choices returned for prompt: " + prompt + ", because: " - + chatCompletion.baseResponse().message()); + logger.warn("No choices returned for prompt: {}, because: {}}", prompt, + chatCompletion.baseResponse().message()); return new ChatResponse(List.of()); } @@ -328,7 +329,7 @@ public Flux stream(Prompt prompt) { return new ChatResponse(generations, from(chatCompletion2)); } catch (Exception e) { - logger.error(e, "Error processing chat completion"); + logger.error("Error processing chat completion", e); return new ChatResponse(List.of()); } })); diff --git a/models/spring-ai-minimax/src/main/java/org/springframework/ai/minimax/MiniMaxEmbeddingModel.java b/models/spring-ai-minimax/src/main/java/org/springframework/ai/minimax/MiniMaxEmbeddingModel.java index 5860d31e0e6..fec3b0c310b 100644 --- a/models/spring-ai-minimax/src/main/java/org/springframework/ai/minimax/MiniMaxEmbeddingModel.java +++ b/models/spring-ai-minimax/src/main/java/org/springframework/ai/minimax/MiniMaxEmbeddingModel.java @@ -20,6 +20,8 @@ import java.util.List; import io.micrometer.observation.ObservationRegistry; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import org.springframework.ai.chat.metadata.DefaultUsage; import org.springframework.ai.document.Document; @@ -38,7 +40,6 @@ import org.springframework.ai.minimax.api.MiniMaxApiConstants; import org.springframework.ai.model.ModelOptionsUtils; import org.springframework.ai.retry.RetryUtils; -import org.springframework.core.log.LogAccessor; import org.springframework.lang.Nullable; import org.springframework.retry.support.RetryTemplate; import org.springframework.util.Assert; @@ -52,7 +53,7 @@ */ public class MiniMaxEmbeddingModel extends AbstractEmbeddingModel { - private static final LogAccessor logger = new LogAccessor(MiniMaxEmbeddingModel.class); + private static final Logger logger = LoggerFactory.getLogger(MiniMaxEmbeddingModel.class); private static final EmbeddingModelObservationConvention DEFAULT_OBSERVATION_CONVENTION = new DefaultEmbeddingModelObservationConvention(); @@ -166,7 +167,7 @@ public EmbeddingResponse call(EmbeddingRequest request) { .execute(ctx -> this.miniMaxApi.embeddings(apiRequest).getBody()); if (apiEmbeddingResponse == null) { - logger.warn("No embeddings returned for request: " + request); + logger.warn("No embeddings returned for request: {}", request); return new EmbeddingResponse(List.of()); } diff --git a/models/spring-ai-minimax/src/test/java/org/springframework/ai/minimax/api/MiniMaxApiToolFunctionCallIT.java b/models/spring-ai-minimax/src/test/java/org/springframework/ai/minimax/api/MiniMaxApiToolFunctionCallIT.java index 18f5763c334..86c337a58e4 100644 --- a/models/spring-ai-minimax/src/test/java/org/springframework/ai/minimax/api/MiniMaxApiToolFunctionCallIT.java +++ b/models/spring-ai-minimax/src/test/java/org/springframework/ai/minimax/api/MiniMaxApiToolFunctionCallIT.java @@ -24,6 +24,8 @@ import com.fasterxml.jackson.databind.ObjectMapper; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.condition.EnabledIfEnvironmentVariable; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import org.springframework.ai.minimax.api.MiniMaxApi.ChatCompletion; import org.springframework.ai.minimax.api.MiniMaxApi.ChatCompletionMessage; @@ -31,7 +33,6 @@ import org.springframework.ai.minimax.api.MiniMaxApi.ChatCompletionMessage.ToolCall; import org.springframework.ai.minimax.api.MiniMaxApi.ChatCompletionRequest; import org.springframework.ai.minimax.api.MiniMaxApi.ChatCompletionRequest.ToolChoiceBuilder; -import org.springframework.core.log.LogAccessor; import org.springframework.http.ResponseEntity; import static org.assertj.core.api.Assertions.assertThat; @@ -42,7 +43,7 @@ @EnabledIfEnvironmentVariable(named = "MINIMAX_API_KEY", matches = ".+") public class MiniMaxApiToolFunctionCallIT { - private static final LogAccessor logger = new LogAccessor(MiniMaxApiToolFunctionCallIT.class); + private final Logger logger = LoggerFactory.getLogger(MiniMaxApiToolFunctionCallIT.class); MockWeatherService weatherService = new MockWeatherService(); diff --git a/models/spring-ai-minimax/src/test/java/org/springframework/ai/minimax/chat/MiniMaxChatOptionsTests.java b/models/spring-ai-minimax/src/test/java/org/springframework/ai/minimax/chat/MiniMaxChatOptionsTests.java index 383daf7a48d..8a7e9ee2efa 100644 --- a/models/spring-ai-minimax/src/test/java/org/springframework/ai/minimax/chat/MiniMaxChatOptionsTests.java +++ b/models/spring-ai-minimax/src/test/java/org/springframework/ai/minimax/chat/MiniMaxChatOptionsTests.java @@ -23,6 +23,8 @@ import org.junit.jupiter.api.Test; import org.junit.jupiter.api.condition.EnabledIfEnvironmentVariable; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import reactor.core.publisher.Flux; import org.springframework.ai.chat.messages.AssistantMessage; @@ -34,7 +36,6 @@ import org.springframework.ai.minimax.MiniMaxChatModel; import org.springframework.ai.minimax.MiniMaxChatOptions; import org.springframework.ai.minimax.api.MiniMaxApi; -import org.springframework.core.log.LogAccessor; import static org.assertj.core.api.Assertions.assertThat; @@ -44,7 +45,7 @@ @EnabledIfEnvironmentVariable(named = "MINIMAX_API_KEY", matches = ".+") public class MiniMaxChatOptionsTests { - private static final LogAccessor logger = new LogAccessor(MiniMaxChatOptionsTests.class); + private static final Logger logger = LoggerFactory.getLogger(MiniMaxChatOptionsTests.class); private final MiniMaxChatModel chatModel = new MiniMaxChatModel(new MiniMaxApi(System.getenv("MINIMAX_API_KEY"))); @@ -134,7 +135,7 @@ void testWebSearchStream() { .map(AssistantMessage::getText) .filter(Objects::nonNull) .collect(Collectors.joining()); - logger.info("Response: " + content); + logger.info("Response: {}", content); assertThat(content).contains("40"); } diff --git a/models/spring-ai-mistral-ai/pom.xml b/models/spring-ai-mistral-ai/pom.xml index 06985cb6b4b..07e45c48d80 100644 --- a/models/spring-ai-mistral-ai/pom.xml +++ b/models/spring-ai-mistral-ai/pom.xml @@ -61,6 +61,11 @@ spring-context-support + + org.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 d3dfba3ad7e..80438008666 100644 --- a/models/spring-ai-mistral-ai/src/main/java/org/springframework/ai/mistralai/MistralAiChatModel.java +++ b/models/spring-ai-mistral-ai/src/main/java/org/springframework/ai/mistralai/MistralAiChatModel.java @@ -27,6 +27,8 @@ import io.micrometer.observation.Observation; import io.micrometer.observation.ObservationRegistry; import io.micrometer.observation.contextpropagation.ObservationThreadLocalAccessor; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import reactor.core.publisher.Flux; import reactor.core.publisher.Mono; @@ -64,7 +66,6 @@ import org.springframework.ai.model.function.FunctionCallbackResolver; import org.springframework.ai.model.function.FunctionCallingOptions; import org.springframework.ai.retry.RetryUtils; -import org.springframework.core.log.LogAccessor; import org.springframework.http.ResponseEntity; import org.springframework.retry.support.RetryTemplate; import org.springframework.util.Assert; @@ -87,7 +88,7 @@ public class MistralAiChatModel extends AbstractToolCallSupport implements ChatM private static final ChatModelObservationConvention DEFAULT_OBSERVATION_CONVENTION = new DefaultChatModelObservationConvention(); - private final LogAccessor logger = new LogAccessor(getClass()); + private final Logger logger = LoggerFactory.getLogger(getClass()); /** * The default options used for the chat completion requests. @@ -202,7 +203,7 @@ public ChatResponse internalCall(Prompt prompt, ChatResponse previousChatRespons ChatCompletion chatCompletion = completionEntity.getBody(); if (chatCompletion == null) { - logger.warn("No chat completion returned for prompt: " + prompt); + logger.warn("No chat completion returned for prompt: {}", prompt); return new ChatResponse(List.of()); } @@ -299,7 +300,7 @@ public Flux internalStream(Prompt prompt, ChatResponse previousCha } } catch (Exception e) { - logger.error(e, "Error processing chat completion"); + logger.error("Error processing chat completion", e); return new ChatResponse(List.of()); } })); diff --git a/models/spring-ai-mistral-ai/src/main/java/org/springframework/ai/mistralai/MistralAiEmbeddingModel.java b/models/spring-ai-mistral-ai/src/main/java/org/springframework/ai/mistralai/MistralAiEmbeddingModel.java index f7e642a3fa1..834bcfcd926 100644 --- a/models/spring-ai-mistral-ai/src/main/java/org/springframework/ai/mistralai/MistralAiEmbeddingModel.java +++ b/models/spring-ai-mistral-ai/src/main/java/org/springframework/ai/mistralai/MistralAiEmbeddingModel.java @@ -19,6 +19,8 @@ import java.util.List; import io.micrometer.observation.ObservationRegistry; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import org.springframework.ai.chat.metadata.DefaultUsage; import org.springframework.ai.document.Document; @@ -37,7 +39,6 @@ import org.springframework.ai.mistralai.api.MistralAiApi; import org.springframework.ai.model.ModelOptionsUtils; import org.springframework.ai.retry.RetryUtils; -import org.springframework.core.log.LogAccessor; import org.springframework.retry.support.RetryTemplate; import org.springframework.util.Assert; @@ -51,7 +52,7 @@ */ public class MistralAiEmbeddingModel extends AbstractEmbeddingModel { - private static final LogAccessor logger = new LogAccessor(MistralAiEmbeddingModel.class); + private static final Logger logger = LoggerFactory.getLogger(MistralAiEmbeddingModel.class); private static final EmbeddingModelObservationConvention DEFAULT_OBSERVATION_CONVENTION = new DefaultEmbeddingModelObservationConvention(); @@ -125,7 +126,7 @@ public EmbeddingResponse call(EmbeddingRequest request) { .execute(ctx -> this.mistralAiApi.embeddings(apiRequest).getBody()); if (apiEmbeddingResponse == null) { - logger.warn("No embeddings returned for request: " + request); + logger.warn("No embeddings returned for request: {}", request); return new EmbeddingResponse(List.of()); } diff --git a/models/spring-ai-mistral-ai/src/test/java/org/springframework/ai/mistralai/MistralAiChatClientIT.java b/models/spring-ai-mistral-ai/src/test/java/org/springframework/ai/mistralai/MistralAiChatClientIT.java index fba261f815c..0bdff32ee4b 100644 --- a/models/spring-ai-mistral-ai/src/test/java/org/springframework/ai/mistralai/MistralAiChatClientIT.java +++ b/models/spring-ai-mistral-ai/src/test/java/org/springframework/ai/mistralai/MistralAiChatClientIT.java @@ -23,6 +23,8 @@ import org.junit.jupiter.api.Test; import org.junit.jupiter.api.condition.EnabledIfEnvironmentVariable; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import reactor.core.publisher.Flux; import org.springframework.ai.chat.client.ChatClient; @@ -39,7 +41,6 @@ import org.springframework.core.ParameterizedTypeReference; import org.springframework.core.convert.support.DefaultConversionService; import org.springframework.core.io.Resource; -import org.springframework.core.log.LogAccessor; import static org.assertj.core.api.Assertions.assertThat; @@ -47,7 +48,7 @@ @EnabledIfEnvironmentVariable(named = "MISTRAL_AI_API_KEY", matches = ".+") class MistralAiChatClientIT { - private static final LogAccessor logger = new LogAccessor(MistralAiChatClientIT.class); + private static final Logger logger = LoggerFactory.getLogger(MistralAiChatClientIT.class); @Autowired MistralAiChatModel chatModel; @@ -232,7 +233,7 @@ void functionCallTest() { .content(); // @formatter:on - logger.info("Response: " + response); + logger.info("Response: {}", response); assertThat(response).containsAnyOf("30.0", "30"); assertThat(response).containsAnyOf("10.0", "10"); @@ -254,7 +255,7 @@ void defaultFunctionCallTest() { .prompt().call().content(); // @formatter:on - logger.info("Response: " + response); + logger.info("Response: {}", response); assertThat(response).containsAnyOf("30.0", "30"); assertThat(response).containsAnyOf("10.0", "10"); @@ -277,7 +278,7 @@ void streamFunctionCallTest() { // @formatter:on String content = response.collectList().block().stream().collect(Collectors.joining()); - logger.info("Response: " + content); + logger.info("Response: {}", content); assertThat(content).containsAnyOf("30.0", "30"); assertThat(content).containsAnyOf("10.0", "10"); diff --git a/models/spring-ai-mistral-ai/src/test/java/org/springframework/ai/mistralai/MistralAiChatModelIT.java b/models/spring-ai-mistral-ai/src/test/java/org/springframework/ai/mistralai/MistralAiChatModelIT.java index e39cd2fb3dd..c32792af69f 100644 --- a/models/spring-ai-mistral-ai/src/test/java/org/springframework/ai/mistralai/MistralAiChatModelIT.java +++ b/models/spring-ai-mistral-ai/src/test/java/org/springframework/ai/mistralai/MistralAiChatModelIT.java @@ -28,6 +28,8 @@ import org.junit.jupiter.api.condition.EnabledIfEnvironmentVariable; import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.provider.ValueSource; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import reactor.core.publisher.Flux; import org.springframework.ai.chat.messages.AssistantMessage; @@ -54,7 +56,6 @@ import org.springframework.core.convert.support.DefaultConversionService; import org.springframework.core.io.ClassPathResource; import org.springframework.core.io.Resource; -import org.springframework.core.log.LogAccessor; import org.springframework.util.MimeTypeUtils; import static org.assertj.core.api.Assertions.assertThat; @@ -69,7 +70,7 @@ @EnabledIfEnvironmentVariable(named = "MISTRAL_AI_API_KEY", matches = ".+") class MistralAiChatModelIT { - private static final LogAccessor logger = new LogAccessor(MistralAiChatModelIT.class); + private static final Logger logger = LoggerFactory.getLogger(MistralAiChatModelIT.class); @Autowired protected ChatModel chatModel; @@ -212,7 +213,7 @@ void functionCallTest() { ChatResponse response = this.chatModel.call(new Prompt(messages, promptOptions)); - logger.info("Response: " + response); + logger.info("Response: {}", response); assertThat(response.getResult().getOutput().getText()).containsAnyOf("30.0", "30"); assertThat(response.getMetadata()).isNotNull(); @@ -245,7 +246,7 @@ void streamFunctionCallTest() { .map(Generation::getOutput) .map(AssistantMessage::getText) .collect(Collectors.joining()); - logger.info("Response: " + content); + logger.info("Response: {}", content); assertThat(content).containsAnyOf("10.0", "10"); } @@ -302,7 +303,7 @@ void streamingMultiModalityImageUrl() throws IOException { .map(Generation::getOutput) .map(AssistantMessage::getText) .collect(Collectors.joining()); - logger.info("Response: " + content); + logger.info("Response: {}", content); assertThat(content).contains("bananas", "apple"); assertThat(content).containsAnyOf("bowl", "basket", "fruit stand"); } @@ -325,7 +326,7 @@ void streamFunctionCallUsageTest() { Flux response = this.streamingChatModel.stream(new Prompt(messages, promptOptions)); ChatResponse chatResponse = response.last().block(); - logger.info("Response: " + chatResponse); + logger.info("Response: {}", chatResponse); assertThat(chatResponse.getMetadata()).isNotNull(); assertThat(chatResponse.getMetadata().getUsage()).isNotNull(); assertThat(chatResponse.getMetadata().getUsage().getTotalTokens()).isLessThan(1050).isGreaterThan(750); diff --git a/models/spring-ai-mistral-ai/src/test/java/org/springframework/ai/mistralai/api/tool/MistralAiApiToolFunctionCallIT.java b/models/spring-ai-mistral-ai/src/test/java/org/springframework/ai/mistralai/api/tool/MistralAiApiToolFunctionCallIT.java index 8d0d39a25cd..09406736d2d 100644 --- a/models/spring-ai-mistral-ai/src/test/java/org/springframework/ai/mistralai/api/tool/MistralAiApiToolFunctionCallIT.java +++ b/models/spring-ai-mistral-ai/src/test/java/org/springframework/ai/mistralai/api/tool/MistralAiApiToolFunctionCallIT.java @@ -23,6 +23,8 @@ import com.fasterxml.jackson.databind.ObjectMapper; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.condition.EnabledIfEnvironmentVariable; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import org.springframework.ai.mistralai.api.MistralAiApi; import org.springframework.ai.mistralai.api.MistralAiApi.ChatCompletion; @@ -33,7 +35,6 @@ import org.springframework.ai.mistralai.api.MistralAiApi.ChatCompletionRequest.ToolChoice; import org.springframework.ai.mistralai.api.MistralAiApi.FunctionTool.Type; import org.springframework.ai.model.ModelOptionsUtils; -import org.springframework.core.log.LogAccessor; import org.springframework.http.ResponseEntity; import org.springframework.util.ObjectUtils; @@ -48,7 +49,7 @@ public class MistralAiApiToolFunctionCallIT { static final String MISTRAL_AI_CHAT_MODEL = MistralAiApi.ChatModel.LARGE.getValue(); - private final LogAccessor logger = new LogAccessor(MistralAiApiToolFunctionCallIT.class); + private final Logger logger = LoggerFactory.getLogger(MistralAiApiToolFunctionCallIT.class); MockWeatherService weatherService = new MockWeatherService(); diff --git a/models/spring-ai-mistral-ai/src/test/java/org/springframework/ai/mistralai/api/tool/PaymentStatusFunctionCallingIT.java b/models/spring-ai-mistral-ai/src/test/java/org/springframework/ai/mistralai/api/tool/PaymentStatusFunctionCallingIT.java index 5fae467249b..f2c03cd3d90 100644 --- a/models/spring-ai-mistral-ai/src/test/java/org/springframework/ai/mistralai/api/tool/PaymentStatusFunctionCallingIT.java +++ b/models/spring-ai-mistral-ai/src/test/java/org/springframework/ai/mistralai/api/tool/PaymentStatusFunctionCallingIT.java @@ -26,6 +26,8 @@ import com.fasterxml.jackson.databind.ObjectMapper; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.condition.EnabledIfEnvironmentVariable; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import org.springframework.ai.mistralai.api.MistralAiApi; import org.springframework.ai.mistralai.api.MistralAiApi.ChatCompletion; @@ -36,7 +38,6 @@ import org.springframework.ai.mistralai.api.MistralAiApi.ChatCompletionRequest.ToolChoice; import org.springframework.ai.mistralai.api.MistralAiApi.FunctionTool; import org.springframework.ai.mistralai.api.MistralAiApi.FunctionTool.Type; -import org.springframework.core.log.LogAccessor; import org.springframework.http.ResponseEntity; import static org.assertj.core.api.Assertions.assertThat; @@ -63,7 +64,7 @@ public class PaymentStatusFunctionCallingIT { static Map> functions = Map.of("retrieve_payment_status", new RetrievePaymentStatus(), "retrieve_payment_date", new RetrievePaymentDate()); - private final LogAccessor logger = new LogAccessor(PaymentStatusFunctionCallingIT.class); + private final Logger logger = LoggerFactory.getLogger(PaymentStatusFunctionCallingIT.class); private static T jsonToObject(String json, Class targetClass) { try { diff --git a/models/spring-ai-moonshot/pom.xml b/models/spring-ai-moonshot/pom.xml index ec03221b56f..40527b8a171 100644 --- a/models/spring-ai-moonshot/pom.xml +++ b/models/spring-ai-moonshot/pom.xml @@ -61,6 +61,11 @@ 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 e75bf718d74..403c15a468c 100644 --- a/models/spring-ai-moonshot/src/main/java/org/springframework/ai/moonshot/MoonshotChatModel.java +++ b/models/spring-ai-moonshot/src/main/java/org/springframework/ai/moonshot/MoonshotChatModel.java @@ -25,6 +25,8 @@ import io.micrometer.observation.Observation; import io.micrometer.observation.ObservationRegistry; import io.micrometer.observation.contextpropagation.ObservationThreadLocalAccessor; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import reactor.core.publisher.Flux; import reactor.core.publisher.Mono; @@ -65,7 +67,6 @@ import org.springframework.ai.moonshot.api.MoonshotApi.FunctionTool; import org.springframework.ai.moonshot.api.MoonshotConstants; import org.springframework.ai.retry.RetryUtils; -import org.springframework.core.log.LogAccessor; import org.springframework.http.ResponseEntity; import org.springframework.retry.support.RetryTemplate; import org.springframework.util.Assert; @@ -80,7 +81,7 @@ */ public class MoonshotChatModel extends AbstractToolCallSupport implements ChatModel, StreamingChatModel { - private static final LogAccessor logger = new LogAccessor(MoonshotChatModel.class); + private static final Logger logger = LoggerFactory.getLogger(MoonshotChatModel.class); private static final ChatModelObservationConvention DEFAULT_OBSERVATION_CONVENTION = new DefaultChatModelObservationConvention(); @@ -204,13 +205,13 @@ public ChatResponse internalCall(Prompt prompt, ChatResponse previousChatRespons var chatCompletion = completionEntity.getBody(); if (chatCompletion == null) { - logger.warn("No chat completion returned for prompt: " + prompt); + logger.warn("No chat completion returned for prompt: {}", prompt); return new ChatResponse(List.of()); } List choices = chatCompletion.choices(); if (choices == null) { - logger.warn("No choices returned for prompt: " + prompt); + logger.warn("No choices returned for prompt: {}", prompt); return new ChatResponse(List.of()); } @@ -311,7 +312,7 @@ public Flux internalStream(Prompt prompt, ChatResponse previousCha return new ChatResponse(generations, from(chatCompletion2, cumulativeUsage)); } catch (Exception e) { - logger.error(e, "Error processing chat completion"); + logger.error("Error processing chat completion", e); return new ChatResponse(List.of()); } diff --git a/models/spring-ai-moonshot/src/test/java/org/springframework/ai/moonshot/api/MoonshotApiToolFunctionCallIT.java b/models/spring-ai-moonshot/src/test/java/org/springframework/ai/moonshot/api/MoonshotApiToolFunctionCallIT.java index 4dd1f099d32..c2597fc1da5 100644 --- a/models/spring-ai-moonshot/src/test/java/org/springframework/ai/moonshot/api/MoonshotApiToolFunctionCallIT.java +++ b/models/spring-ai-moonshot/src/test/java/org/springframework/ai/moonshot/api/MoonshotApiToolFunctionCallIT.java @@ -24,6 +24,8 @@ import com.fasterxml.jackson.databind.ObjectMapper; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.condition.EnabledIfEnvironmentVariable; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import org.springframework.ai.moonshot.api.MoonshotApi.ChatCompletion; import org.springframework.ai.moonshot.api.MoonshotApi.ChatCompletionMessage; @@ -33,7 +35,6 @@ import org.springframework.ai.moonshot.api.MoonshotApi.ChatCompletionRequest.ToolChoiceBuilder; import org.springframework.ai.moonshot.api.MoonshotApi.FunctionTool; import org.springframework.ai.moonshot.api.MoonshotApi.FunctionTool.Type; -import org.springframework.core.log.LogAccessor; import org.springframework.http.ResponseEntity; import static org.assertj.core.api.Assertions.assertThat; @@ -70,7 +71,7 @@ public class MoonshotApiToolFunctionCallIT { } """)); - private static final LogAccessor logger = new LogAccessor(MoonshotApiToolFunctionCallIT.class); + private final Logger logger = LoggerFactory.getLogger(MoonshotApiToolFunctionCallIT.class); private final MockWeatherService weatherService = new MockWeatherService(); diff --git a/models/spring-ai-moonshot/src/test/java/org/springframework/ai/moonshot/chat/MoonshotChatModelFunctionCallingIT.java b/models/spring-ai-moonshot/src/test/java/org/springframework/ai/moonshot/chat/MoonshotChatModelFunctionCallingIT.java index afebc5a132a..f24600653a4 100644 --- a/models/spring-ai-moonshot/src/test/java/org/springframework/ai/moonshot/chat/MoonshotChatModelFunctionCallingIT.java +++ b/models/spring-ai-moonshot/src/test/java/org/springframework/ai/moonshot/chat/MoonshotChatModelFunctionCallingIT.java @@ -24,6 +24,8 @@ import org.junit.jupiter.api.Test; import org.junit.jupiter.api.condition.EnabledIfEnvironmentVariable; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import reactor.core.publisher.Flux; import org.springframework.ai.chat.messages.AssistantMessage; @@ -40,7 +42,6 @@ import org.springframework.ai.moonshot.api.MoonshotApi; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; -import org.springframework.core.log.LogAccessor; import static org.assertj.core.api.Assertions.assertThat; @@ -48,7 +49,7 @@ @EnabledIfEnvironmentVariable(named = "MOONSHOT_API_KEY", matches = ".+") class MoonshotChatModelFunctionCallingIT { - private static final LogAccessor logger = new LogAccessor(MoonshotChatModelFunctionCallingIT.class); + private static final Logger logger = LoggerFactory.getLogger(MoonshotChatModelFunctionCallingIT.class); @Autowired ChatModel chatModel; @@ -99,7 +100,7 @@ void functionCallTest() { ChatResponse response = this.chatModel.call(new Prompt(messages, promptOptions)); - logger.info("Response: " + response); + logger.info("Response: {}", response); assertThat(response.getResult().getOutput().getText()).contains("30", "10", "15"); } @@ -131,7 +132,7 @@ void streamFunctionCallTest() { .map(AssistantMessage::getText) .filter(Objects::nonNull) .collect(Collectors.joining()); - logger.info("Response: " + content); + logger.info("Response: {}", content); assertThat(content).contains("30", "10", "15"); } diff --git a/models/spring-ai-moonshot/src/test/java/org/springframework/ai/moonshot/chat/MoonshotChatModelIT.java b/models/spring-ai-moonshot/src/test/java/org/springframework/ai/moonshot/chat/MoonshotChatModelIT.java index 199494083a0..c177645b734 100644 --- a/models/spring-ai-moonshot/src/test/java/org/springframework/ai/moonshot/chat/MoonshotChatModelIT.java +++ b/models/spring-ai-moonshot/src/test/java/org/springframework/ai/moonshot/chat/MoonshotChatModelIT.java @@ -23,6 +23,8 @@ import org.junit.jupiter.api.Test; import org.junit.jupiter.api.condition.EnabledIfEnvironmentVariable; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import org.springframework.ai.chat.messages.AssistantMessage; import org.springframework.ai.chat.messages.Message; @@ -43,7 +45,6 @@ import org.springframework.boot.test.context.SpringBootTest; import org.springframework.core.convert.support.DefaultConversionService; import org.springframework.core.io.Resource; -import org.springframework.core.log.LogAccessor; import static org.assertj.core.api.Assertions.assertThat; @@ -54,7 +55,7 @@ @EnabledIfEnvironmentVariable(named = "MOONSHOT_API_KEY", matches = ".+") public class MoonshotChatModelIT { - private static final LogAccessor logger = new LogAccessor(MoonshotChatModelIT.class); + private static final Logger logger = LoggerFactory.getLogger(MoonshotChatModelIT.class); @Autowired protected ChatModel chatModel; diff --git a/models/spring-ai-oci-genai/pom.xml b/models/spring-ai-oci-genai/pom.xml index e694ff627c4..1355d4230cc 100644 --- a/models/spring-ai-oci-genai/pom.xml +++ b/models/spring-ai-oci-genai/pom.xml @@ -64,6 +64,10 @@ 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 8710fb3a83d..dde22046e7f 100644 --- a/models/spring-ai-ollama/pom.xml +++ b/models/spring-ai-ollama/pom.xml @@ -69,6 +69,11 @@ ${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 8c1c578fa0c..e939e69d425 100644 --- a/models/spring-ai-ollama/src/main/java/org/springframework/ai/ollama/management/OllamaModelManager.java +++ b/models/spring-ai-ollama/src/main/java/org/springframework/ai/ollama/management/OllamaModelManager.java @@ -18,13 +18,14 @@ import java.time.Duration; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import reactor.util.retry.Retry; import org.springframework.ai.ollama.api.OllamaApi; import org.springframework.ai.ollama.api.OllamaApi.DeleteModelRequest; import org.springframework.ai.ollama.api.OllamaApi.ListModelResponse; import org.springframework.ai.ollama.api.OllamaApi.PullModelRequest; -import org.springframework.core.log.LogAccessor; import org.springframework.util.Assert; import org.springframework.util.CollectionUtils; @@ -37,7 +38,7 @@ */ public class OllamaModelManager { - private static final LogAccessor logger = new LogAccessor(OllamaModelManager.class); + private final Logger logger = LoggerFactory.getLogger(OllamaModelManager.class); private final OllamaApi ollamaApi; @@ -80,13 +81,13 @@ private String normalizeModelName(String modelName) { } public void deleteModel(String modelName) { - logger.info("Start deletion of model: " + modelName); + logger.info("Start deletion of model: {}", modelName); if (!isModelAvailable(modelName)) { - logger.info("Model " + modelName + " not found"); + logger.info("Model {} not found", modelName); return; } this.ollamaApi.deleteModel(new DeleteModelRequest(modelName)); - logger.info("Completed deletion of model: " + modelName); + logger.info("Completed deletion of model: {}", modelName); } public void pullModel(String modelName) { @@ -100,20 +101,20 @@ public void pullModel(String modelName, PullModelStrategy pullModelStrategy) { if (PullModelStrategy.WHEN_MISSING.equals(pullModelStrategy)) { if (isModelAvailable(modelName)) { - logger.debug("Model '" + modelName + "' already available. Skipping pull operation."); + logger.debug("Model '{}' already available. Skipping pull operation.", modelName); return; } } // @formatter:off - logger.info("Start pulling model: "+ modelName); + logger.info("Start pulling model: {}", modelName); this.ollamaApi.pullModel(new PullModelRequest(modelName)) .bufferUntilChanged(OllamaApi.ProgressResponse::status) .doOnEach(signal -> { var progressResponses = signal.get(); if (!CollectionUtils.isEmpty(progressResponses) && progressResponses.get(progressResponses.size() - 1) != null) { - logger.info("Pulling the '"+ modelName +"' model - Status: "+ progressResponses.get(progressResponses.size() - 1).status()); + logger.info("Pulling the '{}' model - Status: {}", modelName, progressResponses.get(progressResponses.size() - 1).status()); } }) .takeUntil(progressResponses -> @@ -121,7 +122,7 @@ public void pullModel(String modelName, PullModelStrategy pullModelStrategy) { .timeout(this.options.timeout()) .retryWhen(Retry.backoff(this.options.maxRetries(), Duration.ofSeconds(5))) .blockLast(); - logger.info("Completed pulling the '"+ modelName +"' model"); + logger.info("Completed pulling the '{}' model", modelName); // @formatter:on } diff --git a/models/spring-ai-ollama/src/test/java/org/springframework/ai/ollama/OllamaChatModelFunctionCallingIT.java b/models/spring-ai-ollama/src/test/java/org/springframework/ai/ollama/OllamaChatModelFunctionCallingIT.java index 04a8cd5b8d3..25f800ca9fa 100644 --- a/models/spring-ai-ollama/src/test/java/org/springframework/ai/ollama/OllamaChatModelFunctionCallingIT.java +++ b/models/spring-ai-ollama/src/test/java/org/springframework/ai/ollama/OllamaChatModelFunctionCallingIT.java @@ -21,6 +21,8 @@ import java.util.stream.Collectors; import org.junit.jupiter.api.Test; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import reactor.core.publisher.Flux; import org.springframework.ai.chat.messages.AssistantMessage; @@ -38,14 +40,13 @@ import org.springframework.boot.SpringBootConfiguration; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.context.annotation.Bean; -import org.springframework.core.log.LogAccessor; import static org.assertj.core.api.Assertions.assertThat; @SpringBootTest(classes = OllamaChatModelFunctionCallingIT.Config.class) class OllamaChatModelFunctionCallingIT extends BaseOllamaIT { - private static final LogAccessor logger = new LogAccessor(OllamaChatModelFunctionCallingIT.class); + private static final Logger logger = LoggerFactory.getLogger(OllamaChatModelFunctionCallingIT.class); private static final String MODEL = "qwen2.5:3b"; @@ -70,7 +71,7 @@ void functionCallTest() { ChatResponse response = this.chatModel.call(new Prompt(messages, promptOptions)); - logger.info("Response: " + response); + logger.info("Response: {}", response); assertThat(response.getResult().getOutput().getText()).contains("30", "10", "15"); } @@ -101,7 +102,7 @@ void streamFunctionCallTest() { .map(Generation::getOutput) .map(AssistantMessage::getText) .collect(Collectors.joining()); - logger.info("Response: " + content); + logger.info("Response: {}", content); assertThat(content).contains("30", "10", "15"); } diff --git a/models/spring-ai-ollama/src/test/java/org/springframework/ai/ollama/OllamaChatModelMultimodalIT.java b/models/spring-ai-ollama/src/test/java/org/springframework/ai/ollama/OllamaChatModelMultimodalIT.java index 9e5816c2514..1fa5828e323 100644 --- a/models/spring-ai-ollama/src/test/java/org/springframework/ai/ollama/OllamaChatModelMultimodalIT.java +++ b/models/spring-ai-ollama/src/test/java/org/springframework/ai/ollama/OllamaChatModelMultimodalIT.java @@ -19,6 +19,8 @@ import java.util.List; import org.junit.jupiter.api.Test; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import org.springframework.ai.chat.messages.UserMessage; import org.springframework.ai.chat.prompt.Prompt; @@ -30,7 +32,6 @@ import org.springframework.boot.test.context.SpringBootTest; import org.springframework.context.annotation.Bean; import org.springframework.core.io.ClassPathResource; -import org.springframework.core.log.LogAccessor; import org.springframework.util.MimeTypeUtils; import static org.assertj.core.api.Assertions.assertThat; @@ -39,7 +40,7 @@ @SpringBootTest class OllamaChatModelMultimodalIT extends BaseOllamaIT { - private static final LogAccessor logger = new LogAccessor(OllamaChatModelMultimodalIT.class); + private static final Logger logger = LoggerFactory.getLogger(OllamaChatModelMultimodalIT.class); private static final String MODEL = "llava-phi3"; diff --git a/models/spring-ai-ollama/src/test/java/org/springframework/ai/ollama/api/tool/OllamaApiToolFunctionCallIT.java b/models/spring-ai-ollama/src/test/java/org/springframework/ai/ollama/api/tool/OllamaApiToolFunctionCallIT.java index 5d8d0e6fb34..104cd91ce08 100644 --- a/models/spring-ai-ollama/src/test/java/org/springframework/ai/ollama/api/tool/OllamaApiToolFunctionCallIT.java +++ b/models/spring-ai-ollama/src/test/java/org/springframework/ai/ollama/api/tool/OllamaApiToolFunctionCallIT.java @@ -23,6 +23,8 @@ import org.junit.jupiter.api.BeforeAll; import org.junit.jupiter.api.Test; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import org.springframework.ai.model.ModelOptionsUtils; import org.springframework.ai.ollama.BaseOllamaIT; @@ -31,7 +33,6 @@ import org.springframework.ai.ollama.api.OllamaApi.Message; import org.springframework.ai.ollama.api.OllamaApi.Message.Role; import org.springframework.ai.ollama.api.OllamaApi.Message.ToolCall; -import org.springframework.core.log.LogAccessor; import static org.assertj.core.api.Assertions.assertThat; @@ -43,7 +44,7 @@ public class OllamaApiToolFunctionCallIT extends BaseOllamaIT { private static final String MODEL = "qwen2.5:3b"; - private static final LogAccessor logger = new LogAccessor(OllamaApiToolFunctionCallIT.class); + private static final Logger logger = LoggerFactory.getLogger(OllamaApiToolFunctionCallIT.class); static OllamaApi ollamaApi; diff --git a/models/spring-ai-openai/pom.xml b/models/spring-ai-openai/pom.xml index 6c1bd4fea64..a69a0224c08 100644 --- a/models/spring-ai-openai/pom.xml +++ b/models/spring-ai-openai/pom.xml @@ -75,6 +75,10 @@ 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 a1981837d05..baf772ed4e7 100644 --- a/models/spring-ai-openai/src/main/java/org/springframework/ai/openai/OpenAiAudioSpeechModel.java +++ b/models/spring-ai-openai/src/main/java/org/springframework/ai/openai/OpenAiAudioSpeechModel.java @@ -17,6 +17,8 @@ package org.springframework.ai.openai; import org.apache.commons.lang3.StringUtils; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import reactor.core.publisher.Flux; import org.springframework.ai.chat.metadata.RateLimit; @@ -30,7 +32,6 @@ import org.springframework.ai.openai.metadata.audio.OpenAiAudioSpeechResponseMetadata; import org.springframework.ai.openai.metadata.support.OpenAiResponseHeaderExtractor; import org.springframework.ai.retry.RetryUtils; -import org.springframework.core.log.LogAccessor; import org.springframework.http.ResponseEntity; import org.springframework.retry.support.RetryTemplate; import org.springframework.util.Assert; @@ -52,7 +53,7 @@ public class OpenAiAudioSpeechModel implements SpeechModel, StreamingSpeechModel */ private static final Float SPEED = 1.0f; - private final LogAccessor logger = new LogAccessor(getClass()); + private final Logger logger = LoggerFactory.getLogger(getClass()); /** * The default options used for the audio completion requests. @@ -131,7 +132,7 @@ public SpeechResponse call(SpeechPrompt speechPrompt) { var speech = speechEntity.getBody(); if (speech == null) { - logger.warn("No speech response returned for speechRequest: " + speechRequest); + logger.warn("No speech response returned for speechRequest: {}", speechRequest); return new SpeechResponse(new Speech(new byte[0])); } diff --git a/models/spring-ai-openai/src/main/java/org/springframework/ai/openai/OpenAiAudioTranscriptionModel.java b/models/spring-ai-openai/src/main/java/org/springframework/ai/openai/OpenAiAudioTranscriptionModel.java index 7753d13b292..4c7bb105648 100644 --- a/models/spring-ai-openai/src/main/java/org/springframework/ai/openai/OpenAiAudioTranscriptionModel.java +++ b/models/spring-ai-openai/src/main/java/org/springframework/ai/openai/OpenAiAudioTranscriptionModel.java @@ -16,6 +16,9 @@ package org.springframework.ai.openai; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + import org.springframework.ai.audio.transcription.AudioTranscription; import org.springframework.ai.audio.transcription.AudioTranscriptionPrompt; import org.springframework.ai.audio.transcription.AudioTranscriptionResponse; @@ -27,7 +30,6 @@ import org.springframework.ai.openai.metadata.support.OpenAiResponseHeaderExtractor; import org.springframework.ai.retry.RetryUtils; import org.springframework.core.io.Resource; -import org.springframework.core.log.LogAccessor; import org.springframework.http.ResponseEntity; import org.springframework.retry.support.RetryTemplate; import org.springframework.util.Assert; @@ -45,7 +47,7 @@ */ public class OpenAiAudioTranscriptionModel implements Model { - private static final LogAccessor logger = new LogAccessor(OpenAiAudioTranscriptionModel.class); + private final Logger logger = LoggerFactory.getLogger(getClass()); private final OpenAiAudioTranscriptionOptions defaultOptions; @@ -116,7 +118,7 @@ public AudioTranscriptionResponse call(AudioTranscriptionPrompt transcriptionPro var transcription = transcriptionEntity.getBody(); if (transcription == null) { - logger.warn("No transcription returned for request: " + audioResource); + logger.warn("No transcription returned for request: {}", audioResource); return new AudioTranscriptionResponse(null); } @@ -137,7 +139,7 @@ public AudioTranscriptionResponse call(AudioTranscriptionPrompt transcriptionPro var transcription = transcriptionEntity.getBody(); if (transcription == null) { - logger.warn("No transcription returned for request: " + audioResource); + logger.warn("No transcription returned for request: {}", audioResource); return new AudioTranscriptionResponse(null); } diff --git a/models/spring-ai-openai/src/main/java/org/springframework/ai/openai/OpenAiChatModel.java b/models/spring-ai-openai/src/main/java/org/springframework/ai/openai/OpenAiChatModel.java index 2c151f546fc..fdb7f2020c4 100644 --- a/models/spring-ai-openai/src/main/java/org/springframework/ai/openai/OpenAiChatModel.java +++ b/models/spring-ai-openai/src/main/java/org/springframework/ai/openai/OpenAiChatModel.java @@ -29,6 +29,8 @@ 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; @@ -74,7 +76,6 @@ import org.springframework.ai.retry.RetryUtils; import org.springframework.core.io.ByteArrayResource; import org.springframework.core.io.Resource; -import org.springframework.core.log.LogAccessor; import org.springframework.http.ResponseEntity; import org.springframework.retry.support.RetryTemplate; import org.springframework.util.Assert; @@ -107,7 +108,7 @@ */ public class OpenAiChatModel extends AbstractToolCallSupport implements ChatModel { - private static final LogAccessor logger = new LogAccessor(OpenAiChatModel.class); + private static final Logger logger = LoggerFactory.getLogger(OpenAiChatModel.class); private static final ChatModelObservationConvention DEFAULT_OBSERVATION_CONVENTION = new DefaultChatModelObservationConvention(); @@ -240,13 +241,13 @@ public ChatResponse internalCall(Prompt prompt, ChatResponse previousChatRespons var chatCompletion = completionEntity.getBody(); if (chatCompletion == null) { - logger.warn("No chat completion returned for prompt: " + prompt); + logger.warn("No chat completion returned for prompt: {}", prompt); return new ChatResponse(List.of()); } List choices = chatCompletion.choices(); if (choices == null) { - logger.warn("No choices returned for prompt: " + prompt); + logger.warn("No choices returned for prompt: {}", prompt); return new ChatResponse(List.of()); } @@ -357,7 +358,7 @@ public Flux internalStream(Prompt prompt, ChatResponse previousCha return new ChatResponse(generations, from(chatCompletion2, null, accumulatedUsage)); } catch (Exception e) { - logger.error(e, "Error processing chat completion"); + logger.error("Error processing chat completion", e); return new ChatResponse(List.of()); } // When in stream mode and enabled to include the usage, the OpenAI diff --git a/models/spring-ai-openai/src/main/java/org/springframework/ai/openai/OpenAiEmbeddingModel.java b/models/spring-ai-openai/src/main/java/org/springframework/ai/openai/OpenAiEmbeddingModel.java index 5018f3f0c17..22c99aefaa8 100644 --- a/models/spring-ai-openai/src/main/java/org/springframework/ai/openai/OpenAiEmbeddingModel.java +++ b/models/spring-ai-openai/src/main/java/org/springframework/ai/openai/OpenAiEmbeddingModel.java @@ -19,6 +19,8 @@ import java.util.List; import io.micrometer.observation.ObservationRegistry; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import org.springframework.ai.chat.metadata.DefaultUsage; import org.springframework.ai.document.Document; @@ -38,7 +40,6 @@ import org.springframework.ai.openai.api.OpenAiApi.EmbeddingList; import org.springframework.ai.openai.api.common.OpenAiApiConstants; import org.springframework.ai.retry.RetryUtils; -import org.springframework.core.log.LogAccessor; import org.springframework.lang.Nullable; import org.springframework.retry.support.RetryTemplate; import org.springframework.util.Assert; @@ -51,7 +52,7 @@ */ public class OpenAiEmbeddingModel extends AbstractEmbeddingModel { - private static final LogAccessor logger = new LogAccessor(OpenAiEmbeddingModel.class); + private static final Logger logger = LoggerFactory.getLogger(OpenAiEmbeddingModel.class); private static final EmbeddingModelObservationConvention DEFAULT_OBSERVATION_CONVENTION = new DefaultEmbeddingModelObservationConvention(); @@ -162,7 +163,7 @@ public EmbeddingResponse call(EmbeddingRequest request) { .execute(ctx -> this.openAiApi.embeddings(apiRequest).getBody()); if (apiEmbeddingResponse == null) { - logger.warn("No embeddings returned for request: " + request); + logger.warn("No embeddings returned for request: {}", request); return new EmbeddingResponse(List.of()); } diff --git a/models/spring-ai-openai/src/main/java/org/springframework/ai/openai/OpenAiImageModel.java b/models/spring-ai-openai/src/main/java/org/springframework/ai/openai/OpenAiImageModel.java index 43e6f513d64..336a44d93bd 100644 --- a/models/spring-ai-openai/src/main/java/org/springframework/ai/openai/OpenAiImageModel.java +++ b/models/spring-ai-openai/src/main/java/org/springframework/ai/openai/OpenAiImageModel.java @@ -19,6 +19,8 @@ import java.util.List; import io.micrometer.observation.ObservationRegistry; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import org.springframework.ai.image.Image; import org.springframework.ai.image.ImageGeneration; @@ -36,7 +38,6 @@ import org.springframework.ai.openai.api.common.OpenAiApiConstants; import org.springframework.ai.openai.metadata.OpenAiImageGenerationMetadata; import org.springframework.ai.retry.RetryUtils; -import org.springframework.core.log.LogAccessor; import org.springframework.http.ResponseEntity; import org.springframework.lang.Nullable; import org.springframework.retry.support.RetryTemplate; @@ -54,7 +55,7 @@ */ public class OpenAiImageModel implements ImageModel { - private static final LogAccessor logger = new LogAccessor(OpenAiImageModel.class); + private static final Logger logger = LoggerFactory.getLogger(OpenAiImageModel.class); private static final ImageModelObservationConvention DEFAULT_OBSERVATION_CONVENTION = new DefaultImageModelObservationConvention(); @@ -164,7 +165,7 @@ private ImageResponse convertResponse(ResponseEntity response = this.streamingChatModel.stream(new Prompt(messages, promptOptions)); Usage usage = response.last().block().getMetadata().getUsage(); - logger.info("Usage: " + usage); + logger.info("Usage: {}", usage); assertThat(usage).isNotNull(); assertThat(usage).isNotInstanceOf(EmptyUsage.class); assertThat(usage).isInstanceOf(DefaultUsage.class); @@ -501,7 +502,7 @@ void streamingMultiModalityImageUrl() throws IOException { .map(Generation::getOutput) .map(AssistantMessage::getText) .collect(Collectors.joining()); - logger.info("Response: " + content); + logger.info("Response: {}", content); assertThat(content).containsAnyOf("bananas", "apple", "bowl", "basket", "fruit stand"); } @@ -576,7 +577,7 @@ void streamingMultiModalityInputAudio(String modelName) { .map(Generation::getOutput) .map(AssistantMessage::getText) .collect(Collectors.joining()); - logger.info("Response: " + content); + logger.info("Response: {}", content); assertThat(content).containsIgnoringCase("hobbits"); } diff --git a/models/spring-ai-openai/src/test/java/org/springframework/ai/openai/chat/OpenAiChatModelProxyToolCallsIT.java b/models/spring-ai-openai/src/test/java/org/springframework/ai/openai/chat/OpenAiChatModelProxyToolCallsIT.java index adffce2bab5..db047a3cfbb 100644 --- a/models/spring-ai-openai/src/test/java/org/springframework/ai/openai/chat/OpenAiChatModelProxyToolCallsIT.java +++ b/models/spring-ai-openai/src/test/java/org/springframework/ai/openai/chat/OpenAiChatModelProxyToolCallsIT.java @@ -30,6 +30,8 @@ import io.micrometer.observation.ObservationRegistry; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.condition.EnabledIfEnvironmentVariable; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import reactor.core.publisher.Flux; import org.springframework.ai.chat.messages.AssistantMessage; @@ -50,7 +52,6 @@ import org.springframework.boot.SpringBootConfiguration; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.context.annotation.Bean; -import org.springframework.core.log.LogAccessor; import org.springframework.util.CollectionUtils; import static org.assertj.core.api.Assertions.assertThat; @@ -59,7 +60,7 @@ @EnabledIfEnvironmentVariable(named = "OPENAI_API_KEY", matches = ".+") class OpenAiChatModelProxyToolCallsIT { - private static final LogAccessor logger = new LogAccessor(OpenAiChatModelProxyToolCallsIT.class); + private static final Logger logger = LoggerFactory.getLogger(OpenAiChatModelProxyToolCallsIT.class); private static final String DEFAULT_MODEL = "gpt-4o-mini"; @@ -185,7 +186,7 @@ void functionCall() throws JsonMappingException, JsonProcessingException { } while (isToolCall); - logger.info("Response: " + chatResponse); + logger.info("Response: {}", chatResponse); assertThat(chatResponse.getResult().getOutput().getText()).contains("30", "10", "15"); } @@ -222,7 +223,7 @@ void functionStream() throws JsonMappingException, JsonProcessingException { .map(cr -> cr.getResult().getOutput().getText()) .collect(Collectors.joining()); - logger.info("Response: " + response); + logger.info("Response: {}", response); assertThat(response).contains("30", "10", "15"); @@ -303,7 +304,7 @@ void functionCall2() throws JsonMappingException, JsonProcessingException { return functionResponse; }); - logger.info("Response: " + chatResponse); + logger.info("Response: {}", chatResponse); assertThat(chatResponse.getResult().getOutput().getText()).contains("30", "10", "15"); } @@ -343,7 +344,7 @@ void functionStream2() throws JsonMappingException, JsonProcessingException { .map(cr -> cr.getResult().getOutput().getText()) .collect(Collectors.joining()); - logger.info("Response: " + response); + logger.info("Response: {}", response); assertThat(response).contains("30", "10", "15"); diff --git a/models/spring-ai-openai/src/test/java/org/springframework/ai/openai/chat/OpenAiChatModelResponseFormatIT.java b/models/spring-ai-openai/src/test/java/org/springframework/ai/openai/chat/OpenAiChatModelResponseFormatIT.java index eaaff36f18d..f2f2864969f 100644 --- a/models/spring-ai-openai/src/test/java/org/springframework/ai/openai/chat/OpenAiChatModelResponseFormatIT.java +++ b/models/spring-ai-openai/src/test/java/org/springframework/ai/openai/chat/OpenAiChatModelResponseFormatIT.java @@ -25,6 +25,8 @@ import com.fasterxml.jackson.databind.ObjectMapper; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.condition.EnabledIfEnvironmentVariable; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import org.springframework.ai.chat.model.ChatResponse; import org.springframework.ai.chat.prompt.Prompt; @@ -38,7 +40,6 @@ import org.springframework.boot.SpringBootConfiguration; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.context.annotation.Bean; -import org.springframework.core.log.LogAccessor; import static org.assertj.core.api.Assertions.assertThat; @@ -52,7 +53,7 @@ public class OpenAiChatModelResponseFormatIT { private static ObjectMapper MAPPER = new ObjectMapper().enable(DeserializationFeature.FAIL_ON_TRAILING_TOKENS); - private final LogAccessor logger = new LogAccessor(getClass()); + private final Logger logger = LoggerFactory.getLogger(getClass()); @Autowired private OpenAiChatModel openAiChatModel; @@ -90,7 +91,7 @@ void jsonObject() throws JsonMappingException, JsonProcessingException { String content = response.getResult().getOutput().getText(); - logger.info("Response content: " + content); + logger.info("Response content: {}", content); assertThat(isValidJson(content)).isTrue(); } @@ -133,7 +134,7 @@ void jsonSchema() throws JsonMappingException, JsonProcessingException { String content = response.getResult().getOutput().getText(); - logger.info("Response content: " + content); + logger.info("Response content: {}", content); assertThat(isValidJson(content)).isTrue(); } @@ -214,7 +215,7 @@ record Items(@JsonProperty(required = true, value = "explanation") String explan String content = response.getResult().getOutput().getText(); - logger.info("Response content: " + content); + logger.info("Response content: {}", content); assertThat(isValidJson(content)).isTrue(); diff --git a/models/spring-ai-openai/src/test/java/org/springframework/ai/openai/chat/OpenAiChatModelTypeReferenceBeanOutputConverterIT.java b/models/spring-ai-openai/src/test/java/org/springframework/ai/openai/chat/OpenAiChatModelTypeReferenceBeanOutputConverterIT.java index 5492954943c..1831095ab63 100644 --- a/models/spring-ai-openai/src/test/java/org/springframework/ai/openai/chat/OpenAiChatModelTypeReferenceBeanOutputConverterIT.java +++ b/models/spring-ai-openai/src/test/java/org/springframework/ai/openai/chat/OpenAiChatModelTypeReferenceBeanOutputConverterIT.java @@ -22,6 +22,8 @@ import org.junit.jupiter.api.Test; import org.junit.jupiter.api.condition.EnabledIfEnvironmentVariable; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import org.springframework.ai.chat.messages.AssistantMessage; import org.springframework.ai.chat.model.ChatResponse; @@ -33,7 +35,6 @@ import org.springframework.ai.openai.testutils.AbstractIT; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.core.ParameterizedTypeReference; -import org.springframework.core.log.LogAccessor; import static org.assertj.core.api.Assertions.assertThat; @@ -41,7 +42,8 @@ @EnabledIfEnvironmentVariable(named = "OPENAI_API_KEY", matches = ".+") class OpenAiChatModelTypeReferenceBeanOutputConverterIT extends AbstractIT { - private static final LogAccessor logger = new LogAccessor(OpenAiChatModelTypeReferenceBeanOutputConverterIT.class); + private static final Logger logger = LoggerFactory + .getLogger(OpenAiChatModelTypeReferenceBeanOutputConverterIT.class); @Test void typeRefOutputConverterRecords() { diff --git a/models/spring-ai-openai/src/test/java/org/springframework/ai/openai/chat/OpenAiPaymentTransactionIT.java b/models/spring-ai-openai/src/test/java/org/springframework/ai/openai/chat/OpenAiPaymentTransactionIT.java index fee7902fc57..f2a92a1efe9 100644 --- a/models/spring-ai-openai/src/test/java/org/springframework/ai/openai/chat/OpenAiPaymentTransactionIT.java +++ b/models/spring-ai-openai/src/test/java/org/springframework/ai/openai/chat/OpenAiPaymentTransactionIT.java @@ -24,6 +24,8 @@ import org.junit.jupiter.api.condition.EnabledIfEnvironmentVariable; import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.provider.ValueSource; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import reactor.core.publisher.Flux; import org.springframework.ai.chat.client.ChatClient; @@ -46,7 +48,6 @@ import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Description; import org.springframework.core.ParameterizedTypeReference; -import org.springframework.core.log.LogAccessor; import static org.assertj.core.api.Assertions.assertThat; @@ -57,7 +58,7 @@ @EnabledIfEnvironmentVariable(named = "OPENAI_API_KEY", matches = ".*") public class OpenAiPaymentTransactionIT { - private static final LogAccessor logger = new LogAccessor(OpenAiPaymentTransactionIT.class); + private static final Logger logger = LoggerFactory.getLogger(OpenAiPaymentTransactionIT.class); private static final Map DATASET = Map.of(new Transaction("001"), new Status("pending"), new Transaction("002"), new Status("approved"), new Transaction("003"), new Status("rejected")); @@ -131,7 +132,7 @@ record TransactionStatusResponse(String id, String status) { private static class LoggingAdvisor implements CallAroundAdvisor { - private static final LogAccessor logger = new LogAccessor(LoggingAdvisor.class); + private final Logger logger = LoggerFactory.getLogger(LoggingAdvisor.class); public String getName() { return this.getClass().getSimpleName(); diff --git a/models/spring-ai-openai/src/test/java/org/springframework/ai/openai/chat/OpenAiRetryTests.java b/models/spring-ai-openai/src/test/java/org/springframework/ai/openai/chat/OpenAiRetryTests.java index 1c3d4e5ffaf..20ca78309c1 100644 --- a/models/spring-ai-openai/src/test/java/org/springframework/ai/openai/chat/OpenAiRetryTests.java +++ b/models/spring-ai-openai/src/test/java/org/springframework/ai/openai/chat/OpenAiRetryTests.java @@ -25,6 +25,8 @@ import org.junit.jupiter.api.extension.ExtendWith; import org.mockito.Mock; import org.mockito.junit.jupiter.MockitoExtension; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import reactor.core.publisher.Flux; import org.springframework.ai.audio.transcription.AudioTranscriptionPrompt; @@ -62,7 +64,6 @@ import org.springframework.ai.retry.RetryUtils; import org.springframework.ai.retry.TransientAiException; import org.springframework.core.io.ClassPathResource; -import org.springframework.core.log.LogAccessor; import org.springframework.http.ResponseEntity; import org.springframework.retry.RetryCallback; import org.springframework.retry.RetryContext; @@ -83,7 +84,7 @@ @ExtendWith(MockitoExtension.class) public class OpenAiRetryTests { - private static final LogAccessor logger = new LogAccessor(OpenAiRetryTests.class); + private static final Logger logger = LoggerFactory.getLogger(OpenAiRetryTests.class); private TestRetryListener retryListener; diff --git a/models/spring-ai-openai/src/test/java/org/springframework/ai/openai/chat/client/OpenAiChatClientIT.java b/models/spring-ai-openai/src/test/java/org/springframework/ai/openai/chat/client/OpenAiChatClientIT.java index 60434c74066..46452de25d1 100644 --- a/models/spring-ai-openai/src/test/java/org/springframework/ai/openai/chat/client/OpenAiChatClientIT.java +++ b/models/spring-ai-openai/src/test/java/org/springframework/ai/openai/chat/client/OpenAiChatClientIT.java @@ -28,6 +28,8 @@ import org.junit.jupiter.api.condition.EnabledIfEnvironmentVariable; import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.provider.ValueSource; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import reactor.core.publisher.Flux; import org.springframework.ai.chat.client.ChatClient; @@ -48,7 +50,6 @@ import org.springframework.core.convert.support.DefaultConversionService; import org.springframework.core.io.ClassPathResource; import org.springframework.core.io.Resource; -import org.springframework.core.log.LogAccessor; import org.springframework.test.context.ActiveProfiles; import org.springframework.util.MimeTypeUtils; @@ -59,7 +60,7 @@ @ActiveProfiles("logging-test") class OpenAiChatClientIT extends AbstractIT { - private static final LogAccessor logger = new LogAccessor(OpenAiChatClientIT.class); + private static final Logger logger = LoggerFactory.getLogger(OpenAiChatClientIT.class); @Value("classpath:/prompts/system-message.st") private Resource systemTextResource; @@ -256,7 +257,7 @@ void functionCallTest() { .content(); // @formatter:on - logger.info("Response: " + response); + logger.info("Response: {}", response); assertThat(response).contains("30", "10", "15"); } @@ -275,7 +276,7 @@ void defaultFunctionCallTest() { .prompt().call().content(); // @formatter:on - logger.info("Response: " + response); + logger.info("Response: {}", response); assertThat(response).contains("30", "10", "15"); } @@ -295,7 +296,7 @@ void streamFunctionCallTest() { // @formatter:on String content = response.collectList().block().stream().collect(Collectors.joining()); - logger.info("Response: " + content); + logger.info("Response: {}", content); assertThat(content).contains("30", "10", "15"); } @@ -357,7 +358,7 @@ void streamingMultiModalityImageUrl() throws IOException { String content = response.collectList().block().stream().collect(Collectors.joining()); - logger.info("Response: " + content); + logger.info("Response: {}", content); assertThat(content).contains("bananas", "apple"); assertThat(content).containsAnyOf("bowl", "basket"); } diff --git a/models/spring-ai-openai/src/test/java/org/springframework/ai/openai/chat/client/OpenAiChatClientMethodInvokingFunctionCallbackIT.java b/models/spring-ai-openai/src/test/java/org/springframework/ai/openai/chat/client/OpenAiChatClientMethodInvokingFunctionCallbackIT.java index 112133a90f1..6aba6982011 100644 --- a/models/spring-ai-openai/src/test/java/org/springframework/ai/openai/chat/client/OpenAiChatClientMethodInvokingFunctionCallbackIT.java +++ b/models/spring-ai-openai/src/test/java/org/springframework/ai/openai/chat/client/OpenAiChatClientMethodInvokingFunctionCallbackIT.java @@ -22,6 +22,8 @@ import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.condition.EnabledIfEnvironmentVariable; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import org.springframework.ai.chat.client.ChatClient; import org.springframework.ai.chat.model.ChatModel; @@ -31,7 +33,6 @@ import org.springframework.ai.tool.method.MethodToolCallback; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; -import org.springframework.core.log.LogAccessor; import org.springframework.test.context.ActiveProfiles; import org.springframework.util.ReflectionUtils; @@ -43,7 +44,8 @@ @ActiveProfiles("logging-test") class OpenAiChatClientMethodInvokingFunctionCallbackIT { - private static final LogAccessor logger = new LogAccessor(OpenAiChatClientMethodInvokingFunctionCallbackIT.class); + private static final Logger logger = LoggerFactory + .getLogger(OpenAiChatClientMethodInvokingFunctionCallbackIT.class); public static Map arguments = new ConcurrentHashMap<>(); @@ -74,7 +76,7 @@ void methodGetWeatherStatic() { .content(); // @formatter:on - logger.info("Response: " + response); + logger.info("Response: {}", response); assertThat(response).contains("30", "10", "15"); } @@ -100,7 +102,7 @@ void methodTurnLightNoResponse() { .content(); // @formatter:on - logger.info("Response: " + response); + logger.info("Response: {}", response); assertThat(arguments).containsEntry("roomName", "living room"); assertThat(arguments).containsEntry("on", true); @@ -128,7 +130,7 @@ void methodGetWeatherNonStatic() { .content(); // @formatter:on - logger.info("Response: " + response); + logger.info("Response: {}", response); assertThat(response).contains("30", "10", "15"); } @@ -156,7 +158,7 @@ void methodGetWeatherToolContext() { .content(); // @formatter:on - logger.info("Response: " + response); + logger.info("Response: {}", response); assertThat(response).contains("30", "10", "15"); assertThat(arguments).containsEntry("tool", "value"); @@ -209,7 +211,7 @@ void methodNoParameters() { .content(); // @formatter:on - logger.info("Response: " + response); + logger.info("Response: {}", response); assertThat(arguments).containsEntry("turnLivingRoomLightOn", true); } @@ -262,7 +264,7 @@ public String getWeatherWithContext(String city, Unit unit, ToolContext context) public void turnLight(String roomName, boolean on) { arguments.put("roomName", roomName); arguments.put("on", on); - logger.info("Turn light in room: " + roomName + " to: " + on); + logger.info("Turn light in room: {} to: {}", roomName, on); } public void turnLivingRoomLightOn() { diff --git a/models/spring-ai-openai/src/test/java/org/springframework/ai/openai/chat/client/OpenAiChatClientMultipleFunctionCallsIT.java b/models/spring-ai-openai/src/test/java/org/springframework/ai/openai/chat/client/OpenAiChatClientMultipleFunctionCallsIT.java index 715213a7ecb..f318caf53c1 100644 --- a/models/spring-ai-openai/src/test/java/org/springframework/ai/openai/chat/client/OpenAiChatClientMultipleFunctionCallsIT.java +++ b/models/spring-ai-openai/src/test/java/org/springframework/ai/openai/chat/client/OpenAiChatClientMultipleFunctionCallsIT.java @@ -25,6 +25,8 @@ import org.junit.jupiter.api.Test; import org.junit.jupiter.api.condition.EnabledIfEnvironmentVariable; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import reactor.core.publisher.Flux; import org.springframework.ai.chat.client.ChatClient; @@ -38,7 +40,6 @@ import org.springframework.beans.factory.annotation.Value; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.core.io.Resource; -import org.springframework.core.log.LogAccessor; import org.springframework.test.context.ActiveProfiles; import static org.assertj.core.api.Assertions.assertThat; @@ -48,7 +49,7 @@ @ActiveProfiles("logging-test") class OpenAiChatClientMultipleFunctionCallsIT extends AbstractIT { - private static final LogAccessor logger = new LogAccessor(OpenAiChatClientMultipleFunctionCallsIT.class); + private static final Logger logger = LoggerFactory.getLogger(OpenAiChatClientMultipleFunctionCallsIT.class); @Value("classpath:/prompts/system-message.st") private Resource systemTextResource; @@ -76,7 +77,7 @@ void turnFunctionsOnAndOffTest() { .content(); // @formatter:on - logger.info("Response: " + response); + logger.info("Response: {}", response); assertThat(response).doesNotContain("30", "10", "15"); @@ -91,7 +92,7 @@ void turnFunctionsOnAndOffTest() { .content(); // @formatter:on - logger.info("Response: " + response); + logger.info("Response: {}", response); assertThat(response).contains("30", "10", "15"); @@ -102,7 +103,7 @@ void turnFunctionsOnAndOffTest() { .content(); // @formatter:on - logger.info("Response: " + response); + logger.info("Response: {}", response); assertThat(response).doesNotContain("30", "10", "15"); @@ -122,7 +123,7 @@ void defaultFunctionCallTest() { .prompt().call().content(); // @formatter:on - logger.info("Response: " + response); + logger.info("Response: {}", response); assertThat(response).contains("30", "10", "15"); } @@ -165,7 +166,7 @@ else if (request.location().contains("San Francisco")) { .prompt().call().content(); // @formatter:on - logger.info("Response: " + response); + logger.info("Response: {}", response); assertThat(response).contains("30", "10", "15"); } @@ -209,7 +210,7 @@ else if (request.location().contains("San Francisco")) { .call().content(); // @formatter:on - logger.info("Response: " + response); + logger.info("Response: {}", response); assertThat(response).contains("30", "10", "15"); } @@ -229,7 +230,7 @@ void streamFunctionCallTest() { // @formatter:on String content = response.collectList().block().stream().collect(Collectors.joining()); - logger.info("Response: " + content); + logger.info("Response: {}", content); assertThat(content).contains("30", "10", "15"); diff --git a/models/spring-ai-openai/src/test/java/org/springframework/ai/openai/chat/client/OpenAiChatClientProxyFunctionCallsIT.java b/models/spring-ai-openai/src/test/java/org/springframework/ai/openai/chat/client/OpenAiChatClientProxyFunctionCallsIT.java index 67ea94ecef2..5a072c9a28a 100644 --- a/models/spring-ai-openai/src/test/java/org/springframework/ai/openai/chat/client/OpenAiChatClientProxyFunctionCallsIT.java +++ b/models/spring-ai-openai/src/test/java/org/springframework/ai/openai/chat/client/OpenAiChatClientProxyFunctionCallsIT.java @@ -27,6 +27,8 @@ import com.fasterxml.jackson.databind.ObjectMapper; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.condition.EnabledIfEnvironmentVariable; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import org.springframework.ai.chat.client.ChatClient; import org.springframework.ai.chat.messages.AssistantMessage; @@ -47,7 +49,6 @@ import org.springframework.beans.factory.annotation.Value; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.core.io.Resource; -import org.springframework.core.log.LogAccessor; import org.springframework.test.context.ActiveProfiles; import org.springframework.util.CollectionUtils; @@ -58,7 +59,7 @@ @ActiveProfiles("logging-test") class OpenAiChatClientProxyFunctionCallsIT extends AbstractIT { - private static final LogAccessor logger = new LogAccessor(OpenAiChatClientMultipleFunctionCallsIT.class); + private static final Logger logger = LoggerFactory.getLogger(OpenAiChatClientMultipleFunctionCallsIT.class); @Value("classpath:/prompts/system-message.st") private Resource systemTextResource; @@ -176,7 +177,7 @@ void toolProxyFunctionCall() throws JsonMappingException, JsonProcessingExceptio } while (isToolCall); - logger.info("Response: " + chatResponse); + logger.info("Response: {}", chatResponse); assertThat(chatResponse.getResult().getOutput().getText()).contains("30", "10", "15"); } diff --git a/models/spring-ai-openai/src/test/java/org/springframework/ai/openai/chat/proxy/DeepSeekWithOpenAiChatModelIT.java b/models/spring-ai-openai/src/test/java/org/springframework/ai/openai/chat/proxy/DeepSeekWithOpenAiChatModelIT.java index 84c00209a42..461b8cdafda 100644 --- a/models/spring-ai-openai/src/test/java/org/springframework/ai/openai/chat/proxy/DeepSeekWithOpenAiChatModelIT.java +++ b/models/spring-ai-openai/src/test/java/org/springframework/ai/openai/chat/proxy/DeepSeekWithOpenAiChatModelIT.java @@ -27,6 +27,8 @@ import org.junit.jupiter.api.condition.EnabledIfEnvironmentVariable; import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.provider.ValueSource; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import reactor.core.publisher.Flux; import org.springframework.ai.chat.client.ChatClient; @@ -54,7 +56,6 @@ import org.springframework.context.annotation.Bean; import org.springframework.core.convert.support.DefaultConversionService; import org.springframework.core.io.Resource; -import org.springframework.core.log.LogAccessor; import static org.assertj.core.api.Assertions.assertThat; @@ -72,7 +73,7 @@ @Disabled("Requires DeepSeek credits") class DeepSeekWithOpenAiChatModelIT { - private static final LogAccessor logger = new LogAccessor(DeepSeekWithOpenAiChatModelIT.class); + private static final Logger logger = LoggerFactory.getLogger(DeepSeekWithOpenAiChatModelIT.class); private static final String DEEPSEEK_BASE_URL = "https://api.deepseek.com"; @@ -211,7 +212,7 @@ void beanOutputConverterRecords() { DeepSeekWithOpenAiChatModelIT.ActorsFilmsRecord actorsFilms = outputConverter .convert(generation.getOutput().getText()); - logger.info("" + actorsFilms); + logger.info("{}", actorsFilms); assertThat(actorsFilms.actor()).isEqualTo("Tom Hanks"); assertThat(actorsFilms.movies()).hasSize(5); } @@ -241,7 +242,7 @@ void beanStreamOutputConverterRecords() { .collect(Collectors.joining()); DeepSeekWithOpenAiChatModelIT.ActorsFilmsRecord actorsFilms = outputConverter.convert(generationTextFromStream); - logger.info("" + actorsFilms); + logger.info("{}", actorsFilms); assertThat(actorsFilms.actor()).isEqualTo("Tom Hanks"); assertThat(actorsFilms.movies()).hasSize(5); } @@ -264,7 +265,7 @@ void functionCallTest() { ChatResponse response = this.chatModel.call(new Prompt(messages, promptOptions)); - logger.info("Response: " + response); + logger.info("Response: {}", response); assertThat(response.getResult().getOutput().getText()).contains("30", "10", "15"); } @@ -296,7 +297,7 @@ void streamFunctionCallTest() { .map(Generation::getOutput) .map(AssistantMessage::getText) .collect(Collectors.joining()); - logger.info("Response: " + content); + logger.info("Response: {}", content); assertThat(content).contains("30", "10", "15"); } diff --git a/models/spring-ai-openai/src/test/java/org/springframework/ai/openai/chat/proxy/GroqWithOpenAiChatModelIT.java b/models/spring-ai-openai/src/test/java/org/springframework/ai/openai/chat/proxy/GroqWithOpenAiChatModelIT.java index 1f4866c23ef..cce105b7876 100644 --- a/models/spring-ai-openai/src/test/java/org/springframework/ai/openai/chat/proxy/GroqWithOpenAiChatModelIT.java +++ b/models/spring-ai-openai/src/test/java/org/springframework/ai/openai/chat/proxy/GroqWithOpenAiChatModelIT.java @@ -29,6 +29,8 @@ import org.junit.jupiter.api.condition.EnabledIfEnvironmentVariable; import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.provider.ValueSource; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import reactor.core.publisher.Flux; import org.springframework.ai.chat.client.ChatClient; @@ -58,7 +60,6 @@ import org.springframework.core.convert.support.DefaultConversionService; import org.springframework.core.io.ClassPathResource; import org.springframework.core.io.Resource; -import org.springframework.core.log.LogAccessor; import org.springframework.util.MimeTypeUtils; import static org.assertj.core.api.Assertions.assertThat; @@ -68,7 +69,7 @@ @Disabled("Due to rate limiting it is hard to run it in one go") class GroqWithOpenAiChatModelIT { - private static final LogAccessor logger = new LogAccessor(GroqWithOpenAiChatModelIT.class); + private static final Logger logger = LoggerFactory.getLogger(GroqWithOpenAiChatModelIT.class); private static final String GROQ_BASE_URL = "https://api.groq.com/openai"; @@ -257,7 +258,7 @@ void functionCallTest() { ChatResponse response = this.chatModel.call(new Prompt(messages, promptOptions)); - logger.info("Response: " + response); + logger.info("Response: {}", response); assertThat(response.getResult().getOutput().getText()).contains("30", "10", "15"); } @@ -288,7 +289,7 @@ void streamFunctionCallTest() { .map(Generation::getOutput) .map(AssistantMessage::getText) .collect(Collectors.joining()); - logger.info("Response: " + content); + logger.info("Response: {}", content); assertThat(content).contains("30", "10", "15"); } @@ -350,7 +351,7 @@ void streamingMultiModalityImageUrl() throws IOException { .map(Generation::getOutput) .map(AssistantMessage::getText) .collect(Collectors.joining()); - logger.info("Response: " + content); + logger.info("Response: {}", content); assertThat(content).contains("bananas", "apple"); assertThat(content).containsAnyOf("bowl", "basket"); } diff --git a/models/spring-ai-openai/src/test/java/org/springframework/ai/openai/chat/proxy/MistralWithOpenAiChatModelIT.java b/models/spring-ai-openai/src/test/java/org/springframework/ai/openai/chat/proxy/MistralWithOpenAiChatModelIT.java index cfb073c68ff..7071f3608be 100644 --- a/models/spring-ai-openai/src/test/java/org/springframework/ai/openai/chat/proxy/MistralWithOpenAiChatModelIT.java +++ b/models/spring-ai-openai/src/test/java/org/springframework/ai/openai/chat/proxy/MistralWithOpenAiChatModelIT.java @@ -29,6 +29,8 @@ import org.junit.jupiter.api.condition.EnabledIfEnvironmentVariable; import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.provider.ValueSource; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import reactor.core.publisher.Flux; import org.springframework.ai.chat.client.ChatClient; @@ -58,7 +60,6 @@ import org.springframework.core.convert.support.DefaultConversionService; import org.springframework.core.io.ClassPathResource; import org.springframework.core.io.Resource; -import org.springframework.core.log.LogAccessor; import org.springframework.util.MimeTypeUtils; import static org.assertj.core.api.Assertions.assertThat; @@ -67,7 +68,7 @@ @EnabledIfEnvironmentVariable(named = "MISTRAL_AI_API_KEY", matches = ".+") class MistralWithOpenAiChatModelIT { - private static final LogAccessor logger = new LogAccessor(MistralWithOpenAiChatModelIT.class); + private static final Logger logger = LoggerFactory.getLogger(MistralWithOpenAiChatModelIT.class); private static final String MISTRAL_BASE_URL = "https://api.mistral.ai"; @@ -259,7 +260,7 @@ void functionCallTest(String modelName) { ChatResponse response = this.chatModel.call(new Prompt(messages, promptOptions)); - logger.info("Response: " + response); + logger.info("Response: {}", response); assertThat(response.getResult().getOutput().getText()).contains("30", "10", "15"); } @@ -292,7 +293,7 @@ void streamFunctionCallTest(String modelName) { .map(Generation::getOutput) .map(AssistantMessage::getText) .collect(Collectors.joining()); - logger.info("Response: " + content); + logger.info("Response: {}", content); assertThat(content).contains("30", "10", "15"); } @@ -354,7 +355,7 @@ void streamingMultiModalityImageUrl() throws IOException { .map(Generation::getOutput) .map(AssistantMessage::getText) .collect(Collectors.joining()); - logger.info("Response: " + content); + logger.info("Response: {}", content); assertThat(content).contains("bananas", "apple"); assertThat(content).containsAnyOf("bowl", "basket"); } diff --git a/models/spring-ai-openai/src/test/java/org/springframework/ai/openai/chat/proxy/NvidiaWithOpenAiChatModelIT.java b/models/spring-ai-openai/src/test/java/org/springframework/ai/openai/chat/proxy/NvidiaWithOpenAiChatModelIT.java index a339af3fd1c..4983e96c7e9 100644 --- a/models/spring-ai-openai/src/test/java/org/springframework/ai/openai/chat/proxy/NvidiaWithOpenAiChatModelIT.java +++ b/models/spring-ai-openai/src/test/java/org/springframework/ai/openai/chat/proxy/NvidiaWithOpenAiChatModelIT.java @@ -25,6 +25,8 @@ import org.junit.jupiter.api.Disabled; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.condition.EnabledIfEnvironmentVariable; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import reactor.core.publisher.Flux; import org.springframework.ai.chat.client.ChatClient; @@ -52,7 +54,6 @@ import org.springframework.context.annotation.Bean; import org.springframework.core.convert.support.DefaultConversionService; import org.springframework.core.io.Resource; -import org.springframework.core.log.LogAccessor; import static org.assertj.core.api.Assertions.assertThat; @@ -65,7 +66,7 @@ @Disabled("Requires NVIDIA credits") class NvidiaWithOpenAiChatModelIT { - private static final LogAccessor logger = new LogAccessor(NvidiaWithOpenAiChatModelIT.class); + private static final Logger logger = LoggerFactory.getLogger(NvidiaWithOpenAiChatModelIT.class); private static final String NVIDIA_BASE_URL = "https://integrate.api.nvidia.com"; @@ -254,7 +255,7 @@ void functionCallTest() { ChatResponse response = this.chatModel.call(new Prompt(messages, promptOptions)); - logger.info("Response: " + response); + logger.info("Response: {}", response); assertThat(response.getResult().getOutput().getText()).contains("30", "10", "15"); } @@ -285,7 +286,7 @@ void streamFunctionCallTest() { .map(Generation::getOutput) .map(AssistantMessage::getText) .collect(Collectors.joining()); - logger.info("Response: " + content); + logger.info("Response: {}", content); assertThat(content).contains("30", "10", "15"); } diff --git a/models/spring-ai-openai/src/test/java/org/springframework/ai/openai/chat/proxy/OllamaWithOpenAiChatModelIT.java b/models/spring-ai-openai/src/test/java/org/springframework/ai/openai/chat/proxy/OllamaWithOpenAiChatModelIT.java index c0587c03bd9..2ec5c34c523 100644 --- a/models/spring-ai-openai/src/test/java/org/springframework/ai/openai/chat/proxy/OllamaWithOpenAiChatModelIT.java +++ b/models/spring-ai-openai/src/test/java/org/springframework/ai/openai/chat/proxy/OllamaWithOpenAiChatModelIT.java @@ -1,5 +1,5 @@ /* - * Copyright 2023-2025 the original author or authors. + * Copyright 2023-2024 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -29,6 +29,8 @@ import org.junit.jupiter.api.Test; import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.provider.ValueSource; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import org.testcontainers.junit.jupiter.Container; import org.testcontainers.junit.jupiter.Testcontainers; import org.testcontainers.ollama.OllamaContainer; @@ -61,7 +63,6 @@ import org.springframework.core.convert.support.DefaultConversionService; import org.springframework.core.io.ClassPathResource; import org.springframework.core.io.Resource; -import org.springframework.core.log.LogAccessor; import org.springframework.util.MimeTypeUtils; import static org.assertj.core.api.Assertions.assertThat; @@ -71,7 +72,7 @@ @SpringBootTest(classes = OllamaWithOpenAiChatModelIT.Config.class) class OllamaWithOpenAiChatModelIT { - private static final LogAccessor logger = new LogAccessor(OllamaWithOpenAiChatModelIT.class); + private static final Logger logger = LoggerFactory.getLogger(OllamaWithOpenAiChatModelIT.class); private static final String DEFAULT_OLLAMA_MODEL = "mistral"; @@ -280,7 +281,7 @@ void functionCallTest(String modelName) { ChatResponse response = this.chatModel.call(new Prompt(messages, promptOptions)); - logger.info("Response: " + response); + logger.info("Response: {}", response); assertThat(response.getResult().getOutput().getText()).contains("30", "10", "15"); } @@ -316,7 +317,7 @@ void streamFunctionCallTest(String modelName) { .map(Generation::getOutput) .map(AssistantMessage::getText) .collect(Collectors.joining()); - logger.info("Response: " + content); + logger.info("Response: {}", content); assertThat(content).contains("30", "10", "15"); } @@ -379,7 +380,7 @@ void streamingMultiModalityImageUrl(String modelName) throws IOException { .map(Generation::getOutput) .map(AssistantMessage::getText) .collect(Collectors.joining()); - logger.info("Response: " + content); + logger.info("Response: {}", content); assertThat(content).contains("bananas", "apple"); assertThat(content).containsAnyOf("bowl", "basket"); } diff --git a/models/spring-ai-openai/src/test/java/org/springframework/ai/openai/chat/proxy/PerplexityWithOpenAiChatModelIT.java b/models/spring-ai-openai/src/test/java/org/springframework/ai/openai/chat/proxy/PerplexityWithOpenAiChatModelIT.java index 03c0bf67c77..ceb6c944121 100644 --- a/models/spring-ai-openai/src/test/java/org/springframework/ai/openai/chat/proxy/PerplexityWithOpenAiChatModelIT.java +++ b/models/spring-ai-openai/src/test/java/org/springframework/ai/openai/chat/proxy/PerplexityWithOpenAiChatModelIT.java @@ -25,6 +25,8 @@ import org.junit.jupiter.api.Disabled; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.condition.EnabledIfEnvironmentVariable; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import reactor.core.publisher.Flux; import org.springframework.ai.chat.client.ChatClient; @@ -53,7 +55,6 @@ import org.springframework.context.annotation.Bean; import org.springframework.core.convert.support.DefaultConversionService; import org.springframework.core.io.Resource; -import org.springframework.core.log.LogAccessor; import org.springframework.web.client.RestClient; import org.springframework.web.reactive.function.client.WebClient; @@ -76,7 +77,7 @@ @Disabled("Requires Perplexity credits") class PerplexityWithOpenAiChatModelIT { - private static final LogAccessor logger = new LogAccessor(PerplexityWithOpenAiChatModelIT.class); + private static final Logger logger = LoggerFactory.getLogger(PerplexityWithOpenAiChatModelIT.class); private static final String PERPLEXITY_BASE_URL = "https://api.perplexity.ai"; @@ -266,7 +267,7 @@ void functionCallTest() { ChatResponse response = this.chatModel.call(new Prompt(messages, promptOptions)); - logger.info("Response: " + response); + logger.info("Response: {}", response); assertThat(response.getResults().stream().mapToLong(r -> r.getOutput().getToolCalls().size()).sum()).isZero(); } @@ -296,7 +297,7 @@ void streamFunctionCallTest() { .map(Generation::getOutput) .map(AssistantMessage::getText) .collect(Collectors.joining()); - logger.info("Response: " + content); + logger.info("Response: {}", content); assertThat(content).doesNotContain("toolCalls"); } diff --git a/models/spring-ai-openai/src/test/java/org/springframework/ai/openai/testutils/AbstractIT.java b/models/spring-ai-openai/src/test/java/org/springframework/ai/openai/testutils/AbstractIT.java index adeb757ced0..90a0de6b674 100644 --- a/models/spring-ai-openai/src/test/java/org/springframework/ai/openai/testutils/AbstractIT.java +++ b/models/spring-ai-openai/src/test/java/org/springframework/ai/openai/testutils/AbstractIT.java @@ -19,6 +19,9 @@ import java.util.List; import java.util.Map; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + import org.springframework.ai.chat.messages.Message; import org.springframework.ai.chat.messages.SystemMessage; import org.springframework.ai.chat.model.ChatModel; @@ -35,14 +38,13 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.core.io.Resource; -import org.springframework.core.log.LogAccessor; import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.Assertions.fail; public abstract class AbstractIT { - private static final LogAccessor logger = new LogAccessor(AbstractIT.class); + private static final Logger logger = LoggerFactory.getLogger(AbstractIT.class); @Autowired protected ChatModel chatModel; diff --git a/models/spring-ai-qianfan/pom.xml b/models/spring-ai-qianfan/pom.xml index c29935b280b..a2483861c68 100644 --- a/models/spring-ai-qianfan/pom.xml +++ b/models/spring-ai-qianfan/pom.xml @@ -60,6 +60,11 @@ 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 0d6058e2cb7..5f3d1ab71a3 100644 --- a/models/spring-ai-qianfan/src/main/java/org/springframework/ai/qianfan/QianFanChatModel.java +++ b/models/spring-ai-qianfan/src/main/java/org/springframework/ai/qianfan/QianFanChatModel.java @@ -23,6 +23,8 @@ import io.micrometer.observation.Observation; import io.micrometer.observation.ObservationRegistry; import io.micrometer.observation.contextpropagation.ObservationThreadLocalAccessor; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import reactor.core.publisher.Flux; import reactor.core.publisher.Mono; @@ -50,7 +52,6 @@ import org.springframework.ai.qianfan.api.QianFanApi.ChatCompletionRequest; import org.springframework.ai.qianfan.api.QianFanConstants; import org.springframework.ai.retry.RetryUtils; -import org.springframework.core.log.LogAccessor; import org.springframework.http.ResponseEntity; import org.springframework.retry.support.RetryTemplate; import org.springframework.util.Assert; @@ -68,7 +69,7 @@ */ public class QianFanChatModel implements ChatModel, StreamingChatModel { - private static final LogAccessor logger = new LogAccessor(QianFanChatModel.class); + private static final Logger logger = LoggerFactory.getLogger(QianFanChatModel.class); private static final ChatModelObservationConvention DEFAULT_OBSERVATION_CONVENTION = new DefaultChatModelObservationConvention(); @@ -168,7 +169,7 @@ public ChatResponse call(Prompt prompt) { var chatCompletion = completionEntity.getBody(); if (chatCompletion == null) { - logger.warn("No chat completion returned for prompt: " + prompt); + logger.warn("No chat completion returned for prompt: {}", prompt); return new ChatResponse(List.of()); } diff --git a/models/spring-ai-qianfan/src/main/java/org/springframework/ai/qianfan/QianFanEmbeddingModel.java b/models/spring-ai-qianfan/src/main/java/org/springframework/ai/qianfan/QianFanEmbeddingModel.java index 758ee9f4310..a77635d4a39 100644 --- a/models/spring-ai-qianfan/src/main/java/org/springframework/ai/qianfan/QianFanEmbeddingModel.java +++ b/models/spring-ai-qianfan/src/main/java/org/springframework/ai/qianfan/QianFanEmbeddingModel.java @@ -19,6 +19,8 @@ import java.util.List; import io.micrometer.observation.ObservationRegistry; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import org.springframework.ai.chat.metadata.DefaultUsage; import org.springframework.ai.document.Document; @@ -38,7 +40,6 @@ import org.springframework.ai.qianfan.api.QianFanApi.EmbeddingList; import org.springframework.ai.qianfan.api.QianFanConstants; import org.springframework.ai.retry.RetryUtils; -import org.springframework.core.log.LogAccessor; import org.springframework.lang.Nullable; import org.springframework.retry.support.RetryTemplate; import org.springframework.util.Assert; @@ -52,7 +53,7 @@ */ public class QianFanEmbeddingModel extends AbstractEmbeddingModel { - private static final LogAccessor logger = new LogAccessor(QianFanEmbeddingModel.class); + private static final Logger logger = LoggerFactory.getLogger(QianFanEmbeddingModel.class); private static final EmbeddingModelObservationConvention DEFAULT_OBSERVATION_CONVENTION = new DefaultEmbeddingModelObservationConvention(); @@ -164,12 +165,12 @@ public EmbeddingResponse call(EmbeddingRequest request) { .execute(ctx -> this.qianFanApi.embeddings(apiRequest).getBody()); if (apiEmbeddingResponse == null) { - logger.warn("No embeddings returned for request: " + request); + logger.warn("No embeddings returned for request: {}", request); return new EmbeddingResponse(List.of()); } if (apiEmbeddingResponse.errorNsg() != null) { - logger.error("Error message returned for request: " + apiEmbeddingResponse.errorNsg()); + logger.error("Error message returned for request: {}", apiEmbeddingResponse.errorNsg()); throw new RuntimeException("Embedding failed: error code:" + apiEmbeddingResponse.errorCode() + ", message:" + apiEmbeddingResponse.errorNsg()); } diff --git a/models/spring-ai-qianfan/src/main/java/org/springframework/ai/qianfan/QianFanImageModel.java b/models/spring-ai-qianfan/src/main/java/org/springframework/ai/qianfan/QianFanImageModel.java index db5d74e4996..91214f58bbe 100644 --- a/models/spring-ai-qianfan/src/main/java/org/springframework/ai/qianfan/QianFanImageModel.java +++ b/models/spring-ai-qianfan/src/main/java/org/springframework/ai/qianfan/QianFanImageModel.java @@ -19,6 +19,8 @@ import java.util.List; import io.micrometer.observation.ObservationRegistry; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import org.springframework.ai.image.Image; import org.springframework.ai.image.ImageGeneration; @@ -34,7 +36,6 @@ import org.springframework.ai.qianfan.api.QianFanConstants; import org.springframework.ai.qianfan.api.QianFanImageApi; import org.springframework.ai.retry.RetryUtils; -import org.springframework.core.log.LogAccessor; import org.springframework.http.ResponseEntity; import org.springframework.lang.Nullable; import org.springframework.retry.support.RetryTemplate; @@ -49,7 +50,7 @@ */ public class QianFanImageModel implements ImageModel { - private static final LogAccessor logger = new LogAccessor(QianFanImageModel.class); + private static final Logger logger = LoggerFactory.getLogger(QianFanImageModel.class); private static final ImageModelObservationConvention DEFAULT_OBSERVATION_CONVENTION = new DefaultImageModelObservationConvention(); @@ -174,7 +175,7 @@ private ImageResponse convertResponse(ResponseEntityspring-context-support + + org.springframework.boot + spring-boot-starter-logging + + org.springframework.ai diff --git a/models/spring-ai-transformers/src/main/java/org/springframework/ai/transformers/TransformersEmbeddingModel.java b/models/spring-ai-transformers/src/main/java/org/springframework/ai/transformers/TransformersEmbeddingModel.java index e5951ff99c1..5fd6f4a8bf9 100644 --- a/models/spring-ai-transformers/src/main/java/org/springframework/ai/transformers/TransformersEmbeddingModel.java +++ b/models/spring-ai-transformers/src/main/java/org/springframework/ai/transformers/TransformersEmbeddingModel.java @@ -37,6 +37,8 @@ import ai.onnxruntime.OrtException; import ai.onnxruntime.OrtSession; import io.micrometer.observation.ObservationRegistry; +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; import org.springframework.ai.document.Document; import org.springframework.ai.document.MetadataMode; @@ -53,7 +55,6 @@ import org.springframework.beans.factory.InitializingBean; import org.springframework.core.io.DefaultResourceLoader; import org.springframework.core.io.Resource; -import org.springframework.core.log.LogAccessor; import org.springframework.util.Assert; import org.springframework.util.StringUtils; @@ -88,7 +89,7 @@ public class TransformersEmbeddingModel extends AbstractEmbeddingModel implement public static final String DEFAULT_MODEL_OUTPUT_NAME = "last_hidden_state"; - private static final LogAccessor logger = new LogAccessor(TransformersEmbeddingModel.class); + private static final Log logger = LogFactory.getLog(TransformersEmbeddingModel.class); private static final EmbeddingModelObservationConvention DEFAULT_OBSERVATION_CONVENTION = new DefaultEmbeddingModelObservationConvention(); diff --git a/models/spring-ai-vertex-ai-embedding/pom.xml b/models/spring-ai-vertex-ai-embedding/pom.xml index 4ff85a91838..5327e48b45e 100644 --- a/models/spring-ai-vertex-ai-embedding/pom.xml +++ b/models/spring-ai-vertex-ai-embedding/pom.xml @@ -83,6 +83,11 @@ spring-context-support + + org.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 d81410aaf47..9062f6ba35b 100644 --- a/models/spring-ai-vertex-ai-embedding/src/main/java/org/springframework/ai/vertexai/embedding/multimodal/VertexAiMultimodalEmbeddingModel.java +++ b/models/spring-ai-vertex-ai-embedding/src/main/java/org/springframework/ai/vertexai/embedding/multimodal/VertexAiMultimodalEmbeddingModel.java @@ -29,6 +29,8 @@ import com.google.cloud.aiplatform.v1.PredictionServiceClient; import com.google.protobuf.InvalidProtocolBufferException; import com.google.protobuf.Value; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import org.springframework.ai.chat.metadata.DefaultUsage; import org.springframework.ai.chat.metadata.Usage; @@ -47,7 +49,6 @@ import org.springframework.ai.vertexai.embedding.VertexAiEmbeddingUtils.ImageBuilder; import org.springframework.ai.vertexai.embedding.VertexAiEmbeddingUtils.MultimodalInstanceBuilder; import org.springframework.ai.vertexai.embedding.VertexAiEmbeddingUtils.VideoBuilder; -import org.springframework.core.log.LogAccessor; import org.springframework.util.Assert; import org.springframework.util.MimeType; import org.springframework.util.MimeTypeUtils; @@ -63,7 +64,7 @@ */ public class VertexAiMultimodalEmbeddingModel implements DocumentEmbeddingModel { - private static final LogAccessor logger = new LogAccessor(VertexAiMultimodalEmbeddingModel.class); + private static final Logger logger = LoggerFactory.getLogger(VertexAiMultimodalEmbeddingModel.class); private static final MimeType TEXT_MIME_TYPE = MimeTypeUtils.parseMimeType("text/*"); @@ -163,7 +164,7 @@ else if (media.getMimeType().isCompatibleWith(IMAGE_MIME_TYPE)) { new DocumentMetadata(document.getId(), media.getMimeType(), media.getData())); } else { - logger.warn("Unsupported image mime type: " + media.getMimeType()); + logger.warn("Unsupported image mime type: {}", media.getMimeType()); throw new IllegalArgumentException("Unsupported image mime type: " + media.getMimeType()); } } @@ -178,7 +179,7 @@ else if (media.getMimeType().isCompatibleWith(VIDEO_MIME_TYPE)) { new DocumentMetadata(document.getId(), media.getMimeType(), media.getData())); } else { - logger.warn("Unsupported media type: " + media.getMimeType()); + logger.warn("Unsupported media type: {}", media.getMimeType()); throw new IllegalArgumentException("Unsupported media type: " + media.getMimeType()); } } diff --git a/models/spring-ai-vertex-ai-gemini/pom.xml b/models/spring-ai-vertex-ai-gemini/pom.xml index d17fd38c72b..cc184d54b22 100644 --- a/models/spring-ai-vertex-ai-gemini/pom.xml +++ b/models/spring-ai-vertex-ai-gemini/pom.xml @@ -84,6 +84,11 @@ spring-context-support + + org.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/VertexAiGeminiChatModelIT.java b/models/spring-ai-vertex-ai-gemini/src/test/java/org/springframework/ai/vertexai/gemini/VertexAiGeminiChatModelIT.java index 3e865bdacd4..7e20d00334f 100644 --- a/models/spring-ai-vertex-ai-gemini/src/test/java/org/springframework/ai/vertexai/gemini/VertexAiGeminiChatModelIT.java +++ b/models/spring-ai-vertex-ai-gemini/src/test/java/org/springframework/ai/vertexai/gemini/VertexAiGeminiChatModelIT.java @@ -189,7 +189,7 @@ void textStream() { .map(AssistantMessage::getText) .collect(Collectors.joining()); - // logger.info("" + actorsFilms); + // logger.info("{}", actorsFilms); assertThat(generationTextFromStream).isNotEmpty(); } @@ -218,7 +218,7 @@ void beanStreamOutputConverterRecords() { .collect(Collectors.joining()); ActorsFilmsRecord actorsFilms = outputConverter.convert(generationTextFromStream); - // logger.info("" + actorsFilms); + // logger.info("{}", actorsFilms); assertThat(actorsFilms.actor()).isEqualTo("Tom Hanks"); assertThat(actorsFilms.movies()).hasSize(5); } diff --git a/models/spring-ai-vertex-ai-gemini/src/test/java/org/springframework/ai/vertexai/gemini/function/MockWeatherService.java b/models/spring-ai-vertex-ai-gemini/src/test/java/org/springframework/ai/vertexai/gemini/function/MockWeatherService.java index fff34d69854..d79b317cda1 100644 --- a/models/spring-ai-vertex-ai-gemini/src/test/java/org/springframework/ai/vertexai/gemini/function/MockWeatherService.java +++ b/models/spring-ai-vertex-ai-gemini/src/test/java/org/springframework/ai/vertexai/gemini/function/MockWeatherService.java @@ -23,15 +23,15 @@ import com.fasterxml.jackson.annotation.JsonInclude.Include; import com.fasterxml.jackson.annotation.JsonProperty; import com.fasterxml.jackson.annotation.JsonPropertyDescription; - -import org.springframework.core.log.LogAccessor; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; /** * @author Christian Tzolov */ public class MockWeatherService implements Function { - private final LogAccessor logger = new LogAccessor(getClass()); + private final Logger logger = LoggerFactory.getLogger(getClass()); @Override public Response apply(Request request) { @@ -47,7 +47,7 @@ else if (request.location().contains("San Francisco")) { temperature = 30; } - logger.info("Request is " + request + ", response temperature is " + temperature); + logger.info("Request is {}, response temperature is {}", request, temperature); return new Response(temperature, Unit.C); } diff --git a/models/spring-ai-vertex-ai-gemini/src/test/java/org/springframework/ai/vertexai/gemini/function/VertexAiGeminiChatModelFunctionCallingIT.java b/models/spring-ai-vertex-ai-gemini/src/test/java/org/springframework/ai/vertexai/gemini/function/VertexAiGeminiChatModelFunctionCallingIT.java index 0e61e6d85f8..8e286bf04aa 100644 --- a/models/spring-ai-vertex-ai-gemini/src/test/java/org/springframework/ai/vertexai/gemini/function/VertexAiGeminiChatModelFunctionCallingIT.java +++ b/models/spring-ai-vertex-ai-gemini/src/test/java/org/springframework/ai/vertexai/gemini/function/VertexAiGeminiChatModelFunctionCallingIT.java @@ -25,6 +25,8 @@ import com.google.cloud.vertexai.VertexAI; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.condition.EnabledIfEnvironmentVariable; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import reactor.core.publisher.Flux; import org.springframework.ai.chat.messages.AssistantMessage; @@ -41,7 +43,6 @@ 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; @@ -50,7 +51,7 @@ @EnabledIfEnvironmentVariable(named = "VERTEX_AI_GEMINI_LOCATION", matches = ".*") public class VertexAiGeminiChatModelFunctionCallingIT { - private final LogAccessor logger = new LogAccessor(getClass()); + private static final Logger logger = LoggerFactory.getLogger(VertexAiGeminiChatModelFunctionCallingIT.class); @Autowired private VertexAiGeminiChatModel chatModel; @@ -91,7 +92,7 @@ public void functionCallExplicitOpenApiSchema() { ChatResponse response = this.chatModel.call(new Prompt(messages, promptOptions)); - logger.info("Response: " + response); + logger.info("Response: {}", response); assertThat(response.getResult().getOutput().getText()).contains("30", "10", "15"); } @@ -124,14 +125,14 @@ public void functionCallTestInferredOpenApiSchema() { ChatResponse response = this.chatModel.call(new Prompt(messages, promptOptions)); - logger.info("Response: " + response); + logger.info("Response: {}", response); assertThat(response.getResult().getOutput().getText()).contains("30", "10", "15"); ChatResponse response2 = this.chatModel .call(new Prompt("What is the payment status for transaction 696?", promptOptions)); - logger.info("Response: " + response2); + logger.info("Response: {}", response2); assertThat(response2.getResult().getOutput().getText()).containsIgnoringCase("transaction 696 is PAYED"); @@ -166,7 +167,7 @@ public void functionCallTestInferredOpenApiSchemaStream() { .map(AssistantMessage::getText) .collect(Collectors.joining()); - logger.info("Response: " + responseString); + logger.info("Response: {}", responseString); assertThat(responseString).contains("30", "10", "15"); diff --git a/models/spring-ai-vertex-ai-gemini/src/test/java/org/springframework/ai/vertexai/gemini/function/VertexAiGeminiPaymentTransactionIT.java b/models/spring-ai-vertex-ai-gemini/src/test/java/org/springframework/ai/vertexai/gemini/function/VertexAiGeminiPaymentTransactionIT.java index ceb19a266b0..888f4536662 100644 --- a/models/spring-ai-vertex-ai-gemini/src/test/java/org/springframework/ai/vertexai/gemini/function/VertexAiGeminiPaymentTransactionIT.java +++ b/models/spring-ai-vertex-ai-gemini/src/test/java/org/springframework/ai/vertexai/gemini/function/VertexAiGeminiPaymentTransactionIT.java @@ -26,6 +26,8 @@ import org.junit.jupiter.api.RepeatedTest; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.condition.EnabledIfEnvironmentVariable; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import reactor.core.publisher.Flux; import org.springframework.ai.chat.client.ChatClient; @@ -44,7 +46,6 @@ import org.springframework.context.ApplicationContext; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Description; -import org.springframework.core.log.LogAccessor; import static org.assertj.core.api.Assertions.assertThat; @@ -56,7 +57,7 @@ @EnabledIfEnvironmentVariable(named = "VERTEX_AI_GEMINI_LOCATION", matches = ".*") public class VertexAiGeminiPaymentTransactionIT { - private static final LogAccessor logger = new LogAccessor(VertexAiGeminiPaymentTransactionIT.class); + private static final Logger logger = LoggerFactory.getLogger(VertexAiGeminiPaymentTransactionIT.class); private static final Map DATASET = Map.of(new Transaction("001"), new Status("pending"), new Transaction("002"), new Status("approved"), new Transaction("003"), new Status("rejected")); @@ -115,7 +116,7 @@ record TransactionStatusResponse(String id, String status) { private static class LoggingAdvisor implements CallAroundAdvisor { - private static final LogAccessor logger = new LogAccessor(LoggingAdvisor.class); + private final Logger logger = LoggerFactory.getLogger(LoggingAdvisor.class); @Override public String getName() { diff --git a/models/spring-ai-watsonx-ai/pom.xml b/models/spring-ai-watsonx-ai/pom.xml index 217253d15f8..c679ee01ae4 100644 --- a/models/spring-ai-watsonx-ai/pom.xml +++ b/models/spring-ai-watsonx-ai/pom.xml @@ -57,6 +57,11 @@ ${project.parent.version} + + org.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 0a10ca9a5ac..169307400d7 100644 --- a/models/spring-ai-watsonx-ai/src/main/java/org/springframework/ai/watsonx/WatsonxAiEmbeddingModel.java +++ b/models/spring-ai-watsonx-ai/src/main/java/org/springframework/ai/watsonx/WatsonxAiEmbeddingModel.java @@ -19,6 +19,9 @@ import java.util.List; import java.util.concurrent.atomic.AtomicInteger; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + import org.springframework.ai.document.Document; import org.springframework.ai.embedding.AbstractEmbeddingModel; import org.springframework.ai.embedding.Embedding; @@ -29,7 +32,6 @@ import org.springframework.ai.watsonx.api.WatsonxAiApi; import org.springframework.ai.watsonx.api.WatsonxAiEmbeddingRequest; import org.springframework.ai.watsonx.api.WatsonxAiEmbeddingResponse; -import org.springframework.core.log.LogAccessor; import org.springframework.util.Assert; import org.springframework.util.StringUtils; @@ -49,7 +51,7 @@ */ public class WatsonxAiEmbeddingModel extends AbstractEmbeddingModel { - private static final LogAccessor logger = new LogAccessor(WatsonxAiEmbeddingModel.class); + private final Logger logger = LoggerFactory.getLogger(getClass()); private final WatsonxAiApi watsonxAiApi; diff --git a/models/spring-ai-zhipuai/pom.xml b/models/spring-ai-zhipuai/pom.xml index 85deca0f13a..f0f6a920fc9 100644 --- a/models/spring-ai-zhipuai/pom.xml +++ b/models/spring-ai-zhipuai/pom.xml @@ -58,6 +58,11 @@ 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 47c9d5e6910..17d56285277 100644 --- a/models/spring-ai-zhipuai/src/main/java/org/springframework/ai/zhipuai/ZhiPuAiChatModel.java +++ b/models/spring-ai-zhipuai/src/main/java/org/springframework/ai/zhipuai/ZhiPuAiChatModel.java @@ -27,6 +27,8 @@ import io.micrometer.observation.Observation; import io.micrometer.observation.ObservationRegistry; import io.micrometer.observation.contextpropagation.ObservationThreadLocalAccessor; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import reactor.core.publisher.Flux; import reactor.core.publisher.Mono; @@ -67,7 +69,6 @@ import org.springframework.ai.zhipuai.api.ZhiPuAiApi.ChatCompletionMessage.ToolCall; import org.springframework.ai.zhipuai.api.ZhiPuAiApi.ChatCompletionRequest; import org.springframework.ai.zhipuai.api.ZhiPuApiConstants; -import org.springframework.core.log.LogAccessor; import org.springframework.http.ResponseEntity; import org.springframework.retry.support.RetryTemplate; import org.springframework.util.Assert; @@ -87,7 +88,7 @@ */ public class ZhiPuAiChatModel extends AbstractToolCallSupport implements ChatModel, StreamingChatModel { - private static final LogAccessor logger = new LogAccessor(ZhiPuAiChatModel.class); + private static final Logger logger = LoggerFactory.getLogger(ZhiPuAiChatModel.class); private static final ChatModelObservationConvention DEFAULT_OBSERVATION_CONVENTION = new DefaultChatModelObservationConvention(); @@ -211,7 +212,7 @@ public ChatResponse call(Prompt prompt) { var chatCompletion = completionEntity.getBody(); if (chatCompletion == null) { - logger.warn("No chat completion returned for prompt: " + prompt); + logger.warn("No chat completion returned for prompt: {}", prompt); return new ChatResponse(List.of()); } @@ -296,7 +297,7 @@ public Flux stream(Prompt prompt) { return new ChatResponse(generations, from(chatCompletion2)); } catch (Exception e) { - logger.error(e, "Error processing chat completion"); + logger.error("Error processing chat completion", e); return new ChatResponse(List.of()); } diff --git a/models/spring-ai-zhipuai/src/main/java/org/springframework/ai/zhipuai/ZhiPuAiEmbeddingModel.java b/models/spring-ai-zhipuai/src/main/java/org/springframework/ai/zhipuai/ZhiPuAiEmbeddingModel.java index c80a36e2d12..f310f65cc97 100644 --- a/models/spring-ai-zhipuai/src/main/java/org/springframework/ai/zhipuai/ZhiPuAiEmbeddingModel.java +++ b/models/spring-ai-zhipuai/src/main/java/org/springframework/ai/zhipuai/ZhiPuAiEmbeddingModel.java @@ -21,6 +21,8 @@ import java.util.concurrent.atomic.AtomicInteger; import io.micrometer.observation.ObservationRegistry; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import org.springframework.ai.chat.metadata.DefaultUsage; import org.springframework.ai.document.Document; @@ -39,7 +41,6 @@ import org.springframework.ai.retry.RetryUtils; import org.springframework.ai.zhipuai.api.ZhiPuAiApi; import org.springframework.ai.zhipuai.api.ZhiPuApiConstants; -import org.springframework.core.log.LogAccessor; import org.springframework.lang.Nullable; import org.springframework.retry.support.RetryTemplate; import org.springframework.util.Assert; @@ -52,7 +53,7 @@ */ public class ZhiPuAiEmbeddingModel extends AbstractEmbeddingModel { - private static final LogAccessor logger = new LogAccessor(ZhiPuAiEmbeddingModel.class); + private static final Logger logger = LoggerFactory.getLogger(ZhiPuAiEmbeddingModel.class); private static final EmbeddingModelObservationConvention DEFAULT_OBSERVATION_CONVENTION = new DefaultEmbeddingModelObservationConvention(); @@ -174,7 +175,7 @@ public EmbeddingResponse call(EmbeddingRequest request) { ZhiPuAiApi.EmbeddingList response = this.retryTemplate .execute(ctx -> this.zhiPuAiApi.embeddings(apiRequest).getBody()); if (response == null || response.data() == null || response.data().isEmpty()) { - logger.warn("No embeddings returned for input: " + inputContent); + logger.warn("No embeddings returned for input: {}", inputContent); embeddingList.add(new float[0]); } else { diff --git a/models/spring-ai-zhipuai/src/main/java/org/springframework/ai/zhipuai/ZhiPuAiImageModel.java b/models/spring-ai-zhipuai/src/main/java/org/springframework/ai/zhipuai/ZhiPuAiImageModel.java index 7dc3753ae3f..406221e7d8a 100644 --- a/models/spring-ai-zhipuai/src/main/java/org/springframework/ai/zhipuai/ZhiPuAiImageModel.java +++ b/models/spring-ai-zhipuai/src/main/java/org/springframework/ai/zhipuai/ZhiPuAiImageModel.java @@ -18,6 +18,9 @@ import java.util.List; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + import org.springframework.ai.image.Image; import org.springframework.ai.image.ImageGeneration; import org.springframework.ai.image.ImageModel; @@ -27,7 +30,6 @@ import org.springframework.ai.model.ModelOptionsUtils; import org.springframework.ai.retry.RetryUtils; import org.springframework.ai.zhipuai.api.ZhiPuAiImageApi; -import org.springframework.core.log.LogAccessor; import org.springframework.http.ResponseEntity; import org.springframework.retry.support.RetryTemplate; import org.springframework.util.Assert; @@ -41,7 +43,7 @@ */ public class ZhiPuAiImageModel implements ImageModel { - private static final LogAccessor logger = new LogAccessor(ZhiPuAiImageModel.class); + private static final Logger logger = LoggerFactory.getLogger(ZhiPuAiImageModel.class); public final RetryTemplate retryTemplate; @@ -99,7 +101,7 @@ private ImageResponse convertResponse(ResponseEntity findClassesInPackage(String packageName, TypeFi .stream()// .map(bd -> TypeReference.of(Objects.requireNonNull(bd.getBeanClassName())))// .peek(tr -> { - if (logger.isDebugEnabled()) { - logger.debug("registering [" + tr.getName() + ']'); + if (log.isDebugEnabled()) { + log.debug("registering [" + tr.getName() + ']'); } }) .collect(Collectors.toUnmodifiableSet()); diff --git a/spring-ai-core/src/main/java/org/springframework/ai/chat/client/advisor/SimpleLoggerAdvisor.java b/spring-ai-core/src/main/java/org/springframework/ai/chat/client/advisor/SimpleLoggerAdvisor.java index 17c3ff6485f..c6fc0d794b8 100644 --- a/spring-ai-core/src/main/java/org/springframework/ai/chat/client/advisor/SimpleLoggerAdvisor.java +++ b/spring-ai-core/src/main/java/org/springframework/ai/chat/client/advisor/SimpleLoggerAdvisor.java @@ -18,6 +18,8 @@ import java.util.function.Function; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import reactor.core.publisher.Flux; import org.springframework.ai.chat.client.advisor.api.AdvisedRequest; @@ -29,7 +31,6 @@ import org.springframework.ai.chat.model.ChatResponse; import org.springframework.ai.chat.model.MessageAggregator; import org.springframework.ai.model.ModelOptionsUtils; -import org.springframework.core.log.LogAccessor; /** * A simple logger advisor that logs the request and response messages. @@ -43,7 +44,7 @@ public class SimpleLoggerAdvisor implements CallAroundAdvisor, StreamAroundAdvis public static final Function DEFAULT_RESPONSE_TO_STRING = response -> ModelOptionsUtils .toJsonStringPrettyPrinter(response); - private static final LogAccessor logger = new LogAccessor(SimpleLoggerAdvisor.class); + private static final Logger logger = LoggerFactory.getLogger(SimpleLoggerAdvisor.class); private final Function requestToString; @@ -77,12 +78,12 @@ public int getOrder() { } private AdvisedRequest before(AdvisedRequest request) { - logger.debug("request: " + this.requestToString.apply(request)); + logger.debug("request: {}", this.requestToString.apply(request)); return request; } private void observeAfter(AdvisedResponse advisedResponse) { - logger.debug("response: " + this.responseToString.apply(advisedResponse.response())); + logger.debug("response: {}", this.responseToString.apply(advisedResponse.response())); } @Override diff --git a/spring-ai-core/src/main/java/org/springframework/ai/chat/metadata/ChatResponseMetadata.java b/spring-ai-core/src/main/java/org/springframework/ai/chat/metadata/ChatResponseMetadata.java index 61ad0d0689b..b8392c7ede2 100644 --- a/spring-ai-core/src/main/java/org/springframework/ai/chat/metadata/ChatResponseMetadata.java +++ b/spring-ai-core/src/main/java/org/springframework/ai/chat/metadata/ChatResponseMetadata.java @@ -19,9 +19,11 @@ import java.util.Map; import java.util.Objects; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + import org.springframework.ai.model.AbstractResponseMetadata; import org.springframework.ai.model.ResponseMetadata; -import org.springframework.core.log.LogAccessor; /** * Models common AI provider metadata returned in an AI response. @@ -34,7 +36,7 @@ */ public class ChatResponseMetadata extends AbstractResponseMetadata implements ResponseMetadata { - private static final LogAccessor logger = new LogAccessor(ChatResponseMetadata.class); + private static final Logger logger = LoggerFactory.getLogger(ChatResponseMetadata.class); private String id = ""; // Set to blank to preserve backward compat with previous @@ -138,7 +140,7 @@ public Builder keyValue(String key, Object value) { this.chatResponseMetadata.map.put(key, value); } else { - logger.debug("Ignore null value for key [" + key + "]"); + logger.debug("Ignore null value for key [{}]", key); } return this; } diff --git a/spring-ai-core/src/main/java/org/springframework/ai/chat/model/MessageAggregator.java b/spring-ai-core/src/main/java/org/springframework/ai/chat/model/MessageAggregator.java index dc0a6019d8c..b94a91f6dbd 100644 --- a/spring-ai-core/src/main/java/org/springframework/ai/chat/model/MessageAggregator.java +++ b/spring-ai-core/src/main/java/org/springframework/ai/chat/model/MessageAggregator.java @@ -22,6 +22,8 @@ import java.util.concurrent.atomic.AtomicReference; import java.util.function.Consumer; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import reactor.core.publisher.Flux; import org.springframework.ai.chat.client.advisor.api.AdvisedResponse; @@ -32,7 +34,6 @@ import org.springframework.ai.chat.metadata.PromptMetadata; import org.springframework.ai.chat.metadata.RateLimit; import org.springframework.ai.chat.metadata.Usage; -import org.springframework.core.log.LogAccessor; import org.springframework.util.StringUtils; /** @@ -45,7 +46,7 @@ */ public class MessageAggregator { - private static final LogAccessor logger = new LogAccessor(MessageAggregator.class); + private static final Logger logger = LoggerFactory.getLogger(MessageAggregator.class); public Flux aggregateAdvisedResponse(Flux advisedResponses, Consumer aggregationHandler) { @@ -167,7 +168,7 @@ public Flux aggregate(Flux fluxChatResponse, metadataPromptMetadataRef.set(PromptMetadata.empty()); metadataRateLimitRef.set(new EmptyRateLimit()); - }).doOnError(e -> logger.error(e, "Aggregation Error")); + }).doOnError(e -> logger.error("Aggregation Error", e)); } public record DefaultUsage(Integer promptTokens, Integer completionTokens, Integer totalTokens) implements Usage { diff --git a/spring-ai-core/src/main/java/org/springframework/ai/converter/BeanOutputConverter.java b/spring-ai-core/src/main/java/org/springframework/ai/converter/BeanOutputConverter.java index a5010824d6b..ea7cf314194 100644 --- a/spring-ai-core/src/main/java/org/springframework/ai/converter/BeanOutputConverter.java +++ b/spring-ai-core/src/main/java/org/springframework/ai/converter/BeanOutputConverter.java @@ -34,10 +34,11 @@ import com.github.victools.jsonschema.generator.SchemaGeneratorConfigBuilder; import com.github.victools.jsonschema.module.jackson.JacksonModule; import com.github.victools.jsonschema.module.jackson.JacksonOption; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import org.springframework.ai.util.JacksonUtils; import org.springframework.core.ParameterizedTypeReference; -import org.springframework.core.log.LogAccessor; import org.springframework.lang.NonNull; /** @@ -58,7 +59,7 @@ */ public class BeanOutputConverter implements StructuredOutputConverter { - private static final LogAccessor logger = new LogAccessor(BeanOutputConverter.class); + private final Logger logger = LoggerFactory.getLogger(BeanOutputConverter.class); /** * The target class type reference to which the output will be converted. @@ -226,7 +227,7 @@ public Map getJsonSchemaMap() { return this.objectMapper.readValue(this.jsonSchema, Map.class); } catch (JsonProcessingException ex) { - logger.error(ex, "Could not parse the JSON Schema to a Map object"); + logger.error("Could not parse the JSON Schema to a Map object", ex); throw new IllegalStateException(ex); } } diff --git a/spring-ai-core/src/main/java/org/springframework/ai/model/function/DefaultFunctionCallbackBuilder.java b/spring-ai-core/src/main/java/org/springframework/ai/model/function/DefaultFunctionCallbackBuilder.java index bef09e773b6..d18e0bf5dae 100644 --- a/spring-ai-core/src/main/java/org/springframework/ai/model/function/DefaultFunctionCallbackBuilder.java +++ b/spring-ai-core/src/main/java/org/springframework/ai/model/function/DefaultFunctionCallbackBuilder.java @@ -23,6 +23,9 @@ import java.util.function.Function; import java.util.function.Supplier; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + import org.springframework.ai.chat.model.ToolContext; import org.springframework.ai.model.ModelOptionsUtils; import org.springframework.ai.model.function.FunctionCallback.FunctionInvokingSpec; @@ -32,7 +35,6 @@ import org.springframework.ai.tool.method.MethodToolCallback; import org.springframework.ai.util.ParsingUtils; import org.springframework.core.ParameterizedTypeReference; -import org.springframework.core.log.LogAccessor; import org.springframework.util.Assert; import org.springframework.util.ReflectionUtils; import org.springframework.util.StringUtils; @@ -48,7 +50,7 @@ @Deprecated public class DefaultFunctionCallbackBuilder implements FunctionCallback.Builder { - private static final LogAccessor logger = new LogAccessor(DefaultFunctionCallbackBuilder.class); + private static final Logger logger = LoggerFactory.getLogger(DefaultFunctionCallbackBuilder.class); @Override public FunctionInvokingSpec function(String name, Function function) { @@ -83,8 +85,8 @@ private String generateDescription(String fromName) { String generatedDescription = ParsingUtils.reConcatenateCamelCase(fromName, " "); - logger.info("Description is not set! A best effort attempt to generate a description:'" + generatedDescription - + "' from the:'" + fromName + "'"); + logger.info("Description is not set! A best effort attempt to generate a description:'{}' from the:'{}'", + generatedDescription, fromName); logger.info("It is recommended to set the Description explicitly! Use the 'description()' method!"); return generatedDescription; diff --git a/spring-ai-core/src/main/java/org/springframework/ai/model/function/MethodInvokingFunctionCallback.java b/spring-ai-core/src/main/java/org/springframework/ai/model/function/MethodInvokingFunctionCallback.java index a026379169b..e3a724b1548 100644 --- a/spring-ai-core/src/main/java/org/springframework/ai/model/function/MethodInvokingFunctionCallback.java +++ b/spring-ai-core/src/main/java/org/springframework/ai/model/function/MethodInvokingFunctionCallback.java @@ -29,11 +29,12 @@ import com.fasterxml.jackson.databind.node.ObjectNode; import com.fasterxml.jackson.module.jsonSchema.JsonSchema; import com.fasterxml.jackson.module.jsonSchema.JsonSchemaGenerator; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import org.springframework.ai.chat.model.ToolContext; import org.springframework.ai.model.ModelOptionsUtils; import org.springframework.ai.tool.method.MethodToolCallback; -import org.springframework.core.log.LogAccessor; import org.springframework.util.Assert; import org.springframework.util.ClassUtils; import org.springframework.util.CollectionUtils; @@ -56,7 +57,7 @@ @Deprecated public class MethodInvokingFunctionCallback implements FunctionCallback { - private static final LogAccessor logger = new LogAccessor(MethodInvokingFunctionCallback.class); + private static final Logger logger = LoggerFactory.getLogger(MethodInvokingFunctionCallback.class); /** * Object instance that contains the method to be invoked. If the method is static @@ -124,7 +125,7 @@ public class MethodInvokingFunctionCallback implements FunctionCallback { this.inputSchema = this.generateJsonSchema(methodParameters); - logger.debug("Generated JSON Schema: " + this.inputSchema); + logger.debug("Generated JSON Schema: {}", this.inputSchema); } @Override diff --git a/spring-ai-core/src/main/java/org/springframework/ai/model/observation/ErrorLoggingObservationHandler.java b/spring-ai-core/src/main/java/org/springframework/ai/model/observation/ErrorLoggingObservationHandler.java index 62a802d554b..0e6cd80d519 100644 --- a/spring-ai-core/src/main/java/org/springframework/ai/model/observation/ErrorLoggingObservationHandler.java +++ b/spring-ai-core/src/main/java/org/springframework/ai/model/observation/ErrorLoggingObservationHandler.java @@ -24,8 +24,9 @@ import io.micrometer.observation.ObservationHandler; import io.micrometer.tracing.Tracer; import io.micrometer.tracing.handler.TracingObservationHandler.TracingContext; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; -import org.springframework.core.log.LogAccessor; import org.springframework.util.Assert; /** @@ -37,7 +38,7 @@ @SuppressWarnings({ "rawtypes", "null" }) public class ErrorLoggingObservationHandler implements ObservationHandler { - private static final LogAccessor logger = new LogAccessor(ErrorLoggingObservationHandler.class); + private static final Logger logger = LoggerFactory.getLogger(ErrorLoggingObservationHandler.class); private final Tracer tracer; @@ -47,7 +48,7 @@ public class ErrorLoggingObservationHandler implements ObservationHandler { public ErrorLoggingObservationHandler(Tracer tracer, List> supportedContextTypes) { - this(tracer, supportedContextTypes, context -> logger.error("Traced Error: " + context.getError())); + this(tracer, supportedContextTypes, context -> logger.error("Traced Error: ", context.getError())); } public ErrorLoggingObservationHandler(Tracer tracer, diff --git a/spring-ai-core/src/main/java/org/springframework/ai/observation/tracing/TracingHelper.java b/spring-ai-core/src/main/java/org/springframework/ai/observation/tracing/TracingHelper.java index bcccb645647..a675fd98ed4 100644 --- a/spring-ai-core/src/main/java/org/springframework/ai/observation/tracing/TracingHelper.java +++ b/spring-ai-core/src/main/java/org/springframework/ai/observation/tracing/TracingHelper.java @@ -24,8 +24,9 @@ import io.micrometer.tracing.handler.TracingObservationHandler; import io.opentelemetry.api.trace.Span; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; -import org.springframework.core.log.LogAccessor; import org.springframework.lang.Nullable; /** @@ -35,7 +36,7 @@ */ public final class TracingHelper { - private static final LogAccessor logger = new LogAccessor(TracingHelper.class); + private static final Logger logger = LoggerFactory.getLogger(TracingHelper.class); private TracingHelper() { } @@ -58,7 +59,7 @@ public static Span extractOtelSpan(@Nullable TracingObservationHandler.TracingCo } } catch (NoSuchMethodException | InvocationTargetException | IllegalAccessException ex) { - logger.warn(ex, "It wasn't possible to extract the OpenTelemetry Span object from Micrometer"); + logger.warn("It wasn't possible to extract the OpenTelemetry Span object from Micrometer", ex); return null; } diff --git a/spring-ai-core/src/main/java/org/springframework/ai/rag/generation/augmentation/ContextualQueryAugmenter.java b/spring-ai-core/src/main/java/org/springframework/ai/rag/generation/augmentation/ContextualQueryAugmenter.java index fa1cd582fa0..42ab33d4d4f 100644 --- a/spring-ai-core/src/main/java/org/springframework/ai/rag/generation/augmentation/ContextualQueryAugmenter.java +++ b/spring-ai-core/src/main/java/org/springframework/ai/rag/generation/augmentation/ContextualQueryAugmenter.java @@ -20,11 +20,13 @@ import java.util.Map; import java.util.stream.Collectors; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + import org.springframework.ai.chat.prompt.PromptTemplate; import org.springframework.ai.document.Document; import org.springframework.ai.rag.Query; import org.springframework.ai.util.PromptAssert; -import org.springframework.core.log.LogAccessor; import org.springframework.lang.Nullable; import org.springframework.util.Assert; @@ -45,7 +47,7 @@ */ public final class ContextualQueryAugmenter implements QueryAugmenter { - private static final LogAccessor logger = new LogAccessor(ContextualQueryAugmenter.class); + private static final Logger logger = LoggerFactory.getLogger(ContextualQueryAugmenter.class); private static final PromptTemplate DEFAULT_PROMPT_TEMPLATE = new PromptTemplate(""" Context information is below. diff --git a/spring-ai-core/src/main/java/org/springframework/ai/rag/preretrieval/query/expansion/MultiQueryExpander.java b/spring-ai-core/src/main/java/org/springframework/ai/rag/preretrieval/query/expansion/MultiQueryExpander.java index 20094bbed13..aa64f46cf0d 100644 --- a/spring-ai-core/src/main/java/org/springframework/ai/rag/preretrieval/query/expansion/MultiQueryExpander.java +++ b/spring-ai-core/src/main/java/org/springframework/ai/rag/preretrieval/query/expansion/MultiQueryExpander.java @@ -20,11 +20,13 @@ import java.util.List; import java.util.stream.Collectors; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + import org.springframework.ai.chat.client.ChatClient; import org.springframework.ai.chat.prompt.PromptTemplate; import org.springframework.ai.rag.Query; import org.springframework.ai.util.PromptAssert; -import org.springframework.core.log.LogAccessor; import org.springframework.lang.Nullable; import org.springframework.util.Assert; import org.springframework.util.CollectionUtils; @@ -49,7 +51,7 @@ */ public final class MultiQueryExpander implements QueryExpander { - private static final LogAccessor logger = new LogAccessor(MultiQueryExpander.class); + private static final Logger logger = LoggerFactory.getLogger(MultiQueryExpander.class); private static final PromptTemplate DEFAULT_PROMPT_TEMPLATE = new PromptTemplate(""" You are an expert at information retrieval and search optimization. @@ -95,7 +97,7 @@ public MultiQueryExpander(ChatClient.Builder chatClientBuilder, @Nullable Prompt public List expand(Query query) { Assert.notNull(query, "query cannot be null"); - logger.debug("Generating " + this.numberOfQueries + " query variants"); + logger.debug("Generating {} query variants", this.numberOfQueries); var response = this.chatClient.prompt() .user(user -> user.text(this.promptTemplate.getTemplate()) @@ -112,8 +114,9 @@ public List expand(Query query) { var queryVariants = Arrays.asList(response.split("\n")); if (CollectionUtils.isEmpty(queryVariants) || this.numberOfQueries != queryVariants.size()) { - logger.warn("Query expansion result does not contain the requested " + this.numberOfQueries - + " variants. Returning the input query unchanged."); + logger.warn( + "Query expansion result does not contain the requested {} variants. Returning the input query unchanged.", + this.numberOfQueries); return List.of(query); } diff --git a/spring-ai-core/src/main/java/org/springframework/ai/rag/preretrieval/query/transformation/CompressionQueryTransformer.java b/spring-ai-core/src/main/java/org/springframework/ai/rag/preretrieval/query/transformation/CompressionQueryTransformer.java index 53aaf8b4d92..11cb23b2271 100644 --- a/spring-ai-core/src/main/java/org/springframework/ai/rag/preretrieval/query/transformation/CompressionQueryTransformer.java +++ b/spring-ai-core/src/main/java/org/springframework/ai/rag/preretrieval/query/transformation/CompressionQueryTransformer.java @@ -19,6 +19,9 @@ import java.util.List; import java.util.stream.Collectors; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + import org.springframework.ai.chat.client.ChatClient; import org.springframework.ai.chat.messages.Message; import org.springframework.ai.chat.messages.MessageType; @@ -26,7 +29,6 @@ import org.springframework.ai.chat.prompt.PromptTemplate; import org.springframework.ai.rag.Query; import org.springframework.ai.util.PromptAssert; -import org.springframework.core.log.LogAccessor; import org.springframework.lang.Nullable; import org.springframework.util.Assert; import org.springframework.util.StringUtils; @@ -43,7 +45,7 @@ */ public class CompressionQueryTransformer implements QueryTransformer { - private static final LogAccessor logger = new LogAccessor(CompressionQueryTransformer.class); + private static final Logger logger = LoggerFactory.getLogger(CompressionQueryTransformer.class); private static final PromptTemplate DEFAULT_PROMPT_TEMPLATE = new PromptTemplate(""" Given the following conversation history and a follow-up query, your task is to synthesize diff --git a/spring-ai-core/src/main/java/org/springframework/ai/rag/preretrieval/query/transformation/RewriteQueryTransformer.java b/spring-ai-core/src/main/java/org/springframework/ai/rag/preretrieval/query/transformation/RewriteQueryTransformer.java index c7d87a8bf74..8dd495029ec 100644 --- a/spring-ai-core/src/main/java/org/springframework/ai/rag/preretrieval/query/transformation/RewriteQueryTransformer.java +++ b/spring-ai-core/src/main/java/org/springframework/ai/rag/preretrieval/query/transformation/RewriteQueryTransformer.java @@ -16,12 +16,14 @@ package org.springframework.ai.rag.preretrieval.query.transformation; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + import org.springframework.ai.chat.client.ChatClient; import org.springframework.ai.chat.prompt.ChatOptions; import org.springframework.ai.chat.prompt.PromptTemplate; import org.springframework.ai.rag.Query; import org.springframework.ai.util.PromptAssert; -import org.springframework.core.log.LogAccessor; import org.springframework.lang.Nullable; import org.springframework.util.Assert; import org.springframework.util.StringUtils; @@ -39,7 +41,7 @@ */ public class RewriteQueryTransformer implements QueryTransformer { - private static final LogAccessor logger = new LogAccessor(RewriteQueryTransformer.class); + private static final Logger logger = LoggerFactory.getLogger(RewriteQueryTransformer.class); private static final PromptTemplate DEFAULT_PROMPT_TEMPLATE = new PromptTemplate(""" Given a user query, rewrite it to provide better results when querying a {target}. @@ -74,7 +76,7 @@ public RewriteQueryTransformer(ChatClient.Builder chatClientBuilder, @Nullable P public Query transform(Query query) { Assert.notNull(query, "query cannot be null"); - logger.debug("Rewriting query to optimize for querying a " + this.targetSearchSystem + "."); + logger.debug("Rewriting query to optimize for querying a {}.", this.targetSearchSystem); var rewrittenQueryText = this.chatClient.prompt() .user(user -> user.text(this.promptTemplate.getTemplate()) diff --git a/spring-ai-core/src/main/java/org/springframework/ai/rag/preretrieval/query/transformation/TranslationQueryTransformer.java b/spring-ai-core/src/main/java/org/springframework/ai/rag/preretrieval/query/transformation/TranslationQueryTransformer.java index 1a151e286b9..7ddf2c7d673 100644 --- a/spring-ai-core/src/main/java/org/springframework/ai/rag/preretrieval/query/transformation/TranslationQueryTransformer.java +++ b/spring-ai-core/src/main/java/org/springframework/ai/rag/preretrieval/query/transformation/TranslationQueryTransformer.java @@ -16,12 +16,14 @@ package org.springframework.ai.rag.preretrieval.query.transformation; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + import org.springframework.ai.chat.client.ChatClient; import org.springframework.ai.chat.prompt.ChatOptions; import org.springframework.ai.chat.prompt.PromptTemplate; import org.springframework.ai.rag.Query; import org.springframework.ai.util.PromptAssert; -import org.springframework.core.log.LogAccessor; import org.springframework.lang.Nullable; import org.springframework.util.Assert; import org.springframework.util.StringUtils; @@ -48,7 +50,7 @@ */ public final class TranslationQueryTransformer implements QueryTransformer { - private static final LogAccessor logger = new LogAccessor(TranslationQueryTransformer.class); + private static final Logger logger = LoggerFactory.getLogger(TranslationQueryTransformer.class); private static final PromptTemplate DEFAULT_PROMPT_TEMPLATE = new PromptTemplate(""" Given a user query, translate it to {targetLanguage}. @@ -83,7 +85,7 @@ public TranslationQueryTransformer(ChatClient.Builder chatClientBuilder, @Nullab public Query transform(Query query) { Assert.notNull(query, "query cannot be null"); - logger.debug("Translating query to target language: " + this.targetLanguage); + logger.debug("Translating query to target language: {}", this.targetLanguage); var translatedQueryText = this.chatClient.prompt() .user(user -> user.text(this.promptTemplate.getTemplate()) diff --git a/spring-ai-core/src/main/java/org/springframework/ai/rag/retrieval/join/ConcatenationDocumentJoiner.java b/spring-ai-core/src/main/java/org/springframework/ai/rag/retrieval/join/ConcatenationDocumentJoiner.java index 5c7c8dc902a..56038587fa6 100644 --- a/spring-ai-core/src/main/java/org/springframework/ai/rag/retrieval/join/ConcatenationDocumentJoiner.java +++ b/spring-ai-core/src/main/java/org/springframework/ai/rag/retrieval/join/ConcatenationDocumentJoiner.java @@ -22,9 +22,11 @@ import java.util.function.Function; import java.util.stream.Collectors; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + import org.springframework.ai.document.Document; import org.springframework.ai.rag.Query; -import org.springframework.core.log.LogAccessor; import org.springframework.util.Assert; /** @@ -37,7 +39,7 @@ */ public class ConcatenationDocumentJoiner implements DocumentJoiner { - private static final LogAccessor logger = new LogAccessor(ConcatenationDocumentJoiner.class); + private static final Logger logger = LoggerFactory.getLogger(ConcatenationDocumentJoiner.class); @Override public List join(Map>> documentsForQuery) { diff --git a/spring-ai-core/src/main/java/org/springframework/ai/tool/execution/DefaultToolCallResultConverter.java b/spring-ai-core/src/main/java/org/springframework/ai/tool/execution/DefaultToolCallResultConverter.java index 290846c6f30..fb6fffcef46 100644 --- a/spring-ai-core/src/main/java/org/springframework/ai/tool/execution/DefaultToolCallResultConverter.java +++ b/spring-ai-core/src/main/java/org/springframework/ai/tool/execution/DefaultToolCallResultConverter.java @@ -18,10 +18,10 @@ import java.lang.reflect.Type; -import org.apache.commons.logging.LogFactory; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import org.springframework.ai.util.json.JsonParser; -import org.springframework.core.log.LogAccessor; import org.springframework.lang.Nullable; /** @@ -32,7 +32,7 @@ */ public final class DefaultToolCallResultConverter implements ToolCallResultConverter { - private static final LogAccessor logger = new LogAccessor(LogFactory.getLog(DefaultToolCallResultConverter.class)); + private static final Logger logger = LoggerFactory.getLogger(DefaultToolCallResultConverter.class); @Override public String apply(@Nullable Object result, @Nullable Type returnType) { diff --git a/spring-ai-core/src/main/java/org/springframework/ai/tool/function/FunctionToolCallback.java b/spring-ai-core/src/main/java/org/springframework/ai/tool/function/FunctionToolCallback.java index 8d635a6f47e..00a569b6123 100644 --- a/spring-ai-core/src/main/java/org/springframework/ai/tool/function/FunctionToolCallback.java +++ b/spring-ai-core/src/main/java/org/springframework/ai/tool/function/FunctionToolCallback.java @@ -22,7 +22,8 @@ import java.util.function.Function; import java.util.function.Supplier; -import org.apache.commons.logging.LogFactory; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import org.springframework.ai.chat.model.ToolContext; import org.springframework.ai.tool.ToolCallback; @@ -34,7 +35,6 @@ import org.springframework.ai.util.json.JsonParser; import org.springframework.ai.util.json.JsonSchemaGenerator; import org.springframework.core.ParameterizedTypeReference; -import org.springframework.core.log.LogAccessor; import org.springframework.lang.Nullable; import org.springframework.util.Assert; import org.springframework.util.StringUtils; @@ -47,7 +47,7 @@ */ public class FunctionToolCallback implements ToolCallback { - private static final LogAccessor logger = new LogAccessor(LogFactory.getLog(FunctionToolCallback.class)); + private static final Logger logger = LoggerFactory.getLogger(FunctionToolCallback.class); private static final ToolCallResultConverter DEFAULT_RESULT_CONVERTER = new DefaultToolCallResultConverter(); @@ -95,12 +95,12 @@ public String call(String toolInput) { public String call(String toolInput, @Nullable ToolContext toolContext) { Assert.hasText(toolInput, "toolInput cannot be null or empty"); - logger.debug("Starting execution of tool: " + toolDefinition.name()); + logger.debug("Starting execution of tool: {}", toolDefinition.name()); I request = JsonParser.fromJson(toolInput, toolInputType); O response = toolFunction.apply(request, toolContext); - logger.debug("Successful execution of tool: " + toolDefinition.name()); + logger.debug("Successful execution of tool: {}", toolDefinition.name()); return toolCallResultConverter.apply(response, null); } diff --git a/spring-ai-core/src/main/java/org/springframework/ai/tool/method/MethodToolCallback.java b/spring-ai-core/src/main/java/org/springframework/ai/tool/method/MethodToolCallback.java index a2ddf71947f..f31b9aecea8 100644 --- a/spring-ai-core/src/main/java/org/springframework/ai/tool/method/MethodToolCallback.java +++ b/spring-ai-core/src/main/java/org/springframework/ai/tool/method/MethodToolCallback.java @@ -16,15 +16,9 @@ package org.springframework.ai.tool.method; -import java.lang.reflect.InvocationTargetException; -import java.lang.reflect.Method; -import java.lang.reflect.Modifier; -import java.lang.reflect.Type; -import java.util.Map; -import java.util.stream.Stream; - import com.fasterxml.jackson.core.type.TypeReference; - +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import org.springframework.ai.chat.model.ToolContext; import org.springframework.ai.tool.ToolCallback; import org.springframework.ai.tool.definition.ToolDefinition; @@ -33,13 +27,19 @@ import org.springframework.ai.tool.execution.ToolExecutionException; import org.springframework.ai.tool.metadata.ToolMetadata; import org.springframework.ai.util.json.JsonParser; -import org.springframework.core.log.LogAccessor; import org.springframework.lang.Nullable; import org.springframework.util.Assert; import org.springframework.util.ClassUtils; import org.springframework.util.CollectionUtils; import org.springframework.util.ReflectionUtils; +import java.lang.reflect.InvocationTargetException; +import java.lang.reflect.Method; +import java.lang.reflect.Modifier; +import java.lang.reflect.Type; +import java.util.Map; +import java.util.stream.Stream; + /** * A {@link ToolCallback} implementation to invoke methods as tools. * @@ -48,7 +48,7 @@ */ public class MethodToolCallback implements ToolCallback { - private static final LogAccessor logger = new LogAccessor(MethodToolCallback.class); + private static final Logger logger = LoggerFactory.getLogger(MethodToolCallback.class); private static final ToolCallResultConverter DEFAULT_RESULT_CONVERTER = new DefaultToolCallResultConverter(); @@ -98,7 +98,7 @@ public String call(String toolInput) { public String call(String toolInput, @Nullable ToolContext toolContext) { Assert.hasText(toolInput, "toolInput cannot be null or empty"); - logger.debug("Starting execution of tool: " + toolDefinition.name()); + logger.debug("Starting execution of tool: {}", toolDefinition.name()); validateToolContextSupport(toolContext); @@ -108,7 +108,7 @@ public String call(String toolInput, @Nullable ToolContext toolContext) { Object result = callMethod(methodArguments); - logger.debug("Successful execution of tool: " + toolDefinition.name()); + logger.debug("Successful execution of tool: {}", toolDefinition.name()); Type returnType = toolMethod.getGenericReturnType(); diff --git a/spring-ai-core/src/main/java/org/springframework/ai/tool/method/MethodToolCallbackProvider.java b/spring-ai-core/src/main/java/org/springframework/ai/tool/method/MethodToolCallbackProvider.java index dc130a937b3..ab89f2d73ef 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,26 +16,27 @@ package org.springframework.ai.tool.method; -import java.lang.reflect.Method; -import java.util.Arrays; -import java.util.List; -import java.util.function.Consumer; -import java.util.function.Function; -import java.util.function.Supplier; -import java.util.stream.Collectors; -import java.util.stream.Stream; - +import org.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.core.log.LogAccessor; import org.springframework.util.Assert; import org.springframework.util.ClassUtils; import org.springframework.util.ReflectionUtils; +import java.lang.reflect.Method; +import java.util.Arrays; +import java.util.List; +import java.util.function.Consumer; +import java.util.function.Function; +import java.util.function.Supplier; +import java.util.stream.Collectors; +import java.util.stream.Stream; + /** * A {@link ToolCallbackProvider} that builds {@link ToolCallback} instances from * {@link Tool}-annotated methods. @@ -45,7 +46,7 @@ */ public class MethodToolCallbackProvider implements ToolCallbackProvider { - private static final LogAccessor logger = new LogAccessor(MethodToolCallbackProvider.class); + private static final Logger logger = LoggerFactory.getLogger(MethodToolCallbackProvider.class); private final List toolObjects; @@ -83,8 +84,8 @@ private boolean isFunctionalType(Method toolMethod) { || ClassUtils.isAssignable(toolMethod.getReturnType(), Consumer.class); if (isFunction) { - logger.warn("Method " + toolMethod.getName() + " is annotated with @Tool but returns a functional type. " - + "This is not supported and the method will be ignored."); + logger.warn("Method {} is annotated with @Tool but returns a functional type. " + + "This is not supported and the method will be ignored.", toolMethod.getName()); } return isFunction; diff --git a/spring-ai-core/src/main/java/org/springframework/ai/transformer/splitter/TextSplitter.java b/spring-ai-core/src/main/java/org/springframework/ai/transformer/splitter/TextSplitter.java index 7d8c3a7f967..793c3fb7589 100644 --- a/spring-ai-core/src/main/java/org/springframework/ai/transformer/splitter/TextSplitter.java +++ b/spring-ai-core/src/main/java/org/springframework/ai/transformer/splitter/TextSplitter.java @@ -21,14 +21,16 @@ import java.util.Map; import java.util.stream.Collectors; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + import org.springframework.ai.document.ContentFormatter; import org.springframework.ai.document.Document; import org.springframework.ai.document.DocumentTransformer; -import org.springframework.core.log.LogAccessor; public abstract class TextSplitter implements DocumentTransformer { - private static final LogAccessor logger = new LogAccessor(TextSplitter.class); + private static final Logger logger = LoggerFactory.getLogger(TextSplitter.class); /** * If true the children documents inherit the content-type of the parent they were diff --git a/spring-ai-core/src/main/java/org/springframework/ai/vectorstore/SimpleVectorStore.java b/spring-ai-core/src/main/java/org/springframework/ai/vectorstore/SimpleVectorStore.java index 76d2359ac55..c550b131397 100644 --- a/spring-ai-core/src/main/java/org/springframework/ai/vectorstore/SimpleVectorStore.java +++ b/spring-ai-core/src/main/java/org/springframework/ai/vectorstore/SimpleVectorStore.java @@ -38,6 +38,8 @@ import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.ObjectWriter; import com.fasterxml.jackson.databind.json.JsonMapper; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import org.springframework.ai.document.Document; import org.springframework.ai.embedding.EmbeddingModel; @@ -47,7 +49,6 @@ import org.springframework.ai.vectorstore.observation.AbstractObservationVectorStore; import org.springframework.ai.vectorstore.observation.VectorStoreObservationContext; import org.springframework.core.io.Resource; -import org.springframework.core.log.LogAccessor; /** * SimpleVectorStore is a simple implementation of the VectorStore interface. @@ -69,7 +70,7 @@ */ public class SimpleVectorStore extends AbstractObservationVectorStore { - private static final LogAccessor logger = new LogAccessor(SimpleVectorStore.class); + private static final Logger logger = LoggerFactory.getLogger(SimpleVectorStore.class); private final ObjectMapper objectMapper; @@ -96,7 +97,7 @@ public void doAdd(List documents) { } for (Document document : documents) { - logger.info("Calling EmbeddingModel for document id = " + document.getId()); + logger.info("Calling EmbeddingModel for document id = {}", document.getId()); float[] embedding = this.embeddingModel.embed(document); SimpleVectorStoreContent storeContent = new SimpleVectorStoreContent(document.getId(), document.getText(), document.getMetadata(), embedding); @@ -138,7 +139,7 @@ public void save(File file) { String json = getVectorDbAsJson(); try { if (!file.exists()) { - logger.info("Creating new vector store file: " + file); + logger.info("Creating new vector store file: {}", file); try { Files.createFile(file.toPath()); } @@ -150,7 +151,7 @@ public void save(File file) { } } else { - logger.info("Overwriting existing vector store file: " + file); + logger.info("Overwriting existing vector store file: {}", file); } try (OutputStream stream = new FileOutputStream(file); Writer writer = new OutputStreamWriter(stream, StandardCharsets.UTF_8)) { @@ -159,15 +160,15 @@ public void save(File file) { } } catch (IOException ex) { - logger.error(ex, "IOException occurred while saving vector store file."); + logger.error("IOException occurred while saving vector store file.", ex); throw new RuntimeException(ex); } catch (SecurityException ex) { - logger.error(ex, "SecurityException occurred while saving vector store file."); + logger.error("SecurityException occurred while saving vector store file.", ex); throw new RuntimeException(ex); } catch (NullPointerException ex) { - logger.error(ex, "NullPointerException occurred while saving vector store file."); + logger.error("NullPointerException occurred while saving vector store file.", ex); throw new RuntimeException(ex); } } diff --git a/spring-ai-integration-tests/src/test/java/org/springframework/ai/integration/tests/tool/FunctionToolCallbackTests.java b/spring-ai-integration-tests/src/test/java/org/springframework/ai/integration/tests/tool/FunctionToolCallbackTests.java index 4f1c6d0f10a..bb4e7f299d7 100644 --- a/spring-ai-integration-tests/src/test/java/org/springframework/ai/integration/tests/tool/FunctionToolCallbackTests.java +++ b/spring-ai-integration-tests/src/test/java/org/springframework/ai/integration/tests/tool/FunctionToolCallbackTests.java @@ -20,9 +20,10 @@ import java.util.function.Consumer; import java.util.function.Function; -import org.apache.commons.logging.LogFactory; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.condition.EnabledIfEnvironmentVariable; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import org.springframework.ai.chat.client.ChatClient; import org.springframework.ai.integration.tests.TestApplication; @@ -37,7 +38,6 @@ import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.Description; import org.springframework.context.annotation.Import; -import org.springframework.core.log.LogAccessor; import static org.assertj.core.api.Assertions.assertThat; @@ -53,7 +53,7 @@ public class FunctionToolCallbackTests { // @formatter:off - private static final LogAccessor logger = new LogAccessor(LogFactory.getLog(FunctionToolCallbackTests.class)); + private static final Logger logger = LoggerFactory.getLogger(FunctionToolCallbackTests.class); @Autowired OpenAiChatModel openAiChatModel; @@ -106,7 +106,7 @@ void chatVoidOutputFromCallback() { .prompt() .user("Welcome %s to the library".formatted("James Bond")) .tools(FunctionToolCallback.builder("welcomeUser", (user) -> { - logger.info("CALLBACK - Welcoming " + ((User) user).name() + " to the library"); + logger.info("CALLBACK - Welcoming {} to the library", ((User) user).name()); }) .description("Welcome a specific user to the library") .inputType(User.class) @@ -134,7 +134,7 @@ void chatSingleFromBean() { @Test void chatSingleFromCallback() { Function> function = author -> { - logger.info("CALLBACK - Getting books by author: "+ author.name()); + logger.info("CALLBACK - Getting books by author: {}", author.name()); return new BookService().getBooksByAuthor(author); }; var content = ChatClient.builder(this.openAiChatModel) @@ -168,7 +168,7 @@ void chatListFromBean() { @Test void chatListFromCallback() { Function> function = books -> { - logger.info("CALLBACK - Getting authors by books: "+ books.books().stream().map(Book::title).toList()); + logger.info("CALLBACK - Getting authors by books: {}", books.books().stream().map(Book::title).toList()); return new BookService().getAuthorsByBook(books.books()); }; var content = ChatClient.builder(this.openAiChatModel) @@ -195,7 +195,7 @@ static class Tools { public static final String WELCOME_USER = "welcomeUser"; - private static final LogAccessor logger = new LogAccessor(Tools.class); + private static final Logger logger = LoggerFactory.getLogger(Tools.class); private final BookService bookService = new BookService(); @@ -208,7 +208,7 @@ Consumer welcome() { @Bean(WELCOME_USER) @Description("Welcome a specific user to the library") Consumer welcomeUser() { - return user -> logger.info("Welcoming "+ user.name() +" to the library"); + return user -> logger.info("Welcoming {} to the library", user.name()); } @Bean(BOOKS_BY_AUTHOR) @@ -224,7 +224,7 @@ Function> booksByAuthor() { @Description("Get the list of authors who wrote the given books available in the library") Function> authorsByBooks() { return books -> { - logger.info("Getting authors by books: "+ books.books().stream().map(Book::title).toList()); + logger.info("Getting authors by books: {}", books.books().stream().map(Book::title).toList()); return bookService.getAuthorsByBook(books.books()); }; } diff --git a/spring-ai-integration-tests/src/test/java/org/springframework/ai/integration/tests/tool/MethodToolCallbackTests.java b/spring-ai-integration-tests/src/test/java/org/springframework/ai/integration/tests/tool/MethodToolCallbackTests.java index c8175d902eb..d0222c6e0a0 100644 --- a/spring-ai-integration-tests/src/test/java/org/springframework/ai/integration/tests/tool/MethodToolCallbackTests.java +++ b/spring-ai-integration-tests/src/test/java/org/springframework/ai/integration/tests/tool/MethodToolCallbackTests.java @@ -16,13 +16,10 @@ package org.springframework.ai.integration.tests.tool; -import java.util.List; -import java.util.Map; -import java.util.concurrent.ConcurrentHashMap; - import org.junit.jupiter.api.Test; import org.junit.jupiter.api.condition.EnabledIfEnvironmentVariable; - +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import org.springframework.ai.chat.client.ChatClient; import org.springframework.ai.integration.tests.TestApplication; import org.springframework.ai.integration.tests.tool.domain.Author; @@ -34,7 +31,10 @@ import org.springframework.ai.tool.method.MethodToolCallback; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; -import org.springframework.core.log.LogAccessor; + +import java.util.List; +import java.util.Map; +import java.util.concurrent.ConcurrentHashMap; import static org.assertj.core.api.Assertions.assertThat; @@ -129,7 +129,7 @@ void chatMethodCallbackDefault() { static class Tools { - private static final LogAccessor logger = new LogAccessor(Tools.class); + private static final Logger logger = LoggerFactory.getLogger(Tools.class); private final BookService bookService; @@ -144,18 +144,18 @@ void welcome() { @Tool(description = "Welcome a specific user to the library") void welcomeUser(String user) { - logger.info("Welcoming " + user + " to the library"); + logger.info("Welcoming {} to the library", user); } @Tool(description = "Get the list of books written by the given author available in the library") List booksByAuthor(String author) { - logger.info("Getting books by author: " + author); + logger.info("Getting books by author: {}", author); return bookService.getBooksByAuthor(new Author(author)); } @Tool(description = "Get the list of authors who wrote the given books available in the library") List authorsByBooks(List books) { - logger.info("Getting authors by books: " + String.join(", ", books)); + logger.info("Getting authors by books: {}", String.join(", ", books)); return bookService.getAuthorsByBook(books.stream().map(b -> new Book(b, "")).toList()); } diff --git a/spring-ai-integration-tests/src/test/java/org/springframework/ai/integration/tests/tool/ToolCallingManagerTests.java b/spring-ai-integration-tests/src/test/java/org/springframework/ai/integration/tests/tool/ToolCallingManagerTests.java index 34fc1887f58..b28f1312f4a 100644 --- a/spring-ai-integration-tests/src/test/java/org/springframework/ai/integration/tests/tool/ToolCallingManagerTests.java +++ b/spring-ai-integration-tests/src/test/java/org/springframework/ai/integration/tests/tool/ToolCallingManagerTests.java @@ -18,9 +18,10 @@ import java.util.List; -import org.apache.commons.logging.LogFactory; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.condition.EnabledIfEnvironmentVariable; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import reactor.core.publisher.Flux; import org.springframework.ai.chat.messages.Message; @@ -41,7 +42,6 @@ import org.springframework.ai.tool.annotation.Tool; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; -import org.springframework.core.log.LogAccessor; import static org.assertj.core.api.Assertions.assertThat; @@ -144,13 +144,13 @@ private void runExplicitToolCallingExecutionWithOptionsStream(ChatOptions chatOp static class Tools { - private static final LogAccessor logger = new LogAccessor(LogFactory.getLog(Tools.class)); + private static final Logger logger = LoggerFactory.getLogger(Tools.class); private final BookService bookService = new BookService(); @Tool(description = "Get the list of books written by the given author available in the library") List booksByAuthor(String author) { - logger.info("Getting books by author: " + author); + logger.info("Getting books by author: {}", author); return bookService.getBooksByAuthor(new Author(author)); } diff --git a/spring-ai-retry/src/main/java/org/springframework/ai/retry/RetryUtils.java b/spring-ai-retry/src/main/java/org/springframework/ai/retry/RetryUtils.java index 5ae5c327c33..960382d5c96 100644 --- a/spring-ai-retry/src/main/java/org/springframework/ai/retry/RetryUtils.java +++ b/spring-ai-retry/src/main/java/org/springframework/ai/retry/RetryUtils.java @@ -20,9 +20,9 @@ import java.nio.charset.StandardCharsets; import java.time.Duration; -import org.apache.commons.logging.LogFactory; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; -import org.springframework.core.log.LogAccessor; import org.springframework.http.client.ClientHttpResponse; import org.springframework.lang.NonNull; import org.springframework.retry.RetryCallback; @@ -41,8 +41,6 @@ */ public abstract class RetryUtils { - private static final LogAccessor logger = new LogAccessor(LogFactory.getLog(RetryUtils.class)); - public static final ResponseErrorHandler DEFAULT_RESPONSE_ERROR_HANDLER = new ResponseErrorHandler() { @Override @@ -69,6 +67,8 @@ public void handleError(@NonNull ClientHttpResponse response) throws IOException } }; + private static final Logger logger = LoggerFactory.getLogger(RetryUtils.class); + public static final RetryTemplate DEFAULT_RETRY_TEMPLATE = RetryTemplate.builder() .maxAttempts(10) .retryOn(TransientAiException.class) @@ -78,7 +78,7 @@ public void handleError(@NonNull ClientHttpResponse response) throws IOException @Override public void onError(RetryContext context, RetryCallback callback, Throwable throwable) { - logger.warn(throwable, "Retry error. Retry count:" + context.getRetryCount()); + logger.warn("Retry error. Retry count:" + context.getRetryCount(), throwable); } }) .build(); diff --git a/spring-ai-spring-boot-autoconfigure/src/main/java/org/springframework/ai/autoconfigure/chat/client/ChatClientAutoConfiguration.java b/spring-ai-spring-boot-autoconfigure/src/main/java/org/springframework/ai/autoconfigure/chat/client/ChatClientAutoConfiguration.java index d1e44c569a2..f815dde2e37 100644 --- a/spring-ai-spring-boot-autoconfigure/src/main/java/org/springframework/ai/autoconfigure/chat/client/ChatClientAutoConfiguration.java +++ b/spring-ai-spring-boot-autoconfigure/src/main/java/org/springframework/ai/autoconfigure/chat/client/ChatClientAutoConfiguration.java @@ -17,6 +17,8 @@ package org.springframework.ai.autoconfigure.chat.client; import io.micrometer.observation.ObservationRegistry; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import org.springframework.ai.chat.client.ChatClient; import org.springframework.ai.chat.client.ChatClientCustomizer; @@ -32,7 +34,6 @@ import org.springframework.boot.context.properties.EnableConfigurationProperties; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Scope; -import org.springframework.core.log.LogAccessor; /** * {@link EnableAutoConfiguration Auto-configuration} for {@link ChatClient}. @@ -55,7 +56,7 @@ matchIfMissing = true) public class ChatClientAutoConfiguration { - private static final LogAccessor logger = new LogAccessor(ChatClientAutoConfiguration.class); + private static final Logger logger = LoggerFactory.getLogger(ChatClientAutoConfiguration.class); @Bean @ConditionalOnMissingBean diff --git a/spring-ai-spring-boot-autoconfigure/src/main/java/org/springframework/ai/autoconfigure/chat/memory/cassandra/CassandraChatMemoryProperties.java b/spring-ai-spring-boot-autoconfigure/src/main/java/org/springframework/ai/autoconfigure/chat/memory/cassandra/CassandraChatMemoryProperties.java index a69f2d8e4b5..96a4c4ee325 100644 --- a/spring-ai-spring-boot-autoconfigure/src/main/java/org/springframework/ai/autoconfigure/chat/memory/cassandra/CassandraChatMemoryProperties.java +++ b/spring-ai-spring-boot-autoconfigure/src/main/java/org/springframework/ai/autoconfigure/chat/memory/cassandra/CassandraChatMemoryProperties.java @@ -18,10 +18,12 @@ import java.time.Duration; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + import org.springframework.ai.autoconfigure.chat.memory.CommonChatMemoryProperties; import org.springframework.ai.chat.memory.cassandra.CassandraChatMemoryConfig; import org.springframework.boot.context.properties.ConfigurationProperties; -import org.springframework.core.log.LogAccessor; import org.springframework.lang.Nullable; /** @@ -36,7 +38,7 @@ public class CassandraChatMemoryProperties extends CommonChatMemoryProperties { public static final String CONFIG_PREFIX = "spring.ai.chat.memory.cassandra"; - private static final LogAccessor logger = new LogAccessor(CassandraChatMemoryProperties.class); + private static final Logger logger = LoggerFactory.getLogger(CassandraChatMemoryProperties.class); private String keyspace = CassandraChatMemoryConfig.DEFAULT_KEYSPACE_NAME; diff --git a/spring-ai-spring-boot-autoconfigure/src/main/java/org/springframework/ai/autoconfigure/chat/observation/ChatObservationAutoConfiguration.java b/spring-ai-spring-boot-autoconfigure/src/main/java/org/springframework/ai/autoconfigure/chat/observation/ChatObservationAutoConfiguration.java index 0349773f11a..f439263fdad 100644 --- a/spring-ai-spring-boot-autoconfigure/src/main/java/org/springframework/ai/autoconfigure/chat/observation/ChatObservationAutoConfiguration.java +++ b/spring-ai-spring-boot-autoconfigure/src/main/java/org/springframework/ai/autoconfigure/chat/observation/ChatObservationAutoConfiguration.java @@ -21,6 +21,8 @@ import io.micrometer.core.instrument.MeterRegistry; import io.micrometer.tracing.Tracer; import io.micrometer.tracing.otel.bridge.OtelTracer; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import org.springframework.ai.chat.client.advisor.observation.AdvisorObservationContext; import org.springframework.ai.chat.client.observation.ChatClientObservationContext; @@ -45,7 +47,6 @@ import org.springframework.boot.context.properties.EnableConfigurationProperties; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; -import org.springframework.core.log.LogAccessor; /** * Auto-configuration for Spring AI chat model observations. @@ -59,7 +60,7 @@ @EnableConfigurationProperties({ ChatObservationProperties.class }) public class ChatObservationAutoConfiguration { - private static final LogAccessor logger = new LogAccessor(ChatObservationAutoConfiguration.class); + private static final Logger logger = LoggerFactory.getLogger(ChatObservationAutoConfiguration.class); private static void logPromptContentWarning() { logger.warn( diff --git a/spring-ai-spring-boot-autoconfigure/src/main/java/org/springframework/ai/autoconfigure/image/observation/ImageObservationAutoConfiguration.java b/spring-ai-spring-boot-autoconfigure/src/main/java/org/springframework/ai/autoconfigure/image/observation/ImageObservationAutoConfiguration.java index 971b7d4f145..a89a42102a3 100644 --- a/spring-ai-spring-boot-autoconfigure/src/main/java/org/springframework/ai/autoconfigure/image/observation/ImageObservationAutoConfiguration.java +++ b/spring-ai-spring-boot-autoconfigure/src/main/java/org/springframework/ai/autoconfigure/image/observation/ImageObservationAutoConfiguration.java @@ -1,5 +1,5 @@ /* - * Copyright 2023-2025 the original author or authors. + * Copyright 2023-2024 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -16,6 +16,9 @@ package org.springframework.ai.autoconfigure.image.observation; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + import org.springframework.ai.image.ImageModel; import org.springframework.ai.image.observation.ImageModelPromptContentObservationFilter; import org.springframework.boot.autoconfigure.AutoConfiguration; @@ -24,7 +27,6 @@ import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; import org.springframework.boot.context.properties.EnableConfigurationProperties; import org.springframework.context.annotation.Bean; -import org.springframework.core.log.LogAccessor; /** * Auto-configuration for Spring AI image model observations. @@ -38,7 +40,7 @@ @EnableConfigurationProperties({ ImageObservationProperties.class }) public class ImageObservationAutoConfiguration { - private static final LogAccessor logger = new LogAccessor(ImageObservationAutoConfiguration.class); + private static final Logger logger = LoggerFactory.getLogger(ImageObservationAutoConfiguration.class); @Bean @ConditionalOnMissingBean diff --git a/spring-ai-spring-boot-autoconfigure/src/main/java/org/springframework/ai/autoconfigure/retry/SpringAiRetryAutoConfiguration.java b/spring-ai-spring-boot-autoconfigure/src/main/java/org/springframework/ai/autoconfigure/retry/SpringAiRetryAutoConfiguration.java index dd4103755c5..b17b4bfc871 100644 --- a/spring-ai-spring-boot-autoconfigure/src/main/java/org/springframework/ai/autoconfigure/retry/SpringAiRetryAutoConfiguration.java +++ b/spring-ai-spring-boot-autoconfigure/src/main/java/org/springframework/ai/autoconfigure/retry/SpringAiRetryAutoConfiguration.java @@ -19,6 +19,9 @@ import java.io.IOException; import java.nio.charset.StandardCharsets; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + import org.springframework.ai.retry.NonTransientAiException; import org.springframework.ai.retry.RetryUtils; import org.springframework.ai.retry.TransientAiException; @@ -27,7 +30,6 @@ import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean; import org.springframework.boot.context.properties.EnableConfigurationProperties; import org.springframework.context.annotation.Bean; -import org.springframework.core.log.LogAccessor; import org.springframework.http.client.ClientHttpResponse; import org.springframework.lang.NonNull; import org.springframework.retry.RetryCallback; @@ -48,7 +50,7 @@ @EnableConfigurationProperties({ SpringAiRetryProperties.class }) public class SpringAiRetryAutoConfiguration { - private static final LogAccessor logger = new LogAccessor(SpringAiRetryAutoConfiguration.class); + private static final Logger logger = LoggerFactory.getLogger(SpringAiRetryAutoConfiguration.class); @Bean @ConditionalOnMissingBean @@ -63,7 +65,7 @@ public RetryTemplate retryTemplate(SpringAiRetryProperties properties) { @Override public void onError(RetryContext context, RetryCallback callback, Throwable throwable) { - logger.warn(throwable, "Retry error. Retry count:" + context.getRetryCount()); + logger.warn("Retry error. Retry count:" + context.getRetryCount(), throwable); } }) .build(); diff --git a/spring-ai-spring-boot-autoconfigure/src/main/java/org/springframework/ai/autoconfigure/vectorstore/cassandra/CassandraVectorStoreProperties.java b/spring-ai-spring-boot-autoconfigure/src/main/java/org/springframework/ai/autoconfigure/vectorstore/cassandra/CassandraVectorStoreProperties.java index 49b42ba2a2c..19174772f6b 100644 --- a/spring-ai-spring-boot-autoconfigure/src/main/java/org/springframework/ai/autoconfigure/vectorstore/cassandra/CassandraVectorStoreProperties.java +++ b/spring-ai-spring-boot-autoconfigure/src/main/java/org/springframework/ai/autoconfigure/vectorstore/cassandra/CassandraVectorStoreProperties.java @@ -1,5 +1,5 @@ /* - * Copyright 2023-2025 the original author or authors. + * Copyright 2023-2024 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -17,12 +17,12 @@ package org.springframework.ai.autoconfigure.vectorstore.cassandra; import com.google.api.client.util.Preconditions; -import org.apache.commons.logging.LogFactory; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import org.springframework.ai.autoconfigure.vectorstore.CommonVectorStoreProperties; import org.springframework.ai.vectorstore.cassandra.CassandraVectorStore; import org.springframework.boot.context.properties.ConfigurationProperties; -import org.springframework.core.log.LogAccessor; /** * Configuration properties for Cassandra Vector Store. @@ -35,7 +35,7 @@ public class CassandraVectorStoreProperties extends CommonVectorStoreProperties public static final String CONFIG_PREFIX = "spring.ai.vectorstore.cassandra"; - private static final LogAccessor logger = new LogAccessor(LogFactory.getLog(CassandraVectorStoreProperties.class)); + private static final Logger logger = LoggerFactory.getLogger(CassandraVectorStoreProperties.class); private String keyspace = CassandraVectorStore.DEFAULT_KEYSPACE_NAME; diff --git a/spring-ai-spring-boot-autoconfigure/src/main/java/org/springframework/ai/autoconfigure/vectorstore/observation/VectorStoreObservationAutoConfiguration.java b/spring-ai-spring-boot-autoconfigure/src/main/java/org/springframework/ai/autoconfigure/vectorstore/observation/VectorStoreObservationAutoConfiguration.java index 7b2561c7149..b69a48e1beb 100644 --- a/spring-ai-spring-boot-autoconfigure/src/main/java/org/springframework/ai/autoconfigure/vectorstore/observation/VectorStoreObservationAutoConfiguration.java +++ b/spring-ai-spring-boot-autoconfigure/src/main/java/org/springframework/ai/autoconfigure/vectorstore/observation/VectorStoreObservationAutoConfiguration.java @@ -17,7 +17,8 @@ package org.springframework.ai.autoconfigure.vectorstore.observation; import io.micrometer.tracing.otel.bridge.OtelTracer; -import org.apache.commons.logging.LogFactory; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import org.springframework.ai.vectorstore.VectorStore; import org.springframework.ai.vectorstore.observation.VectorStoreQueryResponseObservationFilter; @@ -31,7 +32,6 @@ import org.springframework.boot.context.properties.EnableConfigurationProperties; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; -import org.springframework.core.log.LogAccessor; /** * Auto-configuration for Spring AI vector store observations. @@ -46,8 +46,7 @@ @EnableConfigurationProperties({ VectorStoreObservationProperties.class }) public class VectorStoreObservationAutoConfiguration { - private static final LogAccessor logger = new LogAccessor( - LogFactory.getLog(VectorStoreObservationAutoConfiguration.class)); + private static final Logger logger = LoggerFactory.getLogger(VectorStoreObservationAutoConfiguration.class); private static void logQueryResponseContentWarning() { logger.warn( diff --git a/spring-ai-spring-boot-autoconfigure/src/test/java/org/springframework/ai/autoconfigure/anthropic/AnthropicAutoConfigurationIT.java b/spring-ai-spring-boot-autoconfigure/src/test/java/org/springframework/ai/autoconfigure/anthropic/AnthropicAutoConfigurationIT.java index b4084ac0ba0..5b41f15aee7 100644 --- a/spring-ai-spring-boot-autoconfigure/src/test/java/org/springframework/ai/autoconfigure/anthropic/AnthropicAutoConfigurationIT.java +++ b/spring-ai-spring-boot-autoconfigure/src/test/java/org/springframework/ai/autoconfigure/anthropic/AnthropicAutoConfigurationIT.java @@ -19,6 +19,8 @@ import java.util.List; import java.util.stream.Collectors; +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.condition.EnabledIfEnvironmentVariable; import reactor.core.publisher.Flux; @@ -33,14 +35,13 @@ import org.springframework.ai.chat.prompt.Prompt; import org.springframework.boot.autoconfigure.AutoConfigurations; import org.springframework.boot.test.context.runner.ApplicationContextRunner; -import org.springframework.core.log.LogAccessor; import static org.assertj.core.api.Assertions.assertThat; @EnabledIfEnvironmentVariable(named = "ANTHROPIC_API_KEY", matches = ".*") public class AnthropicAutoConfigurationIT { - private static final LogAccessor logger = new LogAccessor(AnthropicAutoConfigurationIT.class); + private static final Log logger = LogFactory.getLog(AnthropicAutoConfigurationIT.class); private final ApplicationContextRunner contextRunner = new ApplicationContextRunner() .withPropertyValues("spring.ai.anthropic.apiKey=" + System.getenv("ANTHROPIC_API_KEY")) diff --git a/spring-ai-spring-boot-autoconfigure/src/test/java/org/springframework/ai/autoconfigure/anthropic/tool/FunctionCallWithFunctionBeanIT.java b/spring-ai-spring-boot-autoconfigure/src/test/java/org/springframework/ai/autoconfigure/anthropic/tool/FunctionCallWithFunctionBeanIT.java index ee110e5541e..51e9e39be2f 100644 --- a/spring-ai-spring-boot-autoconfigure/src/test/java/org/springframework/ai/autoconfigure/anthropic/tool/FunctionCallWithFunctionBeanIT.java +++ b/spring-ai-spring-boot-autoconfigure/src/test/java/org/springframework/ai/autoconfigure/anthropic/tool/FunctionCallWithFunctionBeanIT.java @@ -21,6 +21,8 @@ import org.junit.jupiter.api.Test; import org.junit.jupiter.api.condition.EnabledIfEnvironmentVariable; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import org.springframework.ai.anthropic.AnthropicChatModel; import org.springframework.ai.anthropic.AnthropicChatOptions; @@ -37,14 +39,13 @@ import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.Description; -import org.springframework.core.log.LogAccessor; import static org.assertj.core.api.Assertions.assertThat; @EnabledIfEnvironmentVariable(named = "ANTHROPIC_API_KEY", matches = ".*") class FunctionCallWithFunctionBeanIT { - private final LogAccessor logger = new LogAccessor(FunctionCallWithFunctionBeanIT.class); + private final Logger logger = LoggerFactory.getLogger(FunctionCallWithFunctionBeanIT.class); private final ApplicationContextRunner contextRunner = new ApplicationContextRunner() .withPropertyValues("spring.ai.anthropic.apiKey=" + System.getenv("ANTHROPIC_API_KEY")) @@ -67,14 +68,14 @@ void functionCallTest() { ChatResponse response = chatModel.call(new Prompt(List.of(userMessage), AnthropicChatOptions.builder().function("weatherFunction").build())); - logger.info("Response: " + response); + logger.info("Response: {}", response); assertThat(response.getResult().getOutput().getText()).contains("30", "10", "15"); response = chatModel.call(new Prompt(List.of(userMessage), AnthropicChatOptions.builder().function("weatherFunction3").build())); - logger.info("Response: " + response); + logger.info("Response: {}", response); assertThat(response.getResult().getOutput().getText()).contains("30", "10", "15"); @@ -97,7 +98,7 @@ void functionCallWithPortableFunctionCallingOptions() { ChatResponse response = chatModel.call(new Prompt(List.of(userMessage), FunctionCallingOptions.builder().function("weatherFunction").build())); - logger.info("Response: " + response); + logger.info("Response: {}", response); assertThat(response.getResult().getOutput().getText()).contains("30", "10", "15"); }); diff --git a/spring-ai-spring-boot-autoconfigure/src/test/java/org/springframework/ai/autoconfigure/anthropic/tool/FunctionCallWithPromptFunctionIT.java b/spring-ai-spring-boot-autoconfigure/src/test/java/org/springframework/ai/autoconfigure/anthropic/tool/FunctionCallWithPromptFunctionIT.java index 8ad18487b48..8121991e93d 100644 --- a/spring-ai-spring-boot-autoconfigure/src/test/java/org/springframework/ai/autoconfigure/anthropic/tool/FunctionCallWithPromptFunctionIT.java +++ b/spring-ai-spring-boot-autoconfigure/src/test/java/org/springframework/ai/autoconfigure/anthropic/tool/FunctionCallWithPromptFunctionIT.java @@ -20,6 +20,8 @@ import org.junit.jupiter.api.Test; import org.junit.jupiter.api.condition.EnabledIfEnvironmentVariable; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import org.springframework.ai.anthropic.AnthropicChatModel; import org.springframework.ai.anthropic.AnthropicChatOptions; @@ -31,14 +33,13 @@ import org.springframework.ai.tool.function.FunctionToolCallback; import org.springframework.boot.autoconfigure.AutoConfigurations; import org.springframework.boot.test.context.runner.ApplicationContextRunner; -import org.springframework.core.log.LogAccessor; import static org.assertj.core.api.Assertions.assertThat; @EnabledIfEnvironmentVariable(named = "ANTHROPIC_API_KEY", matches = ".*") public class FunctionCallWithPromptFunctionIT { - private static final LogAccessor logger = new LogAccessor(FunctionCallWithPromptFunctionIT.class); + private final Logger logger = LoggerFactory.getLogger(FunctionCallWithPromptFunctionIT.class); private final ApplicationContextRunner contextRunner = new ApplicationContextRunner() .withPropertyValues("spring.ai.anthropic.apiKey=" + System.getenv("ANTHROPIC_API_KEY")) @@ -66,7 +67,7 @@ void functionCallTest() { ChatResponse response = chatModel.call(new Prompt(List.of(userMessage), promptOptions)); - logger.info("Response: " + response); + logger.info("Response: {}", response); assertThat(response.getResult().getOutput().getText()).contains("30", "10", "15"); }); diff --git a/spring-ai-spring-boot-autoconfigure/src/test/java/org/springframework/ai/autoconfigure/azure/tool/FunctionCallWithFunctionBeanIT.java b/spring-ai-spring-boot-autoconfigure/src/test/java/org/springframework/ai/autoconfigure/azure/tool/FunctionCallWithFunctionBeanIT.java index f3d6747abfc..454f91b75da 100644 --- a/spring-ai-spring-boot-autoconfigure/src/test/java/org/springframework/ai/autoconfigure/azure/tool/FunctionCallWithFunctionBeanIT.java +++ b/spring-ai-spring-boot-autoconfigure/src/test/java/org/springframework/ai/autoconfigure/azure/tool/FunctionCallWithFunctionBeanIT.java @@ -21,6 +21,8 @@ import org.junit.jupiter.api.Test; import org.junit.jupiter.api.condition.EnabledIfEnvironmentVariable; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import org.springframework.ai.autoconfigure.azure.openai.AzureOpenAiAutoConfiguration; import org.springframework.ai.azure.openai.AzureOpenAiChatModel; @@ -35,7 +37,6 @@ import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.Description; -import org.springframework.core.log.LogAccessor; import static org.assertj.core.api.Assertions.assertThat; @@ -43,7 +44,7 @@ @EnabledIfEnvironmentVariable(named = "AZURE_OPENAI_ENDPOINT", matches = ".+") class FunctionCallWithFunctionBeanIT { - private static final LogAccessor logger = new LogAccessor(FunctionCallWithFunctionBeanIT.class); + private final Logger logger = LoggerFactory.getLogger(FunctionCallWithFunctionBeanIT.class); private final ApplicationContextRunner contextRunner = new ApplicationContextRunner().withPropertyValues( // @formatter:off @@ -68,14 +69,14 @@ void functionCallTest() { ChatResponse response = chatModel.call(new Prompt(List.of(userMessage), AzureOpenAiChatOptions.builder().function("weatherFunction").build())); - logger.info("Response: " + response); + logger.info("Response: {}", response); assertThat(response.getResult().getOutput().getText()).contains("30", "10", "15"); response = chatModel.call(new Prompt(List.of(userMessage), AzureOpenAiChatOptions.builder().function("weatherFunction3").build())); - logger.info("Response: " + response); + logger.info("Response: {}", response); assertThat(response.getResult().getOutput().getText()).contains("30", "10", "15"); @@ -97,7 +98,7 @@ void functionCallWithPortableFunctionCallingOptions() { ChatResponse response = chatModel.call(new Prompt(List.of(userMessage), ToolCallingChatOptions.builder().tools("weatherFunction").build())); - logger.info("Response: " + response); + logger.info("Response: {}", response); assertThat(response.getResult().getOutput().getText()).contains("30", "10", "15"); diff --git a/spring-ai-spring-boot-autoconfigure/src/test/java/org/springframework/ai/autoconfigure/azure/tool/FunctionCallWithFunctionWrapperIT.java b/spring-ai-spring-boot-autoconfigure/src/test/java/org/springframework/ai/autoconfigure/azure/tool/FunctionCallWithFunctionWrapperIT.java index 05d5e53e78b..7df9cc89d80 100644 --- a/spring-ai-spring-boot-autoconfigure/src/test/java/org/springframework/ai/autoconfigure/azure/tool/FunctionCallWithFunctionWrapperIT.java +++ b/spring-ai-spring-boot-autoconfigure/src/test/java/org/springframework/ai/autoconfigure/azure/tool/FunctionCallWithFunctionWrapperIT.java @@ -20,6 +20,8 @@ import org.junit.jupiter.api.Test; import org.junit.jupiter.api.condition.EnabledIfEnvironmentVariable; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import org.springframework.ai.autoconfigure.azure.openai.AzureOpenAiAutoConfiguration; import org.springframework.ai.azure.openai.AzureOpenAiChatModel; @@ -33,7 +35,6 @@ import org.springframework.boot.test.context.runner.ApplicationContextRunner; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; -import org.springframework.core.log.LogAccessor; import static org.assertj.core.api.Assertions.assertThat; @@ -41,7 +42,7 @@ @EnabledIfEnvironmentVariable(named = "AZURE_OPENAI_ENDPOINT", matches = ".+") public class FunctionCallWithFunctionWrapperIT { - private static final LogAccessor logger = new LogAccessor(FunctionCallWithFunctionWrapperIT.class); + private final Logger logger = LoggerFactory.getLogger(FunctionCallWithFunctionWrapperIT.class); private final ApplicationContextRunner contextRunner = new ApplicationContextRunner().withPropertyValues( // @formatter:off @@ -66,7 +67,7 @@ void functionCallTest() { ChatResponse response = chatModel.call(new Prompt(List.of(userMessage), AzureOpenAiChatOptions.builder().function("WeatherInfo").build())); - logger.info("Response: " + response); + logger.info("Response: {}", response); assertThat(response.getResult().getOutput().getText()).containsAnyOf("30", "10", "15"); diff --git a/spring-ai-spring-boot-autoconfigure/src/test/java/org/springframework/ai/autoconfigure/azure/tool/FunctionCallWithPromptFunctionIT.java b/spring-ai-spring-boot-autoconfigure/src/test/java/org/springframework/ai/autoconfigure/azure/tool/FunctionCallWithPromptFunctionIT.java index 7c17288a4f0..8a50160dc77 100644 --- a/spring-ai-spring-boot-autoconfigure/src/test/java/org/springframework/ai/autoconfigure/azure/tool/FunctionCallWithPromptFunctionIT.java +++ b/spring-ai-spring-boot-autoconfigure/src/test/java/org/springframework/ai/autoconfigure/azure/tool/FunctionCallWithPromptFunctionIT.java @@ -20,6 +20,8 @@ import org.junit.jupiter.api.Test; import org.junit.jupiter.api.condition.EnabledIfEnvironmentVariable; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import org.springframework.ai.autoconfigure.azure.openai.AzureOpenAiAutoConfiguration; import org.springframework.ai.azure.openai.AzureOpenAiChatModel; @@ -30,7 +32,6 @@ import org.springframework.ai.tool.function.FunctionToolCallback; import org.springframework.boot.autoconfigure.AutoConfigurations; import org.springframework.boot.test.context.runner.ApplicationContextRunner; -import org.springframework.core.log.LogAccessor; import static org.assertj.core.api.Assertions.assertThat; @@ -38,7 +39,7 @@ @EnabledIfEnvironmentVariable(named = "AZURE_OPENAI_ENDPOINT", matches = ".+") public class FunctionCallWithPromptFunctionIT { - private final LogAccessor logger = new LogAccessor(FunctionCallWithPromptFunctionIT.class); + private final Logger logger = LoggerFactory.getLogger(FunctionCallWithPromptFunctionIT.class); private final ApplicationContextRunner contextRunner = new ApplicationContextRunner().withPropertyValues( // @formatter:off @@ -69,7 +70,7 @@ void functionCallTest() { ChatResponse response = chatModel.call(new Prompt(List.of(userMessage), promptOptions)); - logger.info("Response: " + response); + logger.info("Response: {}", response); assertThat(response.getResult().getOutput().getText()).contains("30", "10", "15"); }); diff --git a/spring-ai-spring-boot-autoconfigure/src/test/java/org/springframework/ai/autoconfigure/bedrock/converse/BedrockConverseProxyChatAutoConfigurationIT.java b/spring-ai-spring-boot-autoconfigure/src/test/java/org/springframework/ai/autoconfigure/bedrock/converse/BedrockConverseProxyChatAutoConfigurationIT.java index 8125fa759f8..936f4b59f6e 100644 --- a/spring-ai-spring-boot-autoconfigure/src/test/java/org/springframework/ai/autoconfigure/bedrock/converse/BedrockConverseProxyChatAutoConfigurationIT.java +++ b/spring-ai-spring-boot-autoconfigure/src/test/java/org/springframework/ai/autoconfigure/bedrock/converse/BedrockConverseProxyChatAutoConfigurationIT.java @@ -19,6 +19,8 @@ import java.util.List; import java.util.stream.Collectors; +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; import org.junit.jupiter.api.Test; import reactor.core.publisher.Flux; @@ -32,14 +34,13 @@ import org.springframework.ai.chat.prompt.Prompt; import org.springframework.boot.autoconfigure.AutoConfigurations; import org.springframework.boot.test.context.runner.ApplicationContextRunner; -import org.springframework.core.log.LogAccessor; import static org.assertj.core.api.Assertions.assertThat; @RequiresAwsCredentials public class BedrockConverseProxyChatAutoConfigurationIT { - private static final LogAccessor logger = new LogAccessor(BedrockConverseProxyChatAutoConfigurationIT.class); + private static final Log logger = LogFactory.getLog(BedrockConverseProxyChatAutoConfigurationIT.class); private final ApplicationContextRunner contextRunner = BedrockTestUtils.getContextRunner() .withPropertyValues( diff --git a/spring-ai-spring-boot-autoconfigure/src/test/java/org/springframework/ai/autoconfigure/bedrock/converse/tool/FunctionCallWithFunctionBeanIT.java b/spring-ai-spring-boot-autoconfigure/src/test/java/org/springframework/ai/autoconfigure/bedrock/converse/tool/FunctionCallWithFunctionBeanIT.java index 364ef52f234..9a34b961347 100644 --- a/spring-ai-spring-boot-autoconfigure/src/test/java/org/springframework/ai/autoconfigure/bedrock/converse/tool/FunctionCallWithFunctionBeanIT.java +++ b/spring-ai-spring-boot-autoconfigure/src/test/java/org/springframework/ai/autoconfigure/bedrock/converse/tool/FunctionCallWithFunctionBeanIT.java @@ -21,6 +21,8 @@ import java.util.stream.Collectors; import org.junit.jupiter.api.Test; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import reactor.core.publisher.Flux; import org.springframework.ai.autoconfigure.bedrock.BedrockTestUtils; @@ -36,14 +38,13 @@ import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.Description; -import org.springframework.core.log.LogAccessor; import static org.assertj.core.api.Assertions.assertThat; @RequiresAwsCredentials class FunctionCallWithFunctionBeanIT { - private static final LogAccessor logger = new LogAccessor(FunctionCallWithFunctionBeanIT.class); + private final Logger logger = LoggerFactory.getLogger(FunctionCallWithFunctionBeanIT.class); private final ApplicationContextRunner contextRunner = BedrockTestUtils.getContextRunner() .withConfiguration(AutoConfigurations.of(BedrockConverseProxyChatAutoConfiguration.class)) @@ -65,14 +66,14 @@ void functionCallTest() { ChatResponse response = chatModel.call(new Prompt(List.of(userMessage), ToolCallingChatOptions.builder().tools("weatherFunction").build())); - logger.info("Response: " + response); + logger.info("Response: {}", response); assertThat(response.getResult().getOutput().getText()).contains("30", "10", "15"); response = chatModel.call(new Prompt(List.of(userMessage), ToolCallingChatOptions.builder().tools("weatherFunction3").build())); - logger.info("Response: " + response); + logger.info("Response: {}", response); assertThat(response.getResult().getOutput().getText()).contains("30", "10", "15"); }); @@ -101,7 +102,7 @@ void functionStreamTest() { .map(cr -> cr.getResult().getOutput().getText()) .collect(Collectors.joining()); - logger.info("Response: " + content); + logger.info("Response: {}", content); assertThat(content).contains("30", "10", "15"); }); diff --git a/spring-ai-spring-boot-autoconfigure/src/test/java/org/springframework/ai/autoconfigure/bedrock/converse/tool/FunctionCallWithPromptFunctionIT.java b/spring-ai-spring-boot-autoconfigure/src/test/java/org/springframework/ai/autoconfigure/bedrock/converse/tool/FunctionCallWithPromptFunctionIT.java index b8f6433edb3..62af91d2996 100644 --- a/spring-ai-spring-boot-autoconfigure/src/test/java/org/springframework/ai/autoconfigure/bedrock/converse/tool/FunctionCallWithPromptFunctionIT.java +++ b/spring-ai-spring-boot-autoconfigure/src/test/java/org/springframework/ai/autoconfigure/bedrock/converse/tool/FunctionCallWithPromptFunctionIT.java @@ -19,6 +19,8 @@ import java.util.List; import org.junit.jupiter.api.Test; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import org.springframework.ai.autoconfigure.bedrock.BedrockTestUtils; import org.springframework.ai.autoconfigure.bedrock.RequiresAwsCredentials; @@ -31,14 +33,13 @@ import org.springframework.ai.tool.function.FunctionToolCallback; import org.springframework.boot.autoconfigure.AutoConfigurations; import org.springframework.boot.test.context.runner.ApplicationContextRunner; -import org.springframework.core.log.LogAccessor; import static org.assertj.core.api.Assertions.assertThat; @RequiresAwsCredentials public class FunctionCallWithPromptFunctionIT { - private static final LogAccessor logger = new LogAccessor(FunctionCallWithPromptFunctionIT.class); + private final Logger logger = LoggerFactory.getLogger(FunctionCallWithPromptFunctionIT.class); private final ApplicationContextRunner contextRunner = BedrockTestUtils.getContextRunner() .withConfiguration(AutoConfigurations.of(BedrockConverseProxyChatAutoConfiguration.class)); @@ -65,7 +66,7 @@ void functionCallTest() { ChatResponse response = chatModel.call(new Prompt(List.of(userMessage), promptOptions)); - logger.info("Response: " + response); + logger.info("Response: {}", response); assertThat(response.getResult().getOutput().getText()).contains("30", "10", "15"); }); diff --git a/spring-ai-spring-boot-autoconfigure/src/test/java/org/springframework/ai/autoconfigure/chat/client/ChatClientAutoConfigurationIT.java b/spring-ai-spring-boot-autoconfigure/src/test/java/org/springframework/ai/autoconfigure/chat/client/ChatClientAutoConfigurationIT.java index 097135a452e..ae04bbd8659 100644 --- a/spring-ai-spring-boot-autoconfigure/src/test/java/org/springframework/ai/autoconfigure/chat/client/ChatClientAutoConfigurationIT.java +++ b/spring-ai-spring-boot-autoconfigure/src/test/java/org/springframework/ai/autoconfigure/chat/client/ChatClientAutoConfigurationIT.java @@ -18,6 +18,8 @@ import java.util.List; +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.condition.EnabledIfEnvironmentVariable; @@ -30,7 +32,6 @@ import org.springframework.boot.test.context.runner.ApplicationContextRunner; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; -import org.springframework.core.log.LogAccessor; import static org.assertj.core.api.Assertions.assertThat; @@ -40,7 +41,7 @@ @EnabledIfEnvironmentVariable(named = "OPENAI_API_KEY", matches = ".*") public class ChatClientAutoConfigurationIT { - private static final LogAccessor logger = new LogAccessor(ChatClientAutoConfigurationIT.class); + private static final Log logger = LogFactory.getLog(ChatClientAutoConfigurationIT.class); private final ApplicationContextRunner contextRunner = new ApplicationContextRunner() .withPropertyValues("spring.ai.openai.apiKey=" + System.getenv("OPENAI_API_KEY"), diff --git a/spring-ai-spring-boot-autoconfigure/src/test/java/org/springframework/ai/autoconfigure/huggingface/HuggingfaceChatAutoConfigurationIT.java b/spring-ai-spring-boot-autoconfigure/src/test/java/org/springframework/ai/autoconfigure/huggingface/HuggingfaceChatAutoConfigurationIT.java index 6bdbddea7e4..e3980a13ab0 100644 --- a/spring-ai-spring-boot-autoconfigure/src/test/java/org/springframework/ai/autoconfigure/huggingface/HuggingfaceChatAutoConfigurationIT.java +++ b/spring-ai-spring-boot-autoconfigure/src/test/java/org/springframework/ai/autoconfigure/huggingface/HuggingfaceChatAutoConfigurationIT.java @@ -19,6 +19,8 @@ import java.util.List; import java.util.stream.Collectors; +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; import org.junit.jupiter.api.Disabled; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.condition.EnabledIfEnvironmentVariable; @@ -32,7 +34,6 @@ import org.springframework.ai.huggingface.HuggingfaceChatModel; import org.springframework.boot.autoconfigure.AutoConfigurations; import org.springframework.boot.test.context.runner.ApplicationContextRunner; -import org.springframework.core.log.LogAccessor; import static org.assertj.core.api.Assertions.assertThat; @@ -40,7 +41,7 @@ @EnabledIfEnvironmentVariable(named = "HUGGINGFACE_CHAT_URL", matches = ".+") public class HuggingfaceChatAutoConfigurationIT { - private static final LogAccessor logger = new LogAccessor(HuggingfaceChatAutoConfigurationIT.class); + private static final Log logger = LogFactory.getLog(HuggingfaceChatAutoConfigurationIT.class); private final ApplicationContextRunner contextRunner = new ApplicationContextRunner().withPropertyValues( // @formatter:off diff --git a/spring-ai-spring-boot-autoconfigure/src/test/java/org/springframework/ai/autoconfigure/minimax/FunctionCallbackInPromptIT.java b/spring-ai-spring-boot-autoconfigure/src/test/java/org/springframework/ai/autoconfigure/minimax/FunctionCallbackInPromptIT.java index 309a12f73a1..5e9c88ad9ff 100644 --- a/spring-ai-spring-boot-autoconfigure/src/test/java/org/springframework/ai/autoconfigure/minimax/FunctionCallbackInPromptIT.java +++ b/spring-ai-spring-boot-autoconfigure/src/test/java/org/springframework/ai/autoconfigure/minimax/FunctionCallbackInPromptIT.java @@ -21,6 +21,8 @@ import org.junit.jupiter.api.Test; import org.junit.jupiter.api.condition.EnabledIfEnvironmentVariable; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import reactor.core.publisher.Flux; import org.springframework.ai.autoconfigure.retry.SpringAiRetryAutoConfiguration; @@ -35,7 +37,6 @@ import org.springframework.boot.autoconfigure.AutoConfigurations; import org.springframework.boot.autoconfigure.web.client.RestClientAutoConfiguration; import org.springframework.boot.test.context.runner.ApplicationContextRunner; -import org.springframework.core.log.LogAccessor; import static org.assertj.core.api.Assertions.assertThat; @@ -45,7 +46,7 @@ @EnabledIfEnvironmentVariable(named = "MINIMAX_API_KEY", matches = ".*") public class FunctionCallbackInPromptIT { - private static final LogAccessor logger = new LogAccessor(FunctionCallbackInPromptIT.class); + private final Logger logger = LoggerFactory.getLogger(FunctionCallbackInPromptIT.class); private final ApplicationContextRunner contextRunner = new ApplicationContextRunner() .withPropertyValues("spring.ai.minimax.apiKey=" + System.getenv("MINIMAX_API_KEY")) @@ -71,7 +72,7 @@ void functionCallTest() { ChatResponse response = chatModel.call(new Prompt(List.of(userMessage), promptOptions)); - logger.info("Response: " + response); + logger.info("Response: {}", response); assertThat(response.getResult().getOutput().getText()).contains("30", "10", "15"); }); @@ -105,7 +106,7 @@ void streamingFunctionCallTest() { .map(Generation::getOutput) .map(AssistantMessage::getText) .collect(Collectors.joining()); - logger.info("Response: " + content); + logger.info("Response: {}", content); assertThat(content).containsAnyOf("30.0", "30"); assertThat(content).containsAnyOf("10.0", "10"); diff --git a/spring-ai-spring-boot-autoconfigure/src/test/java/org/springframework/ai/autoconfigure/minimax/FunctionCallbackWithPlainFunctionBeanIT.java b/spring-ai-spring-boot-autoconfigure/src/test/java/org/springframework/ai/autoconfigure/minimax/FunctionCallbackWithPlainFunctionBeanIT.java index 631c4270de3..bedb41f5d7b 100644 --- a/spring-ai-spring-boot-autoconfigure/src/test/java/org/springframework/ai/autoconfigure/minimax/FunctionCallbackWithPlainFunctionBeanIT.java +++ b/spring-ai-spring-boot-autoconfigure/src/test/java/org/springframework/ai/autoconfigure/minimax/FunctionCallbackWithPlainFunctionBeanIT.java @@ -22,6 +22,8 @@ import org.junit.jupiter.api.Test; import org.junit.jupiter.api.condition.EnabledIfEnvironmentVariable; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import reactor.core.publisher.Flux; import org.springframework.ai.autoconfigure.retry.SpringAiRetryAutoConfiguration; @@ -39,7 +41,6 @@ import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.Description; -import org.springframework.core.log.LogAccessor; import static org.assertj.core.api.Assertions.assertThat; @@ -49,7 +50,7 @@ @EnabledIfEnvironmentVariable(named = "MINIMAX_API_KEY", matches = ".*") class FunctionCallbackWithPlainFunctionBeanIT { - private static final LogAccessor logger = new LogAccessor(FunctionCallbackWithPlainFunctionBeanIT.class); + private final Logger logger = LoggerFactory.getLogger(FunctionCallbackWithPlainFunctionBeanIT.class); private final ApplicationContextRunner contextRunner = new ApplicationContextRunner() .withPropertyValues("spring.ai.minimax.apiKey=" + System.getenv("MINIMAX_API_KEY")) @@ -71,7 +72,7 @@ void functionCallTest() { ChatResponse response = chatModel.call( new Prompt(List.of(userMessage), MiniMaxChatOptions.builder().function("weatherFunction").build())); - logger.info("Response: " + response); + logger.info("Response: {}", response); assertThat(response.getResult().getOutput().getText()).contains("30", "10", "15"); @@ -79,7 +80,7 @@ void functionCallTest() { response = chatModel.call(new Prompt(List.of(userMessage), MiniMaxChatOptions.builder().function("weatherFunctionTwo").build())); - logger.info("Response: " + response); + logger.info("Response: {}", response); assertThat(response.getResult().getOutput().getText()).contains("30", "10", "15"); @@ -102,7 +103,7 @@ void functionCallWithPortableFunctionCallingOptions() { ChatResponse response = chatModel.call(new Prompt(List.of(userMessage), functionOptions)); - logger.info("Response: " + response); + logger.info("Response: {}", response); }); } @@ -128,7 +129,7 @@ void streamFunctionCallTest() { .map(Generation::getOutput) .map(AssistantMessage::getText) .collect(Collectors.joining()); - logger.info("Response: " + content); + logger.info("Response: {}", content); assertThat(content).containsAnyOf("30.0", "30"); assertThat(content).containsAnyOf("10.0", "10"); @@ -146,7 +147,7 @@ void streamFunctionCallTest() { .map(Generation::getOutput) .map(AssistantMessage::getText) .collect(Collectors.joining()); - logger.info("Response: " + content); + logger.info("Response: {}", content); assertThat(content).containsAnyOf("30.0", "30"); assertThat(content).containsAnyOf("10.0", "10"); diff --git a/spring-ai-spring-boot-autoconfigure/src/test/java/org/springframework/ai/autoconfigure/minimax/MiniMaxAutoConfigurationIT.java b/spring-ai-spring-boot-autoconfigure/src/test/java/org/springframework/ai/autoconfigure/minimax/MiniMaxAutoConfigurationIT.java index 9107511ffc1..6a3893274a6 100644 --- a/spring-ai-spring-boot-autoconfigure/src/test/java/org/springframework/ai/autoconfigure/minimax/MiniMaxAutoConfigurationIT.java +++ b/spring-ai-spring-boot-autoconfigure/src/test/java/org/springframework/ai/autoconfigure/minimax/MiniMaxAutoConfigurationIT.java @@ -19,6 +19,8 @@ import java.util.List; import java.util.stream.Collectors; +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.condition.EnabledIfEnvironmentVariable; import reactor.core.publisher.Flux; @@ -33,7 +35,6 @@ import org.springframework.boot.autoconfigure.AutoConfigurations; import org.springframework.boot.autoconfigure.web.client.RestClientAutoConfiguration; import org.springframework.boot.test.context.runner.ApplicationContextRunner; -import org.springframework.core.log.LogAccessor; import static org.assertj.core.api.Assertions.assertThat; @@ -43,7 +44,7 @@ @EnabledIfEnvironmentVariable(named = "MINIMAX_API_KEY", matches = ".*") public class MiniMaxAutoConfigurationIT { - private static final LogAccessor logger = new LogAccessor(MiniMaxAutoConfigurationIT.class); + private static final Log logger = LogFactory.getLog(MiniMaxAutoConfigurationIT.class); private final ApplicationContextRunner contextRunner = new ApplicationContextRunner() .withPropertyValues("spring.ai.minimax.apiKey=" + System.getenv("MINIMAX_API_KEY")) diff --git a/spring-ai-spring-boot-autoconfigure/src/test/java/org/springframework/ai/autoconfigure/minimax/MiniMaxFunctionCallbackIT.java b/spring-ai-spring-boot-autoconfigure/src/test/java/org/springframework/ai/autoconfigure/minimax/MiniMaxFunctionCallbackIT.java index f977689e182..c3937895cdf 100644 --- a/spring-ai-spring-boot-autoconfigure/src/test/java/org/springframework/ai/autoconfigure/minimax/MiniMaxFunctionCallbackIT.java +++ b/spring-ai-spring-boot-autoconfigure/src/test/java/org/springframework/ai/autoconfigure/minimax/MiniMaxFunctionCallbackIT.java @@ -21,6 +21,8 @@ import org.junit.jupiter.api.Test; import org.junit.jupiter.api.condition.EnabledIfEnvironmentVariable; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import reactor.core.publisher.Flux; import org.springframework.ai.autoconfigure.retry.SpringAiRetryAutoConfiguration; @@ -37,7 +39,6 @@ import org.springframework.boot.test.context.runner.ApplicationContextRunner; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; -import org.springframework.core.log.LogAccessor; import static org.assertj.core.api.Assertions.assertThat; @@ -47,7 +48,7 @@ @EnabledIfEnvironmentVariable(named = "MINIMAX_API_KEY", matches = ".*") public class MiniMaxFunctionCallbackIT { - private static final LogAccessor logger = new LogAccessor(MiniMaxFunctionCallbackIT.class); + private final Logger logger = LoggerFactory.getLogger(MiniMaxFunctionCallbackIT.class); private final ApplicationContextRunner contextRunner = new ApplicationContextRunner() .withPropertyValues("spring.ai.minimax.apiKey=" + System.getenv("MINIMAX_API_KEY")) @@ -67,7 +68,7 @@ void functionCallTest() { ChatResponse response = chatModel .call(new Prompt(List.of(userMessage), MiniMaxChatOptions.builder().function("WeatherInfo").build())); - logger.info("Response: " + response); + logger.info("Response: {}", response); assertThat(response.getResult().getOutput().getText()).contains("30", "10", "15"); @@ -94,7 +95,7 @@ void streamFunctionCallTest() { .map(Generation::getOutput) .map(AssistantMessage::getText) .collect(Collectors.joining()); - logger.info("Response: " + content); + logger.info("Response: {}", content); assertThat(content).containsAnyOf("30.0", "30"); assertThat(content).containsAnyOf("10.0", "10"); diff --git a/spring-ai-spring-boot-autoconfigure/src/test/java/org/springframework/ai/autoconfigure/mistralai/MistralAiAutoConfigurationIT.java b/spring-ai-spring-boot-autoconfigure/src/test/java/org/springframework/ai/autoconfigure/mistralai/MistralAiAutoConfigurationIT.java index 29b823a2004..99d91c6f3b0 100644 --- a/spring-ai-spring-boot-autoconfigure/src/test/java/org/springframework/ai/autoconfigure/mistralai/MistralAiAutoConfigurationIT.java +++ b/spring-ai-spring-boot-autoconfigure/src/test/java/org/springframework/ai/autoconfigure/mistralai/MistralAiAutoConfigurationIT.java @@ -19,6 +19,8 @@ import java.util.List; import java.util.stream.Collectors; +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.condition.EnabledIfEnvironmentVariable; import reactor.core.publisher.Flux; @@ -31,7 +33,6 @@ import org.springframework.ai.mistralai.MistralAiEmbeddingModel; import org.springframework.boot.autoconfigure.AutoConfigurations; import org.springframework.boot.test.context.runner.ApplicationContextRunner; -import org.springframework.core.log.LogAccessor; import static org.assertj.core.api.Assertions.assertThat; @@ -42,7 +43,7 @@ @EnabledIfEnvironmentVariable(named = "MISTRAL_AI_API_KEY", matches = ".*") public class MistralAiAutoConfigurationIT { - private static final LogAccessor logger = new LogAccessor(MistralAiAutoConfigurationIT.class); + private static final Log logger = LogFactory.getLog(MistralAiAutoConfigurationIT.class); private final ApplicationContextRunner contextRunner = new ApplicationContextRunner() .withPropertyValues("spring.ai.mistralai.apiKey=" + System.getenv("MISTRAL_AI_API_KEY")) diff --git a/spring-ai-spring-boot-autoconfigure/src/test/java/org/springframework/ai/autoconfigure/mistralai/tool/PaymentStatusBeanIT.java b/spring-ai-spring-boot-autoconfigure/src/test/java/org/springframework/ai/autoconfigure/mistralai/tool/PaymentStatusBeanIT.java index 20bb516b06d..36f7c8b3880 100644 --- a/spring-ai-spring-boot-autoconfigure/src/test/java/org/springframework/ai/autoconfigure/mistralai/tool/PaymentStatusBeanIT.java +++ b/spring-ai-spring-boot-autoconfigure/src/test/java/org/springframework/ai/autoconfigure/mistralai/tool/PaymentStatusBeanIT.java @@ -23,6 +23,8 @@ import com.fasterxml.jackson.annotation.JsonProperty; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.condition.EnabledIfEnvironmentVariable; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import org.springframework.ai.autoconfigure.mistralai.MistralAiAutoConfiguration; import org.springframework.ai.chat.messages.UserMessage; @@ -36,7 +38,6 @@ import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.Description; -import org.springframework.core.log.LogAccessor; import static org.assertj.core.api.Assertions.assertThat; @@ -48,7 +49,7 @@ class PaymentStatusBeanIT { new StatusDate("Unpaid", "2021-10-06"), "T1003", new StatusDate("Paid", "2021-10-07"), "T1004", new StatusDate("Paid", "2021-10-05"), "T1005", new StatusDate("Pending", "2021-10-08")); - private static final LogAccessor logger = new LogAccessor(PaymentStatusBeanIT.class); + private final Logger logger = LoggerFactory.getLogger(PaymentStatusBeanIT.class); private final ApplicationContextRunner contextRunner = new ApplicationContextRunner() .withPropertyValues("spring.ai.mistralai.apiKey=" + System.getenv("MISTRAL_AI_API_KEY")) @@ -71,7 +72,7 @@ void functionCallTest() { .function("retrievePaymentDate") .build())); - logger.info("Response: " + response); + logger.info("Response: {}", response); assertThat(response.getResult().getOutput().getText()).containsIgnoringCase("T1001"); assertThat(response.getResult().getOutput().getText()).containsIgnoringCase("paid"); diff --git a/spring-ai-spring-boot-autoconfigure/src/test/java/org/springframework/ai/autoconfigure/mistralai/tool/PaymentStatusBeanOpenAiIT.java b/spring-ai-spring-boot-autoconfigure/src/test/java/org/springframework/ai/autoconfigure/mistralai/tool/PaymentStatusBeanOpenAiIT.java index 550a1bcab4d..321d00f646b 100644 --- a/spring-ai-spring-boot-autoconfigure/src/test/java/org/springframework/ai/autoconfigure/mistralai/tool/PaymentStatusBeanOpenAiIT.java +++ b/spring-ai-spring-boot-autoconfigure/src/test/java/org/springframework/ai/autoconfigure/mistralai/tool/PaymentStatusBeanOpenAiIT.java @@ -23,6 +23,8 @@ import com.fasterxml.jackson.annotation.JsonProperty; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.condition.EnabledIfEnvironmentVariable; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import org.springframework.ai.autoconfigure.openai.OpenAiAutoConfiguration; import org.springframework.ai.chat.messages.UserMessage; @@ -36,7 +38,6 @@ import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.Description; -import org.springframework.core.log.LogAccessor; import static org.assertj.core.api.Assertions.assertThat; @@ -54,7 +55,7 @@ class PaymentStatusBeanOpenAiIT { new StatusDate("Unpaid", "2021-10-06"), "T1003", new StatusDate("Paid", "2021-10-07"), "T1004", new StatusDate("Paid", "2021-10-05"), "T1005", new StatusDate("Pending", "2021-10-08")); - private static final LogAccessor logger = new LogAccessor(PaymentStatusBeanIT.class); + private final Logger logger = LoggerFactory.getLogger(PaymentStatusBeanIT.class); private final ApplicationContextRunner contextRunner = new ApplicationContextRunner() .withPropertyValues("spring.ai.openai.apiKey=" + System.getenv("MISTRAL_AI_API_KEY"), @@ -78,7 +79,7 @@ void functionCallTest() { .function("retrievePaymentDate") .build())); - logger.info("Response: " + response); + logger.info("Response: {}", response); assertThat(response.getResult().getOutput().getText()).containsIgnoringCase("T1001"); assertThat(response.getResult().getOutput().getText()).containsIgnoringCase("paid"); diff --git a/spring-ai-spring-boot-autoconfigure/src/test/java/org/springframework/ai/autoconfigure/mistralai/tool/PaymentStatusPromptIT.java b/spring-ai-spring-boot-autoconfigure/src/test/java/org/springframework/ai/autoconfigure/mistralai/tool/PaymentStatusPromptIT.java index 8967957a7ad..a0a88984d72 100644 --- a/spring-ai-spring-boot-autoconfigure/src/test/java/org/springframework/ai/autoconfigure/mistralai/tool/PaymentStatusPromptIT.java +++ b/spring-ai-spring-boot-autoconfigure/src/test/java/org/springframework/ai/autoconfigure/mistralai/tool/PaymentStatusPromptIT.java @@ -22,6 +22,8 @@ import com.fasterxml.jackson.annotation.JsonProperty; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.condition.EnabledIfEnvironmentVariable; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import org.springframework.ai.autoconfigure.mistralai.MistralAiAutoConfiguration; import org.springframework.ai.chat.messages.UserMessage; @@ -33,7 +35,6 @@ import org.springframework.ai.tool.function.FunctionToolCallback; import org.springframework.boot.autoconfigure.AutoConfigurations; import org.springframework.boot.test.context.runner.ApplicationContextRunner; -import org.springframework.core.log.LogAccessor; import static org.assertj.core.api.Assertions.assertThat; @@ -46,7 +47,7 @@ public class PaymentStatusPromptIT { new Transaction("T1003"), new StatusDate("Paid", "2021-10-07"), new Transaction("T1004"), new StatusDate("Paid", "2021-10-05"), new Transaction("T1005"), new StatusDate("Pending", "2021-10-08")); - private static final LogAccessor logger = new LogAccessor(WeatherServicePromptIT.class); + private final Logger logger = LoggerFactory.getLogger(WeatherServicePromptIT.class); private final ApplicationContextRunner contextRunner = new ApplicationContextRunner() .withPropertyValues("spring.ai.mistralai.apiKey=" + System.getenv("MISTRAL_AI_API_KEY")) @@ -73,7 +74,7 @@ void functionCallTest() { ChatResponse response = chatModel.call(new Prompt(List.of(userMessage), promptOptions)); - logger.info("Response: " + response); + logger.info("Response: {}", response); assertThat(response.getResult().getOutput().getText()).containsIgnoringCase("T1001"); assertThat(response.getResult().getOutput().getText()).containsIgnoringCase("paid"); diff --git a/spring-ai-spring-boot-autoconfigure/src/test/java/org/springframework/ai/autoconfigure/mistralai/tool/WeatherServicePromptIT.java b/spring-ai-spring-boot-autoconfigure/src/test/java/org/springframework/ai/autoconfigure/mistralai/tool/WeatherServicePromptIT.java index d2a8028f024..7c4e56a7d42 100644 --- a/spring-ai-spring-boot-autoconfigure/src/test/java/org/springframework/ai/autoconfigure/mistralai/tool/WeatherServicePromptIT.java +++ b/spring-ai-spring-boot-autoconfigure/src/test/java/org/springframework/ai/autoconfigure/mistralai/tool/WeatherServicePromptIT.java @@ -24,6 +24,8 @@ import com.fasterxml.jackson.annotation.JsonProperty; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.condition.EnabledIfEnvironmentVariable; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import org.springframework.ai.autoconfigure.mistralai.MistralAiAutoConfiguration; import org.springframework.ai.autoconfigure.mistralai.tool.WeatherServicePromptIT.MyWeatherService.Request; @@ -39,7 +41,6 @@ import org.springframework.ai.tool.function.FunctionToolCallback; import org.springframework.boot.autoconfigure.AutoConfigurations; import org.springframework.boot.test.context.runner.ApplicationContextRunner; -import org.springframework.core.log.LogAccessor; import static org.assertj.core.api.Assertions.assertThat; @@ -51,7 +52,7 @@ @EnabledIfEnvironmentVariable(named = "MISTRAL_AI_API_KEY", matches = ".*") public class WeatherServicePromptIT { - private static final LogAccessor logger = new LogAccessor(WeatherServicePromptIT.class); + private final Logger logger = LoggerFactory.getLogger(WeatherServicePromptIT.class); private final ApplicationContextRunner contextRunner = new ApplicationContextRunner() .withPropertyValues("spring.ai.mistralai.api-key=" + System.getenv("MISTRAL_AI_API_KEY")) @@ -81,7 +82,7 @@ void promptFunctionCall() { ChatResponse response = chatModel.call(new Prompt(List.of(userMessage), promptOptions)); - logger.info("Response: " + response); + logger.info("Response: {}", response); assertThat(response.getResult().getOutput().getText()).containsAnyOf("15", "15.0"); }); @@ -107,7 +108,7 @@ void functionCallWithPortableFunctionCallingOptions() { ChatResponse response = chatModel.call(new Prompt(List.of(userMessage), functionOptions)); - logger.info("Response: " + response); + logger.info("Response: {}", response); assertThat(response.getResult().getOutput().getText()).containsAnyOf("15", "15.0"); }); diff --git a/spring-ai-spring-boot-autoconfigure/src/test/java/org/springframework/ai/autoconfigure/moonshot/MoonshotAutoConfigurationIT.java b/spring-ai-spring-boot-autoconfigure/src/test/java/org/springframework/ai/autoconfigure/moonshot/MoonshotAutoConfigurationIT.java index 0c8580218fd..cf8cdd647a3 100644 --- a/spring-ai-spring-boot-autoconfigure/src/test/java/org/springframework/ai/autoconfigure/moonshot/MoonshotAutoConfigurationIT.java +++ b/spring-ai-spring-boot-autoconfigure/src/test/java/org/springframework/ai/autoconfigure/moonshot/MoonshotAutoConfigurationIT.java @@ -19,6 +19,8 @@ import java.util.Objects; import java.util.stream.Collectors; +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.condition.EnabledIfEnvironmentVariable; import reactor.core.publisher.Flux; @@ -31,7 +33,6 @@ import org.springframework.boot.autoconfigure.AutoConfigurations; import org.springframework.boot.autoconfigure.web.client.RestClientAutoConfiguration; import org.springframework.boot.test.context.runner.ApplicationContextRunner; -import org.springframework.core.log.LogAccessor; import static org.assertj.core.api.Assertions.assertThat; @@ -41,7 +42,7 @@ @EnabledIfEnvironmentVariable(named = "MOONSHOT_API_KEY", matches = ".*") public class MoonshotAutoConfigurationIT { - private static final LogAccessor logger = new LogAccessor(MoonshotAutoConfigurationIT.class); + private static final Log logger = LogFactory.getLog(MoonshotAutoConfigurationIT.class); private final ApplicationContextRunner contextRunner = new ApplicationContextRunner() .withPropertyValues("spring.ai.moonshot.apiKey=" + System.getenv("MOONSHOT_API_KEY")) diff --git a/spring-ai-spring-boot-autoconfigure/src/test/java/org/springframework/ai/autoconfigure/moonshot/tool/FunctionCallbackInPromptIT.java b/spring-ai-spring-boot-autoconfigure/src/test/java/org/springframework/ai/autoconfigure/moonshot/tool/FunctionCallbackInPromptIT.java index 123374fa8f3..bd20fbb9d16 100644 --- a/spring-ai-spring-boot-autoconfigure/src/test/java/org/springframework/ai/autoconfigure/moonshot/tool/FunctionCallbackInPromptIT.java +++ b/spring-ai-spring-boot-autoconfigure/src/test/java/org/springframework/ai/autoconfigure/moonshot/tool/FunctionCallbackInPromptIT.java @@ -21,6 +21,8 @@ import org.junit.jupiter.api.Test; import org.junit.jupiter.api.condition.EnabledIfEnvironmentVariable; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import reactor.core.publisher.Flux; import org.springframework.ai.autoconfigure.moonshot.MoonshotAutoConfiguration; @@ -36,7 +38,6 @@ import org.springframework.boot.autoconfigure.AutoConfigurations; import org.springframework.boot.autoconfigure.web.client.RestClientAutoConfiguration; import org.springframework.boot.test.context.runner.ApplicationContextRunner; -import org.springframework.core.log.LogAccessor; import static org.assertj.core.api.Assertions.assertThat; @@ -47,7 +48,7 @@ @EnabledIfEnvironmentVariable(named = "MOONSHOT_API_KEY", matches = ".*") public class FunctionCallbackInPromptIT { - private static final LogAccessor logger = new LogAccessor(FunctionCallbackInPromptIT.class); + private final Logger logger = LoggerFactory.getLogger(FunctionCallbackInPromptIT.class); private final ApplicationContextRunner contextRunner = new ApplicationContextRunner() .withPropertyValues("spring.ai.moonshot.apiKey=" + System.getenv("MOONSHOT_API_KEY")) @@ -73,7 +74,7 @@ void functionCallTest() { ChatResponse response = chatModel.call(new Prompt(List.of(userMessage), promptOptions)); - logger.info("Response: " + response); + logger.info("Response: {}", response); assertThat(response.getResult().getOutput().getText()).contains("30", "10", "15"); }); @@ -107,7 +108,7 @@ void streamingFunctionCallTest() { .map(Generation::getOutput) .map(AssistantMessage::getText) .collect(Collectors.joining()); - logger.info("Response: " + content); + logger.info("Response: {}", content); assertThat(content).containsAnyOf("30.0", "30"); assertThat(content).containsAnyOf("10.0", "10"); diff --git a/spring-ai-spring-boot-autoconfigure/src/test/java/org/springframework/ai/autoconfigure/moonshot/tool/FunctionCallbackWithPlainFunctionBeanIT.java b/spring-ai-spring-boot-autoconfigure/src/test/java/org/springframework/ai/autoconfigure/moonshot/tool/FunctionCallbackWithPlainFunctionBeanIT.java index 1dad6079b0d..a9beae2cf90 100644 --- a/spring-ai-spring-boot-autoconfigure/src/test/java/org/springframework/ai/autoconfigure/moonshot/tool/FunctionCallbackWithPlainFunctionBeanIT.java +++ b/spring-ai-spring-boot-autoconfigure/src/test/java/org/springframework/ai/autoconfigure/moonshot/tool/FunctionCallbackWithPlainFunctionBeanIT.java @@ -22,6 +22,8 @@ import org.junit.jupiter.api.Test; import org.junit.jupiter.api.condition.EnabledIfEnvironmentVariable; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import reactor.core.publisher.Flux; import org.springframework.ai.autoconfigure.moonshot.MoonshotAutoConfiguration; @@ -40,7 +42,6 @@ import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.Description; -import org.springframework.core.log.LogAccessor; import static org.assertj.core.api.Assertions.assertThat; @@ -51,7 +52,7 @@ @EnabledIfEnvironmentVariable(named = "MOONSHOT_API_KEY", matches = ".*") class FunctionCallbackWithPlainFunctionBeanIT { - private static final LogAccessor logger = new LogAccessor(FunctionCallbackWithPlainFunctionBeanIT.class); + private final Logger logger = LoggerFactory.getLogger(FunctionCallbackWithPlainFunctionBeanIT.class); private final ApplicationContextRunner contextRunner = new ApplicationContextRunner() .withPropertyValues("spring.ai.moonshot.apiKey=" + System.getenv("MOONSHOT_API_KEY")) @@ -72,7 +73,7 @@ void functionCallTest() { ChatResponse response = chatModel.call(new Prompt(List.of(userMessage), MoonshotChatOptions.builder().function("weatherFunction").build())); - logger.info("Response: " + response); + logger.info("Response: {}", response); assertThat(response.getResult().getOutput().getText()).contains("30", "10", "15"); @@ -80,7 +81,7 @@ void functionCallTest() { response = chatModel.call(new Prompt(List.of(userMessage), MoonshotChatOptions.builder().function("weatherFunctionTwo").build())); - logger.info("Response: " + response); + logger.info("Response: {}", response); assertThat(response.getResult().getOutput().getText()).contains("30", "10", "15"); @@ -103,7 +104,7 @@ void functionCallWithPortableFunctionCallingOptions() { ChatResponse response = chatModel.call(new Prompt(List.of(userMessage), functionOptions)); - logger.info("Response: " + response); + logger.info("Response: {}", response); }); } @@ -128,7 +129,7 @@ void streamFunctionCallTest() { .map(Generation::getOutput) .map(AssistantMessage::getText) .collect(Collectors.joining()); - logger.info("Response: " + content); + logger.info("Response: {}", content); assertThat(content).containsAnyOf("30.0", "30"); assertThat(content).containsAnyOf("10.0", "10"); @@ -146,7 +147,7 @@ void streamFunctionCallTest() { .map(Generation::getOutput) .map(AssistantMessage::getText) .collect(Collectors.joining()); - logger.info("Response: " + content); + logger.info("Response: {}", content); assertThat(content).containsAnyOf("30.0", "30"); assertThat(content).containsAnyOf("10.0", "10"); diff --git a/spring-ai-spring-boot-autoconfigure/src/test/java/org/springframework/ai/autoconfigure/moonshot/tool/MoonshotFunctionCallbackIT.java b/spring-ai-spring-boot-autoconfigure/src/test/java/org/springframework/ai/autoconfigure/moonshot/tool/MoonshotFunctionCallbackIT.java index dab3784ec83..fed437ef665 100644 --- a/spring-ai-spring-boot-autoconfigure/src/test/java/org/springframework/ai/autoconfigure/moonshot/tool/MoonshotFunctionCallbackIT.java +++ b/spring-ai-spring-boot-autoconfigure/src/test/java/org/springframework/ai/autoconfigure/moonshot/tool/MoonshotFunctionCallbackIT.java @@ -22,6 +22,8 @@ import org.junit.jupiter.api.Test; import org.junit.jupiter.api.condition.EnabledIfEnvironmentVariable; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import reactor.core.publisher.Flux; import org.springframework.ai.autoconfigure.moonshot.MoonshotAutoConfiguration; @@ -39,7 +41,6 @@ import org.springframework.boot.test.context.runner.ApplicationContextRunner; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; -import org.springframework.core.log.LogAccessor; import static org.assertj.core.api.Assertions.assertThat; @@ -50,7 +51,7 @@ @EnabledIfEnvironmentVariable(named = "MOONSHOT_API_KEY", matches = ".*") public class MoonshotFunctionCallbackIT { - private static final LogAccessor logger = new LogAccessor(MoonshotFunctionCallbackIT.class); + private final Logger logger = LoggerFactory.getLogger(MoonshotFunctionCallbackIT.class); private final ApplicationContextRunner contextRunner = new ApplicationContextRunner() .withPropertyValues("spring.ai.moonshot.apiKey=" + System.getenv("MOONSHOT_API_KEY")) @@ -70,7 +71,7 @@ void functionCallTest() { ChatResponse response = chatModel .call(new Prompt(List.of(userMessage), MoonshotChatOptions.builder().function("WeatherInfo").build())); - logger.info("Response: " + response); + logger.info("Response: {}", response); assertThat(response.getResult().getOutput().getText()).contains("30", "10", "15"); @@ -98,7 +99,7 @@ void streamFunctionCallTest() { .map(AssistantMessage::getText) .filter(Objects::nonNull) .collect(Collectors.joining()); - logger.info("Response: " + content); + logger.info("Response: {}", content); assertThat(content).containsAnyOf("30.0", "30"); assertThat(content).containsAnyOf("10.0", "10"); diff --git a/spring-ai-spring-boot-autoconfigure/src/test/java/org/springframework/ai/autoconfigure/ollama/tool/FunctionCallbackInPromptIT.java b/spring-ai-spring-boot-autoconfigure/src/test/java/org/springframework/ai/autoconfigure/ollama/tool/FunctionCallbackInPromptIT.java index 6a51c0e66a0..a703033a128 100644 --- a/spring-ai-spring-boot-autoconfigure/src/test/java/org/springframework/ai/autoconfigure/ollama/tool/FunctionCallbackInPromptIT.java +++ b/spring-ai-spring-boot-autoconfigure/src/test/java/org/springframework/ai/autoconfigure/ollama/tool/FunctionCallbackInPromptIT.java @@ -21,6 +21,8 @@ import org.junit.jupiter.api.BeforeAll; import org.junit.jupiter.api.Test; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import reactor.core.publisher.Flux; import org.springframework.ai.autoconfigure.ollama.BaseOllamaIT; @@ -35,13 +37,12 @@ import org.springframework.ai.tool.function.FunctionToolCallback; import org.springframework.boot.autoconfigure.AutoConfigurations; import org.springframework.boot.test.context.runner.ApplicationContextRunner; -import org.springframework.core.log.LogAccessor; import static org.assertj.core.api.Assertions.assertThat; public class FunctionCallbackInPromptIT extends BaseOllamaIT { - private static final LogAccessor logger = new LogAccessor(FunctionCallbackInPromptIT.class); + private static final Logger logger = LoggerFactory.getLogger(FunctionCallbackInPromptIT.class); private static final String MODEL_NAME = "qwen2.5:3b"; @@ -79,7 +80,7 @@ void functionCallTest() { ChatResponse response = chatModel.call(new Prompt(List.of(userMessage), promptOptions)); - logger.info("Response: " + response); + logger.info("Response: {}", response); assertThat(response.getResult().getOutput().getText()).contains("30", "10", "15"); }); @@ -113,7 +114,7 @@ void streamingFunctionCallTest() { .map(Generation::getOutput) .map(AssistantMessage::getText) .collect(Collectors.joining()); - logger.info("Response: " + content); + logger.info("Response: {}", content); assertThat(content).containsAnyOf("30.0", "30"); assertThat(content).containsAnyOf("10.0", "10"); diff --git a/spring-ai-spring-boot-autoconfigure/src/test/java/org/springframework/ai/autoconfigure/ollama/tool/OllamaFunctionCallbackIT.java b/spring-ai-spring-boot-autoconfigure/src/test/java/org/springframework/ai/autoconfigure/ollama/tool/OllamaFunctionCallbackIT.java index f39e75dd061..1e82e5fdf99 100644 --- a/spring-ai-spring-boot-autoconfigure/src/test/java/org/springframework/ai/autoconfigure/ollama/tool/OllamaFunctionCallbackIT.java +++ b/spring-ai-spring-boot-autoconfigure/src/test/java/org/springframework/ai/autoconfigure/ollama/tool/OllamaFunctionCallbackIT.java @@ -21,6 +21,8 @@ import org.junit.jupiter.api.BeforeAll; import org.junit.jupiter.api.Test; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import reactor.core.publisher.Flux; import org.springframework.ai.autoconfigure.ollama.BaseOllamaIT; @@ -39,13 +41,12 @@ import org.springframework.boot.test.context.runner.ApplicationContextRunner; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; -import org.springframework.core.log.LogAccessor; import static org.assertj.core.api.Assertions.assertThat; public class OllamaFunctionCallbackIT extends BaseOllamaIT { - private static final LogAccessor logger = new LogAccessor(OllamaFunctionCallbackIT.class); + private static final Logger logger = LoggerFactory.getLogger(OllamaFunctionCallbackIT.class); private static final String MODEL_NAME = "qwen2.5:3b"; diff --git a/spring-ai-spring-boot-autoconfigure/src/test/java/org/springframework/ai/autoconfigure/ollama/tool/OllamaFunctionToolBeanIT.java b/spring-ai-spring-boot-autoconfigure/src/test/java/org/springframework/ai/autoconfigure/ollama/tool/OllamaFunctionToolBeanIT.java index 10e82513563..1440a7cd2bd 100644 --- a/spring-ai-spring-boot-autoconfigure/src/test/java/org/springframework/ai/autoconfigure/ollama/tool/OllamaFunctionToolBeanIT.java +++ b/spring-ai-spring-boot-autoconfigure/src/test/java/org/springframework/ai/autoconfigure/ollama/tool/OllamaFunctionToolBeanIT.java @@ -22,6 +22,8 @@ import org.junit.jupiter.api.BeforeAll; import org.junit.jupiter.api.Test; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import reactor.core.publisher.Flux; import org.springframework.ai.autoconfigure.ollama.BaseOllamaIT; @@ -41,7 +43,6 @@ import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.Description; -import org.springframework.core.log.LogAccessor; import static org.assertj.core.api.Assertions.assertThat; @@ -52,7 +53,7 @@ */ public class OllamaFunctionToolBeanIT extends BaseOllamaIT { - private static final LogAccessor logger = new LogAccessor(OllamaFunctionToolBeanIT.class); + private static final Logger logger = LoggerFactory.getLogger(OllamaFunctionToolBeanIT.class); private static final String MODEL_NAME = "qwen2.5:3b"; @@ -85,7 +86,7 @@ void toolCallTest() { ChatResponse response = chatModel.call(new Prompt(List.of(userMessage), OllamaOptions.builder().toolCallbacks(ToolCallbacks.from(myTools)).build())); - logger.info("Response: " + response); + logger.info("Response: {}", response); assertThat(response.getResult().getOutput().getText()).contains("30", "10", "15"); }); @@ -104,7 +105,7 @@ void functionCallTest() { ChatResponse response = chatModel .call(new Prompt(List.of(userMessage), OllamaOptions.builder().tools("weatherInfo").build())); - logger.info("Response: " + response); + logger.info("Response: {}", response); assertThat(response.getResult().getOutput().getText()).contains("30", "10", "15"); }); @@ -130,7 +131,7 @@ void streamFunctionCallTest() { .map(Generation::getOutput) .map(AssistantMessage::getText) .collect(Collectors.joining()); - logger.info("Response: " + content); + logger.info("Response: {}", content); assertThat(content).contains("30", "10", "15"); }); @@ -150,7 +151,7 @@ void functionCallWithPortableFunctionCallingOptions() { ChatResponse response = chatModel.call(new Prompt(List.of(userMessage), functionOptions)); - logger.info("Response: " + response.getResult().getOutput().getText()); + logger.info("Response: {}", response.getResult().getOutput().getText()); assertThat(response.getResult().getOutput().getText()).contains("30", "10", "15"); }); diff --git a/spring-ai-spring-boot-autoconfigure/src/test/java/org/springframework/ai/autoconfigure/openai/OpenAiAutoConfigurationIT.java b/spring-ai-spring-boot-autoconfigure/src/test/java/org/springframework/ai/autoconfigure/openai/OpenAiAutoConfigurationIT.java index 2a14e0e20e1..0ebe376bcaf 100644 --- a/spring-ai-spring-boot-autoconfigure/src/test/java/org/springframework/ai/autoconfigure/openai/OpenAiAutoConfigurationIT.java +++ b/spring-ai-spring-boot-autoconfigure/src/test/java/org/springframework/ai/autoconfigure/openai/OpenAiAutoConfigurationIT.java @@ -20,6 +20,8 @@ import java.util.List; import java.util.stream.Collectors; +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.condition.EnabledIfEnvironmentVariable; import reactor.core.publisher.Flux; @@ -41,14 +43,13 @@ import org.springframework.boot.test.context.runner.ApplicationContextRunner; import org.springframework.core.io.ClassPathResource; import org.springframework.core.io.Resource; -import org.springframework.core.log.LogAccessor; import static org.assertj.core.api.Assertions.assertThat; @EnabledIfEnvironmentVariable(named = "OPENAI_API_KEY", matches = ".*") public class OpenAiAutoConfigurationIT { - private static final LogAccessor logger = new LogAccessor(OpenAiAutoConfigurationIT.class); + private static final Log logger = LogFactory.getLog(OpenAiAutoConfigurationIT.class); private final ApplicationContextRunner contextRunner = new ApplicationContextRunner() .withPropertyValues("spring.ai.openai.apiKey=" + System.getenv("OPENAI_API_KEY")) diff --git a/spring-ai-spring-boot-autoconfigure/src/test/java/org/springframework/ai/autoconfigure/openai/tool/FunctionCallbackInPrompt2IT.java b/spring-ai-spring-boot-autoconfigure/src/test/java/org/springframework/ai/autoconfigure/openai/tool/FunctionCallbackInPrompt2IT.java index d8714b0d624..21c11f7af7b 100644 --- a/spring-ai-spring-boot-autoconfigure/src/test/java/org/springframework/ai/autoconfigure/openai/tool/FunctionCallbackInPrompt2IT.java +++ b/spring-ai-spring-boot-autoconfigure/src/test/java/org/springframework/ai/autoconfigure/openai/tool/FunctionCallbackInPrompt2IT.java @@ -22,6 +22,8 @@ import org.junit.jupiter.api.Test; import org.junit.jupiter.api.condition.EnabledIfEnvironmentVariable; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import org.springframework.ai.autoconfigure.openai.OpenAiAutoConfiguration; import org.springframework.ai.chat.client.ChatClient; @@ -30,14 +32,13 @@ import org.springframework.ai.tool.function.FunctionToolCallback; import org.springframework.boot.autoconfigure.AutoConfigurations; import org.springframework.boot.test.context.runner.ApplicationContextRunner; -import org.springframework.core.log.LogAccessor; import static org.assertj.core.api.Assertions.assertThat; @EnabledIfEnvironmentVariable(named = "OPENAI_API_KEY", matches = ".*") public class FunctionCallbackInPrompt2IT { - private static final LogAccessor logger = new LogAccessor(FunctionCallbackInPromptIT.class); + private final Logger logger = LoggerFactory.getLogger(FunctionCallbackInPromptIT.class); private final ApplicationContextRunner contextRunner = new ApplicationContextRunner() .withPropertyValues("spring.ai.openai.apiKey=" + System.getenv("OPENAI_API_KEY")) @@ -67,7 +68,7 @@ void functionCallTest() { .call().content(); // @formatter:on - logger.info("Response: " + content); + logger.info("Response: {}", content); assertThat(content).contains("30", "10", "15"); }); @@ -97,7 +98,7 @@ record LightInfo(String roomName, boolean isOn) { .build()) .call().content(); // @formatter:on - logger.info("Response: " + content); + logger.info("Response: {}", content); assertThat(state).containsEntry("kitchen", Boolean.TRUE); assertThat(state).containsEntry("living room", Boolean.TRUE); }); @@ -120,7 +121,7 @@ void functionCallTest2() { .build()) .call().content(); // @formatter:on - logger.info("Response: " + content); + logger.info("Response: {}", content); assertThat(content).contains("18"); }); @@ -146,7 +147,7 @@ void streamingFunctionCallTest() { .collectList().block().stream().collect(Collectors.joining()); // @formatter:on - logger.info("Response: " + content); + logger.info("Response: {}", content); assertThat(content).contains("30", "10", "15"); }); diff --git a/spring-ai-spring-boot-autoconfigure/src/test/java/org/springframework/ai/autoconfigure/openai/tool/FunctionCallbackInPromptIT.java b/spring-ai-spring-boot-autoconfigure/src/test/java/org/springframework/ai/autoconfigure/openai/tool/FunctionCallbackInPromptIT.java index b4195bf55c4..14e60ab6801 100644 --- a/spring-ai-spring-boot-autoconfigure/src/test/java/org/springframework/ai/autoconfigure/openai/tool/FunctionCallbackInPromptIT.java +++ b/spring-ai-spring-boot-autoconfigure/src/test/java/org/springframework/ai/autoconfigure/openai/tool/FunctionCallbackInPromptIT.java @@ -21,6 +21,8 @@ import org.junit.jupiter.api.Test; import org.junit.jupiter.api.condition.EnabledIfEnvironmentVariable; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import reactor.core.publisher.Flux; import org.springframework.ai.autoconfigure.openai.OpenAiAutoConfiguration; @@ -35,14 +37,13 @@ import org.springframework.ai.tool.function.FunctionToolCallback; import org.springframework.boot.autoconfigure.AutoConfigurations; import org.springframework.boot.test.context.runner.ApplicationContextRunner; -import org.springframework.core.log.LogAccessor; import static org.assertj.core.api.Assertions.assertThat; @EnabledIfEnvironmentVariable(named = "OPENAI_API_KEY", matches = ".*") public class FunctionCallbackInPromptIT { - private static final LogAccessor logger = new LogAccessor(FunctionCallbackInPromptIT.class); + private final Logger logger = LoggerFactory.getLogger(FunctionCallbackInPromptIT.class); private final ApplicationContextRunner contextRunner = new ApplicationContextRunner() .withPropertyValues("spring.ai.openai.apiKey=" + System.getenv("OPENAI_API_KEY")) @@ -70,7 +71,7 @@ void functionCallTest() { ChatResponse response = chatModel.call(new Prompt(List.of(userMessage), promptOptions)); - logger.info("Response: " + response); + logger.info("Response: {}", response); assertThat(response.getResult().getOutput().getText()).contains("30", "10", "15"); }); @@ -107,7 +108,7 @@ void streamingFunctionCallTest() { .map(Generation::getOutput) .map(AssistantMessage::getText) .collect(Collectors.joining()); - logger.info("Response: " + content); + logger.info("Response: {}", content); assertThat(content).contains("30", "10", "15"); }); diff --git a/spring-ai-spring-boot-autoconfigure/src/test/java/org/springframework/ai/autoconfigure/openai/tool/FunctionCallbackWithPlainFunctionBeanIT.java b/spring-ai-spring-boot-autoconfigure/src/test/java/org/springframework/ai/autoconfigure/openai/tool/FunctionCallbackWithPlainFunctionBeanIT.java index 513d2dbfd66..4c5df9a30bf 100644 --- a/spring-ai-spring-boot-autoconfigure/src/test/java/org/springframework/ai/autoconfigure/openai/tool/FunctionCallbackWithPlainFunctionBeanIT.java +++ b/spring-ai-spring-boot-autoconfigure/src/test/java/org/springframework/ai/autoconfigure/openai/tool/FunctionCallbackWithPlainFunctionBeanIT.java @@ -28,6 +28,8 @@ import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.condition.EnabledIfEnvironmentVariable; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import reactor.core.publisher.Flux; import org.springframework.ai.autoconfigure.openai.OpenAiAutoConfiguration; @@ -47,14 +49,13 @@ import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.Description; -import org.springframework.core.log.LogAccessor; import static org.assertj.core.api.Assertions.assertThat; @EnabledIfEnvironmentVariable(named = "OPENAI_API_KEY", matches = ".*") class FunctionCallbackWithPlainFunctionBeanIT { - private static final LogAccessor logger = new LogAccessor(FunctionCallbackWithPlainFunctionBeanIT.class); + private static final Logger logger = LoggerFactory.getLogger(FunctionCallbackWithPlainFunctionBeanIT.class); private final ApplicationContextRunner contextRunner = new ApplicationContextRunner() .withPropertyValues("spring.ai.openai.apiKey=" + System.getenv("OPENAI_API_KEY"), @@ -81,7 +82,7 @@ void functionCallingVoidInput() { ChatResponse response = chatModel.call(new Prompt(List.of(userMessage), OpenAiChatOptions.builder().function("turnLivingRoomLightOn").build())); - logger.info("Response: " + response); + logger.info("Response: {}", response); assertThat(feedback).hasSize(1); assertThat(feedback.get("turnLivingRoomLightOn")).isEqualTo(Boolean.valueOf(true)); }); @@ -99,7 +100,7 @@ void functionCallingSupplier() { ChatResponse response = chatModel.call(new Prompt(List.of(userMessage), OpenAiChatOptions.builder().function("turnLivingRoomLightOnSupplier").build())); - logger.info("Response: " + response); + logger.info("Response: {}", response); assertThat(feedback).hasSize(1); assertThat(feedback.get("turnLivingRoomLightOnSupplier")).isEqualTo(Boolean.valueOf(true)); }); @@ -117,7 +118,7 @@ void functionCallingVoidOutput() { ChatResponse response = chatModel .call(new Prompt(List.of(userMessage), OpenAiChatOptions.builder().function("turnLight").build())); - logger.info("Response: " + response); + logger.info("Response: {}", response); assertThat(feedback).hasSize(2); assertThat(feedback.get("kitchen")).isEqualTo(Boolean.valueOf(true)); assertThat(feedback.get("living room")).isEqualTo(Boolean.valueOf(true)); @@ -136,7 +137,7 @@ void functionCallingConsumer() { ChatResponse response = chatModel.call(new Prompt(List.of(userMessage), OpenAiChatOptions.builder().function("turnLightConsumer").build())); - logger.info("Response: " + response); + logger.info("Response: {}", response); assertThat(feedback).hasSize(2); assertThat(feedback.get("kitchen")).isEqualTo(Boolean.valueOf(true)); assertThat(feedback.get("living room")).isEqualTo(Boolean.valueOf(true)); @@ -158,7 +159,7 @@ void trainScheduler() { ChatResponse response = chatModel.call(new Prompt(List.of(userMessage), functionOptions)); - logger.info("Response: " + response.getResult().getOutput().getText()); + logger.info("Response: {}", response.getResult().getOutput().getText()); }); } @@ -187,7 +188,7 @@ void functionCallWithDirectBiFunction() { .toolContext(Map.of("sessionId", "123")) .build())); - logger.info("Response: " + response); + logger.info("Response: {}", response); assertThat(response.getResult().getOutput().getText()).contains("30", "10", "15"); @@ -219,7 +220,7 @@ void functionCallWithBiFunctionClass() { .toolContext(Map.of("sessionId", "123")) .build())); - logger.info("Response: " + response); + logger.info("Response: {}", response); assertThat(response.getResult().getOutput().getText()).contains("30", "10", "15"); @@ -239,7 +240,7 @@ void functionCallTest() { ChatResponse response = chatModel.call( new Prompt(List.of(userMessage), OpenAiChatOptions.builder().function("weatherFunction").build())); - logger.info("Response: " + response); + logger.info("Response: {}", response); assertThat(response.getResult().getOutput().getText()).contains("30", "10", "15"); @@ -247,7 +248,7 @@ void functionCallTest() { response = chatModel.call(new Prompt(List.of(userMessage), OpenAiChatOptions.builder().function("weatherFunctionTwo").build())); - logger.info("Response: " + response); + logger.info("Response: {}", response); assertThat(response.getResult().getOutput().getText()).contains("30", "10", "15"); @@ -267,7 +268,7 @@ void functionCallWithPortableFunctionCallingOptions() { ChatResponse response = chatModel.call(new Prompt(List.of(userMessage), functionOptions)); - logger.info("Response: " + response.getResult().getOutput().getText()); + logger.info("Response: {}", response.getResult().getOutput().getText()); assertThat(response.getResult().getOutput().getText()).contains("30", "10", "15"); }); @@ -294,7 +295,7 @@ void streamFunctionCallTest() { .map(Generation::getOutput) .map(AssistantMessage::getText) .collect(Collectors.joining()); - logger.info("Response: " + content); + logger.info("Response: {}", content); assertThat(content).contains("30", "10", "15"); @@ -310,7 +311,7 @@ void streamFunctionCallTest() { .map(Generation::getOutput) .map(AssistantMessage::getText) .collect(Collectors.joining()); - logger.info("Response: " + content); + logger.info("Response: {}", content); assertThat(content).isNotEmpty().withFailMessage("Content returned from OpenAI model is empty"); assertThat(content).contains("30", "10", "15"); diff --git a/spring-ai-spring-boot-autoconfigure/src/test/java/org/springframework/ai/autoconfigure/openai/tool/OpenAiFunctionCallback2IT.java b/spring-ai-spring-boot-autoconfigure/src/test/java/org/springframework/ai/autoconfigure/openai/tool/OpenAiFunctionCallback2IT.java index c361a897165..aab1aabd8c3 100644 --- a/spring-ai-spring-boot-autoconfigure/src/test/java/org/springframework/ai/autoconfigure/openai/tool/OpenAiFunctionCallback2IT.java +++ b/spring-ai-spring-boot-autoconfigure/src/test/java/org/springframework/ai/autoconfigure/openai/tool/OpenAiFunctionCallback2IT.java @@ -20,6 +20,8 @@ import org.junit.jupiter.api.Test; import org.junit.jupiter.api.condition.EnabledIfEnvironmentVariable; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import org.springframework.ai.autoconfigure.openai.OpenAiAutoConfiguration; import org.springframework.ai.chat.client.ChatClient; @@ -31,14 +33,13 @@ import org.springframework.boot.test.context.runner.ApplicationContextRunner; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; -import org.springframework.core.log.LogAccessor; import static org.assertj.core.api.Assertions.assertThat; @EnabledIfEnvironmentVariable(named = "OPENAI_API_KEY", matches = ".*") public class OpenAiFunctionCallback2IT { - private static final LogAccessor logger = new LogAccessor(OpenAiFunctionCallback2IT.class); + private final Logger logger = LoggerFactory.getLogger(OpenAiFunctionCallback2IT.class); private final ApplicationContextRunner contextRunner = new ApplicationContextRunner() .withPropertyValues("spring.ai.openai.apiKey=" + System.getenv("OPENAI_API_KEY"), @@ -63,7 +64,7 @@ void functionCallTest() { .call().content(); // @formatter:on - logger.info("Response: " + content); + logger.info("Response: {}", content); assertThat(content).contains("30", "10", "15"); }); @@ -83,7 +84,7 @@ void streamFunctionCallTest() { .collectList().block().stream().collect(Collectors.joining()); // @formatter:on - logger.info("Response: " + content); + logger.info("Response: {}", content); assertThat(content).contains("30", "10", "15"); }); diff --git a/spring-ai-spring-boot-autoconfigure/src/test/java/org/springframework/ai/autoconfigure/openai/tool/OpenAiFunctionCallbackIT.java b/spring-ai-spring-boot-autoconfigure/src/test/java/org/springframework/ai/autoconfigure/openai/tool/OpenAiFunctionCallbackIT.java index ffc799fe71c..d4914146cec 100644 --- a/spring-ai-spring-boot-autoconfigure/src/test/java/org/springframework/ai/autoconfigure/openai/tool/OpenAiFunctionCallbackIT.java +++ b/spring-ai-spring-boot-autoconfigure/src/test/java/org/springframework/ai/autoconfigure/openai/tool/OpenAiFunctionCallbackIT.java @@ -21,6 +21,8 @@ import org.junit.jupiter.api.Test; import org.junit.jupiter.api.condition.EnabledIfEnvironmentVariable; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import reactor.core.publisher.Flux; import org.springframework.ai.autoconfigure.openai.OpenAiAutoConfiguration; @@ -38,14 +40,13 @@ import org.springframework.boot.test.context.runner.ApplicationContextRunner; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; -import org.springframework.core.log.LogAccessor; import static org.assertj.core.api.Assertions.assertThat; @EnabledIfEnvironmentVariable(named = "OPENAI_API_KEY", matches = ".*") public class OpenAiFunctionCallbackIT { - private static final LogAccessor logger = new LogAccessor(OpenAiFunctionCallbackIT.class); + private final Logger logger = LoggerFactory.getLogger(OpenAiFunctionCallbackIT.class); private final ApplicationContextRunner contextRunner = new ApplicationContextRunner() .withPropertyValues("spring.ai.openai.apiKey=" + System.getenv("OPENAI_API_KEY"), @@ -64,7 +65,7 @@ void functionCallTest() { ChatResponse response = chatModel .call(new Prompt(List.of(userMessage), OpenAiChatOptions.builder().function("WeatherInfo").build())); - logger.info("Response: " + response); + logger.info("Response: {}", response); assertThat(response.getResult().getOutput().getText()).contains("30", "10", "15"); @@ -91,7 +92,7 @@ void streamFunctionCallTest() { .map(Generation::getOutput) .map(AssistantMessage::getText) .collect(Collectors.joining()); - logger.info("Response: " + content); + logger.info("Response: {}", content); assertThat(content).containsAnyOf("30.0", "30"); assertThat(content).containsAnyOf("10.0", "10"); diff --git a/spring-ai-spring-boot-autoconfigure/src/test/java/org/springframework/ai/autoconfigure/qianfan/QianFanAutoConfigurationIT.java b/spring-ai-spring-boot-autoconfigure/src/test/java/org/springframework/ai/autoconfigure/qianfan/QianFanAutoConfigurationIT.java index f04ed5d815c..78842991257 100644 --- a/spring-ai-spring-boot-autoconfigure/src/test/java/org/springframework/ai/autoconfigure/qianfan/QianFanAutoConfigurationIT.java +++ b/spring-ai-spring-boot-autoconfigure/src/test/java/org/springframework/ai/autoconfigure/qianfan/QianFanAutoConfigurationIT.java @@ -20,6 +20,8 @@ import java.util.Objects; import java.util.stream.Collectors; +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.condition.EnabledIfEnvironmentVariable; import org.junit.jupiter.api.condition.EnabledIfEnvironmentVariables; @@ -38,7 +40,6 @@ import org.springframework.boot.autoconfigure.AutoConfigurations; import org.springframework.boot.autoconfigure.web.client.RestClientAutoConfiguration; import org.springframework.boot.test.context.runner.ApplicationContextRunner; -import org.springframework.core.log.LogAccessor; import static org.assertj.core.api.Assertions.assertThat; @@ -49,7 +50,7 @@ @EnabledIfEnvironmentVariable(named = "QIANFAN_SECRET_KEY", matches = ".+") }) public class QianFanAutoConfigurationIT { - private static final LogAccessor logger = new LogAccessor(QianFanAutoConfigurationIT.class); + private static final Log logger = LogFactory.getLog(QianFanAutoConfigurationIT.class); private final ApplicationContextRunner contextRunner = new ApplicationContextRunner() .withPropertyValues("spring.ai.qianfan.apiKey=" + System.getenv("QIANFAN_API_KEY"), diff --git a/spring-ai-spring-boot-autoconfigure/src/test/java/org/springframework/ai/autoconfigure/vertexai/gemini/VertexAiGeminiAutoConfigurationIT.java b/spring-ai-spring-boot-autoconfigure/src/test/java/org/springframework/ai/autoconfigure/vertexai/gemini/VertexAiGeminiAutoConfigurationIT.java index 5ad44895e60..ca2cdeb3a02 100644 --- a/spring-ai-spring-boot-autoconfigure/src/test/java/org/springframework/ai/autoconfigure/vertexai/gemini/VertexAiGeminiAutoConfigurationIT.java +++ b/spring-ai-spring-boot-autoconfigure/src/test/java/org/springframework/ai/autoconfigure/vertexai/gemini/VertexAiGeminiAutoConfigurationIT.java @@ -18,6 +18,8 @@ import java.util.stream.Collectors; +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.condition.EnabledIfEnvironmentVariable; import reactor.core.publisher.Flux; @@ -28,7 +30,6 @@ import org.springframework.ai.vertexai.gemini.VertexAiGeminiChatModel; import org.springframework.boot.autoconfigure.AutoConfigurations; import org.springframework.boot.test.context.runner.ApplicationContextRunner; -import org.springframework.core.log.LogAccessor; import static org.assertj.core.api.Assertions.assertThat; @@ -36,7 +37,7 @@ @EnabledIfEnvironmentVariable(named = "VERTEX_AI_GEMINI_LOCATION", matches = ".*") public class VertexAiGeminiAutoConfigurationIT { - private static final LogAccessor logger = new LogAccessor(VertexAiGeminiAutoConfigurationIT.class); + private static final Log logger = LogFactory.getLog(VertexAiGeminiAutoConfigurationIT.class); private final ApplicationContextRunner contextRunner = new ApplicationContextRunner() .withPropertyValues("spring.ai.vertex.ai.gemini.project-id=" + System.getenv("VERTEX_AI_GEMINI_PROJECT_ID"), diff --git a/spring-ai-spring-boot-autoconfigure/src/test/java/org/springframework/ai/autoconfigure/vertexai/gemini/tool/FunctionCallWithFunctionBeanIT.java b/spring-ai-spring-boot-autoconfigure/src/test/java/org/springframework/ai/autoconfigure/vertexai/gemini/tool/FunctionCallWithFunctionBeanIT.java index 304bff8fcfc..92769b23488 100644 --- a/spring-ai-spring-boot-autoconfigure/src/test/java/org/springframework/ai/autoconfigure/vertexai/gemini/tool/FunctionCallWithFunctionBeanIT.java +++ b/spring-ai-spring-boot-autoconfigure/src/test/java/org/springframework/ai/autoconfigure/vertexai/gemini/tool/FunctionCallWithFunctionBeanIT.java @@ -21,6 +21,8 @@ import org.junit.jupiter.api.Test; import org.junit.jupiter.api.condition.EnabledIfEnvironmentVariable; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import org.springframework.ai.autoconfigure.vertexai.gemini.VertexAiGeminiAutoConfiguration; import org.springframework.ai.chat.messages.UserMessage; @@ -34,7 +36,6 @@ import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.Description; -import org.springframework.core.log.LogAccessor; import static org.assertj.core.api.Assertions.assertThat; @@ -42,7 +43,7 @@ @EnabledIfEnvironmentVariable(named = "VERTEX_AI_GEMINI_LOCATION", matches = ".*") class FunctionCallWithFunctionBeanIT { - private static final LogAccessor logger = new LogAccessor(FunctionCallWithFunctionBeanIT.class); + private final Logger logger = LoggerFactory.getLogger(FunctionCallWithFunctionBeanIT.class); private final ApplicationContextRunner contextRunner = new ApplicationContextRunner() .withPropertyValues("spring.ai.vertex.ai.gemini.project-id=" + System.getenv("VERTEX_AI_GEMINI_PROJECT_ID"), @@ -70,21 +71,21 @@ void functionCallTest() { ChatResponse response = chatModel.call(new Prompt(List.of(userMessage), VertexAiGeminiChatOptions.builder().function("weatherFunction").build())); - logger.info("Response: " + response); + logger.info("Response: {}", response); assertThat(response.getResult().getOutput().getText()).contains("30", "10", "15"); response = chatModel.call(new Prompt(List.of(userMessage), VertexAiGeminiChatOptions.builder().function("weatherFunction3").build())); - logger.info("Response: " + response); + logger.info("Response: {}", response); assertThat(response.getResult().getOutput().getText()).contains("30", "10", "15"); response = chatModel .call(new Prompt(List.of(userMessage), VertexAiGeminiChatOptions.builder().build())); - logger.info("Response: " + response); + logger.info("Response: {}", response); assertThat(response.getResult().getOutput().getText()).doesNotContain("30", "10", "15"); @@ -110,14 +111,14 @@ void functionCallWithPortableFunctionCallingOptions() { ChatResponse response = chatModel.call(new Prompt(List.of(userMessage), FunctionCallingOptions.builder().function("weatherFunction").build())); - logger.info("Response: " + response); + logger.info("Response: {}", response); assertThat(response.getResult().getOutput().getText()).contains("30", "10", "15"); response = chatModel.call(new Prompt(List.of(userMessage), VertexAiGeminiChatOptions.builder().function("weatherFunction3").build())); - logger.info("Response: " + response); + logger.info("Response: {}", response); assertThat(response.getResult().getOutput().getText()).contains("30", "10", "15"); diff --git a/spring-ai-spring-boot-autoconfigure/src/test/java/org/springframework/ai/autoconfigure/vertexai/gemini/tool/FunctionCallWithFunctionWrapperIT.java b/spring-ai-spring-boot-autoconfigure/src/test/java/org/springframework/ai/autoconfigure/vertexai/gemini/tool/FunctionCallWithFunctionWrapperIT.java index 497894fd555..4747e6af870 100644 --- a/spring-ai-spring-boot-autoconfigure/src/test/java/org/springframework/ai/autoconfigure/vertexai/gemini/tool/FunctionCallWithFunctionWrapperIT.java +++ b/spring-ai-spring-boot-autoconfigure/src/test/java/org/springframework/ai/autoconfigure/vertexai/gemini/tool/FunctionCallWithFunctionWrapperIT.java @@ -20,6 +20,8 @@ import org.junit.jupiter.api.Test; import org.junit.jupiter.api.condition.EnabledIfEnvironmentVariable; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import org.springframework.ai.autoconfigure.vertexai.gemini.VertexAiGeminiAutoConfiguration; import org.springframework.ai.chat.messages.UserMessage; @@ -33,7 +35,6 @@ import org.springframework.boot.test.context.runner.ApplicationContextRunner; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; -import org.springframework.core.log.LogAccessor; import static org.assertj.core.api.Assertions.assertThat; @@ -41,7 +42,7 @@ @EnabledIfEnvironmentVariable(named = "VERTEX_AI_GEMINI_LOCATION", matches = ".*") public class FunctionCallWithFunctionWrapperIT { - private static final LogAccessor logger = new LogAccessor(FunctionCallWithFunctionWrapperIT.class); + private final Logger logger = LoggerFactory.getLogger(FunctionCallWithFunctionWrapperIT.class); private final ApplicationContextRunner contextRunner = new ApplicationContextRunner() .withPropertyValues("spring.ai.vertex.ai.gemini.project-id=" + System.getenv("VERTEX_AI_GEMINI_PROJECT_ID"), @@ -66,7 +67,7 @@ void functionCallTest() { ChatResponse response = chatModel.call(new Prompt(List.of(userMessage), VertexAiGeminiChatOptions.builder().function("WeatherInfo").build())); - logger.info("Response: " + response); + logger.info("Response: {}", response); assertThat(response.getResult().getOutput().getText()).contains("30", "10", "15"); }); diff --git a/spring-ai-spring-boot-autoconfigure/src/test/java/org/springframework/ai/autoconfigure/vertexai/gemini/tool/FunctionCallWithPromptFunctionIT.java b/spring-ai-spring-boot-autoconfigure/src/test/java/org/springframework/ai/autoconfigure/vertexai/gemini/tool/FunctionCallWithPromptFunctionIT.java index f3cad660d11..99e524f5219 100644 --- a/spring-ai-spring-boot-autoconfigure/src/test/java/org/springframework/ai/autoconfigure/vertexai/gemini/tool/FunctionCallWithPromptFunctionIT.java +++ b/spring-ai-spring-boot-autoconfigure/src/test/java/org/springframework/ai/autoconfigure/vertexai/gemini/tool/FunctionCallWithPromptFunctionIT.java @@ -20,6 +20,8 @@ import org.junit.jupiter.api.Test; import org.junit.jupiter.api.condition.EnabledIfEnvironmentVariable; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import org.springframework.ai.autoconfigure.vertexai.gemini.VertexAiGeminiAutoConfiguration; import org.springframework.ai.chat.messages.UserMessage; @@ -31,7 +33,6 @@ import org.springframework.ai.vertexai.gemini.VertexAiGeminiChatOptions; import org.springframework.boot.autoconfigure.AutoConfigurations; import org.springframework.boot.test.context.runner.ApplicationContextRunner; -import org.springframework.core.log.LogAccessor; import static org.assertj.core.api.Assertions.assertThat; @@ -39,7 +40,7 @@ @EnabledIfEnvironmentVariable(named = "VERTEX_AI_GEMINI_LOCATION", matches = ".*") public class FunctionCallWithPromptFunctionIT { - private static final LogAccessor logger = new LogAccessor(FunctionCallWithPromptFunctionIT.class); + private final Logger logger = LoggerFactory.getLogger(FunctionCallWithPromptFunctionIT.class); private final ApplicationContextRunner contextRunner = new ApplicationContextRunner() .withPropertyValues("spring.ai.vertex.ai.gemini.project-id=" + System.getenv("VERTEX_AI_GEMINI_PROJECT_ID"), @@ -77,7 +78,7 @@ void functionCallTest() { ChatResponse response = chatModel.call(new Prompt(List.of(userMessage), promptOptions)); - logger.info("Response: " + response); + logger.info("Response: {}", response); assertThat(response.getResult().getOutput().getText()).contains("30", "10", "15"); @@ -85,7 +86,7 @@ void functionCallTest() { response = chatModel .call(new Prompt(List.of(userMessage), VertexAiGeminiChatOptions.builder().build())); - logger.info("Response: " + response); + logger.info("Response: {}", response); assertThat(response.getResult().getOutput().getText()).doesNotContain("30", "10", "15"); diff --git a/spring-ai-spring-boot-autoconfigure/src/test/java/org/springframework/ai/autoconfigure/zhipuai/ZhiPuAiAutoConfigurationIT.java b/spring-ai-spring-boot-autoconfigure/src/test/java/org/springframework/ai/autoconfigure/zhipuai/ZhiPuAiAutoConfigurationIT.java index 8b00bace4c0..f60814cb4cf 100644 --- a/spring-ai-spring-boot-autoconfigure/src/test/java/org/springframework/ai/autoconfigure/zhipuai/ZhiPuAiAutoConfigurationIT.java +++ b/spring-ai-spring-boot-autoconfigure/src/test/java/org/springframework/ai/autoconfigure/zhipuai/ZhiPuAiAutoConfigurationIT.java @@ -19,6 +19,8 @@ import java.util.List; import java.util.stream.Collectors; +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.condition.EnabledIfEnvironmentVariable; import reactor.core.publisher.Flux; @@ -36,7 +38,6 @@ import org.springframework.boot.autoconfigure.AutoConfigurations; import org.springframework.boot.autoconfigure.web.client.RestClientAutoConfiguration; import org.springframework.boot.test.context.runner.ApplicationContextRunner; -import org.springframework.core.log.LogAccessor; import static org.assertj.core.api.Assertions.assertThat; @@ -46,7 +47,7 @@ @EnabledIfEnvironmentVariable(named = "ZHIPU_AI_API_KEY", matches = ".*") public class ZhiPuAiAutoConfigurationIT { - private static final LogAccessor logger = new LogAccessor(ZhiPuAiAutoConfigurationIT.class); + private static final Log logger = LogFactory.getLog(ZhiPuAiAutoConfigurationIT.class); private final ApplicationContextRunner contextRunner = new ApplicationContextRunner() .withPropertyValues("spring.ai.zhipuai.apiKey=" + System.getenv("ZHIPU_AI_API_KEY")) diff --git a/spring-ai-spring-boot-autoconfigure/src/test/java/org/springframework/ai/autoconfigure/zhipuai/tool/FunctionCallbackInPromptIT.java b/spring-ai-spring-boot-autoconfigure/src/test/java/org/springframework/ai/autoconfigure/zhipuai/tool/FunctionCallbackInPromptIT.java index 22cebfb3c75..556e7df8c19 100644 --- a/spring-ai-spring-boot-autoconfigure/src/test/java/org/springframework/ai/autoconfigure/zhipuai/tool/FunctionCallbackInPromptIT.java +++ b/spring-ai-spring-boot-autoconfigure/src/test/java/org/springframework/ai/autoconfigure/zhipuai/tool/FunctionCallbackInPromptIT.java @@ -21,6 +21,8 @@ import org.junit.jupiter.api.Test; import org.junit.jupiter.api.condition.EnabledIfEnvironmentVariable; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import reactor.core.publisher.Flux; import org.springframework.ai.autoconfigure.retry.SpringAiRetryAutoConfiguration; @@ -36,7 +38,6 @@ import org.springframework.boot.autoconfigure.AutoConfigurations; import org.springframework.boot.autoconfigure.web.client.RestClientAutoConfiguration; import org.springframework.boot.test.context.runner.ApplicationContextRunner; -import org.springframework.core.log.LogAccessor; import static org.assertj.core.api.Assertions.assertThat; @@ -46,7 +47,7 @@ @EnabledIfEnvironmentVariable(named = "ZHIPU_AI_API_KEY", matches = ".*") public class FunctionCallbackInPromptIT { - private static final LogAccessor logger = new LogAccessor(FunctionCallbackInPromptIT.class); + private final Logger logger = LoggerFactory.getLogger(FunctionCallbackInPromptIT.class); private final ApplicationContextRunner contextRunner = new ApplicationContextRunner() .withPropertyValues("spring.ai.zhipuai.apiKey=" + System.getenv("ZHIPU_AI_API_KEY")) @@ -74,7 +75,7 @@ void functionCallTest() { ChatResponse response = chatModel.call(new Prompt(List.of(userMessage), promptOptions)); - logger.info("Response: " + response); + logger.info("Response: {}", response); assertThat(response.getResult().getOutput().getText()).contains("30", "10", "15"); }); @@ -108,7 +109,7 @@ void streamingFunctionCallTest() { .map(Generation::getOutput) .map(AssistantMessage::getText) .collect(Collectors.joining()); - logger.info("Response: " + content); + logger.info("Response: {}", content); assertThat(content).containsAnyOf("30.0", "30"); assertThat(content).containsAnyOf("10.0", "10"); diff --git a/spring-ai-spring-boot-autoconfigure/src/test/java/org/springframework/ai/autoconfigure/zhipuai/tool/FunctionCallbackWithPlainFunctionBeanIT.java b/spring-ai-spring-boot-autoconfigure/src/test/java/org/springframework/ai/autoconfigure/zhipuai/tool/FunctionCallbackWithPlainFunctionBeanIT.java index 20c04423401..714ea619c44 100644 --- a/spring-ai-spring-boot-autoconfigure/src/test/java/org/springframework/ai/autoconfigure/zhipuai/tool/FunctionCallbackWithPlainFunctionBeanIT.java +++ b/spring-ai-spring-boot-autoconfigure/src/test/java/org/springframework/ai/autoconfigure/zhipuai/tool/FunctionCallbackWithPlainFunctionBeanIT.java @@ -22,6 +22,8 @@ import org.junit.jupiter.api.Test; import org.junit.jupiter.api.condition.EnabledIfEnvironmentVariable; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import reactor.core.publisher.Flux; import org.springframework.ai.autoconfigure.retry.SpringAiRetryAutoConfiguration; @@ -40,7 +42,6 @@ import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.Description; -import org.springframework.core.log.LogAccessor; import static org.assertj.core.api.Assertions.assertThat; @@ -50,7 +51,7 @@ @EnabledIfEnvironmentVariable(named = "ZHIPU_AI_API_KEY", matches = ".*") class FunctionCallbackWithPlainFunctionBeanIT { - private static final LogAccessor logger = new LogAccessor(FunctionCallbackWithPlainFunctionBeanIT.class); + private final Logger logger = LoggerFactory.getLogger(FunctionCallbackWithPlainFunctionBeanIT.class); private final ApplicationContextRunner contextRunner = new ApplicationContextRunner() .withPropertyValues("spring.ai.zhipuai.apiKey=" + System.getenv("ZHIPU_AI_API_KEY")) @@ -71,7 +72,7 @@ void functionCallTest() { ChatResponse response = chatModel.call( new Prompt(List.of(userMessage), ZhiPuAiChatOptions.builder().function("weatherFunction").build())); - logger.info("Response: " + response); + logger.info("Response: {}", response); assertThat(response.getResult().getOutput().getText()).contains("30", "10", "15"); @@ -79,7 +80,7 @@ void functionCallTest() { response = chatModel.call(new Prompt(List.of(userMessage), ZhiPuAiChatOptions.builder().function("weatherFunctionTwo").build())); - logger.info("Response: " + response); + logger.info("Response: {}", response); assertThat(response.getResult().getOutput().getText()).contains("30", "10", "15"); @@ -102,7 +103,7 @@ void functionCallWithPortableFunctionCallingOptions() { ChatResponse response = chatModel.call(new Prompt(List.of(userMessage), functionOptions)); - logger.info("Response: " + response); + logger.info("Response: {}", response); }); } @@ -127,7 +128,7 @@ void streamFunctionCallTest() { .map(Generation::getOutput) .map(AssistantMessage::getText) .collect(Collectors.joining()); - logger.info("Response: " + content); + logger.info("Response: {}", content); assertThat(content).containsAnyOf("30.0", "30"); assertThat(content).containsAnyOf("10.0", "10"); @@ -145,7 +146,7 @@ void streamFunctionCallTest() { .map(Generation::getOutput) .map(AssistantMessage::getText) .collect(Collectors.joining()); - logger.info("Response: " + content); + logger.info("Response: {}", content); assertThat(content).containsAnyOf("30.0", "30"); assertThat(content).containsAnyOf("10.0", "10"); diff --git a/spring-ai-spring-boot-autoconfigure/src/test/java/org/springframework/ai/autoconfigure/zhipuai/tool/ZhipuAiFunctionCallbackIT.java b/spring-ai-spring-boot-autoconfigure/src/test/java/org/springframework/ai/autoconfigure/zhipuai/tool/ZhipuAiFunctionCallbackIT.java index d73535ca2a9..6b258e98d1a 100644 --- a/spring-ai-spring-boot-autoconfigure/src/test/java/org/springframework/ai/autoconfigure/zhipuai/tool/ZhipuAiFunctionCallbackIT.java +++ b/spring-ai-spring-boot-autoconfigure/src/test/java/org/springframework/ai/autoconfigure/zhipuai/tool/ZhipuAiFunctionCallbackIT.java @@ -21,6 +21,8 @@ import org.junit.jupiter.api.Test; import org.junit.jupiter.api.condition.EnabledIfEnvironmentVariable; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import reactor.core.publisher.Flux; import org.springframework.ai.autoconfigure.retry.SpringAiRetryAutoConfiguration; @@ -38,7 +40,6 @@ import org.springframework.boot.test.context.runner.ApplicationContextRunner; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; -import org.springframework.core.log.LogAccessor; import static org.assertj.core.api.Assertions.assertThat; @@ -48,7 +49,7 @@ @EnabledIfEnvironmentVariable(named = "ZHIPU_AI_API_KEY", matches = ".*") public class ZhipuAiFunctionCallbackIT { - private static final LogAccessor logger = new LogAccessor(ZhipuAiFunctionCallbackIT.class); + private final Logger logger = LoggerFactory.getLogger(ZhipuAiFunctionCallbackIT.class); private final ApplicationContextRunner contextRunner = new ApplicationContextRunner() .withPropertyValues("spring.ai.zhipuai.apiKey=" + System.getenv("ZHIPU_AI_API_KEY")) @@ -68,7 +69,7 @@ void functionCallTest() { ChatResponse response = chatModel .call(new Prompt(List.of(userMessage), ZhiPuAiChatOptions.builder().function("WeatherInfo").build())); - logger.info("Response: " + response); + logger.info("Response: {}", response); assertThat(response.getResult().getOutput().getText()).contains("30", "10", "15"); @@ -95,7 +96,7 @@ void streamFunctionCallTest() { .map(Generation::getOutput) .map(AssistantMessage::getText) .collect(Collectors.joining()); - logger.info("Response: " + content); + logger.info("Response: {}", content); assertThat(content).containsAnyOf("30.0", "30"); assertThat(content).containsAnyOf("10.0", "10"); diff --git a/spring-ai-spring-boot-autoconfigure/src/test/kotlin/org/springframework/ai/autoconfigure/ollama/tool/FunctionCallbackContextKotlinIT.kt b/spring-ai-spring-boot-autoconfigure/src/test/kotlin/org/springframework/ai/autoconfigure/ollama/tool/FunctionCallbackContextKotlinIT.kt index 83b2ce73fcb..884d40d0309 100644 --- a/spring-ai-spring-boot-autoconfigure/src/test/kotlin/org/springframework/ai/autoconfigure/ollama/tool/FunctionCallbackContextKotlinIT.kt +++ b/spring-ai-spring-boot-autoconfigure/src/test/kotlin/org/springframework/ai/autoconfigure/ollama/tool/FunctionCallbackContextKotlinIT.kt @@ -19,19 +19,21 @@ package org.springframework.ai.autoconfigure.ollama.tool import org.assertj.core.api.Assertions.assertThat import org.junit.jupiter.api.BeforeAll import org.junit.jupiter.api.Test +import org.slf4j.LoggerFactory + import org.springframework.ai.autoconfigure.ollama.BaseOllamaIT import org.springframework.ai.autoconfigure.ollama.OllamaAutoConfiguration import org.springframework.ai.chat.messages.UserMessage import org.springframework.ai.chat.prompt.Prompt import org.springframework.ai.model.function.FunctionCallingOptions import org.springframework.ai.ollama.OllamaChatModel +import org.springframework.ai.ollama.api.OllamaModel import org.springframework.ai.ollama.api.OllamaOptions import org.springframework.boot.autoconfigure.AutoConfigurations import org.springframework.boot.test.context.runner.ApplicationContextRunner import org.springframework.context.annotation.Bean import org.springframework.context.annotation.Configuration import org.springframework.context.annotation.Description -import org.springframework.core.log.LogAccessor class FunctionCallbackResolverKotlinIT : BaseOllamaIT() { @@ -46,7 +48,7 @@ class FunctionCallbackResolverKotlinIT : BaseOllamaIT() { } } - private val logger = LogAccessor(FunctionCallbackResolverKotlinIT::class.java) + private val logger = LoggerFactory.getLogger(FunctionCallbackResolverKotlinIT::class.java) private val contextRunner = ApplicationContextRunner() .withPropertyValues( diff --git a/spring-ai-spring-boot-autoconfigure/src/test/kotlin/org/springframework/ai/autoconfigure/ollama/tool/FunctionCallbackKotlinIT.kt b/spring-ai-spring-boot-autoconfigure/src/test/kotlin/org/springframework/ai/autoconfigure/ollama/tool/FunctionCallbackKotlinIT.kt index 990a98b5444..691c22bf957 100644 --- a/spring-ai-spring-boot-autoconfigure/src/test/kotlin/org/springframework/ai/autoconfigure/ollama/tool/FunctionCallbackKotlinIT.kt +++ b/spring-ai-spring-boot-autoconfigure/src/test/kotlin/org/springframework/ai/autoconfigure/ollama/tool/FunctionCallbackKotlinIT.kt @@ -19,6 +19,8 @@ package org.springframework.ai.autoconfigure.ollama.tool import org.assertj.core.api.Assertions.assertThat import org.junit.jupiter.api.BeforeAll import org.junit.jupiter.api.Test +import org.slf4j.LoggerFactory + import org.springframework.ai.autoconfigure.ollama.BaseOllamaIT import org.springframework.ai.autoconfigure.ollama.OllamaAutoConfiguration import org.springframework.ai.chat.messages.UserMessage @@ -31,7 +33,6 @@ import org.springframework.boot.autoconfigure.AutoConfigurations import org.springframework.boot.test.context.runner.ApplicationContextRunner import org.springframework.context.annotation.Bean import org.springframework.context.annotation.Configuration -import org.springframework.core.log.LogAccessor class FunctionCallbackKotlinIT : BaseOllamaIT() { @@ -46,7 +47,7 @@ class FunctionCallbackKotlinIT : BaseOllamaIT() { } } - private val logger = LogAccessor(FunctionCallbackKotlinIT::class.java) + private val logger = LoggerFactory.getLogger(FunctionCallbackKotlinIT::class.java) private val contextRunner = ApplicationContextRunner() .withPropertyValues( diff --git a/spring-ai-spring-boot-testcontainers/src/test/java/org/springframework/ai/testcontainers/service/connection/ollama/OllamaContainerConnectionDetailsFactoryIT.java b/spring-ai-spring-boot-testcontainers/src/test/java/org/springframework/ai/testcontainers/service/connection/ollama/OllamaContainerConnectionDetailsFactoryIT.java index 0cd31f60507..4a9b6824d91 100644 --- a/spring-ai-spring-boot-testcontainers/src/test/java/org/springframework/ai/testcontainers/service/connection/ollama/OllamaContainerConnectionDetailsFactoryIT.java +++ b/spring-ai-spring-boot-testcontainers/src/test/java/org/springframework/ai/testcontainers/service/connection/ollama/OllamaContainerConnectionDetailsFactoryIT.java @@ -22,6 +22,8 @@ import org.junit.jupiter.api.BeforeAll; import org.junit.jupiter.api.Disabled; import org.junit.jupiter.api.Test; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import org.testcontainers.junit.jupiter.Container; import org.testcontainers.junit.jupiter.Testcontainers; import org.testcontainers.ollama.OllamaContainer; @@ -34,7 +36,6 @@ import org.springframework.boot.autoconfigure.web.client.RestClientAutoConfiguration; import org.springframework.boot.testcontainers.service.connection.ServiceConnection; import org.springframework.context.annotation.Configuration; -import org.springframework.core.log.LogAccessor; import org.springframework.test.context.TestPropertySource; import org.springframework.test.context.junit.jupiter.SpringJUnitConfig; @@ -53,7 +54,7 @@ class OllamaContainerConnectionDetailsFactoryIT { static final String MODEL_NAME = "nomic-embed-text"; - private static final LogAccessor logger = new LogAccessor(OllamaContainerConnectionDetailsFactoryIT.class); + private static final Logger logger = LoggerFactory.getLogger(OllamaContainerConnectionDetailsFactoryIT.class); @Container @ServiceConnection @@ -64,9 +65,9 @@ class OllamaContainerConnectionDetailsFactoryIT { @BeforeAll public static void beforeAll() throws IOException, InterruptedException { - logger.info("Start pulling the '" + MODEL_NAME + "' model. The operation can take several minutes..."); + logger.info("Start pulling the '{}' model. The operation can take several minutes...", MODEL_NAME); ollama.execInContainer("ollama", "pull", MODEL_NAME); - logger.info("Completed pulling the '" + MODEL_NAME + "' model"); + logger.info("Completed pulling the '{}' model", MODEL_NAME); } @Test diff --git a/spring-ai-test/src/main/java/org/springframework/ai/evaluation/BasicEvaluationTest.java b/spring-ai-test/src/main/java/org/springframework/ai/evaluation/BasicEvaluationTest.java index c38bc6ea267..69e50493c17 100644 --- a/spring-ai-test/src/main/java/org/springframework/ai/evaluation/BasicEvaluationTest.java +++ b/spring-ai-test/src/main/java/org/springframework/ai/evaluation/BasicEvaluationTest.java @@ -19,6 +19,9 @@ import java.util.List; import java.util.Map; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + import org.springframework.ai.chat.messages.Message; import org.springframework.ai.chat.messages.SystemMessage; import org.springframework.ai.chat.model.ChatModel; @@ -27,14 +30,13 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.core.io.Resource; -import org.springframework.core.log.LogAccessor; import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.Assertions.fail; public class BasicEvaluationTest { - private static final LogAccessor logger = new LogAccessor(BasicEvaluationTest.class); + private static final Logger logger = LoggerFactory.getLogger(BasicEvaluationTest.class); @Autowired protected ChatModel openAiChatModel; diff --git a/vector-stores/spring-ai-azure-cosmos-db-store/src/main/java/org/springframework/ai/vectorstore/cosmosdb/CosmosDBVectorStore.java b/vector-stores/spring-ai-azure-cosmos-db-store/src/main/java/org/springframework/ai/vectorstore/cosmosdb/CosmosDBVectorStore.java index 45f8e8d01bf..ec40ee9d239 100644 --- a/vector-stores/spring-ai-azure-cosmos-db-store/src/main/java/org/springframework/ai/vectorstore/cosmosdb/CosmosDBVectorStore.java +++ b/vector-stores/spring-ai-azure-cosmos-db-store/src/main/java/org/springframework/ai/vectorstore/cosmosdb/CosmosDBVectorStore.java @@ -52,9 +52,12 @@ import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.node.ObjectNode; import org.apache.commons.lang3.tuple.ImmutablePair; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import reactor.core.publisher.Flux; import org.springframework.ai.document.Document; +import org.springframework.ai.embedding.BatchingStrategy; import org.springframework.ai.embedding.EmbeddingModel; import org.springframework.ai.embedding.EmbeddingOptionsBuilder; import org.springframework.ai.observation.conventions.VectorStoreProvider; @@ -63,7 +66,6 @@ import org.springframework.ai.vectorstore.filter.Filter; import org.springframework.ai.vectorstore.observation.AbstractObservationVectorStore; import org.springframework.ai.vectorstore.observation.VectorStoreObservationContext; -import org.springframework.core.log.LogAccessor; import org.springframework.lang.Nullable; import org.springframework.util.Assert; @@ -77,7 +79,7 @@ */ public class CosmosDBVectorStore extends AbstractObservationVectorStore implements AutoCloseable { - private static final LogAccessor logger = new LogAccessor(CosmosDBVectorStore.class); + private static final Logger logger = LoggerFactory.getLogger(CosmosDBVectorStore.class); private final CosmosAsyncClient cosmosClient; @@ -251,19 +253,19 @@ public void doAdd(List documents) { // for status code 409 } else { - logger.info("Document added with status: " + statusCode); + logger.info("Document added with status: {}", statusCode); } } else { logger.warn("Received a null response or null status code for a document operation."); } }) - .doOnError(error -> logger.error("Error adding document: " + error.getMessage())) + .doOnError(error -> logger.error("Error adding document: {}", error.getMessage())) .doOnComplete(() -> logger.info("Bulk operation completed successfully.")) .blockLast(); // Block until the last item of the Flux is processed } catch (Exception e) { - logger.error(e, "Exception occurred during bulk add operation: " + e.getMessage()); + logger.error("Exception occurred during bulk add operation: {}", e.getMessage(), e); throw e; // Rethrow the exception after logging } } @@ -279,15 +281,15 @@ public Optional doDelete(List idList) { // Execute bulk delete operations synchronously by using blockLast() on the // Flux this.container.executeBulkOperations(Flux.fromIterable(itemOperations)) - .doOnNext(response -> logger - .info("Document deleted with status: " + response.getResponse().getStatusCode())) - .doOnError(error -> logger.error("Error deleting document: " + error.getMessage())) + .doOnNext(response -> logger.info("Document deleted with status: {}", + response.getResponse().getStatusCode())) + .doOnError(error -> logger.error("Error deleting document: {}", error.getMessage())) .blockLast(); // This will block until all operations have finished return Optional.of(true); } catch (Exception e) { - logger.error("Exception while deleting documents: " + e.getMessage()); + logger.error("Exception while deleting documents: {}", e.getMessage()); return Optional.of(false); } } @@ -307,7 +309,7 @@ public List doSimilaritySearch(SearchRequest request) { // Convert query into vector embedding float[] embedding = this.embeddingModel.embed(request.getQuery()); - logger.info("similarity threshold: " + request.getSimilarityThreshold()); + logger.info("similarity threshold: {}", request.getSimilarityThreshold()); List embeddingList = IntStream.range(0, embedding.length) .mapToObj(i -> embedding[i]) @@ -343,7 +345,7 @@ public List doSimilaritySearch(SearchRequest request) { CosmosPagedFlux pagedFlux = this.container.queryItems(sqlQuerySpec, options, JsonNode.class); - logger.info("Executing similarity search query: " + query); + logger.info("Executing similarity search query: {}", query); try { // Collect documents from the paged flux List documents = pagedFlux.byPage() @@ -358,7 +360,7 @@ public List doSimilaritySearch(SearchRequest request) { return docs != null ? docs : List.of(); } catch (Exception e) { - logger.error("Error during similarity search: " + e.getMessage()); + logger.error("Error during similarity search: {}", e.getMessage()); return List.of(); } } diff --git a/vector-stores/spring-ai-azure-store/src/main/java/org/springframework/ai/vectorstore/azure/AzureVectorStore.java b/vector-stores/spring-ai-azure-store/src/main/java/org/springframework/ai/vectorstore/azure/AzureVectorStore.java index e7dfb531d1a..f983b79b905 100644 --- a/vector-stores/spring-ai-azure-store/src/main/java/org/springframework/ai/vectorstore/azure/AzureVectorStore.java +++ b/vector-stores/spring-ai-azure-store/src/main/java/org/springframework/ai/vectorstore/azure/AzureVectorStore.java @@ -42,7 +42,8 @@ import com.azure.search.documents.models.SearchOptions; import com.azure.search.documents.models.VectorSearchOptions; import com.azure.search.documents.models.VectorizedQuery; -import org.apache.commons.logging.LogFactory; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import org.springframework.ai.document.Document; import org.springframework.ai.document.DocumentMetadata; @@ -57,7 +58,6 @@ import org.springframework.ai.vectorstore.observation.AbstractObservationVectorStore; import org.springframework.ai.vectorstore.observation.VectorStoreObservationContext; import org.springframework.beans.factory.InitializingBean; -import org.springframework.core.log.LogAccessor; import org.springframework.lang.Nullable; import org.springframework.util.Assert; import org.springframework.util.CollectionUtils; @@ -80,7 +80,7 @@ public class AzureVectorStore extends AbstractObservationVectorStore implements public static final String DEFAULT_INDEX_NAME = "spring_ai_azure_vector_store"; - private static final LogAccessor logger = new LogAccessor(LogFactory.getLog(AzureVectorStore.class)); + private static final Logger logger = LoggerFactory.getLogger(AzureVectorStore.class); private static final String SPRING_AI_VECTOR_CONFIG = "spring-ai-vector-config"; diff --git a/vector-stores/spring-ai-cassandra-store/src/main/java/org/springframework/ai/cassandra/SchemaUtil.java b/vector-stores/spring-ai-cassandra-store/src/main/java/org/springframework/ai/cassandra/SchemaUtil.java index 694674f7b36..ebaf90de296 100644 --- a/vector-stores/spring-ai-cassandra-store/src/main/java/org/springframework/ai/cassandra/SchemaUtil.java +++ b/vector-stores/spring-ai-cassandra-store/src/main/java/org/springframework/ai/cassandra/SchemaUtil.java @@ -21,9 +21,8 @@ import com.datastax.oss.driver.api.core.CqlSession; import com.datastax.oss.driver.api.core.cql.SimpleStatement; import com.datastax.oss.driver.api.querybuilder.SchemaBuilder; -import org.apache.commons.logging.LogFactory; - -import org.springframework.core.log.LogAccessor; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; /** * Utility class for working with Cassandra schema. @@ -33,7 +32,7 @@ */ public final class SchemaUtil { - private static final LogAccessor logger = new LogAccessor(LogFactory.getLog(SchemaUtil.class)); + private static final Logger logger = LoggerFactory.getLogger(SchemaUtil.class); private SchemaUtil() { @@ -62,7 +61,7 @@ public static void ensureKeyspaceExists(CqlSession session, String keyspaceName) .withSimpleStrategy(1) .build(); - logger.debug(() -> "Executing " + keyspaceStmt.getQuery()); + logger.debug("Executing {}", keyspaceStmt.getQuery()); session.execute(keyspaceStmt); } } diff --git a/vector-stores/spring-ai-cassandra-store/src/main/java/org/springframework/ai/chat/memory/cassandra/CassandraChatMemoryConfig.java b/vector-stores/spring-ai-cassandra-store/src/main/java/org/springframework/ai/chat/memory/cassandra/CassandraChatMemoryConfig.java index a95d1796fe5..fa62afe5950 100644 --- a/vector-stores/spring-ai-cassandra-store/src/main/java/org/springframework/ai/chat/memory/cassandra/CassandraChatMemoryConfig.java +++ b/vector-stores/spring-ai-cassandra-store/src/main/java/org/springframework/ai/chat/memory/cassandra/CassandraChatMemoryConfig.java @@ -40,10 +40,10 @@ import com.datastax.oss.driver.api.querybuilder.schema.CreateTableWithOptions; import com.datastax.oss.driver.shaded.guava.common.annotations.VisibleForTesting; import com.datastax.oss.driver.shaded.guava.common.base.Preconditions; -import org.apache.commons.logging.LogFactory; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import org.springframework.ai.cassandra.SchemaUtil; -import org.springframework.core.log.LogAccessor; /** * Configuration for the Cassandra Chat Memory store. @@ -67,7 +67,7 @@ public final class CassandraChatMemoryConfig { public static final String DEFAULT_USER_COLUMN_NAME = "user"; - private static final LogAccessor logger = new LogAccessor(LogFactory.getLog(CassandraChatMemoryConfig.class)); + private static final Logger logger = LoggerFactory.getLogger(CassandraChatMemoryConfig.class); final CqlSession session; @@ -193,7 +193,7 @@ private void ensureTableColumnsExist() { alterTable = alterTable.addColumn(this.userColumn, DataTypes.TEXT); } SimpleStatement stmt = ((AlterTableAddColumnEnd) alterTable).build(); - logger.debug(() -> "Executing " + stmt.getQuery()); + logger.debug("Executing {}", stmt.getQuery()); this.session.execute(stmt); } } diff --git a/vector-stores/spring-ai-cassandra-store/src/main/java/org/springframework/ai/vectorstore/cassandra/CassandraVectorStore.java b/vector-stores/spring-ai-cassandra-store/src/main/java/org/springframework/ai/vectorstore/cassandra/CassandraVectorStore.java index 9575ef5bcbf..d53cde41539 100644 --- a/vector-stores/spring-ai-cassandra-store/src/main/java/org/springframework/ai/vectorstore/cassandra/CassandraVectorStore.java +++ b/vector-stores/spring-ai-cassandra-store/src/main/java/org/springframework/ai/vectorstore/cassandra/CassandraVectorStore.java @@ -61,7 +61,8 @@ import com.datastax.oss.driver.api.querybuilder.schema.CreateTableStart; import com.datastax.oss.driver.shaded.guava.common.annotations.VisibleForTesting; import com.datastax.oss.driver.shaded.guava.common.base.Preconditions; -import org.apache.commons.logging.LogFactory; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import org.springframework.ai.cassandra.SchemaUtil; import org.springframework.ai.document.Document; @@ -78,7 +79,6 @@ import org.springframework.ai.vectorstore.filter.FilterExpressionConverter; import org.springframework.ai.vectorstore.observation.AbstractObservationVectorStore; import org.springframework.ai.vectorstore.observation.VectorStoreObservationContext; -import org.springframework.core.log.LogAccessor; import org.springframework.util.Assert; /** @@ -193,7 +193,7 @@ public class CassandraVectorStore extends AbstractObservationVectorStore impleme private static final String QUERY_FORMAT = "select %s,%s,%s%s from %s.%s ? order by %s ann of ? limit ?"; - private static final LogAccessor logger = new LogAccessor(LogFactory.getLog(CassandraVectorStore.class)); + private static final Logger logger = LoggerFactory.getLogger(CassandraVectorStore.class); private static final Map SIMILARITY_TYPE_MAPPING = Map.of( Similarity.COSINE, VectorStoreSimilarityMetric.COSINE, Similarity.EUCLIDEAN, @@ -346,11 +346,11 @@ protected void doDelete(Filter.Expression filterExpression) { throw new IllegalStateException("Failed to delete some documents"); } - logger.debug(() -> "Deleted " + idsToDelete.size() + " documents matching filter expression"); + logger.debug("Deleted {} documents matching filter expression", idsToDelete.size()); } } catch (Exception e) { - logger.error(e, () -> "Failed to delete documents by filter"); + logger.error("Failed to delete documents by filter", e); throw new IllegalStateException("Failed to delete documents by filter", e); } } @@ -371,7 +371,7 @@ public List doSimilaritySearch(SearchRequest request) { String query = String.format(this.similarityStmt, cqlVector, whereClause, cqlVector, request.getTopK()); List documents = new ArrayList<>(); - logger.trace(() -> "Executing " + query); + logger.trace("Executing {}", query); SimpleStatement s = SimpleStatement.newInstance(query).setExecutionProfileName(DRIVER_PROFILE_SEARCH); for (Row row : this.session.execute(s)) { @@ -483,8 +483,7 @@ private String similaritySearchStatement() { extraSelectFields.toString(), this.schema.keyspace(), this.schema.table(), this.schema.embedding()); query = query.replace("?", "%s"); - String finalQuery = query; - logger.debug("preparing " + finalQuery); + logger.debug("preparing {}", query); return query; } @@ -594,7 +593,7 @@ private void ensureIndexesExists() { .andColumn(this.schema.embedding) .build(); - logger.debug(() -> "Executing " + indexStmt.getQuery()); + logger.debug("Executing {}", indexStmt.getQuery()); this.session.execute(indexStmt); Stream @@ -610,7 +609,7 @@ private void ensureIndexesExists() { .andColumn(metadata.name()) .build(); - logger.debug(() -> "Executing " + indexStatement.getQuery()); + logger.debug("Executing {}", indexStatement.getQuery()); this.session.execute(indexStatement); }); } @@ -648,7 +647,7 @@ private void ensureTableExists(int vectorDimension) { .append(" vector)"); - logger.debug(() -> "Executing " + tableStmt); + logger.debug("Executing {}", tableStmt.toString()); this.session.execute(tableStmt.toString()); } } @@ -701,12 +700,12 @@ private void ensureTableColumnsExist(int vectorDimension) { .append(vectorDimension) .append(">)"); - logger.debug(() -> "Executing " + alterTableStmt.toString()); + logger.debug("Executing {}", alterTableStmt.toString()); this.session.execute(alterTableStmt.toString()); } else { SimpleStatement stmt = ((AlterTableAddColumnEnd) alterTable).build(); - logger.debug("Executing " + stmt.getQuery()); + logger.debug("Executing {}", stmt.getQuery()); this.session.execute(stmt); } } diff --git a/vector-stores/spring-ai-cassandra-store/src/test/java/org/springframework/ai/vectorstore/cassandra/CassandraRichSchemaVectorStoreIT.java b/vector-stores/spring-ai-cassandra-store/src/test/java/org/springframework/ai/vectorstore/cassandra/CassandraRichSchemaVectorStoreIT.java index dc5562129d9..e85a844c047 100644 --- a/vector-stores/spring-ai-cassandra-store/src/test/java/org/springframework/ai/vectorstore/cassandra/CassandraRichSchemaVectorStoreIT.java +++ b/vector-stores/spring-ai-cassandra-store/src/test/java/org/springframework/ai/vectorstore/cassandra/CassandraRichSchemaVectorStoreIT.java @@ -33,9 +33,10 @@ import com.datastax.oss.driver.api.core.servererrors.InvalidQueryException; import com.datastax.oss.driver.api.core.servererrors.SyntaxError; import com.datastax.oss.driver.api.core.type.DataTypes; -import org.apache.commons.logging.LogFactory; import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.Test; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import org.testcontainers.containers.CassandraContainer; import org.testcontainers.junit.jupiter.Container; import org.testcontainers.junit.jupiter.Testcontainers; @@ -55,7 +56,6 @@ import org.springframework.context.ApplicationContext; import org.springframework.context.annotation.Bean; import org.springframework.core.io.DefaultResourceLoader; -import org.springframework.core.log.LogAccessor; import static org.assertj.core.api.Assertions.assertThat; @@ -69,8 +69,7 @@ @Testcontainers class CassandraRichSchemaVectorStoreIT { - private static final LogAccessor logger = new LogAccessor( - LogFactory.getLog(CassandraRichSchemaVectorStoreIT.class)); + private static final Logger logger = LoggerFactory.getLogger(CassandraRichSchemaVectorStoreIT.class); private static final List documents = List.of( @@ -283,7 +282,7 @@ void addAndSearchPoormansBench() { } CompletableFuture.allOf(futures).join(); long time = System.nanoTime() - start; - logger.info(() -> "add+search took an average of {} ms" + Duration.ofNanos(time / runs).toMillis()); + logger.info("add+search took an average of {} ms", Duration.ofNanos(time / runs).toMillis()); } } }); @@ -601,7 +600,7 @@ private CassandraVectorStore.Builder createBuilder(ApplicationContext context, L } private void executeCqlFile(ApplicationContext context, String filename) throws IOException { - logger.info(() -> "executing " + filename); + logger.info("executing {}", filename); CqlSession session = context.getBean(CqlSession.class); diff --git a/vector-stores/spring-ai-chroma-store/src/main/java/org/springframework/ai/chroma/vectorstore/ChromaVectorStore.java b/vector-stores/spring-ai-chroma-store/src/main/java/org/springframework/ai/chroma/vectorstore/ChromaVectorStore.java index ca5ace32295..55184744330 100644 --- a/vector-stores/spring-ai-chroma-store/src/main/java/org/springframework/ai/chroma/vectorstore/ChromaVectorStore.java +++ b/vector-stores/spring-ai-chroma-store/src/main/java/org/springframework/ai/chroma/vectorstore/ChromaVectorStore.java @@ -25,6 +25,8 @@ import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.json.JsonMapper; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import org.springframework.ai.chroma.vectorstore.ChromaApi.AddEmbeddingsRequest; import org.springframework.ai.chroma.vectorstore.ChromaApi.DeleteEmbeddingsRequest; @@ -43,7 +45,6 @@ import org.springframework.ai.vectorstore.observation.AbstractObservationVectorStore; import org.springframework.ai.vectorstore.observation.VectorStoreObservationContext; import org.springframework.beans.factory.InitializingBean; -import org.springframework.core.log.LogAccessor; import org.springframework.lang.NonNull; import org.springframework.lang.Nullable; import org.springframework.util.Assert; @@ -81,7 +82,7 @@ public class ChromaVectorStore extends AbstractObservationVectorStore implements private boolean initialized = false; - private static final LogAccessor logger = new LogAccessor(ChromaVectorStore.class); + private static final Logger logger = LoggerFactory.getLogger(ChromaVectorStore.class); /** * @param builder {@link VectorStore.Builder} for chroma vector store @@ -179,7 +180,7 @@ protected void doDelete(Filter.Expression expression) { this.chromaApi.deleteEmbeddings(this.collectionId, deleteRequest); } catch (Exception e) { - logger.error(e, "Failed to delete documents by filter: " + e.getMessage()); + logger.error("Failed to delete documents by filter: {}", e.getMessage(), e); throw new IllegalStateException("Failed to delete documents by filter", e); } } diff --git a/vector-stores/spring-ai-elasticsearch-store/src/main/java/org/springframework/ai/vectorstore/elasticsearch/ElasticsearchVectorStore.java b/vector-stores/spring-ai-elasticsearch-store/src/main/java/org/springframework/ai/vectorstore/elasticsearch/ElasticsearchVectorStore.java index 4d2a1924209..3e7514ea3bf 100644 --- a/vector-stores/spring-ai-elasticsearch-store/src/main/java/org/springframework/ai/vectorstore/elasticsearch/ElasticsearchVectorStore.java +++ b/vector-stores/spring-ai-elasticsearch-store/src/main/java/org/springframework/ai/vectorstore/elasticsearch/ElasticsearchVectorStore.java @@ -35,13 +35,16 @@ import co.elastic.clients.transport.rest_client.RestClientTransport; import com.fasterxml.jackson.databind.DeserializationFeature; import com.fasterxml.jackson.databind.ObjectMapper; -import org.apache.commons.logging.LogFactory; import org.elasticsearch.client.RestClient; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import org.springframework.ai.document.Document; import org.springframework.ai.document.DocumentMetadata; +import org.springframework.ai.embedding.BatchingStrategy; import org.springframework.ai.embedding.EmbeddingModel; import org.springframework.ai.embedding.EmbeddingOptionsBuilder; +import org.springframework.ai.embedding.TokenCountBatchingStrategy; import org.springframework.ai.model.EmbeddingUtils; import org.springframework.ai.observation.conventions.VectorStoreProvider; import org.springframework.ai.observation.conventions.VectorStoreSimilarityMetric; @@ -52,7 +55,6 @@ import org.springframework.ai.vectorstore.observation.AbstractObservationVectorStore; import org.springframework.ai.vectorstore.observation.VectorStoreObservationContext; import org.springframework.beans.factory.InitializingBean; -import org.springframework.core.log.LogAccessor; import org.springframework.util.Assert; /** @@ -147,7 +149,7 @@ */ public class ElasticsearchVectorStore extends AbstractObservationVectorStore implements InitializingBean { - private static final LogAccessor logger = new LogAccessor(LogFactory.getLog(ElasticsearchVectorStore.class)); + private static final Logger logger = LoggerFactory.getLogger(ElasticsearchVectorStore.class); private static final Map SIMILARITY_TYPE_MAPPING = Map.of( SimilarityFunction.cosine, VectorStoreSimilarityMetric.COSINE, SimilarityFunction.l2_norm, diff --git a/vector-stores/spring-ai-gemfire-store/src/main/java/org/springframework/ai/vectorstore/gemfire/GemFireVectorStore.java b/vector-stores/spring-ai-gemfire-store/src/main/java/org/springframework/ai/vectorstore/gemfire/GemFireVectorStore.java index 4266827e303..37fc9383310 100644 --- a/vector-stores/spring-ai-gemfire-store/src/main/java/org/springframework/ai/vectorstore/gemfire/GemFireVectorStore.java +++ b/vector-stores/spring-ai-gemfire-store/src/main/java/org/springframework/ai/vectorstore/gemfire/GemFireVectorStore.java @@ -27,12 +27,15 @@ import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.json.JsonMapper; -import org.apache.commons.logging.LogFactory; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import org.springframework.ai.document.Document; import org.springframework.ai.document.DocumentMetadata; +import org.springframework.ai.embedding.BatchingStrategy; import org.springframework.ai.embedding.EmbeddingModel; import org.springframework.ai.embedding.EmbeddingOptionsBuilder; +import org.springframework.ai.embedding.TokenCountBatchingStrategy; import org.springframework.ai.observation.conventions.VectorStoreProvider; import org.springframework.ai.util.JacksonUtils; import org.springframework.ai.vectorstore.AbstractVectorStoreBuilder; @@ -40,7 +43,6 @@ import org.springframework.ai.vectorstore.observation.AbstractObservationVectorStore; import org.springframework.ai.vectorstore.observation.VectorStoreObservationContext; import org.springframework.beans.factory.InitializingBean; -import org.springframework.core.log.LogAccessor; import org.springframework.http.HttpMethod; import org.springframework.http.MediaType; import org.springframework.lang.Nullable; @@ -63,7 +65,7 @@ */ public class GemFireVectorStore extends AbstractObservationVectorStore implements InitializingBean { - private static final LogAccessor logger = new LogAccessor(LogFactory.getLog(GemFireVectorStore.class)); + private static final Logger logger = LoggerFactory.getLogger(GemFireVectorStore.class); private static final String DEFAULT_URI = "http{ssl}://{host}:{port}/gemfire-vectordb/v1/indexes"; @@ -239,7 +241,7 @@ public Optional doDelete(List idList) { .block(); } catch (Exception e) { - logger.warn(e, "Error removing embedding: " + e.getMessage()); + logger.warn("Error removing embedding: {}", e.getMessage(), e); return Optional.of(false); } return Optional.of(true); diff --git a/vector-stores/spring-ai-hanadb-store/src/main/java/org/springframework/ai/vectorstore/hanadb/HanaCloudVectorStore.java b/vector-stores/spring-ai-hanadb-store/src/main/java/org/springframework/ai/vectorstore/hanadb/HanaCloudVectorStore.java index 3821dca9864..e5722ad6ac6 100644 --- a/vector-stores/spring-ai-hanadb-store/src/main/java/org/springframework/ai/vectorstore/hanadb/HanaCloudVectorStore.java +++ b/vector-stores/spring-ai-hanadb-store/src/main/java/org/springframework/ai/vectorstore/hanadb/HanaCloudVectorStore.java @@ -24,7 +24,8 @@ import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.json.JsonMapper; -import org.apache.commons.logging.LogFactory; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import org.springframework.ai.document.Document; import org.springframework.ai.embedding.EmbeddingModel; @@ -36,7 +37,6 @@ import org.springframework.ai.vectorstore.SearchRequest; import org.springframework.ai.vectorstore.observation.AbstractObservationVectorStore; import org.springframework.ai.vectorstore.observation.VectorStoreObservationContext; -import org.springframework.core.log.LogAccessor; import org.springframework.lang.Nullable; import org.springframework.util.Assert; @@ -77,7 +77,7 @@ */ public class HanaCloudVectorStore extends AbstractObservationVectorStore { - private static final LogAccessor logger = new LogAccessor(LogFactory.getLog(HanaCloudVectorStore.class)); + private static final Logger logger = LoggerFactory.getLogger(HanaCloudVectorStore.class); private final HanaVectorRepository repository; @@ -116,25 +116,25 @@ public static Builder builder(HanaVectorRepository r public void doAdd(List documents) { int count = 1; for (Document document : documents) { - logger.info("[" + count++ + "/" + documents.size() + "] Calling EmbeddingModel for document id = " - + document.getId()); + logger.info("[{}/{}] Calling EmbeddingModel for document id = {}", count++, documents.size(), + document.getId()); String content = document.getText().replaceAll("\\s+", " "); String embedding = getEmbedding(document); this.repository.save(this.tableName, document.getId(), embedding, content); } - logger.info("Embeddings saved in HanaCloudVectorStore for " + (count - 1) + " documents"); + logger.info("Embeddings saved in HanaCloudVectorStore for {} documents", count - 1); } @Override public Optional doDelete(List idList) { int deleteCount = this.repository.deleteEmbeddingsById(this.tableName, idList); - logger.info(deleteCount + " embeddings deleted"); + logger.info("{} embeddings deleted", deleteCount); return Optional.of(deleteCount == idList.size()); } public int purgeEmbeddings() { int deleteCount = this.repository.deleteAllEmbeddings(this.tableName); - logger.info(deleteCount + " embeddings deleted"); + logger.info("{} embeddings deleted", deleteCount); return deleteCount; } @@ -153,8 +153,8 @@ public List doSimilaritySearch(SearchRequest request) { String queryEmbedding = getEmbedding(request); List searchResult = this.repository.cosineSimilaritySearch(this.tableName, request.getTopK(), queryEmbedding); - logger.info("Hana cosine-similarity for query=" + request.getQuery() + ", with topK=" + request.getTopK() - + " returned " + searchResult.size() + " results"); + logger.info("Hana cosine-similarity for query={}, with topK={} returned {} results", request.getQuery(), + request.getTopK(), searchResult.size()); return searchResult.stream().map(c -> { try { diff --git a/vector-stores/spring-ai-hanadb-store/src/test/java/org/springframework/ai/vectorstore/hanadb/CricketWorldCupHanaController.java b/vector-stores/spring-ai-hanadb-store/src/test/java/org/springframework/ai/vectorstore/hanadb/CricketWorldCupHanaController.java index de5a396de6a..e3745879a58 100644 --- a/vector-stores/spring-ai-hanadb-store/src/test/java/org/springframework/ai/vectorstore/hanadb/CricketWorldCupHanaController.java +++ b/vector-stores/spring-ai-hanadb-store/src/test/java/org/springframework/ai/vectorstore/hanadb/CricketWorldCupHanaController.java @@ -23,7 +23,8 @@ import java.util.function.Supplier; import java.util.stream.Collectors; -import org.apache.commons.logging.LogFactory; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import org.springframework.ai.chat.messages.UserMessage; import org.springframework.ai.chat.model.ChatModel; @@ -35,7 +36,6 @@ import org.springframework.ai.vectorstore.VectorStore; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.core.io.Resource; -import org.springframework.core.log.LogAccessor; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PostMapping; @@ -50,7 +50,7 @@ @RestController public class CricketWorldCupHanaController { - private static final LogAccessor logger = new LogAccessor(LogFactory.getLog(CricketWorldCupHanaController.class)); + private static final Logger logger = LoggerFactory.getLogger(CricketWorldCupHanaController.class); private final VectorStore hanaCloudVectorStore; @@ -65,7 +65,7 @@ public CricketWorldCupHanaController(ChatModel chatModel, VectorStore hanaCloudV @PostMapping("/ai/hana-vector-store/cricket-world-cup/purge-embeddings") public ResponseEntity purgeEmbeddings() { int deleteCount = ((HanaCloudVectorStore) this.hanaCloudVectorStore).purgeEmbeddings(); - logger.info(deleteCount + " embeddings purged from CRICKET_WORLD_CUP table in Hana DB"); + logger.info("{} embeddings purged from CRICKET_WORLD_CUP table in Hana DB", deleteCount); return ResponseEntity.ok() .body(String.format("%d embeddings purged from CRICKET_WORLD_CUP table in Hana DB", deleteCount)); } @@ -76,7 +76,7 @@ public ResponseEntity handleFileUpload(@RequestParam("pdf") MultipartFil Supplier> reader = new PagePdfDocumentReader(pdf); Function, List> splitter = new TokenTextSplitter(); List documents = splitter.apply(reader.get()); - logger.info(documents.size() + " documents created from pdf file: " + pdf.getFilename()); + logger.info("{} documents created from pdf file: {}", documents.size(), pdf.getFilename()); this.hanaCloudVectorStore.accept(documents); return ResponseEntity.ok() .body(String.format("%d documents created from pdf file: %s", documents.size(), pdf.getFilename())); @@ -92,7 +92,7 @@ public Map hanaVectorStoreSearch(@RequestParam("message") String var userMessage = new UserMessage(message); Prompt prompt = new Prompt(List.of(similarDocsMessage, userMessage)); String generation = this.chatModel.call(prompt).getResult().getOutput().getText(); - logger.info("Generation: " + generation); + logger.info("Generation: {}", generation); return Map.of("generation", generation); } diff --git a/vector-stores/spring-ai-hanadb-store/src/test/java/org/springframework/ai/vectorstore/hanadb/HanaCloudVectorStoreIT.java b/vector-stores/spring-ai-hanadb-store/src/test/java/org/springframework/ai/vectorstore/hanadb/HanaCloudVectorStoreIT.java index e913c778d56..8f0f1d488d1 100644 --- a/vector-stores/spring-ai-hanadb-store/src/test/java/org/springframework/ai/vectorstore/hanadb/HanaCloudVectorStoreIT.java +++ b/vector-stores/spring-ai-hanadb-store/src/test/java/org/springframework/ai/vectorstore/hanadb/HanaCloudVectorStoreIT.java @@ -22,10 +22,11 @@ import javax.sql.DataSource; -import org.apache.commons.logging.LogFactory; import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.condition.EnabledIfEnvironmentVariable; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import org.springframework.ai.document.Document; import org.springframework.ai.embedding.EmbeddingModel; @@ -38,7 +39,6 @@ import org.springframework.boot.autoconfigure.EnableAutoConfiguration; import org.springframework.boot.test.context.runner.ApplicationContextRunner; import org.springframework.context.annotation.Bean; -import org.springframework.core.log.LogAccessor; import org.springframework.jdbc.datasource.DriverManagerDataSource; import org.springframework.orm.jpa.JpaVendorAdapter; import org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean; @@ -54,7 +54,7 @@ @EnabledIfEnvironmentVariable(named = "HANA_DATASOURCE_PASSWORD", matches = ".+") public class HanaCloudVectorStoreIT { - private static final LogAccessor logger = new LogAccessor(LogFactory.getLog(HanaCloudVectorStoreIT.class)); + private static final Logger logger = LoggerFactory.getLogger(HanaCloudVectorStoreIT.class); private final ApplicationContextRunner contextRunner = new ApplicationContextRunner() .withUserConfiguration(HanaTestApplication.class); @@ -65,7 +65,7 @@ public void vectorStoreTest() { VectorStore vectorStore = context.getBean(HanaCloudVectorStore.class); int deleteCount = ((HanaCloudVectorStore) vectorStore).purgeEmbeddings(); - logger.info("Purged all embeddings: count=" + deleteCount); + logger.info("Purged all embeddings: count={}", deleteCount); Supplier> reader = new PagePdfDocumentReader("classpath:Cricket_World_Cup.pdf"); Function, List> splitter = new TokenTextSplitter(); diff --git a/vector-stores/spring-ai-mariadb-store/src/main/java/org/springframework/ai/vectorstore/mariadb/MariaDBSchemaValidator.java b/vector-stores/spring-ai-mariadb-store/src/main/java/org/springframework/ai/vectorstore/mariadb/MariaDBSchemaValidator.java index b2391205e1b..f3be68f087c 100644 --- a/vector-stores/spring-ai-mariadb-store/src/main/java/org/springframework/ai/vectorstore/mariadb/MariaDBSchemaValidator.java +++ b/vector-stores/spring-ai-mariadb-store/src/main/java/org/springframework/ai/vectorstore/mariadb/MariaDBSchemaValidator.java @@ -22,10 +22,10 @@ import java.util.Map; import java.util.regex.Pattern; -import org.apache.commons.logging.LogFactory; import org.mariadb.jdbc.Driver; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; -import org.springframework.core.log.LogAccessor; import org.springframework.dao.DataAccessException; import org.springframework.jdbc.core.JdbcTemplate; @@ -35,7 +35,7 @@ */ public class MariaDBSchemaValidator { - private static final LogAccessor logger = new LogAccessor(LogFactory.getLog(MariaDBSchemaValidator.class)); + private static final Logger logger = LoggerFactory.getLogger(MariaDBSchemaValidator.class); private final JdbcTemplate jdbcTemplate; @@ -79,7 +79,7 @@ void validateTableSchema(String schemaName, String tableName, String idFieldName } try { - logger.info(() -> "Validating MariaDBStore schema for table: " + tableName + " in schema: " + schemaName); + logger.info("Validating MariaDBStore schema for table: {} in schema: {}", tableName, schemaName); List expectedColumns = new ArrayList<>(); expectedColumns.add(idFieldName); diff --git a/vector-stores/spring-ai-mariadb-store/src/main/java/org/springframework/ai/vectorstore/mariadb/MariaDBVectorStore.java b/vector-stores/spring-ai-mariadb-store/src/main/java/org/springframework/ai/vectorstore/mariadb/MariaDBVectorStore.java index 4efc6554f91..9f5908ff085 100644 --- a/vector-stores/spring-ai-mariadb-store/src/main/java/org/springframework/ai/vectorstore/mariadb/MariaDBVectorStore.java +++ b/vector-stores/spring-ai-mariadb-store/src/main/java/org/springframework/ai/vectorstore/mariadb/MariaDBVectorStore.java @@ -28,11 +28,14 @@ import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.json.JsonMapper; -import org.apache.commons.logging.LogFactory; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import org.springframework.ai.document.Document; +import org.springframework.ai.embedding.BatchingStrategy; import org.springframework.ai.embedding.EmbeddingModel; import org.springframework.ai.embedding.EmbeddingOptionsBuilder; +import org.springframework.ai.embedding.TokenCountBatchingStrategy; import org.springframework.ai.observation.conventions.VectorStoreProvider; import org.springframework.ai.observation.conventions.VectorStoreSimilarityMetric; import org.springframework.ai.util.JacksonUtils; @@ -43,7 +46,6 @@ import org.springframework.ai.vectorstore.observation.AbstractObservationVectorStore; import org.springframework.ai.vectorstore.observation.VectorStoreObservationContext; import org.springframework.beans.factory.InitializingBean; -import org.springframework.core.log.LogAccessor; import org.springframework.jdbc.core.BatchPreparedStatementSetter; import org.springframework.jdbc.core.JdbcTemplate; import org.springframework.jdbc.core.RowMapper; @@ -147,7 +149,7 @@ public class MariaDBVectorStore extends AbstractObservationVectorStore implement public static final int MAX_DOCUMENT_BATCH_SIZE = 10_000; - private static final LogAccessor logger = new LogAccessor(LogFactory.getLog(MariaDBVectorStore.class)); + private static final Logger logger = LoggerFactory.getLogger(MariaDBVectorStore.class); public static final String DEFAULT_TABLE_NAME = "vector_store"; @@ -213,8 +215,8 @@ protected MariaDBVectorStore(MariaDBBuilder builder) { this.vectorTableName = builder.vectorTableName.isEmpty() ? DEFAULT_TABLE_NAME : MariaDBSchemaValidator.validateAndEnquoteIdentifier(builder.vectorTableName.trim(), false); - logger.info(() -> "Using the vector table name: " + this.vectorTableName + ". Is empty: " - + builder.vectorTableName.isEmpty()); + logger.info("Using the vector table name: {}. Is empty: {}", this.vectorTableName, + builder.vectorTableName.isEmpty()); this.schemaName = builder.schemaName == null ? null : MariaDBSchemaValidator.validateAndEnquoteIdentifier(builder.schemaName, false); @@ -336,12 +338,12 @@ protected void doDelete(Filter.Expression filterExpression) { String sql = String.format("DELETE FROM %s WHERE %s", getFullyQualifiedTableName(), nativeFilterExpression); - logger.debug("Executing delete with filter: " + sql); + logger.debug("Executing delete with filter: {}", sql); this.jdbcTemplate.update(sql); } catch (Exception e) { - logger.error(e, "Failed to delete documents by filter: " + e.getMessage()); + logger.error("Failed to delete documents by filter: {}", e.getMessage(), e); throw new IllegalStateException("Failed to delete documents by filter", e); } } @@ -378,10 +380,10 @@ public List doSimilaritySearch(SearchRequest request) { @Override public void afterPropertiesSet() { - logger.info(() -> "Initializing MariaDBVectorStore schema for table: " + this.vectorTableName + " in schema: " - + this.schemaName); + logger.info("Initializing MariaDBVectorStore schema for table: {} in schema: {}", this.vectorTableName, + this.schemaName); - logger.info(() -> "vectorTableValidationsEnabled " + this.schemaValidation); + logger.info("vectorTableValidationsEnabled {}", this.schemaValidation); if (this.schemaValidation) { this.schemaValidator.validateTableSchema(this.schemaName, this.vectorTableName, this.idFieldName, @@ -389,8 +391,7 @@ public void afterPropertiesSet() { } if (!this.initializeSchema) { - logger - .debug(() -> "Skipping the schema initialization for the table: " + this.getFullyQualifiedTableName()); + logger.debug("Skipping the schema initialization for the table: {}", this.getFullyQualifiedTableName()); return; } @@ -437,8 +438,8 @@ int embeddingDimensions() { } } catch (Exception e) { - logger.warn(e, () -> "Failed to obtain the embedding dimensions from the embedding model and fall backs to" - + " default:" + OPENAI_EMBEDDING_DIMENSION_SIZE); + logger.warn("Failed to obtain the embedding dimensions from the embedding model and fall backs to" + + " default:" + OPENAI_EMBEDDING_DIMENSION_SIZE, e); } return OPENAI_EMBEDDING_DIMENSION_SIZE; } diff --git a/vector-stores/spring-ai-milvus-store/src/main/java/org/springframework/ai/vectorstore/milvus/MilvusVectorStore.java b/vector-stores/spring-ai-milvus-store/src/main/java/org/springframework/ai/vectorstore/milvus/MilvusVectorStore.java index a430a951997..1eed78e5d63 100644 --- a/vector-stores/spring-ai-milvus-store/src/main/java/org/springframework/ai/vectorstore/milvus/MilvusVectorStore.java +++ b/vector-stores/spring-ai-milvus-store/src/main/java/org/springframework/ai/vectorstore/milvus/MilvusVectorStore.java @@ -49,12 +49,15 @@ import io.milvus.param.index.DropIndexParam; import io.milvus.response.QueryResultsWrapper.RowRecord; import io.milvus.response.SearchResultsWrapper; -import org.apache.commons.logging.LogFactory; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import org.springframework.ai.document.Document; import org.springframework.ai.document.DocumentMetadata; +import org.springframework.ai.embedding.BatchingStrategy; import org.springframework.ai.embedding.EmbeddingModel; import org.springframework.ai.embedding.EmbeddingOptionsBuilder; +import org.springframework.ai.embedding.TokenCountBatchingStrategy; import org.springframework.ai.model.EmbeddingUtils; import org.springframework.ai.observation.conventions.VectorStoreProvider; import org.springframework.ai.observation.conventions.VectorStoreSimilarityMetric; @@ -66,7 +69,6 @@ import org.springframework.ai.vectorstore.observation.AbstractObservationVectorStore; import org.springframework.ai.vectorstore.observation.VectorStoreObservationContext; import org.springframework.beans.factory.InitializingBean; -import org.springframework.core.log.LogAccessor; import org.springframework.util.Assert; import org.springframework.util.StringUtils; @@ -161,7 +163,7 @@ public class MilvusVectorStore extends AbstractObservationVectorStore implements // Metadata, automatically assigned by Milvus. private static final String DISTANCE_FIELD_NAME = "distance"; - private static final LogAccessor logger = new LogAccessor(LogFactory.getLog(MilvusVectorStore.class)); + private static final Logger logger = LoggerFactory.getLogger(MilvusVectorStore.class); private static final Map SIMILARITY_TYPE_MAPPING = Map.of( MetricType.COSINE, VectorStoreSimilarityMetric.COSINE, MetricType.L2, VectorStoreSimilarityMetric.EUCLIDEAN, @@ -310,10 +312,10 @@ protected void doDelete(Filter.Expression filterExpression) { } long deleteCount = status.getData().getDeleteCnt(); - logger.debug("Deleted " + deleteCount + " documents matching filter expression"); + logger.debug("Deleted {} documents matching filter expression", deleteCount); } catch (Exception e) { - logger.error(e, "Failed to delete documents by filter: " + e.getMessage()); + logger.error("Failed to delete documents by filter: {}", e.getMessage(), e); throw new IllegalStateException("Failed to delete documents by filter", e); } } @@ -507,9 +509,8 @@ int embeddingDimensions() { } } catch (Exception e) { - logger.warn(e, - "Failed to obtain the embedding dimensions from the embedding model and fall backs to default:" - + this.embeddingDimension); + logger.warn("Failed to obtain the embedding dimensions from the embedding model and fall backs to default:" + + this.embeddingDimension, e); } return OPENAI_EMBEDDING_DIMENSION_SIZE; } diff --git a/vector-stores/spring-ai-mongodb-atlas-store/src/main/java/org/springframework/ai/vectorstore/mongodb/atlas/MongoDBAtlasVectorStore.java b/vector-stores/spring-ai-mongodb-atlas-store/src/main/java/org/springframework/ai/vectorstore/mongodb/atlas/MongoDBAtlasVectorStore.java index e03294b4f29..26d631b44d1 100644 --- a/vector-stores/spring-ai-mongodb-atlas-store/src/main/java/org/springframework/ai/vectorstore/mongodb/atlas/MongoDBAtlasVectorStore.java +++ b/vector-stores/spring-ai-mongodb-atlas-store/src/main/java/org/springframework/ai/vectorstore/mongodb/atlas/MongoDBAtlasVectorStore.java @@ -24,7 +24,8 @@ import com.mongodb.MongoCommandException; import com.mongodb.client.result.DeleteResult; -import org.springframework.core.log.LogAccessor; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import org.springframework.ai.document.Document; import org.springframework.ai.document.DocumentMetadata; @@ -127,7 +128,7 @@ */ public class MongoDBAtlasVectorStore extends AbstractObservationVectorStore implements InitializingBean { - private static final LogAccessor logger = new LogAccessor(MongoDBAtlasVectorStore.class); + private static final Logger logger = LoggerFactory.getLogger(MongoDBAtlasVectorStore.class); public static final String ID_FIELD_NAME = "_id"; diff --git a/vector-stores/spring-ai-neo4j-store/src/main/java/org/springframework/ai/vectorstore/neo4j/Neo4jVectorStore.java b/vector-stores/spring-ai-neo4j-store/src/main/java/org/springframework/ai/vectorstore/neo4j/Neo4jVectorStore.java index 6efec2d2b2f..01a068d9c01 100644 --- a/vector-stores/spring-ai-neo4j-store/src/main/java/org/springframework/ai/vectorstore/neo4j/Neo4jVectorStore.java +++ b/vector-stores/spring-ai-neo4j-store/src/main/java/org/springframework/ai/vectorstore/neo4j/Neo4jVectorStore.java @@ -21,11 +21,12 @@ import java.util.Map; import java.util.Optional; -import org.apache.commons.logging.LogFactory; import org.neo4j.cypherdsl.support.schema_name.SchemaNames; import org.neo4j.driver.Driver; import org.neo4j.driver.SessionConfig; import org.neo4j.driver.Values; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import org.springframework.ai.document.Document; import org.springframework.ai.document.DocumentMetadata; @@ -40,7 +41,6 @@ import org.springframework.ai.vectorstore.observation.AbstractObservationVectorStore; import org.springframework.ai.vectorstore.observation.VectorStoreObservationContext; import org.springframework.beans.factory.InitializingBean; -import org.springframework.core.log.LogAccessor; import org.springframework.util.Assert; import org.springframework.util.StringUtils; @@ -134,7 +134,7 @@ */ public class Neo4jVectorStore extends AbstractObservationVectorStore implements InitializingBean { - private static final LogAccessor logger = new LogAccessor(LogFactory.getLog(Neo4jVectorStore.class)); + private static final Logger logger = LoggerFactory.getLogger(Neo4jVectorStore.class); public static final int DEFAULT_EMBEDDING_DIMENSION = 1536; @@ -253,10 +253,10 @@ protected void doDelete(Filter.Expression filterExpression) { var summary = session.run(cypher, Map.of("transactionSize", DEFAULT_TRANSACTION_SIZE)).consume(); - logger.debug("Deleted " + summary.counters().nodesDeleted() + " nodes matching filter expression"); + logger.debug("Deleted {} nodes matching filter expression", summary.counters().nodesDeleted()); } catch (Exception e) { - logger.error(e, "Failed to delete nodes by filter: " + e.getMessage()); + logger.error("Failed to delete nodes by filter: {}", e.getMessage(), e); throw new IllegalStateException("Failed to delete nodes by filter", e); } } diff --git a/vector-stores/spring-ai-opensearch-store/src/main/java/org/springframework/ai/vectorstore/opensearch/OpenSearchVectorStore.java b/vector-stores/spring-ai-opensearch-store/src/main/java/org/springframework/ai/vectorstore/opensearch/OpenSearchVectorStore.java index 360a8c046c9..dfd8a5ab4ac 100644 --- a/vector-stores/spring-ai-opensearch-store/src/main/java/org/springframework/ai/vectorstore/opensearch/OpenSearchVectorStore.java +++ b/vector-stores/spring-ai-opensearch-store/src/main/java/org/springframework/ai/vectorstore/opensearch/OpenSearchVectorStore.java @@ -24,7 +24,6 @@ import java.util.Optional; import java.util.stream.Collectors; -import org.apache.commons.logging.LogFactory; import org.opensearch.client.json.JsonData; import org.opensearch.client.json.JsonpMapper; import org.opensearch.client.opensearch.OpenSearchClient; @@ -39,6 +38,8 @@ import org.opensearch.client.opensearch.indices.CreateIndexRequest; import org.opensearch.client.opensearch.indices.CreateIndexResponse; import org.opensearch.client.transport.endpoints.BooleanResponse; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import org.springframework.ai.document.Document; import org.springframework.ai.document.DocumentMetadata; @@ -53,7 +54,6 @@ import org.springframework.ai.vectorstore.observation.AbstractObservationVectorStore; import org.springframework.ai.vectorstore.observation.VectorStoreObservationContext; import org.springframework.beans.factory.InitializingBean; -import org.springframework.core.log.LogAccessor; import org.springframework.util.Assert; /** @@ -141,7 +141,7 @@ */ public class OpenSearchVectorStore extends AbstractObservationVectorStore implements InitializingBean { - private static final LogAccessor logger = new LogAccessor(LogFactory.getLog(OpenSearchVectorStore.class)); + private static final Logger logger = LoggerFactory.getLogger(OpenSearchVectorStore.class); public static final String COSINE_SIMILARITY_FUNCTION = "cosinesimil"; @@ -254,7 +254,7 @@ protected void doDelete(Filter.Expression filterExpression) { } } catch (Exception e) { - logger.error(e, "Failed to delete documents by filter: " + e.getMessage()); + logger.error("Failed to delete documents by filter: {}", e.getMessage()); throw new IllegalStateException("Failed to delete documents by filter", e); } } diff --git a/vector-stores/spring-ai-oracle-store/src/main/java/org/springframework/ai/vectorstore/oracle/OracleVectorStore.java b/vector-stores/spring-ai-oracle-store/src/main/java/org/springframework/ai/vectorstore/oracle/OracleVectorStore.java index d624ef809e4..016dd5950f6 100644 --- a/vector-stores/spring-ai-oracle-store/src/main/java/org/springframework/ai/vectorstore/oracle/OracleVectorStore.java +++ b/vector-stores/spring-ai-oracle-store/src/main/java/org/springframework/ai/vectorstore/oracle/OracleVectorStore.java @@ -34,11 +34,15 @@ import oracle.sql.json.OracleJsonGenerator; import oracle.sql.json.OracleJsonObject; import oracle.sql.json.OracleJsonValue; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import org.springframework.ai.document.Document; import org.springframework.ai.document.DocumentMetadata; +import org.springframework.ai.embedding.BatchingStrategy; import org.springframework.ai.embedding.EmbeddingModel; import org.springframework.ai.embedding.EmbeddingOptionsBuilder; +import org.springframework.ai.embedding.TokenCountBatchingStrategy; import org.springframework.ai.observation.conventions.VectorStoreProvider; import org.springframework.ai.observation.conventions.VectorStoreSimilarityMetric; import org.springframework.ai.vectorstore.AbstractVectorStoreBuilder; @@ -48,7 +52,6 @@ import org.springframework.ai.vectorstore.observation.AbstractObservationVectorStore; import org.springframework.ai.vectorstore.observation.VectorStoreObservationContext; import org.springframework.beans.factory.InitializingBean; -import org.springframework.core.log.LogAccessor; import org.springframework.jdbc.core.BatchPreparedStatementSetter; import org.springframework.jdbc.core.JdbcTemplate; import org.springframework.jdbc.core.RowMapper; @@ -95,7 +98,7 @@ public class OracleVectorStore extends AbstractObservationVectorStore implements public static final int DEFAULT_SEARCH_ACCURACY = -1; - private static final LogAccessor logger = new LogAccessor(OracleVectorStore.class); + private static final Logger logger = LoggerFactory.getLogger(OracleVectorStore.class); private static final Map SIMILARITY_TYPE_MAPPING = Map .of(OracleVectorStoreDistanceType.COSINE, VectorStoreSimilarityMetric.COSINE, @@ -323,7 +326,7 @@ protected void doDelete(Filter.Expression filterExpression) { logger.debug("Deleted " + deletedCount + " documents matching filter expression"); } catch (Exception e) { - logger.error(e, "Failed to delete documents by filter: " + e.getMessage()); + logger.error("Failed to delete documents by filter: {}", e.getMessage(), e); throw new IllegalStateException("Failed to delete documents by filter", e); } } diff --git a/vector-stores/spring-ai-pgvector-store/src/main/java/org/springframework/ai/vectorstore/pgvector/PgVectorSchemaValidator.java b/vector-stores/spring-ai-pgvector-store/src/main/java/org/springframework/ai/vectorstore/pgvector/PgVectorSchemaValidator.java index 389eaaa93db..f0c5951676b 100644 --- a/vector-stores/spring-ai-pgvector-store/src/main/java/org/springframework/ai/vectorstore/pgvector/PgVectorSchemaValidator.java +++ b/vector-stores/spring-ai-pgvector-store/src/main/java/org/springframework/ai/vectorstore/pgvector/PgVectorSchemaValidator.java @@ -20,9 +20,9 @@ import java.util.List; import java.util.Map; -import org.apache.commons.logging.LogFactory; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; -import org.springframework.core.log.LogAccessor; import org.springframework.dao.DataAccessException; import org.springframework.jdbc.core.JdbcTemplate; @@ -35,7 +35,7 @@ */ public class PgVectorSchemaValidator { - private static final LogAccessor logger = new LogAccessor(LogFactory.getLog(PgVectorSchemaValidator.class)); + private static final Logger logger = LoggerFactory.getLogger(PgVectorSchemaValidator.class); private final JdbcTemplate jdbcTemplate; @@ -92,7 +92,7 @@ void validateTableSchema(String schemaName, String tableName) { } try { - logger.info("Validating PGVectorStore schema for table: " + tableName + " in schema: " + schemaName); + logger.info("Validating PGVectorStore schema for table: {} in schema: {}", tableName, schemaName); List expectedColumns = new ArrayList<>(); expectedColumns.add("id"); diff --git a/vector-stores/spring-ai-pgvector-store/src/main/java/org/springframework/ai/vectorstore/pgvector/PgVectorStore.java b/vector-stores/spring-ai-pgvector-store/src/main/java/org/springframework/ai/vectorstore/pgvector/PgVectorStore.java index 00a32457147..f091bf5879e 100644 --- a/vector-stores/spring-ai-pgvector-store/src/main/java/org/springframework/ai/vectorstore/pgvector/PgVectorStore.java +++ b/vector-stores/spring-ai-pgvector-store/src/main/java/org/springframework/ai/vectorstore/pgvector/PgVectorStore.java @@ -29,13 +29,16 @@ import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.json.JsonMapper; import com.pgvector.PGvector; -import org.apache.commons.logging.LogFactory; import org.postgresql.util.PGobject; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import org.springframework.ai.document.Document; import org.springframework.ai.document.DocumentMetadata; +import org.springframework.ai.embedding.BatchingStrategy; import org.springframework.ai.embedding.EmbeddingModel; import org.springframework.ai.embedding.EmbeddingOptionsBuilder; +import org.springframework.ai.embedding.TokenCountBatchingStrategy; import org.springframework.ai.observation.conventions.VectorStoreProvider; import org.springframework.ai.observation.conventions.VectorStoreSimilarityMetric; import org.springframework.ai.util.JacksonUtils; @@ -47,7 +50,6 @@ import org.springframework.ai.vectorstore.observation.AbstractObservationVectorStore; import org.springframework.ai.vectorstore.observation.VectorStoreObservationContext; import org.springframework.beans.factory.InitializingBean; -import org.springframework.core.log.LogAccessor; import org.springframework.jdbc.core.BatchPreparedStatementSetter; import org.springframework.jdbc.core.JdbcTemplate; import org.springframework.jdbc.core.RowMapper; @@ -169,7 +171,7 @@ public class PgVectorStore extends AbstractObservationVectorStore implements Ini public static final int MAX_DOCUMENT_BATCH_SIZE = 10_000; - private static final LogAccessor logger = new LogAccessor(LogFactory.getLog(PgVectorSchemaValidator.class)); + private static final Logger logger = LoggerFactory.getLogger(PgVectorStore.class); private static Map SIMILARITY_TYPE_MAPPING = Map.of( PgDistanceType.COSINE_DISTANCE, VectorStoreSimilarityMetric.COSINE, PgDistanceType.EUCLIDEAN_DISTANCE, @@ -216,8 +218,8 @@ protected PgVectorStore(PgVectorStoreBuilder builder) { String vectorTable = builder.vectorTableName; this.vectorTableName = vectorTable.isEmpty() ? DEFAULT_TABLE_NAME : vectorTable.trim(); - logger.info("Using the vector table name: " + this.vectorTableName + " Is empty: " - + this.vectorTableName.isEmpty()); + logger.info("Using the vector table name: {}. Is empty: {}", this.vectorTableName, + this.vectorTableName.isEmpty()); this.vectorIndexName = this.vectorTableName.equals(DEFAULT_TABLE_NAME) ? DEFAULT_VECTOR_INDEX_NAME : this.vectorTableName + "_index"; @@ -380,17 +382,17 @@ private String comparisonOperator() { @Override public void afterPropertiesSet() { - logger.info("Initializing PGVectorStore schema for table: " + this.getVectorTableName() + " in schema: " - + this.getSchemaName()); + logger.info("Initializing PGVectorStore schema for table: {} in schema: {}", this.getVectorTableName(), + this.getSchemaName()); - logger.info("vectorTableValidationsEnabled " + this.schemaValidation); + logger.info("vectorTableValidationsEnabled {}", this.schemaValidation); if (this.schemaValidation) { this.schemaValidator.validateTableSchema(this.getSchemaName(), this.getVectorTableName()); } if (!this.initializeSchema) { - logger.debug("Skipping the schema initialization for the table: " + this.getFullyQualifiedTableName()); + logger.debug("Skipping the schema initialization for the table: {}", this.getFullyQualifiedTableName()); return; } @@ -452,9 +454,8 @@ int embeddingDimensions() { } } catch (Exception e) { - logger.warn(e, - "Failed to obtain the embedding dimensions from the embedding model and fall backs to default:" - + OPENAI_EMBEDDING_DIMENSION_SIZE); + logger.warn("Failed to obtain the embedding dimensions from the embedding model and fall backs to default:" + + OPENAI_EMBEDDING_DIMENSION_SIZE, e); } return OPENAI_EMBEDDING_DIMENSION_SIZE; } diff --git a/vector-stores/spring-ai-pinecone-store/src/main/java/org/springframework/ai/vectorstore/pinecone/PineconeVectorStore.java b/vector-stores/spring-ai-pinecone-store/src/main/java/org/springframework/ai/vectorstore/pinecone/PineconeVectorStore.java index d8a494786ef..48c1306dafb 100644 --- a/vector-stores/spring-ai-pinecone-store/src/main/java/org/springframework/ai/vectorstore/pinecone/PineconeVectorStore.java +++ b/vector-stores/spring-ai-pinecone-store/src/main/java/org/springframework/ai/vectorstore/pinecone/PineconeVectorStore.java @@ -17,7 +17,6 @@ package org.springframework.ai.vectorstore.pinecone; import java.time.Duration; -import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.Optional; @@ -33,19 +32,17 @@ import io.pinecone.PineconeConnection; import io.pinecone.PineconeConnectionConfig; import io.pinecone.proto.DeleteRequest; -import io.pinecone.proto.DeleteResponse; import io.pinecone.proto.QueryRequest; import io.pinecone.proto.QueryResponse; import io.pinecone.proto.UpsertRequest; import io.pinecone.proto.Vector; -import org.apache.commons.logging.LogFactory; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import org.springframework.ai.document.Document; import org.springframework.ai.document.DocumentMetadata; -import org.springframework.ai.embedding.BatchingStrategy; import org.springframework.ai.embedding.EmbeddingModel; import org.springframework.ai.embedding.EmbeddingOptionsBuilder; -import org.springframework.ai.embedding.TokenCountBatchingStrategy; import org.springframework.ai.model.EmbeddingUtils; import org.springframework.ai.observation.conventions.VectorStoreProvider; import org.springframework.ai.vectorstore.AbstractVectorStoreBuilder; @@ -55,7 +52,6 @@ import org.springframework.ai.vectorstore.filter.converter.PineconeFilterExpressionConverter; import org.springframework.ai.vectorstore.observation.AbstractObservationVectorStore; import org.springframework.ai.vectorstore.observation.VectorStoreObservationContext; -import org.springframework.core.log.LogAccessor; import org.springframework.lang.Nullable; import org.springframework.util.Assert; import org.springframework.util.StringUtils; @@ -88,7 +84,7 @@ public class PineconeVectorStore extends AbstractObservationVectorStore { private final ObjectMapper objectMapper; - private static final LogAccessor logger = new LogAccessor(LogFactory.getLog(PineconeVectorStore.class)); + private static final Logger logger = LoggerFactory.getLogger(PineconeVectorStore.class); /** * Creates a new PineconeVectorStore using the builder pattern. @@ -320,11 +316,11 @@ protected void doDelete(Filter.Expression filterExpression) { throw new IllegalStateException("Failed to delete some documents"); } - logger.debug(() -> "Deleted " + idsToDelete.size() + " documents matching filter expression"); + logger.debug("Deleted {} documents matching filter expression", idsToDelete.size()); } } catch (Exception e) { - logger.error(e, () -> "Failed to delete documents by filter"); + logger.error("Failed to delete documents by filter", e); throw new IllegalStateException("Failed to delete documents by filter", e); } } diff --git a/vector-stores/spring-ai-qdrant-store/src/main/java/org/springframework/ai/vectorstore/qdrant/QdrantVectorStore.java b/vector-stores/spring-ai-qdrant-store/src/main/java/org/springframework/ai/vectorstore/qdrant/QdrantVectorStore.java index 24202c6be2d..2eba583ccad 100644 --- a/vector-stores/spring-ai-qdrant-store/src/main/java/org/springframework/ai/vectorstore/qdrant/QdrantVectorStore.java +++ b/vector-stores/spring-ai-qdrant-store/src/main/java/org/springframework/ai/vectorstore/qdrant/QdrantVectorStore.java @@ -32,7 +32,8 @@ import io.qdrant.client.grpc.Points.ScoredPoint; import io.qdrant.client.grpc.Points.SearchPoints; import io.qdrant.client.grpc.Points.UpdateStatus; -import org.apache.commons.logging.LogFactory; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import org.springframework.ai.document.Document; import org.springframework.ai.document.DocumentMetadata; @@ -45,7 +46,6 @@ import org.springframework.ai.vectorstore.observation.AbstractObservationVectorStore; import org.springframework.ai.vectorstore.observation.VectorStoreObservationContext; import org.springframework.beans.factory.InitializingBean; -import org.springframework.core.log.LogAccessor; import org.springframework.util.Assert; /** @@ -126,7 +126,7 @@ */ public class QdrantVectorStore extends AbstractObservationVectorStore implements InitializingBean { - private static final LogAccessor logger = new LogAccessor(LogFactory.getLog(QdrantVectorStore.class)); + private static final Logger logger = LoggerFactory.getLogger(QdrantVectorStore.class); public static final String DEFAULT_COLLECTION_NAME = "vector_store"; @@ -234,7 +234,7 @@ protected void doDelete(org.springframework.ai.vectorstore.filter.Filter.Express logger.debug("Deleted documents matching filter expression"); } catch (Exception e) { - logger.error(e, "Failed to delete documents by filter: " + e.getMessage()); + logger.error("Failed to delete documents by filter: {}", e.getMessage(), e); throw new IllegalStateException("Failed to delete documents by filter", e); } } diff --git a/vector-stores/spring-ai-redis-store/src/main/java/org/springframework/ai/vectorstore/redis/RedisVectorStore.java b/vector-stores/spring-ai-redis-store/src/main/java/org/springframework/ai/vectorstore/redis/RedisVectorStore.java index f19eb89994e..72bc9fd8999 100644 --- a/vector-stores/spring-ai-redis-store/src/main/java/org/springframework/ai/vectorstore/redis/RedisVectorStore.java +++ b/vector-stores/spring-ai-redis-store/src/main/java/org/springframework/ai/vectorstore/redis/RedisVectorStore.java @@ -27,7 +27,8 @@ import java.util.function.Predicate; import java.util.stream.Collectors; -import org.apache.commons.logging.LogFactory; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import redis.clients.jedis.JedisPooled; import redis.clients.jedis.Pipeline; import redis.clients.jedis.json.Path2; @@ -58,7 +59,6 @@ import org.springframework.ai.vectorstore.observation.AbstractObservationVectorStore; import org.springframework.ai.vectorstore.observation.VectorStoreObservationContext; import org.springframework.beans.factory.InitializingBean; -import org.springframework.core.log.LogAccessor; import org.springframework.lang.Nullable; import org.springframework.util.Assert; import org.springframework.util.CollectionUtils; @@ -199,7 +199,7 @@ public class RedisVectorStore extends AbstractObservationVectorStore implements private static final String JSON_PATH_PREFIX = "$."; - private static final LogAccessor logger = new LogAccessor(LogFactory.getLog(RedisVectorStore.class)); + private static final Logger logger = LoggerFactory.getLogger(RedisVectorStore.class); private static final Predicate RESPONSE_OK = Predicate.isEqual("OK"); @@ -289,7 +289,7 @@ public Optional doDelete(List idList) { Optional errResponse = responses.stream().filter(Predicate.not(RESPONSE_DEL_OK)).findAny(); if (errResponse.isPresent()) { if (logger.isErrorEnabled()) { - logger.error("Could not delete document: " + errResponse.get()); + logger.error("Could not delete document: {}", errResponse.get()); } return Optional.of(false); } @@ -322,16 +322,16 @@ protected void doDelete(Filter.Expression filterExpression) { Optional errResponse = responses.stream().filter(Predicate.not(RESPONSE_DEL_OK)).findAny(); if (errResponse.isPresent()) { - logger.error(() -> "Could not delete document: " + errResponse.get()); + logger.error("Could not delete document: {}", errResponse.get()); throw new IllegalStateException("Failed to delete some documents"); } } - logger.debug(() -> "Deleted " + matchingIds.size() + " documents matching filter expression"); + logger.debug("Deleted {} documents matching filter expression", matchingIds.size()); } } catch (Exception e) { - logger.error(e, () -> "Failed to delete documents by filter"); + logger.error("Failed to delete documents by filter", e); throw new IllegalStateException("Failed to delete documents by filter", e); } } diff --git a/vector-stores/spring-ai-typesense-store/src/main/java/org/springframework/ai/vectorstore/typesense/TypesenseVectorStore.java b/vector-stores/spring-ai-typesense-store/src/main/java/org/springframework/ai/vectorstore/typesense/TypesenseVectorStore.java index dd3ff09efb0..cb567980351 100644 --- a/vector-stores/spring-ai-typesense-store/src/main/java/org/springframework/ai/vectorstore/typesense/TypesenseVectorStore.java +++ b/vector-stores/spring-ai-typesense-store/src/main/java/org/springframework/ai/vectorstore/typesense/TypesenseVectorStore.java @@ -23,7 +23,8 @@ import java.util.stream.IntStream; import java.util.stream.Stream; -import org.apache.commons.logging.LogFactory; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import org.typesense.api.Client; import org.typesense.api.FieldTypes; import org.typesense.model.CollectionResponse; @@ -48,7 +49,6 @@ import org.springframework.ai.vectorstore.observation.AbstractObservationVectorStore; import org.springframework.ai.vectorstore.observation.VectorStoreObservationContext; import org.springframework.beans.factory.InitializingBean; -import org.springframework.core.log.LogAccessor; import org.springframework.lang.Nullable; import org.springframework.util.Assert; @@ -94,7 +94,7 @@ public class TypesenseVectorStore extends AbstractObservationVectorStore impleme public static final int INVALID_EMBEDDING_DIMENSION = -1; - private static final LogAccessor logger = new LogAccessor(LogFactory.getLog(TypesenseVectorStore.class)); + private static final Logger logger = LoggerFactory.getLogger(TypesenseVectorStore.class); public final FilterExpressionConverter filterExpressionConverter = new TypesenseFilterExpressionConverter(); @@ -159,10 +159,10 @@ public void doAdd(List documents) { try { this.client.collections(this.collectionName).documents().import_(documentList, importDocumentsParameters); - logger.info(() -> "Added " + documentList.size() + " documents"); + logger.info("Added {} documents", documentList.size()); } catch (Exception e) { - logger.error(e, "Failed to add documents"); + logger.error("Failed to add documents", e); } } @@ -184,7 +184,7 @@ public Optional doDelete(List idList) { return Optional.of(deletedDocs > 0); } catch (Exception e) { - logger.error(e, "Failed to delete documents"); + logger.error("Failed to delete documents", e); return Optional.of(Boolean.FALSE); } } @@ -204,14 +204,14 @@ protected void doDelete(Filter.Expression filterExpression) { int deletedDocs = (Integer) response.getOrDefault("num_deleted", 0); if (deletedDocs == 0) { - logger.warn(() -> "No documents were deleted matching filter expression"); + logger.warn("No documents were deleted matching filter expression"); } else { - logger.debug(() -> "Deleted " + deletedDocs + " documents matching filter expression"); + logger.debug("Deleted {} documents matching filter expression", deletedDocs); } } catch (Exception e) { - logger.error(e, () -> "Failed to delete documents by filter"); + logger.error("Failed to delete documents by filter", e); throw new IllegalStateException("Failed to delete documents by filter", e); } } @@ -223,7 +223,7 @@ public List doSimilaritySearch(SearchRequest request) { String nativeFilterExpressions = (request.getFilterExpression() != null) ? this.filterExpressionConverter.convertExpression(request.getFilterExpression()) : ""; - logger.info("Filter expression: " + nativeFilterExpressions); + logger.info("Filter expression: {}", nativeFilterExpressions); float[] embedding = this.embeddingModel.embed(request.getQuery()); @@ -265,11 +265,11 @@ public List doSimilaritySearch(SearchRequest request) { })) .toList(); - logger.info("Found " + documents.size() + " documents"); + logger.info("Found {} documents", documents.size()); return documents; } catch (Exception e) { - logger.error(e, "Failed to search documents"); + logger.error("Failed to search documents", e); return List.of(); } } @@ -285,9 +285,8 @@ int embeddingDimensions() { } } catch (Exception e) { - logger.warn(e, - () -> "Failed to obtain the embedding dimensions from the embedding model and fall backs to default:" - + this.embeddingDimension); + logger.warn("Failed to obtain the embedding dimensions from the embedding model and fall backs to default:" + + this.embeddingDimension, e); } return OPENAI_EMBEDDING_DIMENSION_SIZE; } @@ -314,7 +313,7 @@ private boolean hasCollection() { void createCollection() { if (this.hasCollection()) { - logger.info("Collection " + this.collectionName + " already exists"); + logger.info("Collection {} already exists", this.collectionName); return; } @@ -332,25 +331,25 @@ void createCollection() { try { this.client.collections().create(collectionSchema); - logger.info("Collection " + this.collectionName + " created"); + logger.info("Collection {} created", this.collectionName); } catch (Exception e) { - logger.error(e, "Failed to create collection " + this.collectionName); + logger.error("Failed to create collection {}", this.collectionName, e); } } void dropCollection() { if (!this.hasCollection()) { - logger.info("Collection " + this.collectionName + " does not exist"); + logger.info("Collection {} does not exist", this.collectionName); return; } try { this.client.collections(this.collectionName).delete(); - logger.info("Collection " + this.collectionName + " dropped"); + logger.info("Collection {} dropped", this.collectionName); } catch (Exception e) { - logger.error(e, "Failed to drop collection " + this.collectionName); + logger.error("Failed to drop collection {}", this.collectionName, e); } } @@ -362,7 +361,7 @@ Map getCollectionInfo() { retrievedCollection.getNumDocuments()); } catch (Exception e) { - logger.error(e, "Failed to retrieve collection info"); + logger.error("Failed to retrieve collection info", e); return null; } diff --git a/vector-stores/spring-ai-weaviate-store/src/main/java/org/springframework/ai/vectorstore/weaviate/WeaviateVectorStore.java b/vector-stores/spring-ai-weaviate-store/src/main/java/org/springframework/ai/vectorstore/weaviate/WeaviateVectorStore.java index 92f3aab4630..24fbffeee3c 100644 --- a/vector-stores/spring-ai-weaviate-store/src/main/java/org/springframework/ai/vectorstore/weaviate/WeaviateVectorStore.java +++ b/vector-stores/spring-ai-weaviate-store/src/main/java/org/springframework/ai/vectorstore/weaviate/WeaviateVectorStore.java @@ -43,7 +43,8 @@ import io.weaviate.client.v1.graphql.query.builder.GetBuilder.GetBuilderBuilder; import io.weaviate.client.v1.graphql.query.fields.Field; import io.weaviate.client.v1.graphql.query.fields.Fields; -import org.apache.commons.logging.LogFactory; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import org.springframework.ai.document.Document; import org.springframework.ai.document.DocumentMetadata; @@ -56,7 +57,6 @@ import org.springframework.ai.vectorstore.filter.Filter; import org.springframework.ai.vectorstore.observation.AbstractObservationVectorStore; import org.springframework.ai.vectorstore.observation.VectorStoreObservationContext; -import org.springframework.core.log.LogAccessor; import org.springframework.util.Assert; import org.springframework.util.CollectionUtils; import org.springframework.util.StringUtils; @@ -93,7 +93,7 @@ */ public class WeaviateVectorStore extends AbstractObservationVectorStore { - private static final LogAccessor logger = new LogAccessor(LogFactory.getLog(WeaviateVectorStore.class)); + private static final Logger logger = LoggerFactory.getLogger(WeaviateVectorStore.class); private static final String METADATA_FIELD_PREFIX = "meta_"; @@ -323,14 +323,14 @@ protected void doDelete(Filter.Expression filterExpression) { throw new IllegalStateException("Failed to delete some documents"); } - logger.debug(() -> "Deleted " + idsToDelete.size() + " documents matching filter expression"); + logger.debug("Deleted {} documents matching filter expression", idsToDelete.size()); } else { - logger.debug(() -> "No documents found matching filter expression"); + logger.debug("No documents found matching filter expression"); } } catch (Exception e) { - logger.error(e, () -> "Failed to delete documents by filter"); + logger.error("Failed to delete documents by filter", e); throw new IllegalStateException("Failed to delete documents by filter", e); } }