diff --git a/advisors/spring-ai-advisors-vector-store/src/main/java/org/springframework/ai/chat/client/advisor/vectorstore/QuestionAnswerAdvisor.java b/advisors/spring-ai-advisors-vector-store/src/main/java/org/springframework/ai/chat/client/advisor/vectorstore/QuestionAnswerAdvisor.java index 8c301fbdd04..470984787db 100644 --- a/advisors/spring-ai-advisors-vector-store/src/main/java/org/springframework/ai/chat/client/advisor/vectorstore/QuestionAnswerAdvisor.java +++ b/advisors/spring-ai-advisors-vector-store/src/main/java/org/springframework/ai/chat/client/advisor/vectorstore/QuestionAnswerAdvisor.java @@ -28,6 +28,7 @@ import org.springframework.ai.chat.client.ChatClientResponse; import org.springframework.ai.chat.client.advisor.api.AdvisorChain; import org.springframework.ai.chat.client.advisor.api.BaseAdvisor; +import org.springframework.ai.chat.client.advisor.api.SchedulerHolder; import org.springframework.ai.chat.messages.UserMessage; import org.springframework.ai.chat.model.ChatResponse; import org.springframework.ai.chat.prompt.PromptTemplate; @@ -83,7 +84,7 @@ public class QuestionAnswerAdvisor implements BaseAdvisor { private final int order; public QuestionAnswerAdvisor(VectorStore vectorStore) { - this(vectorStore, SearchRequest.builder().build(), DEFAULT_PROMPT_TEMPLATE, BaseAdvisor.DEFAULT_SCHEDULER, + this(vectorStore, SearchRequest.builder().build(), DEFAULT_PROMPT_TEMPLATE, SchedulerHolder.DEFAULT_SCHEDULER, DEFAULT_ORDER); } @@ -95,7 +96,7 @@ public QuestionAnswerAdvisor(VectorStore vectorStore) { this.vectorStore = vectorStore; this.searchRequest = searchRequest; this.promptTemplate = promptTemplate != null ? promptTemplate : DEFAULT_PROMPT_TEMPLATE; - this.scheduler = scheduler != null ? scheduler : BaseAdvisor.DEFAULT_SCHEDULER; + this.scheduler = scheduler != null ? scheduler : SchedulerHolder.DEFAULT_SCHEDULER; this.order = order; } @@ -197,7 +198,7 @@ public Builder searchRequest(SearchRequest searchRequest) { } public Builder protectFromBlocking(boolean protectFromBlocking) { - this.scheduler = protectFromBlocking ? BaseAdvisor.DEFAULT_SCHEDULER : Schedulers.immediate(); + this.scheduler = protectFromBlocking ? SchedulerHolder.DEFAULT_SCHEDULER : Schedulers.immediate(); return this; } diff --git a/advisors/spring-ai-advisors-vector-store/src/main/java/org/springframework/ai/chat/client/advisor/vectorstore/VectorStoreChatMemoryAdvisor.java b/advisors/spring-ai-advisors-vector-store/src/main/java/org/springframework/ai/chat/client/advisor/vectorstore/VectorStoreChatMemoryAdvisor.java index 3d4183507c9..fae7a53c7c5 100644 --- a/advisors/spring-ai-advisors-vector-store/src/main/java/org/springframework/ai/chat/client/advisor/vectorstore/VectorStoreChatMemoryAdvisor.java +++ b/advisors/spring-ai-advisors-vector-store/src/main/java/org/springframework/ai/chat/client/advisor/vectorstore/VectorStoreChatMemoryAdvisor.java @@ -30,8 +30,8 @@ import org.springframework.ai.chat.client.ChatClientResponse; import org.springframework.ai.chat.client.advisor.api.Advisor; import org.springframework.ai.chat.client.advisor.api.AdvisorChain; -import org.springframework.ai.chat.client.advisor.api.BaseAdvisor; import org.springframework.ai.chat.client.advisor.api.BaseChatMemoryAdvisor; +import org.springframework.ai.chat.client.advisor.api.SchedulerHolder; import org.springframework.ai.chat.client.advisor.api.StreamAdvisorChain; import org.springframework.ai.chat.memory.ChatMemory; import org.springframework.ai.chat.messages.AssistantMessage; @@ -223,7 +223,7 @@ public static class Builder { private String conversationId = ChatMemory.DEFAULT_CONVERSATION_ID; - private Scheduler scheduler = BaseAdvisor.DEFAULT_SCHEDULER; + private Scheduler scheduler = SchedulerHolder.DEFAULT_SCHEDULER; private int order = Advisor.DEFAULT_CHAT_MEMORY_PRECEDENCE_ORDER; diff --git a/spring-ai-client-chat/src/main/java/org/springframework/ai/chat/client/advisor/MessageChatMemoryAdvisor.java b/spring-ai-client-chat/src/main/java/org/springframework/ai/chat/client/advisor/MessageChatMemoryAdvisor.java index 1b8bbea84e9..874f19a1617 100644 --- a/spring-ai-client-chat/src/main/java/org/springframework/ai/chat/client/advisor/MessageChatMemoryAdvisor.java +++ b/spring-ai-client-chat/src/main/java/org/springframework/ai/chat/client/advisor/MessageChatMemoryAdvisor.java @@ -28,8 +28,8 @@ import org.springframework.ai.chat.client.ChatClientResponse; import org.springframework.ai.chat.client.advisor.api.Advisor; import org.springframework.ai.chat.client.advisor.api.AdvisorChain; -import org.springframework.ai.chat.client.advisor.api.BaseAdvisor; import org.springframework.ai.chat.client.advisor.api.BaseChatMemoryAdvisor; +import org.springframework.ai.chat.client.advisor.api.SchedulerHolder; import org.springframework.ai.chat.client.advisor.api.StreamAdvisorChain; import org.springframework.ai.chat.memory.ChatMemory; import org.springframework.ai.chat.messages.Message; @@ -138,7 +138,7 @@ public static final class Builder { private int order = Advisor.DEFAULT_CHAT_MEMORY_PRECEDENCE_ORDER; - private Scheduler scheduler = BaseAdvisor.DEFAULT_SCHEDULER; + private Scheduler scheduler = SchedulerHolder.DEFAULT_SCHEDULER; private ChatMemory chatMemory; diff --git a/spring-ai-client-chat/src/main/java/org/springframework/ai/chat/client/advisor/PromptChatMemoryAdvisor.java b/spring-ai-client-chat/src/main/java/org/springframework/ai/chat/client/advisor/PromptChatMemoryAdvisor.java index 5ae3c9459d0..b475fb0abd4 100644 --- a/spring-ai-client-chat/src/main/java/org/springframework/ai/chat/client/advisor/PromptChatMemoryAdvisor.java +++ b/spring-ai-client-chat/src/main/java/org/springframework/ai/chat/client/advisor/PromptChatMemoryAdvisor.java @@ -32,8 +32,8 @@ import org.springframework.ai.chat.client.ChatClientResponse; import org.springframework.ai.chat.client.advisor.api.Advisor; import org.springframework.ai.chat.client.advisor.api.AdvisorChain; -import org.springframework.ai.chat.client.advisor.api.BaseAdvisor; import org.springframework.ai.chat.client.advisor.api.BaseChatMemoryAdvisor; +import org.springframework.ai.chat.client.advisor.api.SchedulerHolder; import org.springframework.ai.chat.client.advisor.api.StreamAdvisorChain; import org.springframework.ai.chat.memory.ChatMemory; import org.springframework.ai.chat.messages.Message; @@ -194,7 +194,7 @@ public static final class Builder { private int order = Advisor.DEFAULT_CHAT_MEMORY_PRECEDENCE_ORDER; - private Scheduler scheduler = BaseAdvisor.DEFAULT_SCHEDULER; + private Scheduler scheduler = SchedulerHolder.DEFAULT_SCHEDULER; private ChatMemory chatMemory; diff --git a/spring-ai-client-chat/src/main/java/org/springframework/ai/chat/client/advisor/api/BaseAdvisor.java b/spring-ai-client-chat/src/main/java/org/springframework/ai/chat/client/advisor/api/BaseAdvisor.java index 007aac02bfc..1356d940071 100644 --- a/spring-ai-client-chat/src/main/java/org/springframework/ai/chat/client/advisor/api/BaseAdvisor.java +++ b/spring-ai-client-chat/src/main/java/org/springframework/ai/chat/client/advisor/api/BaseAdvisor.java @@ -19,7 +19,6 @@ import reactor.core.publisher.Flux; import reactor.core.publisher.Mono; import reactor.core.scheduler.Scheduler; -import reactor.core.scheduler.Schedulers; import org.springframework.ai.chat.client.ChatClientRequest; import org.springframework.ai.chat.client.ChatClientResponse; @@ -41,8 +40,6 @@ */ public interface BaseAdvisor extends CallAdvisor, StreamAdvisor { - Scheduler DEFAULT_SCHEDULER = Schedulers.boundedElastic(); - @Override default ChatClientResponse adviseCall(ChatClientRequest chatClientRequest, CallAdvisorChain callAdvisorChain) { Assert.notNull(chatClientRequest, "chatClientRequest cannot be null"); @@ -92,7 +89,7 @@ default String getName() { * Scheduler used for processing the advisor logic when streaming. */ default Scheduler getScheduler() { - return DEFAULT_SCHEDULER; + return SchedulerHolder.DEFAULT_SCHEDULER; } } diff --git a/spring-ai-client-chat/src/main/java/org/springframework/ai/chat/client/advisor/api/SchedulerHolder.java b/spring-ai-client-chat/src/main/java/org/springframework/ai/chat/client/advisor/api/SchedulerHolder.java new file mode 100644 index 00000000000..4e7cbace0fb --- /dev/null +++ b/spring-ai-client-chat/src/main/java/org/springframework/ai/chat/client/advisor/api/SchedulerHolder.java @@ -0,0 +1,30 @@ +/* + * Copyright 2023-2025 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.springframework.ai.chat.client.advisor.api; + +import reactor.core.scheduler.Scheduler; +import reactor.core.scheduler.Schedulers; + +/** + * @author Jonghoon Park + * @since 1.0.0 + */ +public class SchedulerHolder { + + public static final Scheduler DEFAULT_SCHEDULER = Schedulers.boundedElastic(); + +} diff --git a/spring-ai-rag/src/main/java/org/springframework/ai/rag/advisor/RetrievalAugmentationAdvisor.java b/spring-ai-rag/src/main/java/org/springframework/ai/rag/advisor/RetrievalAugmentationAdvisor.java index 10cfea33584..8ddb079dd3b 100644 --- a/spring-ai-rag/src/main/java/org/springframework/ai/rag/advisor/RetrievalAugmentationAdvisor.java +++ b/spring-ai-rag/src/main/java/org/springframework/ai/rag/advisor/RetrievalAugmentationAdvisor.java @@ -29,6 +29,7 @@ import org.springframework.ai.chat.client.ChatClientResponse; import org.springframework.ai.chat.client.advisor.api.AdvisorChain; import org.springframework.ai.chat.client.advisor.api.BaseAdvisor; +import org.springframework.ai.chat.client.advisor.api.SchedulerHolder; import org.springframework.ai.chat.model.ChatResponse; import org.springframework.ai.document.Document; import org.springframework.ai.rag.Query; @@ -95,7 +96,7 @@ private RetrievalAugmentationAdvisor(@Nullable List queryTrans this.documentPostProcessors = documentPostProcessors != null ? documentPostProcessors : List.of(); this.queryAugmenter = queryAugmenter != null ? queryAugmenter : ContextualQueryAugmenter.builder().build(); this.taskExecutor = taskExecutor != null ? taskExecutor : buildDefaultTaskExecutor(); - this.scheduler = scheduler != null ? scheduler : BaseAdvisor.DEFAULT_SCHEDULER; + this.scheduler = scheduler != null ? scheduler : SchedulerHolder.DEFAULT_SCHEDULER; this.order = order != null ? order : 0; }