Skip to content

Commit eff16bf

Browse files
committed
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 087de16 commit eff16bf

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)