|
|
|
|
@ -6,6 +6,7 @@ import com.fasterxml.jackson.databind.JsonNode;
|
|
|
|
|
import com.fasterxml.jackson.databind.ObjectMapper;
|
|
|
|
|
import com.github.yulichang.toolkit.JoinWrappers;
|
|
|
|
|
import com.github.yulichang.wrapper.MPJLambdaWrapper;
|
|
|
|
|
import io.seata.common.util.StringUtils;
|
|
|
|
|
import org.dromara.ai.domain.AiChatMessage;
|
|
|
|
|
import org.dromara.ai.domain.AiChatMessageDetail;
|
|
|
|
|
import org.dromara.ai.domain.AiTokenUsage;
|
|
|
|
|
@ -88,7 +89,7 @@ public abstract class BaseAIProviderProcessor implements IUnifiedAIProviderProce
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
protected void configureApiKey(AIRequest request) {
|
|
|
|
|
if(request.getModelId()!=null){
|
|
|
|
|
if (request.getModelId() != null) {
|
|
|
|
|
AiModelVo aiModelVo = aiModelMapper.selectVoById(request.getModelId());
|
|
|
|
|
if (aiModelVo != null) {
|
|
|
|
|
if (aiModelVo.getApiKey() == null) {
|
|
|
|
|
@ -101,12 +102,13 @@ public abstract class BaseAIProviderProcessor implements IUnifiedAIProviderProce
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* 普通http请求(非流式请求),直接返回完整回复
|
|
|
|
|
*
|
|
|
|
|
* @param url
|
|
|
|
|
* @param requestBody
|
|
|
|
|
* @param apiKey
|
|
|
|
|
* @return AIResponse
|
|
|
|
|
*/
|
|
|
|
|
public abstract Mono<AIResponse> standardRequest(String url,String requestBody, String apiKey);
|
|
|
|
|
public abstract Mono<AIResponse> standardRequest(String url, String requestBody, String apiKey);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
@ -165,14 +167,6 @@ public abstract class BaseAIProviderProcessor implements IUnifiedAIProviderProce
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* 处理流式响应的JSON块,返回包含内容和token信息的对象
|
|
|
|
|
*/
|
|
|
|
|
@ -216,6 +210,7 @@ public abstract class BaseAIProviderProcessor implements IUnifiedAIProviderProce
|
|
|
|
|
|
|
|
|
|
protected void saveChatMessage(AIRequest request, String fullResponse, TokenUsage tokenUsage, LoginUser loginUser) {
|
|
|
|
|
try {
|
|
|
|
|
String messageType = StringUtils.isNotBlank(request.getMessageDetailType()) ? request.getMessageDetailType() : HwMomAiConstants.AI_CHAT_MESSAGE_DETAIL_TYPE_QUESTION;
|
|
|
|
|
String sessionId = request.getSessionId();
|
|
|
|
|
AiChatMessage aiChatMessage = aiChatMessageMapper
|
|
|
|
|
.selectOne(new LambdaQueryWrapper<AiChatMessage>()
|
|
|
|
|
@ -225,7 +220,7 @@ public abstract class BaseAIProviderProcessor implements IUnifiedAIProviderProce
|
|
|
|
|
aiChatMessage = new AiChatMessage();
|
|
|
|
|
aiChatMessage.setSessionId(request.getSessionId());
|
|
|
|
|
aiChatMessage.setMessageTopic(objectMapper.writeValueAsString(request.getMessageTopic()));
|
|
|
|
|
aiChatMessage.setMessageType(AIChatMessageTypeEnum.AI_CHAT.getCode());
|
|
|
|
|
aiChatMessage.setMessageType(messageType);
|
|
|
|
|
aiChatMessage.setModelId(request.getModelId());
|
|
|
|
|
aiChatMessage.setKnowledgeBaseId(request.getKnowledgeBaseId());
|
|
|
|
|
// aiChatMessage.setTotalToken();
|
|
|
|
|
@ -239,10 +234,10 @@ public abstract class BaseAIProviderProcessor implements IUnifiedAIProviderProce
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
saveTokenUsage(HwMomAiConstants.AI_CHAT_MESSAGE_DETAIL_TYPE_QUESTION, objectMapper.writeValueAsString(request.getQuestionContent()),
|
|
|
|
|
saveTokenUsage(messageType, objectMapper.writeValueAsString(request.getQuestionContent()),
|
|
|
|
|
objectMapper.writeValueAsString(fullResponse), tokenUsage, request.getModelId(), request.getKnowledgeBaseId(), null,
|
|
|
|
|
aiChatMessage.getChatMessageId(),request.getSessionId(),request.getCarryHistoryFlag(),"1",
|
|
|
|
|
loginUser.getUserId(),loginUser.getTenantId(), loginUser.getDeptId());
|
|
|
|
|
aiChatMessage.getChatMessageId(), request.getSessionId(), request.getCarryHistoryFlag(), "1",
|
|
|
|
|
loginUser.getUserId(), loginUser.getTenantId(), loginUser.getDeptId());
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// AiChatMessageDetail aiChatMessageDetail = new AiChatMessageDetail();
|
|
|
|
|
@ -275,6 +270,7 @@ public abstract class BaseAIProviderProcessor implements IUnifiedAIProviderProce
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* 保存token使用情况
|
|
|
|
|
*
|
|
|
|
|
* @param messageDetailType
|
|
|
|
|
* @param questionContent
|
|
|
|
|
* @param answerContent
|
|
|
|
|
@ -292,12 +288,12 @@ public abstract class BaseAIProviderProcessor implements IUnifiedAIProviderProce
|
|
|
|
|
*/
|
|
|
|
|
@Override
|
|
|
|
|
public void saveTokenUsage(String messageDetailType, String questionContent, String answerContent, TokenUsage tokenUsage,
|
|
|
|
|
Long modelId, Long knowledgeBaseId, Long knowledgeContentId,
|
|
|
|
|
Long chatMessageId,String sessionId,String takeFlag,String completeFlag,
|
|
|
|
|
Long userId,String tenantId,Long deptId) {
|
|
|
|
|
Long promptToken = tokenUsage!=null ? tokenUsage.getPromptToken():null;
|
|
|
|
|
Long completionToken = tokenUsage!=null ? tokenUsage.getCompletionToken():null;
|
|
|
|
|
Long totalToken = tokenUsage!=null ? tokenUsage.getTotalToken():null;
|
|
|
|
|
Long modelId, Long knowledgeBaseId, Long knowledgeContentId,
|
|
|
|
|
Long chatMessageId, String sessionId, String takeFlag, String completeFlag,
|
|
|
|
|
Long userId, String tenantId, Long deptId) {
|
|
|
|
|
Long promptToken = tokenUsage != null ? tokenUsage.getPromptToken() : null;
|
|
|
|
|
Long completionToken = tokenUsage != null ? tokenUsage.getCompletionToken() : null;
|
|
|
|
|
Long totalToken = tokenUsage != null ? tokenUsage.getTotalToken() : null;
|
|
|
|
|
|
|
|
|
|
AiChatMessageDetail aiChatMessageDetail = new AiChatMessageDetail();
|
|
|
|
|
aiChatMessageDetail.setMessageDetailType(messageDetailType);
|
|
|
|
|
@ -350,7 +346,6 @@ public abstract class BaseAIProviderProcessor implements IUnifiedAIProviderProce
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* 流式chunk结果类
|
|
|
|
|
*/
|
|
|
|
|
@ -364,8 +359,13 @@ public abstract class BaseAIProviderProcessor implements IUnifiedAIProviderProce
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// getters
|
|
|
|
|
public String getContent() { return content; }
|
|
|
|
|
public TokenUsage getTokenUsage() { return tokenUsage; }
|
|
|
|
|
public String getContent() {
|
|
|
|
|
return content;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public TokenUsage getTokenUsage() {
|
|
|
|
|
return tokenUsage;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public boolean hasContent() {
|
|
|
|
|
return content != null && !content.isEmpty();
|
|
|
|
|
@ -377,8 +377,6 @@ public abstract class BaseAIProviderProcessor implements IUnifiedAIProviderProce
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// /**
|
|
|
|
|
// * 流式回复
|
|
|
|
|
// * @param request
|
|
|
|
|
|