diff --git a/spring-ai-client-chat/src/main/java/org/springframework/ai/chat/client/advisor/DefaultAroundAdvisorChain.java b/spring-ai-client-chat/src/main/java/org/springframework/ai/chat/client/advisor/DefaultAroundAdvisorChain.java index e9d1a1d2066..35fab89c789 100644 --- a/spring-ai-client-chat/src/main/java/org/springframework/ai/chat/client/advisor/DefaultAroundAdvisorChain.java +++ b/spring-ai-client-chat/src/main/java/org/springframework/ai/chat/client/advisor/DefaultAroundAdvisorChain.java @@ -192,7 +192,7 @@ public Builder pushAll(List advisors) { .toList(); if (!CollectionUtils.isEmpty(callAroundAdvisorList)) { - callAroundAdvisorList.forEach(this.callAdvisors::push); + this.callAdvisors.addAll(callAroundAdvisorList); } List streamAroundAdvisorList = advisors.stream() @@ -201,7 +201,7 @@ public Builder pushAll(List advisors) { .toList(); if (!CollectionUtils.isEmpty(streamAroundAdvisorList)) { - streamAroundAdvisorList.forEach(this.streamAdvisors::push); + this.streamAdvisors.addAll(streamAroundAdvisorList); } this.reOrder(); diff --git a/spring-ai-client-chat/src/test/java/org/springframework/ai/chat/client/advisor/DefaultAroundAdvisorChainTests.java b/spring-ai-client-chat/src/test/java/org/springframework/ai/chat/client/advisor/DefaultAroundAdvisorChainTests.java index ed00537f716..cdb3fa2f0e2 100644 --- a/spring-ai-client-chat/src/test/java/org/springframework/ai/chat/client/advisor/DefaultAroundAdvisorChainTests.java +++ b/spring-ai-client-chat/src/test/java/org/springframework/ai/chat/client/advisor/DefaultAroundAdvisorChainTests.java @@ -125,4 +125,44 @@ void getStreamAdvisors() { assertThat(chain.getStreamAdvisors()).containsExactlyInAnyOrder(advisors.toArray(new StreamAdvisor[0])); } + @Test + void testOrder() { + TestOrderAdvisor advisor1 = new TestOrderAdvisor("advisor1", 1); + TestOrderAdvisor advisor21 = new TestOrderAdvisor("advisor2_1", 2); + TestOrderAdvisor advisor22 = new TestOrderAdvisor("advisor2_2", 2); + TestOrderAdvisor advisor3 = new TestOrderAdvisor("advisor3", 3); + + var advisors = List.of(advisor3, advisor1, advisor21, advisor22); + + DefaultAroundAdvisorChain chain = DefaultAroundAdvisorChain.builder(ObservationRegistry.NOOP) + .pushAll(advisors) + .build(); + + assertThat(chain.getStreamAdvisors()).containsExactly(advisor1, advisor21, advisor22, advisor3); + assertThat(chain.getCallAdvisors()).containsExactly(advisor1, advisor21, advisor22, advisor3); + } + + private record TestOrderAdvisor(String name, int order) implements CallAdvisor, StreamAdvisor { + @Override + public String getName() { + return name; + } + + @Override + public int getOrder() { + return order; + } + + @Override + public ChatClientResponse adviseCall(ChatClientRequest chatClientRequest, CallAdvisorChain callAdvisorChain) { + return null; + } + + @Override + public Flux adviseStream(ChatClientRequest chatClientRequest, + StreamAdvisorChain streamAdvisorChain) { + return null; + } + } + }