4141import reactor .core .publisher .Flux ;
4242
4343/**
44- * Spring AI {@linkplain ChatClient} and {@linkplain StreamingChatClient} for Aliyun Dashscope
44+ * Spring AI {@linkplain ChatClient} and {@linkplain StreamingChatClient} for
45+ * Aliyun Dashscope
4546 */
4647public class DashscopeChatClient extends
4748 AbstractFunctionCallSupport <ChatCompletionMessage , ChatCompletionRequest , ChatCompletionResult > implements
@@ -97,33 +98,38 @@ public Flux<ChatResponse> stream(Prompt prompt) {
9798 var request = createRequest (prompt );
9899 if (request .isMultiModalRequest ()) {
99100 return RxJava2Adapter .flowableToFlux (
100- dashscopeApi .multiModalStream (request .getMultiModalMessages (), request .options ())
101+ dashscopeApi .multiModalStream (request .getMultiModalMessages (),
102+ request .options ())
101103 .map (result -> {
102104 var response = handleFunctionCallOrReturn (request ,
103105 new ChatCompletionResult (result ));
104106 return chatCompletionResultToChatResponse (response );
105107 }));
106108 }
107109 return RxJava2Adapter .flowableToFlux (
108- dashscopeApi .chatCompletionStream (request .getMessages (), request .options ())
110+ dashscopeApi .chatCompletionStream (request .getMessages (),
111+ request .options ())
109112 .map (result -> {
110113 var response = handleFunctionCallOrReturn (request ,
111114 new ChatCompletionResult (result ));
112115 return chatCompletionResultToChatResponse (response );
113116 }));
114117 }
115118
116- private ChatResponse chatCompletionResultToChatResponse (ChatCompletionResult result ) {
119+ private ChatResponse chatCompletionResultToChatResponse (
120+ ChatCompletionResult result ) {
117121 if (result .multiModalConversationResult () != null ) {
118- return multiModalConversationResultToChatResponse (result .multiModalConversationResult ());
122+ return multiModalConversationResultToChatResponse (
123+ result .multiModalConversationResult ());
119124 } else {
120125 return generationResultToChatResponse (result .generationResult ());
121126 }
122127 }
123128
124129 private ChatResponse multiModalConversationResultToChatResponse (
125130 MultiModalConversationResult result ) {
126- List <org .springframework .ai .chat .Generation > generations = result .getOutput ().getChoices ()
131+ List <org .springframework .ai .chat .Generation > generations = result .getOutput ()
132+ .getChoices ()
127133 .stream ()
128134 .map (choice -> new org .springframework .ai .chat .Generation (
129135 (String ) choice .getMessage ().getContent ().get (0 ).get ("text" ))
@@ -211,7 +217,8 @@ private ToolBase toToolFunction(FunctionCallback functionCallback) {
211217
212218 @ Override
213219 protected ChatCompletionRequest doCreateToolResponseRequest (
214- ChatCompletionRequest previousRequest , ChatCompletionMessage responseMessage ,
220+ ChatCompletionRequest previousRequest ,
221+ ChatCompletionMessage responseMessage ,
215222 List <ChatCompletionMessage > conversationHistory ) {
216223 if (responseMessage .message () != null ) {
217224 for (ToolCallBase toolCall : responseMessage .message ().getToolCalls ()) {
@@ -223,7 +230,8 @@ protected ChatCompletionRequest doCreateToolResponseRequest(
223230
224231 if (!this .functionCallbackRegister .containsKey (functionName )) {
225232 throw new IllegalStateException (
226- "No function callback found for function name: " + functionName );
233+ "No function callback found for function name: "
234+ + functionName );
227235 }
228236
229237 String functionResponse = this .functionCallbackRegister .get (
@@ -244,29 +252,36 @@ protected ChatCompletionRequest doCreateToolResponseRequest(
244252 }
245253
246254 @ Override
247- protected List <ChatCompletionMessage > doGetUserMessages (ChatCompletionRequest request ) {
255+ protected List <ChatCompletionMessage > doGetUserMessages (
256+ ChatCompletionRequest request ) {
248257 return request .messages ();
249258 }
250259
251260 @ Override
252- protected ChatCompletionMessage doGetToolResponseMessage (ChatCompletionResult response ) {
261+ protected ChatCompletionMessage doGetToolResponseMessage (
262+ ChatCompletionResult response ) {
253263 if (response .generationResult () != null ) {
254264 return new ChatCompletionMessage (
255- response .generationResult ().getOutput ().getChoices ().get (0 ).getMessage ());
265+ response .generationResult ().getOutput ().getChoices ().get (0 )
266+ .getMessage ());
256267 } else {
257268 return new ChatCompletionMessage (
258- response .multiModalConversationResult ().getOutput ().getChoices ().get (0 ).getMessage ());
269+ response .multiModalConversationResult ().getOutput ().getChoices ()
270+ .get (0 ).getMessage ());
259271 }
260272 }
261273
262274 @ Override
263- protected ChatCompletionResult doChatCompletion (ChatCompletionRequest request ) {
275+ protected ChatCompletionResult doChatCompletion (
276+ ChatCompletionRequest request ) {
264277 if (request .isMultiModalRequest ()) {
265278 return new ChatCompletionResult (
266- this .dashscopeApi .multiModal (request .getMultiModalMessages (), request .options ()));
279+ this .dashscopeApi .multiModal (request .getMultiModalMessages (),
280+ request .options ()));
267281 } else {
268- return new ChatCompletionResult (this .dashscopeApi .chatCompletion (request .getMessages (),
269- request .options ()));
282+ return new ChatCompletionResult (
283+ this .dashscopeApi .chatCompletion (request .getMessages (),
284+ request .options ()));
270285 }
271286 }
272287
@@ -285,11 +300,13 @@ protected boolean isToolFunctionCall(ChatCompletionResult response) {
285300
286301 private List <ChatCompletionMessage > toDashscopeMessages (
287302 List <org .springframework .ai .chat .messages .Message > messages ) {
288- if (messages .stream ().anyMatch (message -> !CollectionUtils .isEmpty (message .getMedia ()))) {
303+ if (messages .stream ()
304+ .anyMatch (message -> !CollectionUtils .isEmpty (message .getMedia ()))) {
289305 return messages .stream ().map (this ::toDashscopeMultiModalMessage )
290306 .map (ChatCompletionMessage ::new ).toList ();
291307 } else {
292- return messages .stream ().map (this ::toDashscopeMessage ).map (ChatCompletionMessage ::new )
308+ return messages .stream ().map (this ::toDashscopeMessage )
309+ .map (ChatCompletionMessage ::new )
293310 .toList ();
294311 }
295312 }
@@ -304,9 +321,10 @@ private Message toDashscopeMessage(
304321
305322 private MultiModalMessage toDashscopeMultiModalMessage (
306323 org .springframework .ai .chat .messages .Message message ) {
307- var images = message .getMedia ().stream ().map (media -> new HashMap <String , Object >() {{
308- put ("image" , media .getData ());
309- }}).toList ();
324+ var images = message .getMedia ().stream ()
325+ .map (media -> new HashMap <String , Object >() {{
326+ put (media .getMimeType ().getType (), media .getData ());
327+ }}).toList ();
310328 var content = new ArrayList <Map <String , Object >>(images );
311329 content .add (new HashMap <>() {{
312330 put ("text" , message .getContent ());
0 commit comments