diff --git a/src/main/java/com/newyetai/ai/controller/AiController.java b/src/main/java/com/newyetai/ai/controller/AiController.java index 919d51e..34b91d7 100644 --- a/src/main/java/com/newyetai/ai/controller/AiController.java +++ b/src/main/java/com/newyetai/ai/controller/AiController.java @@ -1,6 +1,7 @@ package com.newyetai.ai.controller; import com.newyetai.common.AlitaResult; +import com.newyetai.sdk.ai.util.AIUtils; import com.newyetai.sdk.xf.dto.RtasrReqDTO; import com.newyetai.sdk.xf.model.ChatReq; import com.newyetai.sdk.xf.model.TranslateReq; @@ -21,7 +22,7 @@ public class AiController { @PostMapping("chat") @ApiOperation("ai对话") public AlitaResult chat(@Validated @RequestBody ChatReq req) { - return AlitaResult.success(XfUtils.chat(req)); + return AlitaResult.success(AIUtils.chat(req)); } @PostMapping("translate") diff --git a/src/main/java/com/newyetai/component/chat/mapper/ChatMsgMapper.xml b/src/main/java/com/newyetai/component/chat/mapper/ChatMsgMapper.xml index 20b6044..7cde710 100644 --- a/src/main/java/com/newyetai/component/chat/mapper/ChatMsgMapper.xml +++ b/src/main/java/com/newyetai/component/chat/mapper/ChatMsgMapper.xml @@ -15,6 +15,5 @@ and chat_id = #{param.chatId} - order by id desc \ No newline at end of file diff --git a/src/main/java/com/newyetai/sdk/ai/config/AiProperties.java b/src/main/java/com/newyetai/sdk/ai/config/AiProperties.java new file mode 100644 index 0000000..7d35636 --- /dev/null +++ b/src/main/java/com/newyetai/sdk/ai/config/AiProperties.java @@ -0,0 +1,29 @@ +package com.newyetai.sdk.ai.config; + +import java.io.Serializable; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; +import org.springframework.boot.context.properties.ConfigurationProperties; +import org.springframework.stereotype.Component; + +@ConfigurationProperties(prefix = AiProperties.PREFIX) +@Data +@Component +@NoArgsConstructor +@AllArgsConstructor +@Builder +public class AiProperties implements Serializable{ + + /** **/ + private static final long serialVersionUID = 6362606996602121889L; + + public static final String PREFIX = "ai"; + + /** 对话提供者 **/ + private String chatProvider; + + + +} diff --git a/src/main/java/com/newyetai/sdk/ai/service/service/AiProvider.java b/src/main/java/com/newyetai/sdk/ai/service/service/AiProvider.java new file mode 100644 index 0000000..de2985e --- /dev/null +++ b/src/main/java/com/newyetai/sdk/ai/service/service/AiProvider.java @@ -0,0 +1,46 @@ +package com.newyetai.sdk.ai.service.service; + +import com.newyetai.common.AlitaResult; +import com.newyetai.common.util.JsonUtils; +import com.newyetai.sdk.ai.config.AiProperties; +import com.newyetai.sdk.common.constant.SdkConstants; +import com.newyetai.sdk.common.dto.DefaultSdkInvokeLogDTO; +import com.newyetai.sdk.common.util.HttpUtils; +import com.newyetai.sdk.deepseek.config.DeepSeekProperties; +import com.newyetai.sdk.deepseek.service.DeepSeekProvider; +import com.newyetai.sdk.xf.config.XfProperties; +import com.newyetai.sdk.xf.model.ChatReq; +import com.newyetai.sdk.xf.model.ChatRes; +import com.newyetai.sdk.xf.service.XfSparkProvider; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.HttpEntity; +import org.springframework.http.HttpHeaders; +import org.springframework.http.HttpMethod; +import org.springframework.http.ResponseEntity; +import org.springframework.stereotype.Service; + +@Slf4j +@Service +public class AiProvider { + + private static AiProperties aiProperties; + + @Autowired + private DeepSeekProvider deepSeekProvider; + @Autowired + private XfSparkProvider xfSparkProvider; + + private AiProvider(AiProperties aiProperties) { + AiProvider.aiProperties = aiProperties; + } + + public static AlitaResult httpChat(ChatReq req) { + if (aiProperties.getChatProvider().equals(XfProperties.PREFIX)) { + return XfSparkProvider.httpChat(req); + } else { + return DeepSeekProvider.httpChat(req); + } + } + +} diff --git a/src/main/java/com/newyetai/sdk/ai/util/AIUtils.java b/src/main/java/com/newyetai/sdk/ai/util/AIUtils.java new file mode 100644 index 0000000..dd32f08 --- /dev/null +++ b/src/main/java/com/newyetai/sdk/ai/util/AIUtils.java @@ -0,0 +1,24 @@ +package com.newyetai.sdk.ai.util; + +import com.newyetai.common.AlitaResult; +import com.newyetai.common.exception.util.Assert; +import com.newyetai.sdk.ai.service.service.AiProvider; +import com.newyetai.sdk.xf.model.ChatReq; +import org.springframework.stereotype.Component; + +@Component +public class AIUtils { + + /** + * 对话 + * @param req + * @return + */ + public static String chat(ChatReq req) { + AlitaResult result = AiProvider.httpChat(req); + Assert.isTrue(result.getSuccess(), result.getMsg()); + return result.getData(); + } + + +} diff --git a/src/main/java/com/newyetai/sdk/deepseek/config/DeepSeekProperties.java b/src/main/java/com/newyetai/sdk/deepseek/config/DeepSeekProperties.java new file mode 100644 index 0000000..3c4daf6 --- /dev/null +++ b/src/main/java/com/newyetai/sdk/deepseek/config/DeepSeekProperties.java @@ -0,0 +1,29 @@ +package com.newyetai.sdk.deepseek.config; + +import java.io.Serializable; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; +import org.springframework.boot.context.properties.ConfigurationProperties; +import org.springframework.stereotype.Component; + +@ConfigurationProperties(prefix = DeepSeekProperties.PREFIX) +@Data +@Component +@NoArgsConstructor +@AllArgsConstructor +@Builder +public class DeepSeekProperties implements Serializable{ + + /** **/ + private static final long serialVersionUID = 6362606996602121889L; + + public static final String PREFIX = "deepseek"; + + /** 控制台获取http服务接口认证信息中的APIPassword **/ + private String httpAPIPassword; + + + +} diff --git a/src/main/java/com/newyetai/sdk/deepseek/service/DeepSeekProvider.java b/src/main/java/com/newyetai/sdk/deepseek/service/DeepSeekProvider.java new file mode 100644 index 0000000..36787d7 --- /dev/null +++ b/src/main/java/com/newyetai/sdk/deepseek/service/DeepSeekProvider.java @@ -0,0 +1,65 @@ +package com.newyetai.sdk.deepseek.service; + +import com.newyetai.common.AlitaResult; +import com.newyetai.common.util.JsonUtils; +import com.newyetai.sdk.common.constant.SdkConstants; +import com.newyetai.sdk.common.dto.DefaultSdkInvokeLogDTO; +import com.newyetai.sdk.common.util.HttpUtils; +import com.newyetai.sdk.deepseek.config.DeepSeekProperties; +import com.newyetai.sdk.xf.model.ChatReq; +import com.newyetai.sdk.xf.model.ChatRes; +import lombok.extern.slf4j.Slf4j; +import org.springframework.http.HttpEntity; +import org.springframework.http.HttpHeaders; +import org.springframework.http.HttpMethod; +import org.springframework.http.ResponseEntity; +import org.springframework.stereotype.Service; + +@Slf4j +@Service +public class DeepSeekProvider { + + private static DeepSeekProperties deepSeekProperties; + + private DeepSeekProvider(DeepSeekProperties deepSeekProperties) { + DeepSeekProvider.deepSeekProperties = deepSeekProperties; + } + + public static AlitaResult httpChat(ChatReq req) { + return httpChat(req, deepSeekProperties.getHttpAPIPassword()); + } + + + public static AlitaResult httpChat(ChatReq req, String httpAPIPassword) { + ResponseEntity response = null; + try { + try { + HttpHeaders header = new HttpHeaders(); + header.add("Authorization", "Bearer " + httpAPIPassword); + header.add("Content-Type", "application/json"); + // 发送请求 + HttpEntity requestEntity = new HttpEntity(req, header); + response = + HttpUtils.restTemplate.exchange("https://api.deepseek.com/chat/completions", + HttpMethod.POST, requestEntity, ChatRes.class); + } catch (Exception e) { + log.error("http error:{}", e.getMessage()); + return AlitaResult.error(SdkConstants.SDK_HTTP_INVOKE_ERROR_CODE, e.getMessage()); + } + try { + String content = response.getBody().getChoices().get(0).getMessage().getContent(); + return AlitaResult.success(content); + } catch (Exception e) { + return AlitaResult.error(SdkConstants.SDK_RESPONSE_CONVERT_ERROR_CODE, "返回结果获取content失败"); + } + + } finally { + log.info("invoke:{}", + JsonUtils + .toJsonString( + DefaultSdkInvokeLogDTO.builder().requestData(req).responseData(response) + .build())); + } + } + +} diff --git a/src/main/resources/application.properties b/src/main/resources/application.properties index ad2c564..134633a 100644 --- a/src/main/resources/application.properties +++ b/src/main/resources/application.properties @@ -153,6 +153,7 @@ ali.idcard.url=https://kzidcardv1.market.alicloudapi.com/api-mall/api/id_card/ch ali.idcard.appcode=728e8c05167a482093418707ca22822b + #讯飞配置 xf.httpAPIPassword=EfqszvaEEoTnUfQRRcvr:ohEYAwzpIiUeWFvZAqEk #在控制台-我的应用获取 @@ -168,6 +169,14 @@ xf.otsHostUrl=https://ntrans.xfyun.cn/v2/ots #实时语音转写 xf.rtasr.APIKey=2e33d9128a73be21b294594e5377ca53 + +#deepseek配置 +deepseek.httpAPIPassword=sk-2f5300bb751944a2a8e3b8d8f45c0ac5 + +#ai配置 +#对话提供者,对应配置的PREFIX +ai.chatProvider=deepseek + #腾讯地图 tencent.map.key=TS7BZ-GOVCB-CUZUL-JUUAV-WTYT3-Z2B4Z tencent.map.baseUrl=https://apis.map.qq.com diff --git a/src/test/java/com/newyetai/DeepSeekTest.java b/src/test/java/com/newyetai/DeepSeekTest.java new file mode 100644 index 0000000..0beae52 --- /dev/null +++ b/src/test/java/com/newyetai/DeepSeekTest.java @@ -0,0 +1,20 @@ +package com.newyetai; + +import com.newyetai.common.AlitaResult; +import com.newyetai.sdk.common.util.HttpUtils; +import com.newyetai.sdk.deepseek.service.DeepSeekProvider; +import com.newyetai.sdk.xf.model.ChatReq; +import com.newyetai.sdk.xf.model.MessageDTO; +import lombok.extern.slf4j.Slf4j; +import org.junit.jupiter.api.Test; + +@Slf4j +public class DeepSeekTest { + + @Test + public void chat(){ + AlitaResult result = DeepSeekProvider.httpChat(ChatReq.builder().model("deepseek-chat").message(MessageDTO.builder().role("user").content("讲个故事").build()).build(), ""); + log.info("{}", result); + } + +} diff --git a/src/test/java/com/newyetai/SparkTest.java b/src/test/java/com/newyetai/SparkTest.java index 7244a7d..bcd57d2 100644 --- a/src/test/java/com/newyetai/SparkTest.java +++ b/src/test/java/com/newyetai/SparkTest.java @@ -51,6 +51,7 @@ public class SparkTest { .iatHostUrl("https://iat-api.xfyun.cn/v2/iat") .ttsHostUrl("https://tts-api.xfyun.cn/v2/tts") .otsHostUrl("https://ntrans.xfyun.cn/v2/ots") + .httpAPIPassword("EfqszvaEEoTnUfQRRcvr:ohEYAwzpIiUeWFvZAqEk") .appId("83b8ddca") .apiSecret("ZWE2MjkzY2VmZDkwM2EwZGJhNGRhOWJm") .apiKey("e092f93e28ebe6d27f756bb2d884dcff") @@ -185,7 +186,7 @@ public class SparkTest { @Test public void iat() throws IOException { - String file = "src/main/resources/iat/file.mp3"; + String file = "src/main/resources/iat/cn.pcm"; try(InputStream is = new FileInputStream(file)){ AlitaResult result = WebIATWS.execute(is, xfProperties); log.info("{}", result); @@ -239,4 +240,16 @@ public class SparkTest { } } + @Test + public void chat(){ + ChatReq req = ChatReq.builder().message(MessageDTO.builder().role("system").content( + "你是一位专业的简历分析专家。目标任务:请根据我给出的信息,分析得出简历信息。不要自己填充json信息") + .role("user").content("我是大学生") + .build()).build(); + + AlitaResult result = XfSparkProvider.httpChat(req, xfProperties.getHttpAPIPassword()); + Assert.isTrue(result.getSuccess(), result.getMsg()); + log.info("{}", result); + } + }