| 
					
				 | 
			
			
				@@ -2,6 +2,8 @@ package cn.iocoder.yudao.framework.ai.chatyiyan; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 import cn.hutool.core.bean.BeanUtil; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 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.Prompt; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 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.exception.YiYanApiException; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 import lombok.extern.slf4j.Slf4j; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+import org.jetbrains.annotations.NotNull; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 import org.springframework.http.ResponseEntity; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 import org.springframework.retry.RetryCallback; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 import org.springframework.retry.RetryContext; 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -18,10 +21,11 @@ import reactor.core.publisher.Flux; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 import java.time.Duration; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 import java.util.List; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+import java.util.stream.Collectors; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 /** 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  * 文心一言 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- * 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ * <p> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  * author: fansili 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  * 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, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                                                                             RetryCallback<T, E> callback, Throwable throwable) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                     log.warn("重试异常:" + context.getRetryCount(), throwable); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                }; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                ; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             }) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             .build(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -92,6 +98,42 @@ public class YiYanChatClient implements ChatClient, StreamingChatClient { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     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 则没有配置文件 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         if (yiYanOptions == null && prompt.getOptions() == null) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             throw new ChatException("ChatOptions 未配置参数!"); 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -106,19 +148,7 @@ public class YiYanChatClient implements ChatClient, StreamingChatClient { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             throw new ChatException("Prompt 传入的不是 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; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 } 
			 |