Skip to content

Commit 7aec508

Browse files
committed
chore: format
Signed-off-by: jiangsier-xyz <[email protected]>
1 parent 4040c73 commit 7aec508

File tree

4 files changed

+93
-109
lines changed

4 files changed

+93
-109
lines changed

models/spring-ai-qwen/src/main/java/org/springframework/ai/qwen/QwenChatModel.java

+27-27
Original file line numberDiff line numberDiff line change
@@ -145,33 +145,33 @@ private Flux<ChatResponse> internalStream(Prompt prompt, ChatResponse previousCh
145145

146146
observation.parentObservation(contextView.getOrDefault(ObservationThreadLocalAccessor.KEY, null)).start();
147147

148-
// @formatter:off
149-
Flux<ChatResponse> chatResponse = this.qwenApi.streamCall(prompt, previousChatResponse)
150-
.flatMap(response -> {
151-
if (this.toolExecutionEligibilityPredicate.isToolExecutionRequired(prompt.getOptions(), response)) {
152-
return Flux.defer(() -> {
153-
var toolExecutionResult = this.toolCallingManager.executeToolCalls(prompt, response);
154-
if (toolExecutionResult.returnDirect()) {
155-
// return tool execution result directly to the client
156-
return Flux.just(ChatResponse.builder().from(response)
157-
.generations(ToolExecutionResult.buildGenerations(toolExecutionResult))
158-
.build());
159-
} else {
160-
// send the tool execution result back to the model.
161-
return this.internalStream(
162-
new Prompt(toolExecutionResult.conversationHistory(), prompt.getOptions()),
163-
response);
164-
}
165-
}).subscribeOn(Schedulers.boundedElastic());
166-
}
167-
else {
168-
return Flux.just(response);
169-
}
170-
})
171-
.doOnError(observation::error)
172-
.doFinally(s -> observation.stop())
173-
.contextWrite(ctx -> ctx.put(ObservationThreadLocalAccessor.KEY, observation));
174-
// @formatter:on
148+
Flux<ChatResponse> chatResponse = this.qwenApi.streamCall(prompt, previousChatResponse)
149+
.flatMap(response -> {
150+
if (this.toolExecutionEligibilityPredicate.isToolExecutionRequired(prompt.getOptions(), response)) {
151+
return Flux.defer(() -> {
152+
var toolExecutionResult = this.toolCallingManager.executeToolCalls(prompt, response);
153+
if (toolExecutionResult.returnDirect()) {
154+
// return tool execution result directly to the client
155+
return Flux.just(ChatResponse.builder()
156+
.from(response)
157+
.generations(ToolExecutionResult.buildGenerations(toolExecutionResult))
158+
.build());
159+
}
160+
else {
161+
// send the tool execution result back to the model.
162+
return this.internalStream(
163+
new Prompt(toolExecutionResult.conversationHistory(), prompt.getOptions()),
164+
response);
165+
}
166+
}).subscribeOn(Schedulers.boundedElastic());
167+
}
168+
else {
169+
return Flux.just(response);
170+
}
171+
})
172+
.doOnError(observation::error)
173+
.doFinally(s -> observation.stop())
174+
.contextWrite(ctx -> ctx.put(ObservationThreadLocalAccessor.KEY, observation));
175175

176176
return new MessageAggregator().aggregate(chatResponse, observationContext::setResponse);
177177
});

models/spring-ai-qwen/src/test/java/org/springframework/ai/qwen/QwenChatModelIT.java

+42-52
Original file line numberDiff line numberDiff line change
@@ -181,18 +181,16 @@ void beanStreamOutputConverterRecords() {
181181
PromptTemplate promptTemplate = new PromptTemplate(template, Map.of("format", format));
182182
Prompt prompt = new Prompt(promptTemplate.createMessage());
183183

184-
// @formatter:off
185-
String generationTextFromStream = this.chatModel.stream(prompt)
186-
.collectList()
187-
.block()
188-
.stream()
189-
.map(ChatResponse::getResults)
190-
.flatMap(List::stream)
191-
.map(Generation::getOutput)
192-
.map(AssistantMessage::getText)
193-
.filter(Objects::nonNull)
194-
.collect(Collectors.joining());
195-
// @formatter:on
184+
String generationTextFromStream = this.chatModel.stream(prompt)
185+
.collectList()
186+
.block()
187+
.stream()
188+
.map(ChatResponse::getResults)
189+
.flatMap(List::stream)
190+
.map(Generation::getOutput)
191+
.map(AssistantMessage::getText)
192+
.filter(Objects::nonNull)
193+
.collect(Collectors.joining());
196194

197195
ActorsFilmsRecord actorsFilms = converter.convert(generationTextFromStream);
198196
logger.info(actorsFilms.toString());
@@ -204,13 +202,12 @@ void beanStreamOutputConverterRecords() {
204202
void multiModalityImageUrl() throws IOException {
205203
URL url = new URL("https://docs.spring.io/spring-ai/reference/_images/multimodal.test.png");
206204

207-
// @formatter:off
208-
String response = ChatClient.create(this.chatModel).prompt()
209-
.options(QwenChatOptions.builder().model(QwenModel.QWEN_VL_MAX.getName()).build())
210-
.user(u -> u.text("Explain what do you see on this picture?").media(MimeTypeUtils.IMAGE_PNG, url))
211-
.call()
212-
.content();
213-
// @formatter:on
205+
String response = ChatClient.create(this.chatModel)
206+
.prompt()
207+
.options(QwenChatOptions.builder().model(QwenModel.QWEN_VL_MAX.getName()).build())
208+
.user(u -> u.text("Explain what do you see on this picture?").media(MimeTypeUtils.IMAGE_PNG, url))
209+
.call()
210+
.content();
214211

215212
logger.info(response);
216213
assertThat(response).containsAnyOf("bananas", "apple", "bowl", "basket", "fruit stand");
@@ -220,31 +217,28 @@ void multiModalityImageUrl() throws IOException {
220217
void multiModalityImageResource() {
221218
Resource resource = new ClassPathResource("multimodal.test.png");
222219

223-
// @formatter:off
224-
String response = ChatClient.create(this.chatModel).prompt()
225-
.options(QwenChatOptions.builder().model(QwenModel.QWEN_VL_MAX.getName()).build())
226-
.user(u -> u.text("Explain what do you see on this picture?").media(MimeTypeUtils.IMAGE_PNG, resource))
227-
.call()
228-
.content();
229-
// @formatter:on
220+
String response = ChatClient.create(this.chatModel)
221+
.prompt()
222+
.options(QwenChatOptions.builder().model(QwenModel.QWEN_VL_MAX.getName()).build())
223+
.user(u -> u.text("Explain what do you see on this picture?").media(MimeTypeUtils.IMAGE_PNG, resource))
224+
.call()
225+
.content();
230226

231227
assertThat(response).containsAnyOf("bananas", "apple", "bowl", "basket", "fruit stand");
232228
}
233229

234230
@Test
235231
void answerAfterSearch() {
236-
// @formatter:off
237-
QwenChatOptions options = QwenChatOptions.builder()
238-
.enableSearch(true)
239-
.searchOptions(QwenChatOptions.SearchOptions.builder()
240-
.citationFormat("[<number>]")
241-
.enableCitation(true)
242-
.enableSource(true)
243-
.forcedSearch(true)
244-
.searchStrategy("standard")
245-
.build())
246-
.build();
247-
// @formatter:on
232+
QwenChatOptions options = QwenChatOptions.builder()
233+
.enableSearch(true)
234+
.searchOptions(QwenChatOptions.SearchOptions.builder()
235+
.citationFormat("[<number>]")
236+
.enableCitation(true)
237+
.enableSource(true)
238+
.forcedSearch(true)
239+
.searchStrategy("standard")
240+
.build())
241+
.build();
248242

249243
Prompt prompt = new Prompt("What is the weather of Beijing?", options);
250244

@@ -258,20 +252,16 @@ void answerAfterSearch() {
258252

259253
@Test
260254
void translateMessage() {
261-
// @formatter:off
262-
QwenChatOptions options = QwenChatOptions.builder()
263-
.model(QwenModel.QWEN_MT_PLUS.getName())
264-
.translationOptions(QwenChatOptions.TranslationOptions.builder()
265-
.sourceLang("English")
266-
.targetLang("Chinese")
267-
.terms(singletonList(QwenChatOptions.TranslationOptionTerm.builder()
268-
.source("memory")
269-
.target("内存")
270-
.build()))
271-
.domains("Translate into this IT domain style.")
272-
.build())
273-
.build();
274-
// @formatter:on
255+
QwenChatOptions options = QwenChatOptions.builder()
256+
.model(QwenModel.QWEN_MT_PLUS.getName())
257+
.translationOptions(QwenChatOptions.TranslationOptions.builder()
258+
.sourceLang("English")
259+
.targetLang("Chinese")
260+
.terms(singletonList(
261+
QwenChatOptions.TranslationOptionTerm.builder().source("memory").target("内存").build()))
262+
.domains("Translate into this IT domain style.")
263+
.build())
264+
.build();
275265

276266
Prompt prompt = new Prompt("my memory", options);
277267

models/spring-ai-qwen/src/test/java/org/springframework/ai/qwen/api/MockImageContentFilter.java

+4-6
Original file line numberDiff line numberDiff line change
@@ -34,12 +34,10 @@ static void handle(MultiModalConversationParam.MultiModalConversationParamBuilde
3434
}
3535
filteredContents.add(filteredContent);
3636
}
37-
// @formatter:off
38-
MultiModalMessage filteredMessage = MultiModalMessage.builder()
39-
.role(multiModalMessage.getRole())
40-
.content(filteredContents)
41-
.build();
42-
// @formatter:on
37+
MultiModalMessage filteredMessage = MultiModalMessage.builder()
38+
.role(multiModalMessage.getRole())
39+
.content(filteredContents)
40+
.build();
4341
filteredMessages.add(filteredMessage);
4442
}
4543

models/spring-ai-qwen/src/test/java/org/springframework/ai/qwen/api/QwenApiIT.java

+20-24
Original file line numberDiff line numberDiff line change
@@ -65,18 +65,16 @@ public void streamingCallNonMultimodalModel() {
6565

6666
QwenApi api = qwenApi();
6767

68-
// @formatter:off
69-
String generationTextFromStream = api.streamCall(prompt, null)
70-
.collectList()
71-
.block()
72-
.stream()
73-
.map(ChatResponse::getResults)
74-
.flatMap(List::stream)
75-
.map(Generation::getOutput)
76-
.map(AssistantMessage::getText)
77-
.filter(Objects::nonNull)
78-
.collect(Collectors.joining());
79-
// @formatter:on
68+
String generationTextFromStream = api.streamCall(prompt, null)
69+
.collectList()
70+
.block()
71+
.stream()
72+
.map(ChatResponse::getResults)
73+
.flatMap(List::stream)
74+
.map(Generation::getOutput)
75+
.map(AssistantMessage::getText)
76+
.filter(Objects::nonNull)
77+
.collect(Collectors.joining());
8078

8179
logger.info(generationTextFromStream);
8280
assertThat(generationTextFromStream).containsIgnoringCase("rain");
@@ -119,18 +117,16 @@ public void streamingCallNonMultimodalModelWithCustomizedParameter() {
119117
QwenApi api = qwenApi();
120118
api.setGenerationParamCustomizer(builder -> builder.stopString("rain"));
121119

122-
// @formatter:off
123-
String generationTextFromStream = api.streamCall(prompt, null)
124-
.collectList()
125-
.block()
126-
.stream()
127-
.map(ChatResponse::getResults)
128-
.flatMap(List::stream)
129-
.map(Generation::getOutput)
130-
.map(AssistantMessage::getText)
131-
.filter(Objects::nonNull)
132-
.collect(Collectors.joining());
133-
// @formatter:on
120+
String generationTextFromStream = api.streamCall(prompt, null)
121+
.collectList()
122+
.block()
123+
.stream()
124+
.map(ChatResponse::getResults)
125+
.flatMap(List::stream)
126+
.map(Generation::getOutput)
127+
.map(AssistantMessage::getText)
128+
.filter(Objects::nonNull)
129+
.collect(Collectors.joining());
134130

135131
logger.info(generationTextFromStream);
136132
assertThat(generationTextFromStream).doesNotContainIgnoringCase("rain");

0 commit comments

Comments
 (0)