Skip to content

Commit 28276d1

Browse files
tzolovmarkpollack
authored andcommitted
Refactor Advisor Interfaces and add AroundAdvisor support
Refactoring and enhancements to the advisor functionality. New Advisor interfaces in the org.springframework.ai.chat.client.advisor.api package: - Advisor: Base interface for all advisor types. - RequestAdvisor: For advising on request data before execution. - ResponseAdvisor: For advising on response data after execution, with enhanced streaming modes. - CallAroundAdvisor and StreamAroundAdvisor: For around advice on synchronous and streaming requests respectively. - AroundAdvisorChain and DefaultAroundAdvisorChain: To manage chaining of around advisors. Advisor Chain and Prompt Generation: - Added the DefaultAroundAdvisorChain class to manage the sequence of advisors applied around chat model methods. - Adjusted the prompt generation (toPrompt) to integrate with the refactored AdvisedRequest object. Refactoring and Updates: - Replaced the deprecated RequestResponseAdvisor interface with RequestAdvisor and ResponseAdvisor across the spring-ai-core and test modules. - Updated the DefaultChatClient and related classes to use the new Advisor interface, improving modularity and consistency. - Refactored DefaultAdvisorSpec and DefaultChatClientRequestSpec to handle the new Advisor type, and revised advisor lists and methods accordingly. - Enhanced the handling of streaming responses, introducing StreamResponseMode for better control during streaming scenarios.
1 parent 53721c6 commit 28276d1

File tree

22 files changed

+955
-256
lines changed

22 files changed

+955
-256
lines changed

models/spring-ai-openai/src/test/java/org/springframework/ai/openai/chat/GroqWithOpenAiChatModelIT.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,6 @@
3434
import org.slf4j.LoggerFactory;
3535
import org.springframework.ai.chat.client.ChatClient;
3636
import org.springframework.ai.chat.messages.AssistantMessage;
37-
import org.springframework.ai.model.Media;
3837
import org.springframework.ai.chat.messages.Message;
3938
import org.springframework.ai.chat.messages.UserMessage;
4039
import org.springframework.ai.chat.model.ChatResponse;
@@ -45,6 +44,7 @@
4544
import org.springframework.ai.converter.BeanOutputConverter;
4645
import org.springframework.ai.converter.ListOutputConverter;
4746
import org.springframework.ai.converter.MapOutputConverter;
47+
import org.springframework.ai.model.Media;
4848
import org.springframework.ai.model.function.FunctionCallbackWrapper;
4949
import org.springframework.ai.openai.OpenAiChatModel;
5050
import org.springframework.ai.openai.OpenAiChatOptions;

models/spring-ai-openai/src/test/java/org/springframework/ai/openai/chat/OpenAiPaymentTransactionIT.java

Lines changed: 10 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,8 @@
1616

1717
package org.springframework.ai.openai.chat;
1818

19+
import static org.assertj.core.api.Assertions.assertThat;
20+
1921
import java.util.List;
2022
import java.util.Map;
2123
import java.util.function.Function;
@@ -26,11 +28,10 @@
2628
import org.junit.jupiter.params.provider.ValueSource;
2729
import org.slf4j.Logger;
2830
import org.slf4j.LoggerFactory;
29-
import reactor.core.publisher.Flux;
30-
3131
import org.springframework.ai.chat.client.AdvisedRequest;
3232
import org.springframework.ai.chat.client.ChatClient;
33-
import org.springframework.ai.chat.client.RequestResponseAdvisor;
33+
import org.springframework.ai.chat.client.advisor.api.RequestAdvisor;
34+
import org.springframework.ai.chat.client.advisor.api.ResponseAdvisor;
3435
import org.springframework.ai.chat.model.ChatResponse;
3536
import org.springframework.ai.converter.BeanOutputConverter;
3637
import org.springframework.ai.model.function.FunctionCallbackContext;
@@ -47,7 +48,7 @@
4748
import org.springframework.context.annotation.Description;
4849
import org.springframework.core.ParameterizedTypeReference;
4950

50-
import static org.assertj.core.api.Assertions.assertThat;
51+
import reactor.core.publisher.Flux;
5152

5253
/**
5354
* @author Christian Tzolov
@@ -64,10 +65,14 @@ public class OpenAiPaymentTransactionIT {
6465
record TransactionStatusResponse(String id, String status) {
6566
}
6667

67-
private static class LoggingAdvisor implements RequestResponseAdvisor {
68+
private static class LoggingAdvisor implements RequestAdvisor, ResponseAdvisor {
6869

6970
private final Logger logger = LoggerFactory.getLogger(LoggingAdvisor.class);
7071

72+
public String getName() {
73+
return this.getClass().getSimpleName();
74+
}
75+
7176
@Override
7277
public AdvisedRequest adviseRequest(AdvisedRequest request, Map<String, Object> context) {
7378
logger.info("System text: \n" + request.systemText());

models/spring-ai-vertex-ai-gemini/src/test/java/org/springframework/ai/vertexai/gemini/function/VertexAiGeminiPaymentTransactionIT.java

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,8 @@
3030
import org.slf4j.LoggerFactory;
3131
import org.springframework.ai.chat.client.AdvisedRequest;
3232
import org.springframework.ai.chat.client.ChatClient;
33-
import org.springframework.ai.chat.client.RequestResponseAdvisor;
33+
import org.springframework.ai.chat.client.advisor.api.RequestAdvisor;
34+
import org.springframework.ai.chat.client.advisor.api.ResponseAdvisor;
3435
import org.springframework.ai.chat.model.ChatResponse;
3536
import org.springframework.ai.model.function.FunctionCallbackContext;
3637
import org.springframework.ai.model.function.FunctionCallbackWrapper.Builder.SchemaType;
@@ -64,10 +65,15 @@ public class VertexAiGeminiPaymentTransactionIT {
6465
record TransactionStatusResponse(String id, String status) {
6566
}
6667

67-
private static class LoggingAdvisor implements RequestResponseAdvisor {
68+
private static class LoggingAdvisor implements RequestAdvisor, ResponseAdvisor {
6869

6970
private final Logger logger = LoggerFactory.getLogger(LoggingAdvisor.class);
7071

72+
@Override
73+
public String getName() {
74+
return this.getClass().getSimpleName();
75+
}
76+
7177
@Override
7278
public AdvisedRequest adviseRequest(AdvisedRequest request, Map<String, Object> context) {
7379
logger.info("System text: \n" + request.systemText());

spring-ai-core/src/main/java/org/springframework/ai/chat/client/AdvisedRequest.java

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@
2020
import java.util.Map;
2121

2222
import org.springframework.ai.model.Media;
23+
import org.springframework.ai.chat.client.advisor.api.Advisor;
2324
import org.springframework.ai.chat.messages.Message;
2425
import org.springframework.ai.chat.model.ChatModel;
2526
import org.springframework.ai.chat.prompt.ChatOptions;
@@ -46,7 +47,7 @@
4647
*/
4748
public record AdvisedRequest(ChatModel chatModel, String userText, String systemText, ChatOptions chatOptions,
4849
List<Media> media, List<String> functionNames, List<FunctionCallback> functionCallbacks, List<Message> messages,
49-
Map<String, Object> userParams, Map<String, Object> systemParams, List<RequestResponseAdvisor> advisors,
50+
Map<String, Object> userParams, Map<String, Object> systemParams, List<Advisor> advisors,
5051
Map<String, Object> advisorParams) {
5152

5253
public static Builder from(AdvisedRequest from) {
@@ -92,7 +93,7 @@ public static class Builder {
9293

9394
private Map<String, Object> systemParams = Map.of();
9495

95-
private List<RequestResponseAdvisor> advisors = List.of();
96+
private List<Advisor> advisors = List.of();
9697

9798
private Map<String, Object> advisorParams = Map.of();
9899

@@ -146,7 +147,7 @@ public Builder withSystemParams(Map<String, Object> systemParams) {
146147
return this;
147148
}
148149

149-
public Builder withAdvisors(List<RequestResponseAdvisor> advisors) {
150+
public Builder withAdvisors(List<Advisor> advisors) {
150151
this.advisors = advisors;
151152
return this;
152153
}

spring-ai-core/src/main/java/org/springframework/ai/chat/client/ChatClient.java

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@
2121
import java.util.Map;
2222
import java.util.function.Consumer;
2323

24+
import org.springframework.ai.chat.client.advisor.api.Advisor;
2425
import org.springframework.ai.chat.client.observation.ChatClientObservationConvention;
2526
import org.springframework.ai.chat.messages.Message;
2627
import org.springframework.ai.chat.model.ChatModel;
@@ -122,9 +123,9 @@ interface AdvisorSpec {
122123

123124
AdvisorSpec params(Map<String, Object> p);
124125

125-
AdvisorSpec advisors(RequestResponseAdvisor... advisors);
126+
AdvisorSpec advisors(Advisor... advisors);
126127

127-
AdvisorSpec advisors(List<RequestResponseAdvisor> advisors);
128+
AdvisorSpec advisors(List<Advisor> advisors);
128129

129130
}
130131

@@ -192,9 +193,9 @@ interface ChatClientRequestSpec {
192193

193194
ChatClientRequestSpec advisors(Consumer<AdvisorSpec> consumer);
194195

195-
ChatClientRequestSpec advisors(RequestResponseAdvisor... advisors);
196+
ChatClientRequestSpec advisors(Advisor... advisors);
196197

197-
ChatClientRequestSpec advisors(List<RequestResponseAdvisor> advisors);
198+
ChatClientRequestSpec advisors(List<Advisor> advisors);
198199

199200
ChatClientRequestSpec messages(Message... messages);
200201

@@ -237,11 +238,11 @@ <I, O> ChatClientRequestSpec function(String name, String description, Class<I>
237238
*/
238239
interface Builder {
239240

240-
Builder defaultAdvisors(RequestResponseAdvisor... advisor);
241+
Builder defaultAdvisors(Advisor... advisor);
241242

242243
Builder defaultAdvisors(Consumer<AdvisorSpec> advisorSpecConsumer);
243244

244-
Builder defaultAdvisors(List<RequestResponseAdvisor> advisors);
245+
Builder defaultAdvisors(List<Advisor> advisors);
245246

246247
Builder defaultOptions(ChatOptions chatOptions);
247248

0 commit comments

Comments
 (0)