package cc.mrbird.febs.ai.service.impl; import cc.mrbird.febs.ai.entity.AiProductQuestion; import cc.mrbird.febs.ai.entity.AiTalk; import cc.mrbird.febs.ai.enumerates.AiPromptEnum; import cc.mrbird.febs.ai.mapper.AiTalkMapper; import cc.mrbird.febs.ai.req.talk.AiTalkAnswerStream; import cc.mrbird.febs.ai.req.talk.ApiTalkDto; import cc.mrbird.febs.ai.req.talk.ApiTalkItemPageDto; import cc.mrbird.febs.ai.req.talk.ApiTalkPageDto; import cc.mrbird.febs.ai.res.talk.ApiTalkPageVo; import cc.mrbird.febs.ai.res.talk.ApiTalkQuestionVo; import cc.mrbird.febs.ai.res.talk.ApiTalkVo; import cc.mrbird.febs.ai.service.AiProductQuestionService; import cc.mrbird.febs.ai.service.AiService; import cc.mrbird.febs.ai.service.AiTalkItemService; import cc.mrbird.febs.ai.service.AiTalkService; import cc.mrbird.febs.ai.strategy.LlmStrategyFactory; import cc.mrbird.febs.ai.strategy.enumerates.LlmStrategyContextEnum; import cc.mrbird.febs.ai.strategy.enumerates.LlmStrategyEnum; import cc.mrbird.febs.ai.strategy.param.LlmStrategyDto; import cc.mrbird.febs.ai.utils.UUID; import cc.mrbird.febs.common.entity.FebsResponse; import cc.mrbird.febs.common.utils.LoginUserUtil; import cn.hutool.core.collection.CollUtil; import cn.hutool.core.date.DateTime; import cn.hutool.core.date.DateUtil; import cn.hutool.core.util.StrUtil; import cn.hutool.json.JSONUtil; import com.alibaba.dashscope.common.Role; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; import reactor.core.publisher.Flux; import java.util.ArrayList; import java.util.Date; import java.util.HashMap; import java.util.List; @Slf4j @Service @RequiredArgsConstructor public class AiTalkServiceImpl extends ServiceImpl implements AiTalkService { private final AiTalkItemService aiTalkItemService; private final AiProductQuestionService aiProductQuestionService; private final AiService aiService; private final LlmStrategyFactory llmStrategyFactory; @Override public FebsResponse questionList() { List list = new ArrayList<>(); LambdaQueryWrapper queryWrapper = Wrappers.lambdaQuery(AiProductQuestion.class); queryWrapper.orderByDesc(AiProductQuestion::getCreatedTime); queryWrapper.last("limit 30"); List listByQuery = aiProductQuestionService.getListByQuery(queryWrapper); if (CollUtil.isNotEmpty(listByQuery)){ for (AiProductQuestion aiProductQuestion : listByQuery){ ApiTalkQuestionVo apiTalkQuestionVo = new ApiTalkQuestionVo(); apiTalkQuestionVo.setContext(aiProductQuestion.getTitle()); list.add(apiTalkQuestionVo); } } return new FebsResponse().success().data(list); } @Override public FebsResponse talkOpen(ApiTalkDto dto) { String talkId = dto.getTalkId(); String context = dto.getContext(); Integer type = dto.getType(); String reasoningContent = dto.getReasoningContent(); String memberUuid = LoginUserUtil.getLoginUser().getMemberUuid(); AiTalk aiTalk = this.getById(talkId); DateTime date = DateUtil.date(); if (StrUtil.isEmpty(talkId)){ aiTalk = this.add(memberUuid,context, date); } HashMap stringStringHashMap = new HashMap<>(); stringStringHashMap.put(LlmStrategyContextEnum.THINK.getName(),reasoningContent); stringStringHashMap.put(LlmStrategyContextEnum.CONTENT.getName(),context); aiTalkItemService.add(aiTalk.getId(), type, JSONUtil.toJsonStr(stringStringHashMap), memberUuid, date); ApiTalkVo apiTalkVo = new ApiTalkVo(); apiTalkVo.setTalkId(aiTalk.getId()); return new FebsResponse().success().data(apiTalkVo); } @Override public AiTalk add(String memberUuid, String question, Date date) { AiTalk aiTalk = new AiTalk(); aiTalk.setId(UUID.getSimpleUUIDString()); aiTalk.setQuestion(question); aiTalk.setCreatedTime(date); aiTalk.setMemberId(memberUuid); this.baseMapper.insert(aiTalk); return aiTalk; } @Override public Flux answerStream(String question) { return aiService.answerStream(question); } @Override public FebsResponse talkList(ApiTalkPageDto dto) { String memberUuid = LoginUserUtil.getLoginUser().getMemberUuid(); dto.setMemberUuid(memberUuid); // 创建分页对象,传入当前页和每页大小 Page page = new Page<>(dto.getPageNow(), dto.getPageSize()); Page pageListByQuery = this.getBaseMapper().getPageTalkListByQuery(page, dto); return new FebsResponse().success().data(pageListByQuery); } @Override public FebsResponse historyPage(ApiTalkItemPageDto dto) { String memberUuid = LoginUserUtil.getLoginUser().getMemberUuid(); dto.setMemberUuid(memberUuid); return aiTalkItemService.historyPage(dto); } @Override public Flux answerStreamV2(AiTalkAnswerStream dto) { return aiService.answerStreamV2(dto); } @Override public Flux answerStreamV3(AiTalkAnswerStream dto) { ArrayList llmStrategyDtoList = new ArrayList<>(); if (dto.getPrompt() != null){ LlmStrategyDto llmStrategyDto = new LlmStrategyDto(); llmStrategyDto.setRole(Role.SYSTEM.getValue()); llmStrategyDto.setContent(AiPromptEnum.STREAM_NORMAL.getPrompt()); llmStrategyDtoList.add(llmStrategyDto); } if (dto.getQuestion() != null){ LlmStrategyDto llmStrategyDto = new LlmStrategyDto(); llmStrategyDto.setRole(Role.USER.getValue()); llmStrategyDto.setContent(dto.getQuestion()); llmStrategyDtoList.add(llmStrategyDto); } String modelName = LlmStrategyEnum.getName(aiService.getSystemSetAiType()); return llmStrategyFactory.getCalculationStrategyMap().get(modelName).llmInvokeStreamingWithThink(llmStrategyDtoList); } }