| 
														
															@@ -2,6 +2,8 @@ package cn.iocoder.yudao.framework.ai.chatyiyan; 
														 | 
													
												
											
												
													
														| 
														 | 
														
															  
														 | 
														
														 | 
														
															  
														 | 
													
												
											
												
													
														| 
														 | 
														
															 import cn.hutool.core.bean.BeanUtil; 
														 | 
														
														 | 
														
															 import cn.hutool.core.bean.BeanUtil; 
														 | 
													
												
											
												
													
														| 
														 | 
														
															 import cn.iocoder.yudao.framework.ai.chat.*; 
														 | 
														
														 | 
														
															 import cn.iocoder.yudao.framework.ai.chat.*; 
														 | 
													
												
											
												
													
														| 
														 | 
														
															 
														 | 
														
														 | 
														
															+import cn.iocoder.yudao.framework.ai.chat.messages.Message; 
														 | 
													
												
											
												
													
														| 
														 | 
														
															 
														 | 
														
														 | 
														
															+import cn.iocoder.yudao.framework.ai.chat.messages.MessageType; 
														 | 
													
												
											
												
													
														| 
														 | 
														
															 import cn.iocoder.yudao.framework.ai.chat.prompt.ChatOptions; 
														 | 
														
														 | 
														
															 import cn.iocoder.yudao.framework.ai.chat.prompt.ChatOptions; 
														 | 
													
												
											
												
													
														| 
														 | 
														
															 import cn.iocoder.yudao.framework.ai.chat.prompt.Prompt; 
														 | 
														
														 | 
														
															 import cn.iocoder.yudao.framework.ai.chat.prompt.Prompt; 
														 | 
													
												
											
												
													
														| 
														 | 
														
															 import cn.iocoder.yudao.framework.ai.chatyiyan.api.YiYanApi; 
														 | 
														
														 | 
														
															 import cn.iocoder.yudao.framework.ai.chatyiyan.api.YiYanApi; 
														 | 
													
												
											
										
											
												
													
														 | 
														
															@@ -9,6 +11,7 @@ import cn.iocoder.yudao.framework.ai.chatyiyan.api.YiYanChatCompletion; 
														 | 
													
												
											
												
													
														| 
														 | 
														
															 import cn.iocoder.yudao.framework.ai.chatyiyan.api.YiYanChatCompletionRequest; 
														 | 
														
														 | 
														
															 import cn.iocoder.yudao.framework.ai.chatyiyan.api.YiYanChatCompletionRequest; 
														 | 
													
												
											
												
													
														| 
														 | 
														
															 import cn.iocoder.yudao.framework.ai.chatyiyan.exception.YiYanApiException; 
														 | 
														
														 | 
														
															 import cn.iocoder.yudao.framework.ai.chatyiyan.exception.YiYanApiException; 
														 | 
													
												
											
												
													
														| 
														 | 
														
															 import lombok.extern.slf4j.Slf4j; 
														 | 
														
														 | 
														
															 import lombok.extern.slf4j.Slf4j; 
														 | 
													
												
											
												
													
														| 
														 | 
														
															 
														 | 
														
														 | 
														
															+import org.jetbrains.annotations.NotNull; 
														 | 
													
												
											
												
													
														| 
														 | 
														
															 import org.springframework.http.ResponseEntity; 
														 | 
														
														 | 
														
															 import org.springframework.http.ResponseEntity; 
														 | 
													
												
											
												
													
														| 
														 | 
														
															 import org.springframework.retry.RetryCallback; 
														 | 
														
														 | 
														
															 import org.springframework.retry.RetryCallback; 
														 | 
													
												
											
												
													
														| 
														 | 
														
															 import org.springframework.retry.RetryContext; 
														 | 
														
														 | 
														
															 import org.springframework.retry.RetryContext; 
														 | 
													
												
											
										
											
												
													
														 | 
														
															@@ -18,10 +21,11 @@ import reactor.core.publisher.Flux; 
														 | 
													
												
											
												
													
														| 
														 | 
														
															  
														 | 
														
														 | 
														
															  
														 | 
													
												
											
												
													
														| 
														 | 
														
															 import java.time.Duration; 
														 | 
														
														 | 
														
															 import java.time.Duration; 
														 | 
													
												
											
												
													
														| 
														 | 
														
															 import java.util.List; 
														 | 
														
														 | 
														
															 import java.util.List; 
														 | 
													
												
											
												
													
														| 
														 | 
														
															 
														 | 
														
														 | 
														
															+import java.util.stream.Collectors; 
														 | 
													
												
											
												
													
														| 
														 | 
														
															  
														 | 
														
														 | 
														
															  
														 | 
													
												
											
												
													
														| 
														 | 
														
															 /** 
														 | 
														
														 | 
														
															 /** 
														 | 
													
												
											
												
													
														| 
														 | 
														
															  * 文心一言 
														 | 
														
														 | 
														
															  * 文心一言 
														 | 
													
												
											
												
													
														| 
														 | 
														
															- * 
														 | 
														
														 | 
														
															 
														 | 
													
												
											
												
													
														| 
														 | 
														
															 
														 | 
														
														 | 
														
															+ * <p> 
														 | 
													
												
											
												
													
														| 
														 | 
														
															  * author: fansili 
														 | 
														
														 | 
														
															  * author: fansili 
														 | 
													
												
											
												
													
														| 
														 | 
														
															  * time: 2024/3/8 19:11 
														 | 
														
														 | 
														
															  * time: 2024/3/8 19:11 
														 | 
													
												
											
												
													
														| 
														 | 
														
															  */ 
														 | 
														
														 | 
														
															  */ 
														 | 
													
												
											
										
											
												
													
														 | 
														
															@@ -52,7 +56,9 @@ public class YiYanChatClient implements ChatClient, StreamingChatClient { 
														 | 
													
												
											
												
													
														| 
														 | 
														
															                 public <T extends Object, E extends Throwable> void onError(RetryContext context, 
														 | 
														
														 | 
														
															                 public <T extends Object, E extends Throwable> void onError(RetryContext context, 
														 | 
													
												
											
												
													
														| 
														 | 
														
															                                                                             RetryCallback<T, E> callback, Throwable throwable) { 
														 | 
														
														 | 
														
															                                                                             RetryCallback<T, E> callback, Throwable throwable) { 
														 | 
													
												
											
												
													
														| 
														 | 
														
															                     log.warn("重试异常:" + context.getRetryCount(), throwable); 
														 | 
														
														 | 
														
															                     log.warn("重试异常:" + context.getRetryCount(), throwable); 
														 | 
													
												
											
												
													
														| 
														 | 
														
															-                }; 
														 | 
														
														 | 
														
															 
														 | 
													
												
											
												
													
														| 
														 | 
														
															 
														 | 
														
														 | 
														
															+                } 
														 | 
													
												
											
												
													
														| 
														 | 
														
															 
														 | 
														
														 | 
														
															+ 
														 | 
													
												
											
												
													
														| 
														 | 
														
															 
														 | 
														
														 | 
														
															+                ; 
														 | 
													
												
											
												
													
														| 
														 | 
														
															             }) 
														 | 
														
														 | 
														
															             }) 
														 | 
													
												
											
												
													
														| 
														 | 
														
															             .build(); 
														 | 
														
														 | 
														
															             .build(); 
														 | 
													
												
											
												
													
														| 
														 | 
														
															  
														 | 
														
														 | 
														
															  
														 | 
													
												
											
										
											
												
													
														 | 
														
															@@ -92,6 +98,42 @@ public class YiYanChatClient implements ChatClient, StreamingChatClient { 
														 | 
													
												
											
												
													
														| 
														 | 
														
															     } 
														 | 
														
														 | 
														
															     } 
														 | 
													
												
											
												
													
														| 
														 | 
														
															  
														 | 
														
														 | 
														
															  
														 | 
													
												
											
												
													
														| 
														 | 
														
															     private YiYanChatCompletionRequest createRequest(Prompt prompt, boolean stream) { 
														 | 
														
														 | 
														
															     private YiYanChatCompletionRequest createRequest(Prompt prompt, boolean stream) { 
														 | 
													
												
											
												
													
														| 
														 | 
														
															 
														 | 
														
														 | 
														
															+        // 获取配置 
														 | 
													
												
											
												
													
														| 
														 | 
														
															 
														 | 
														
														 | 
														
															+        YiYanOptions useOptions = getYiYanOptions(prompt); 
														 | 
													
												
											
												
													
														| 
														 | 
														
															 
														 | 
														
														 | 
														
															+        // 创建 request 
														 | 
													
												
											
												
													
														| 
														 | 
														
															 
														 | 
														
														 | 
														
															+ 
														 | 
													
												
											
												
													
														| 
														 | 
														
															 
														 | 
														
														 | 
														
															+        // tip: 百度的 system 不在 message 里面 
														 | 
													
												
											
												
													
														| 
														 | 
														
															 
														 | 
														
														 | 
														
															+        // tip:百度的 message 只有 user 和 assistant 
														 | 
													
												
											
												
													
														| 
														 | 
														
															 
														 | 
														
														 | 
														
															+        // https://cloud.baidu.com/doc/WENXINWORKSHOP/s/clntwmv7t 
														 | 
													
												
											
												
													
														| 
														 | 
														
															 
														 | 
														
														 | 
														
															+ 
														 | 
													
												
											
												
													
														| 
														 | 
														
															 
														 | 
														
														 | 
														
															+        // 获取 user 和 assistant 
														 | 
													
												
											
												
													
														| 
														 | 
														
															 
														 | 
														
														 | 
														
															+        List<YiYanChatCompletionRequest.Message> messageList = prompt.getInstructions().stream() 
														 | 
													
												
											
												
													
														| 
														 | 
														
															 
														 | 
														
														 | 
														
															+                // 过滤 system 
														 | 
													
												
											
												
													
														| 
														 | 
														
															 
														 | 
														
														 | 
														
															+                .filter(msg -> MessageType.SYSTEM != msg.getMessageType()) 
														 | 
													
												
											
												
													
														| 
														 | 
														
															 
														 | 
														
														 | 
														
															+                .map(msg -> new YiYanChatCompletionRequest.Message() 
														 | 
													
												
											
												
													
														| 
														 | 
														
															 
														 | 
														
														 | 
														
															+                        .setRole(msg.getMessageType().getValue()) 
														 | 
													
												
											
												
													
														| 
														 | 
														
															 
														 | 
														
														 | 
														
															+                        .setContent(msg.getContent()) 
														 | 
													
												
											
												
													
														| 
														 | 
														
															 
														 | 
														
														 | 
														
															+                ).toList(); 
														 | 
													
												
											
												
													
														| 
														 | 
														
															 
														 | 
														
														 | 
														
															+        // 获取 system 
														 | 
													
												
											
												
													
														| 
														 | 
														
															 
														 | 
														
														 | 
														
															+        String systemPrompt = prompt.getInstructions().stream() 
														 | 
													
												
											
												
													
														| 
														 | 
														
															 
														 | 
														
														 | 
														
															+                .filter(msg -> MessageType.SYSTEM == msg.getMessageType()) 
														 | 
													
												
											
												
													
														| 
														 | 
														
															 
														 | 
														
														 | 
														
															+                .map(Message::getContent) 
														 | 
													
												
											
												
													
														| 
														 | 
														
															 
														 | 
														
														 | 
														
															+                .collect(Collectors.joining()); 
														 | 
													
												
											
												
													
														| 
														 | 
														
															 
														 | 
														
														 | 
														
															+ 
														 | 
													
												
											
												
													
														| 
														 | 
														
															 
														 | 
														
														 | 
														
															+        YiYanChatCompletionRequest request = new YiYanChatCompletionRequest(messageList); 
														 | 
													
												
											
												
													
														| 
														 | 
														
															 
														 | 
														
														 | 
														
															+        // 复制 qianWenOptions 属性取 request(这里 options 属性和 request 基本保持一致) 
														 | 
													
												
											
												
													
														| 
														 | 
														
															 
														 | 
														
														 | 
														
															+        // top: 由于遵循 spring-ai规范,支持在构建client的时候传入默认的 chatOptions 
														 | 
													
												
											
												
													
														| 
														 | 
														
															 
														 | 
														
														 | 
														
															+        BeanUtil.copyProperties(useOptions, request); 
														 | 
													
												
											
												
													
														| 
														 | 
														
															 
														 | 
														
														 | 
														
															+        request.setTop_p(useOptions.getTopP()); 
														 | 
													
												
											
												
													
														| 
														 | 
														
															 
														 | 
														
														 | 
														
															+        request.setMax_output_tokens(useOptions.getMaxOutputTokens()); 
														 | 
													
												
											
												
													
														| 
														 | 
														
															 
														 | 
														
														 | 
														
															+        request.setTemperature(useOptions.getTemperature()); 
														 | 
													
												
											
												
													
														| 
														 | 
														
															 
														 | 
														
														 | 
														
															+        request.setSystem(systemPrompt); 
														 | 
													
												
											
												
													
														| 
														 | 
														
															 
														 | 
														
														 | 
														
															+        // 设置 stream 
														 | 
													
												
											
												
													
														| 
														 | 
														
															 
														 | 
														
														 | 
														
															+        request.setStream(stream); 
														 | 
													
												
											
												
													
														| 
														 | 
														
															 
														 | 
														
														 | 
														
															+        return request; 
														 | 
													
												
											
												
													
														| 
														 | 
														
															 
														 | 
														
														 | 
														
															+    } 
														 | 
													
												
											
												
													
														| 
														 | 
														
															 
														 | 
														
														 | 
														
															+ 
														 | 
													
												
											
												
													
														| 
														 | 
														
															 
														 | 
														
														 | 
														
															+    private @NotNull YiYanOptions getYiYanOptions(Prompt prompt) { 
														 | 
													
												
											
												
													
														| 
														 | 
														
															         // 两个都为null 则没有配置文件 
														 | 
														
														 | 
														
															         // 两个都为null 则没有配置文件 
														 | 
													
												
											
												
													
														| 
														 | 
														
															         if (yiYanOptions == null && prompt.getOptions() == null) { 
														 | 
														
														 | 
														
															         if (yiYanOptions == null && prompt.getOptions() == null) { 
														 | 
													
												
											
												
													
														| 
														 | 
														
															             throw new ChatException("ChatOptions 未配置参数!"); 
														 | 
														
														 | 
														
															             throw new ChatException("ChatOptions 未配置参数!"); 
														 | 
													
												
											
										
											
												
													
														 | 
														
															@@ -106,19 +148,7 @@ public class YiYanChatClient implements ChatClient, StreamingChatClient { 
														 | 
													
												
											
												
													
														| 
														 | 
														
															             throw new ChatException("Prompt 传入的不是 YiYanOptions!"); 
														 | 
														
														 | 
														
															             throw new ChatException("Prompt 传入的不是 YiYanOptions!"); 
														 | 
													
												
											
												
													
														| 
														 | 
														
															         } 
														 | 
														
														 | 
														
															         } 
														 | 
													
												
											
												
													
														| 
														 | 
														
															         // 转换 YiYanOptions 
														 | 
														
														 | 
														
															         // 转换 YiYanOptions 
														 | 
													
												
											
												
													
														| 
														 | 
														
															-        YiYanOptions qianWenOptions = (YiYanOptions) options; 
														 | 
														
														 | 
														
															 
														 | 
													
												
											
												
													
														| 
														 | 
														
															-        // 创建 request 
														 | 
														
														 | 
														
															 
														 | 
													
												
											
												
													
														| 
														 | 
														
															-        List<YiYanChatCompletionRequest.Message> messageList = prompt.getInstructions().stream().map( 
														 | 
														
														 | 
														
															 
														 | 
													
												
											
												
													
														| 
														 | 
														
															-                msg -> new YiYanChatCompletionRequest.Message() 
														 | 
														
														 | 
														
															 
														 | 
													
												
											
												
													
														| 
														 | 
														
															-                        .setRole(msg.getMessageType().getValue()) 
														 | 
														
														 | 
														
															 
														 | 
													
												
											
												
													
														| 
														 | 
														
															-                        .setContent(msg.getContent()) 
														 | 
														
														 | 
														
															 
														 | 
													
												
											
												
													
														| 
														 | 
														
															-        ).toList(); 
														 | 
														
														 | 
														
															 
														 | 
													
												
											
												
													
														| 
														 | 
														
															-        YiYanChatCompletionRequest request = new YiYanChatCompletionRequest(messageList); 
														 | 
														
														 | 
														
															 
														 | 
													
												
											
												
													
														| 
														 | 
														
															-        // 复制 qianWenOptions 属性取 request(这里 options 属性和 request 基本保持一致) 
														 | 
														
														 | 
														
															 
														 | 
													
												
											
												
													
														| 
														 | 
														
															-        // top: 由于遵循 spring-ai规范,支持在构建client的时候传入默认的 chatOptions 
														 | 
														
														 | 
														
															 
														 | 
													
												
											
												
													
														| 
														 | 
														
															-        BeanUtil.copyProperties(qianWenOptions, request); 
														 | 
														
														 | 
														
															 
														 | 
													
												
											
												
													
														| 
														 | 
														
															-        // 设置 stream 
														 | 
														
														 | 
														
															 
														 | 
													
												
											
												
													
														| 
														 | 
														
															-        request.setStream(stream); 
														 | 
														
														 | 
														
															 
														 | 
													
												
											
												
													
														| 
														 | 
														
															-        return request; 
														 | 
														
														 | 
														
															 
														 | 
													
												
											
												
													
														| 
														 | 
														
															 
														 | 
														
														 | 
														
															+        YiYanOptions useOptions = (YiYanOptions) options; 
														 | 
													
												
											
												
													
														| 
														 | 
														
															 
														 | 
														
														 | 
														
															+        return useOptions; 
														 | 
													
												
											
												
													
														| 
														 | 
														
															     } 
														 | 
														
														 | 
														
															     } 
														 | 
													
												
											
												
													
														| 
														 | 
														
															 } 
														 | 
														
														 | 
														
															 } 
														 |