| | |
| | | import cc.mrbird.febs.ai.enumerates.AiTypeEnum; |
| | | import cc.mrbird.febs.ai.mapper.AiMemberTalkMapper; |
| | | import cc.mrbird.febs.ai.req.memberTalk.ApiMemberTalkItemPageDto; |
| | | import cc.mrbird.febs.ai.req.memberTalk.ApiTalkMemberListDto; |
| | | import cc.mrbird.febs.ai.req.memberTalk.ApiTalkReportListDto; |
| | | 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::getMemberId,memberUuid); |
| | | query.eq(AiMemberTalk::getProductId,productId); |
| | | 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)){ |
| | |
| | | apiMemberTalkVo.setDoneCnt(aiMemberTalk.getDoneCnt() + 1); |
| | | return new FebsResponse().success().data(apiMemberTalkVo); |
| | | } |
| | | |
| | | @Override |
| | | public FebsResponse talkList(ApiMemberTalkListDto dto) { |
| | | |
| | | return new FebsResponse().success().data(aiMemberTalkService.getPageByDto(dto)); |
| | | } |
| | | |
| | | @Override |
| | | public FebsResponse talkMemberList(ApiTalkMemberListDto dto) { |
| | | |
| | | return new FebsResponse().success().data(aiMemberTalkItemService.getPageByDto(dto)); |
| | | } |
| | | |
| | | @Override |
| | | public Flux<FebsResponse> talkReportList(ApiTalkReportListDto dto) { |
| | | String memberTalkId = dto.getMemberTalkId(); |
| | | AiMemberTalk byId = aiMemberTalkService.getById(memberTalkId); |
| | | 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 reload(ApiMemberTalkReloadStreamDto dto) { |
| | |
| | | llmStrategyDtoList.add(llmStrategyDto); |
| | | llmStrategyDto = this.buildLlmStrategyDtoList("请按照要求生成报告", 2); |
| | | llmStrategyDtoList.add(llmStrategyDto); |
| | | llmStrategyDto = this.buildLlmStrategyDtoList(String.valueOf(LlmApplicationAppIdEnum.REPORT.getCode()), 4); |
| | | |
| | | AiCompanyWorkflow aiCompanyWorkflow = aiCompanyWorkflowService.getByTypeAndCompanyId(LlmApplicationAppIdEnum.REPORT.getCode(),aiMemberTalk.getCompanyId()); |
| | | if (ObjectUtil.isNull(aiCompanyWorkflow)){ |
| | | throw new FebsException("工作流配置异常,请联系管理员"); |
| | | } |
| | | llmStrategyDto = this.buildLlmStrategyDtoList(aiCompanyWorkflow.getCode(), 4); |
| | | llmStrategyDtoList.add(llmStrategyDto); |
| | | |
| | | LlmStrategyDto llmStrategyDtoMessage = buildMessages(memberTalkId); |