Skip to content

Commit d4eb358

Browse files
committed
fix: Incorrect order when Advisors have the same order
Signed-off-by: YunKui Lu <luyunkui95@gmail.com>
1 parent 694bb50 commit d4eb358

File tree

2 files changed

+41
-2
lines changed

2 files changed

+41
-2
lines changed

spring-ai-client-chat/src/main/java/org/springframework/ai/chat/client/advisor/DefaultAroundAdvisorChain.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -192,7 +192,7 @@ public Builder pushAll(List<? extends Advisor> advisors) {
192192
.toList();
193193

194194
if (!CollectionUtils.isEmpty(callAroundAdvisorList)) {
195-
callAroundAdvisorList.forEach(this.callAdvisors::push);
195+
this.callAdvisors.addAll(callAroundAdvisorList);
196196
}
197197

198198
List<StreamAdvisor> streamAroundAdvisorList = advisors.stream()
@@ -201,7 +201,7 @@ public Builder pushAll(List<? extends Advisor> advisors) {
201201
.toList();
202202

203203
if (!CollectionUtils.isEmpty(streamAroundAdvisorList)) {
204-
streamAroundAdvisorList.forEach(this.streamAdvisors::push);
204+
this.streamAdvisors.addAll(streamAroundAdvisorList);
205205
}
206206

207207
this.reOrder();

spring-ai-client-chat/src/test/java/org/springframework/ai/chat/client/advisor/DefaultAroundAdvisorChainTests.java

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@
2121

2222
import io.micrometer.observation.ObservationRegistry;
2323
import org.junit.jupiter.api.Test;
24+
import org.springframework.core.Ordered;
2425
import reactor.core.publisher.Flux;
2526

2627
import org.springframework.ai.chat.client.ChatClientRequest;
@@ -125,4 +126,42 @@ void getStreamAdvisors() {
125126
assertThat(chain.getStreamAdvisors()).containsExactlyInAnyOrder(advisors.toArray(new StreamAdvisor[0]));
126127
}
127128

129+
@Test
130+
void testOrder(){
131+
TestOrderAdvisor advisor1 = new TestOrderAdvisor("advisor1", 1);
132+
TestOrderAdvisor advisor21 = new TestOrderAdvisor("advisor2_1", 2);
133+
TestOrderAdvisor advisor22 = new TestOrderAdvisor("advisor2_2", 2);
134+
TestOrderAdvisor advisor3 = new TestOrderAdvisor("advisor3", 3);
135+
136+
var advisors = List.of(advisor3, advisor1, advisor21, advisor22);
137+
138+
DefaultAroundAdvisorChain chain = DefaultAroundAdvisorChain.builder(ObservationRegistry.NOOP)
139+
.pushAll(advisors)
140+
.build();
141+
142+
assertThat(chain.getStreamAdvisors()).containsExactly(advisor1, advisor21, advisor22, advisor3);
143+
assertThat(chain.getCallAdvisors()).containsExactly(advisor1, advisor21, advisor22, advisor3);
144+
}
145+
146+
private record TestOrderAdvisor(String name, int order) implements CallAdvisor, StreamAdvisor {
147+
@Override
148+
public String getName() {
149+
return name;
150+
}
151+
152+
@Override
153+
public int getOrder() {
154+
return order;
155+
}
156+
157+
@Override
158+
public ChatClientResponse adviseCall(ChatClientRequest chatClientRequest, CallAdvisorChain callAdvisorChain) {
159+
return null;
160+
}
161+
162+
@Override
163+
public Flux<ChatClientResponse> adviseStream(ChatClientRequest chatClientRequest, StreamAdvisorChain streamAdvisorChain) {
164+
return null;
165+
}
166+
}
128167
}

0 commit comments

Comments
 (0)