Compare commits

..

No commits in common. 'dbd9aed46fc92cb5ec9f4913ae119be9f5915117' and '418392c1896171e2e803bf8c87478eed45499b11' have entirely different histories.

@ -55,8 +55,6 @@ public class DeepSeekClient {
public static final String API_Key;
public static final String API_Url;
public static String API_Model;
//public static String API_Model_Url;
//public static String API_Model_Reasoner;
@Resource
private static ChatSessionRepository chatSessionRepository;
@ -74,8 +72,6 @@ public class DeepSeekClient {
API_Key = props.getProperty("key");
API_Url = props.getProperty("url");
API_Model = props.getProperty("model");
//API_Model_Url = props.getProperty("modelReasonerUrl");
//API_Model_Reasoner = props.getProperty("modelReasoner");
} catch (Exception e) {
throw new RuntimeException(e);
}

@ -146,16 +146,6 @@ public class AiDeepSeekController {
SseEmitter sseEmitter = new SseEmitter(-1L);
return deepSeekChatService.ChatSeeEmitterAsk(chatCompletionReqDto);
}
/**
* deepseek
* @param chatCompletionReqDto
* @return
*/
@PostMapping("chat/deep_ponder")
@ApiOperation("与 spark 的流式对话")
public SseEmitter deepPonderChatCompletion(@RequestBody @Valid ChatCompletionReqDto chatCompletionReqDto) {
String userId = SecurityUtil.getLoginUser().getId();
SseEmitter sseEmitter = new SseEmitter(-1L);
return deepSeekChatService.ReasonerChatCompletion(chatCompletionReqDto);
}
}

@ -14,8 +14,8 @@ public class ChatCompletionReqDto {
@ApiModelProperty("会话id没有则为空")
private String appId;
@ApiModelProperty("模型类型: 科大讯飞:sparkMaxDeepSeekdeepseek-chat DeepSeek深度思考deepseek-reasoner")
private String model = "sparkMax";
@ApiModelProperty("模型类型: 科大讯飞:SparkMaxDeepSeekDeepSeek_Chat")
private String model = "SparkMax";
@NotBlank(message = "请输入消息内容")
private String text;

@ -39,7 +39,6 @@ public class ChatSession extends BaseItem {
private String id;
private String userText;
private String gptText;
private String reasoningText = "";
/**
* point
*/
@ -58,18 +57,5 @@ public class ChatSession extends BaseItem {
message.setModel(model);
return message;
}
public static Message of(String userText, String gptText,String model,String reasoningText) {
Message message = new Message();
message.setId(UUID.randomUUID().toString());
message.setCost(0);
message.setUserText(userText);
message.setGptText(gptText);
message.setCreateTime(Instant.now().toEpochMilli());
message.setModel(model);
message.setReasoningText(reasoningText);
return message;
}
}
}

@ -31,11 +31,4 @@ public interface DeepSeekService {
*/
SseEmitter ChatSeeEmitterAsk(ChatCompletionReqDto chatCompletionReqDto);
/**
* AI
* @param chatCompletionReqDto
* @return
*/
SseEmitter ReasonerChatCompletion(ChatCompletionReqDto chatCompletionReqDto);
}

@ -64,7 +64,7 @@ public class ChatMessageServiceImpl implements ChatMessageService {
String appId = chatCompletionReqDto.getAppId();
SseEmitter sseEmitter;
//
if (chatCompletionReqDto.getModel().equals("deepseek_chat") || chatCompletionReqDto.getModel().equals("deepseek-reasoner")) {
if (StringUtils.isEmpty(appId) || chatCompletionReqDto.getModel().equals("DeepSeek_Chat")) {
sseEmitter = completionBySession(chatCompletionReqDto, userId);
} else {
sseEmitter = completionByApp(chatCompletionReqDto, false);
@ -178,7 +178,7 @@ public class ChatMessageServiceImpl implements ChatMessageService {
switch (chatCompletionReqDto.getModel()) {
//星火大模型
case "sparkMax":
case "SparkMax":
{
SparkGptStreamListener listener = new SparkGptStreamListener(sseEmitter);
// open 回调
@ -214,8 +214,7 @@ public class ChatMessageServiceImpl implements ChatMessageService {
return finalSseEmitter;
}
// DeepSeek 模型
case "deepseek_chat":
case "deepseek-reasoner":
case "DeepSeek_Chat":
{
// OKHttp 方式请求
sseEmitter = deepSeekChatService.ChatSeeEmitterAsk(chatCompletionReqDto);
@ -235,8 +234,6 @@ public class ChatMessageServiceImpl implements ChatMessageService {
private SseEmitter completionBySession(ChatCompletionReqDto chatCompletionReqDto, String userId) {
String userPrompt = chatCompletionReqDto.getText();
String sessionId = chatCompletionReqDto.getSessionId();
String mode = chatCompletionReqDto.getModel();
ChatSession session = RepositoryUtil.findOne(chatSessionRepository.findBySessionId(sessionId), "该会话不存在");
if (!session.getUserId().equals(userId)) {
@ -246,7 +243,7 @@ public class ChatMessageServiceImpl implements ChatMessageService {
SseEmitter sseEmitter = new SseEmitter(-1L);
switch (chatCompletionReqDto.getModel()){
// 星火大模型
case "sparkMax":{
case "SparkMax":{
SparkGptStreamListener listener = new SparkGptStreamListener(sseEmitter);
// open 回调
listener.setOnOpen((s) -> {
@ -282,8 +279,7 @@ public class ChatMessageServiceImpl implements ChatMessageService {
return finalSseEmitter;
}
// DeepSeek 模型
case "deepseek-chat":
case "deepseek-reasoner":
case "DeepSeek_Chat":
{
sseEmitter = deepSeekChatService.ChatSeeEmitterAsk(chatCompletionReqDto );
return sseEmitter;

@ -17,11 +17,8 @@ import cn.teammodel.service.DeepSeekService;
import cn.teammodel.service.DeepSeekSessionService;
import cn.teammodel.utils.RepositoryUtil;
import com.azure.cosmos.models.CosmosPatchOperations;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.JsonNode;
import lombok.extern.slf4j.Slf4j;
import okhttp3.*;
import okio.BufferedSource;
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.entity.StringEntity;
@ -31,15 +28,12 @@ import org.springframework.stereotype.Service;
import org.springframework.web.servlet.mvc.method.annotation.SseEmitter;
import javax.annotation.Resource;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.nio.charset.StandardCharsets;
import java.time.Instant;
import java.util.*;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.TimeUnit;
import com.fasterxml.jackson.databind.ObjectMapper;
@ -142,7 +136,6 @@ public class DeepSeekServiceImpl implements DeepSeekService {
public SseEmitter ChatSeeEmitterAsk(ChatCompletionReqDto chatCompletionReqDto) {
SseEmitter sseEmitter = new SseEmitter(-1L);
StringBuilder strContent = new StringBuilder();
StringBuilder strReasoning = new StringBuilder();
executorService.execute(()-> {
try {
log.info("流式回答开始,问题:{}", chatCompletionReqDto.getText());
@ -157,13 +150,13 @@ public class DeepSeekServiceImpl implements DeepSeekService {
question.put("content", chatCompletionReqDto.getText());
Map<String, Object> requestMap = new HashMap<>();
requestMap.put("model", chatCompletionReqDto.getModel());
requestMap.put("model", DeepSeekClient.API_Model);
requestMap.put("messages", Collections.singletonList(question));
requestMap.put("stream", true);
requestMap.put("max_tokens", 1024);
String requestBody = objectMapper.writeValueAsString(requestMap);
httpPost.setEntity(new StringEntity(requestBody, StandardCharsets.UTF_8));
StringBuilder responseBody = new StringBuilder();
try (CloseableHttpResponse response = client.execute(httpPost);
BufferedReader reader = new BufferedReader(
new InputStreamReader(response.getEntity().getContent(), StandardCharsets.UTF_8))) {
@ -174,7 +167,7 @@ public class DeepSeekServiceImpl implements DeepSeekService {
if ("[DONE]".equals(jsonData)) {
sseEmitter.send("[DONE]");
// 会话完成,更新历史会话记录
ChatSession.Message message = ChatSession.Message.of(chatCompletionReqDto.getText(), strContent.toString(),chatCompletionReqDto.getModel(),strReasoning.toString());
ChatSession.Message message = ChatSession.Message.of(chatCompletionReqDto.getText(), strContent.toString(),chatCompletionReqDto.getModel());
HistoryCache.updateContext(chatCompletionReqDto.getSessionId(), message);
CosmosPatchOperations options = CosmosPatchOperations.create()
.replace("/updateTime", Instant.now().toEpochMilli())
@ -188,20 +181,11 @@ public class DeepSeekServiceImpl implements DeepSeekService {
.path("delta")
.path("content")
.asText("");
//推理过程
String reasoning_content = node.path("choices")
.path(0)
.path("delta")
.path("reasoning_content")
.asText("");
if (!content.isEmpty()) {
responseBody.append(content);
strContent.append(content);
sseEmitter.send(content);
}
if (!reasoning_content.isEmpty()) {
strReasoning.append(reasoning_content);
sseEmitter.send("reasoning:"+ reasoning_content);
}
}
}
log.info("流式回答结束,{}",question);
@ -220,98 +204,6 @@ public class DeepSeekServiceImpl implements DeepSeekService {
return sseEmitter;
}
/**
*
* @param chatCompletionReqDto
* @return
*/
@Override
public SseEmitter ReasonerChatCompletion(ChatCompletionReqDto chatCompletionReqDto) {
SseEmitter sseEmitter = new SseEmitter(-1L);
OkHttpClient client = new OkHttpClient.Builder()
.readTimeout(30, TimeUnit.SECONDS)
.build();
MediaType JSON = MediaType.parse("application/json; charset=utf-8");
// 构建请求体
// String requestBody = "{"
// + "\"model\": \"deepseek-chat\","
// + "\"messages\": [{\"role\": \"user\", \"content\": \"请介绍一下成都\"}],"
// + "\"stream\": true,"
// + "\"temperature\": 0.7"
// + "}";
Map<String, Object> question = new HashMap<>();
question.put("role", "user");
question.put("content", chatCompletionReqDto.getText());
Map<String, Object> requestMap = new HashMap<>();
requestMap.put("model", chatCompletionReqDto.getModel());
requestMap.put("messages", Collections.singletonList(question));
requestMap.put("stream", true);
String requestBody = null;
try {
requestBody = objectMapper.writeValueAsString(requestMap);
} catch (JsonProcessingException e) {
log.error("处理用户转换问题出错", e);
sseEmitter.completeWithError(e);
}
Request request = new Request.Builder()
.url(DeepSeekClient.API_Url)
.post(RequestBody.create(JSON, requestBody))
.addHeader("Authorization", "Bearer " + DeepSeekClient.API_Key)
.addHeader("Accept", "text/event-stream")
.build();
try(Response response = client.newCall(request).execute()){
if (response.isSuccessful() && response.body() != null) {
try (ResponseBody body = response.body()) {
if (body != null) {
BufferedSource source = body.source();
while (!source.exhausted()) {
String line = source.readUtf8Line();
if (line != null && line.startsWith("data: ")) {
String json = line.substring(6).trim();
if (json.equals("[DONE]")) {
sseEmitter.send("[DONE]");
break;
}
JsonNode node = objectMapper.readTree(json);
String content = node.path("choices")
.path(0)
.path("delta")
.path("content")
.asText("");
String reasoning_content = node.path("choices")
.path(0)
.path("delta")
.path("reasoning_content")
.asText("");
if (!content.isEmpty()) {
sseEmitter.send(content);
}
if (!reasoning_content.isEmpty()) {
sseEmitter.send("reasoning:"+reasoning_content);
}
}
}
log.info("流式回答结束,{}",requestBody);
sseEmitter.complete();
}
} catch (IOException e) {
log.error("处理 Deepseek 请求时发生错误", e);
sseEmitter.completeWithError(e);
}
}
}catch (IOException e) {
log.error("处理 Deepseek 请求时发生错误", e);
sseEmitter.completeWithError(e);
}
return sseEmitter;
}
//region 辅助方法
/**
* /

@ -1,3 +1,4 @@
key=sk-83b5b6dd85c745cbae2572ea01c54e44
url=https://api.deepseek.com/chat/completions
model=deepseek-chat
model=deepseek-chat
modelReasoner=deepseek-reasoner
Loading…
Cancel
Save