| | |
| | | import cc.mrbird.febs.ai.req.memberTalkStream.*; |
| | | import cc.mrbird.febs.ai.req.memberTalk.ApiMemberTalkListDto; |
| | | import cc.mrbird.febs.ai.res.memberTalk.ApiMemberTalkMemberAnswerSavaVo; |
| | | import cc.mrbird.febs.ai.res.memberTalk.ApiTalkReportListVo; |
| | | import cc.mrbird.febs.ai.res.memberTalkStream.ApiMemberTalkReloadStreamVo; |
| | | import cc.mrbird.febs.ai.res.memberTalkStream.ApiMemberTalkStreamVo; |
| | | import cc.mrbird.febs.ai.res.memberTalk.ApiMemberTalkListVo; |
| | | import cc.mrbird.febs.ai.service.*; |
| | | import cc.mrbird.febs.ai.strategy.LlmStrategyFactory; |
| | | import cc.mrbird.febs.ai.strategy.enumerates.LlmApplicationAppIdEnum; |
| | |
| | | query.eq(AiMemberTalk::getState,AiTypeEnum.AI_MEMBER_TALK_STATE_ING.getCode()); |
| | | query.orderByDesc(AiMemberTalk::getCreatedTime); |
| | | query.last("limit 1"); |
| | | AiMemberTalk aiMemberTalk = aiMemberTalkService.getByQuery(query); |
| | | if (ObjectUtil.isNull(aiMemberTalk)){ |
| | | aiMemberTalk = aiMemberTalkService.add(memberUuid,companyId,productId,nowTime,questionCount); |
| | | } |
| | | |
| | | ApiMemberTalkStreamVo apiMemberTalkVo = new ApiMemberTalkStreamVo(); |
| | | |
| | | AiMemberTalk aiMemberTalk = aiMemberTalkService.getByQuery(query); |
| | | String title = "加载时间过程,请重试!"; |
| | | AiProductQuestion question = aiProductQuestionService.createQuestion(productId); |
| | | if (ObjectUtil.isNotNull(question)){ |
| | | title = question.getTitle(); |
| | | AiMemberTalkItem aiMemberTalkItem = aiMemberTalkItemService.add(memberUuid, aiMemberTalk.getId(),companyId, 1, title, nowTime); |
| | | apiMemberTalkVo.setMemberTalkItemId(aiMemberTalkItem.getId()); |
| | | aiMemberTalkService.updateTimeUpdate(nowTime,aiMemberTalk.getId()); |
| | | if (ObjectUtil.isNull(aiMemberTalk)){ |
| | | aiMemberTalk = aiMemberTalkService.add(memberUuid,companyId,productId,nowTime,questionCount); |
| | | AiProductQuestion question = aiProductQuestionService.createQuestion(productId); |
| | | if (ObjectUtil.isNotNull(question)){ |
| | | title = question.getTitle(); |
| | | AiMemberTalkItem aiMemberTalkItem = aiMemberTalkItemService.add(memberUuid, aiMemberTalk.getId(),companyId, 1, title, nowTime); |
| | | apiMemberTalkVo.setMemberTalkItemId(aiMemberTalkItem.getId()); |
| | | aiMemberTalkService.updateTimeUpdate(nowTime,aiMemberTalk.getId()); |
| | | } |
| | | }else{ |
| | | AiMemberTalkItem oneByQuery = aiMemberTalkItemService.getOneByQuery( |
| | | Wrappers.lambdaQuery(AiMemberTalkItem.class) |
| | | .eq(AiMemberTalkItem::getMemberTalkId, aiMemberTalk.getId()) |
| | | .eq(AiMemberTalkItem::getType, 1) |
| | | .orderByDesc(AiMemberTalkItem::getCreatedTime) |
| | | .last("limit 1") |
| | | ); |
| | | if (ObjectUtil.isNotNull(oneByQuery)){ |
| | | title = oneByQuery.getContext(); |
| | | apiMemberTalkVo.setMemberTalkItemId(oneByQuery.getId()); |
| | | } |
| | | } |
| | | apiMemberTalkVo.setMemberTalkId(aiMemberTalk.getId()); |
| | | apiMemberTalkVo.setType(1); |
| | |
| | | apiMemberTalkVo.setQuestionCnt(aiMemberTalk.getQuestionCnt()); |
| | | apiMemberTalkVo.setDoneCnt(aiMemberTalk.getDoneCnt() + 1); |
| | | return new FebsResponse().success().data(apiMemberTalkVo); |
| | | } |
| | | |
| | | @Override |
| | | public Flux<FebsResponse> startV2(ApiMemberTalkStreamV2Dto dto) { |
| | | |
| | | String memberUuid = LoginUserUtil.getLoginUser().getMemberUuid(); |
| | | String memberTalkId = dto.getMemberTalkId(); |
| | | AiMemberTalk aiMemberTalk = aiMemberTalkMapper.selectById(memberTalkId); |
| | | if (ObjectUtil.isNull(aiMemberTalk)){ |
| | | throw new FebsException("对话不存在"); |
| | | } |
| | | |
| | | LambdaQueryWrapper<AiProductRoleLink> productLinkQuery = Wrappers.lambdaQuery(AiProductRoleLink.class); |
| | | productLinkQuery.eq(AiProductRoleLink::getProductId,aiMemberTalk.getProductId()); |
| | | productLinkQuery.last("limit 1"); |
| | | AiProductRoleLink aiProductRoleLink = aiProductRoleLinkService.getByQuery(productLinkQuery); |
| | | if(ObjectUtil.isNull(aiProductRoleLink)){ |
| | | throw new FebsException("产品没有关联AI陪练"); |
| | | } |
| | | |
| | | String productRoleId = aiProductRoleLink.getProductRoleId(); |
| | | AiProductRole aiProductRole = aiProductRoleService.getById(productRoleId); |
| | | if (ObjectUtil.isNull(aiProductRole)){ |
| | | throw new FebsException("产品AI陪练不存在"); |
| | | } |
| | | |
| | | String promptHead = aiProductRole.getModelId(); |
| | | |
| | | List<LlmStrategyDto> llmStrategyDtoList = new ArrayList<>(); |
| | | LlmStrategyDto llmStrategyDto = this.buildLlmStrategyDtoList(promptHead, 1); |
| | | llmStrategyDtoList.add(llmStrategyDto); |
| | | llmStrategyDto = this.buildLlmStrategyDtoList("请按照上下文内容,进行对话的延续,例如提出一个相关的问题或者对内容进行一个延续", 2); |
| | | llmStrategyDtoList.add(llmStrategyDto); |
| | | |
| | | AiCompanyWorkflow aiCompanyWorkflow = aiCompanyWorkflowService.getByTypeAndCompanyId(LlmApplicationAppIdEnum.CONTEXT_TALK.getCode(),aiMemberTalk.getCompanyId()); |
| | | if (ObjectUtil.isNull(aiCompanyWorkflow)){ |
| | | throw new FebsException("工作流配置异常,请联系管理员"); |
| | | } |
| | | llmStrategyDto = this.buildLlmStrategyDtoList(aiCompanyWorkflow.getCode(), 4); |
| | | llmStrategyDtoList.add(llmStrategyDto); |
| | | |
| | | LlmStrategyDto llmStrategyDtoMessage = buildMessages(memberTalkId); |
| | | llmStrategyDtoList.add(llmStrategyDtoMessage); |
| | | String modelName = LlmStrategyEnum.getName(aiService.getSystemSetAiType()); |
| | | |
| | | return llmStrategyFactory.getCalculationStrategyMap().get(modelName).llmInvokeStreamingNoThink(llmStrategyDtoList); |
| | | } |
| | | |
| | | @Override |
| | |
| | | } |
| | | |
| | | @Override |
| | | public FebsResponse talkReportList(ApiTalkReportListDto dto) { |
| | | ApiTalkReportListVo apiTalkReportListDto = new ApiTalkReportListVo(); |
| | | |
| | | public Flux<FebsResponse> talkReportList(ApiTalkReportListDto dto) { |
| | | String memberTalkId = dto.getMemberTalkId(); |
| | | AiMemberTalk byId = aiMemberTalkService.getById(memberTalkId); |
| | | apiTalkReportListDto.setAnalysis(byId.getAnalysis()); |
| | | return new FebsResponse().success().data(apiTalkReportListDto); |
| | | String analysis = byId.getAnalysis(); |
| | | |
| | | if (StrUtil.isEmpty(analysis)) { |
| | | return Flux.just(new FebsResponse().success().data("")); |
| | | } |
| | | |
| | | // 将分析报告分块,每块100个字符 |
| | | return Flux.generate( |
| | | () -> 0, // 初始状态 |
| | | (index, sink) -> { |
| | | int endIndex = Math.min(index + 100, analysis.length()); |
| | | String chunk = analysis.substring(index, endIndex); |
| | | |
| | | Map<String, Object> responseData = new HashMap<>(); |
| | | responseData.put("chunk", chunk); |
| | | responseData.put("isLast", endIndex >= analysis.length()); |
| | | responseData.put("progress", Math.min(100, (endIndex * 100) / analysis.length())); |
| | | |
| | | sink.next(new FebsResponse().success().data(responseData)); |
| | | |
| | | if (endIndex >= analysis.length()) { |
| | | sink.complete(); |
| | | return index; // 结束状态 |
| | | } |
| | | |
| | | return endIndex; // 下一次的起始索引 |
| | | } |
| | | ); |
| | | } |
| | | |
| | | @Override |
| | | public FebsResponse talkReportListV2(ApiTalkReportListDto dto) { |
| | | String memberTalkId = dto.getMemberTalkId(); |
| | | AiMemberTalk byId = aiMemberTalkService.getById(memberTalkId); |
| | | return new FebsResponse().success().data(byId.getAnalysis()); |
| | | } |
| | | |
| | | |
| | | @Override |
| | | public FebsResponse reload(ApiMemberTalkReloadStreamDto dto) { |
| | |
| | | this.updateMemberTalkUpdateTime(aiMemberTalk.getState(),aiMemberTalk.getDoneCnt(),aiMemberTalk.getId(), new Date()); |
| | | |
| | | String companyId = aiMemberTalk.getCompanyId(); |
| | | Integer type = dto.getType(); |
| | | String memberTalkItemId; |
| | | String contentByCode = AiTalkOutputEnum.HIGH_LIGHT.getCodeByType(type); |
| | | if(StrUtil.isEmpty(dto.getMemberTalkItemId())){ |
| | | HashMap<String, String> stringStringHashMap = new HashMap<>(); |
| | | stringStringHashMap.put(contentByCode,content); |
| | | AiMemberTalkItem add = aiMemberTalkItemService.add(memberUuid, memberTalkId,companyId, 3, JSONUtil.toJsonStr(stringStringHashMap), new Date()); |
| | | memberTalkItemId = add.getId(); |
| | | }else{ |
| | | memberTalkItemId = dto.getMemberTalkItemId(); |
| | | AiMemberTalkItem aiMemberTalkItem = aiMemberTalkItemService.getById(memberTalkItemId); |
| | | String context = aiMemberTalkItem.getContext(); |
| | | HashMap<String, String> stringStringHashMap = JSONUtil.toBean(context, HashMap.class); |
| | | stringStringHashMap.put(contentByCode,content); |
| | | aiMemberTalkItemService.update(null, |
| | | Wrappers.lambdaUpdate(AiMemberTalkItem.class) |
| | | .set(AiMemberTalkItem::getContext,JSONUtil.toJsonStr(stringStringHashMap)) |
| | | .set(AiMemberTalkItem::getUpdatedTime,new Date()) |
| | | .set(AiMemberTalkItem::getRevision,aiMemberTalkItem.getRevision()+1) |
| | | .eq(AiMemberTalkItem::getId,memberTalkItemId) |
| | | ); |
| | | } |
| | | AiMemberTalkItem add = aiMemberTalkItemService.add(memberUuid, memberTalkId,companyId, 1, content, new Date()); |
| | | String memberTalkItemId = add.getId(); |
| | | |
| | | HashMap<String, String> stringStringHashMap = new HashMap<>(); |
| | | stringStringHashMap.put("memberTalkItemId",memberTalkItemId); |