add ai chat deepseek

This commit is contained in:
ran.shang
2025-07-07 10:51:42 +08:00
parent c6a46b62cc
commit cd3aaea259
10 changed files with 238 additions and 3 deletions

View File

@@ -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<String> chat(@Validated @RequestBody ChatReq req) {
return AlitaResult.success(XfUtils.chat(req));
return AlitaResult.success(AIUtils.chat(req));
}
@PostMapping("translate")

View File

@@ -15,6 +15,5 @@
<if test="param.chatId != null">
and chat_id = #{param.chatId}
</if>
order by id desc
</select>
</mapper>

View File

@@ -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;
}

View File

@@ -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<String> httpChat(ChatReq req) {
if (aiProperties.getChatProvider().equals(XfProperties.PREFIX)) {
return XfSparkProvider.httpChat(req);
} else {
return DeepSeekProvider.httpChat(req);
}
}
}

View File

@@ -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<String> result = AiProvider.httpChat(req);
Assert.isTrue(result.getSuccess(), result.getMsg());
return result.getData();
}
}

View File

@@ -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;
}

View File

@@ -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<String> httpChat(ChatReq req) {
return httpChat(req, deepSeekProperties.getHttpAPIPassword());
}
public static AlitaResult<String> httpChat(ChatReq req, String httpAPIPassword) {
ResponseEntity<ChatRes> 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()));
}
}
}

View File

@@ -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

View File

@@ -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);
}
}

View File

@@ -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<String> 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<String> result = XfSparkProvider.httpChat(req, xfProperties.getHttpAPIPassword());
Assert.isTrue(result.getSuccess(), result.getMsg());
log.info("{}", result);
}
}