| | |
| | | ChatMessage message = choice.getMessage(); |
| | | if (message.getReasoningContent()!= null &&!message.getReasoningContent().isEmpty()) { |
| | | apiMemberTalkStreamVo.setReasoningContent(message.getReasoningContent()); |
| | | System.out.print(message.getReasoningContent()); |
| | | // System.out.print(message.getReasoningContent()); |
| | | } |
| | | |
| | | String content = message.getContent() == null ? "" : message.getContent().toString(); |
| | |
| | | }) |
| | | .onErrorResume(throwable -> { |
| | | log.error("流式调用AI服务失败,问题输入: {}", question, throwable); |
| | | FebsResponse errorResponse = new FebsResponse().message("AI服务调用失败"); |
| | | FebsResponse errorResponse = new FebsResponse().fail().message("AI服务调用失败"); |
| | | return Flux.just(errorResponse); |
| | | }); |
| | | } |
| | |
| | | String question = dto.getQuestion(); |
| | | log.info("----- standard request -----"); |
| | | |
| | | // 参数校验 |
| | | if (StrUtil.isBlank(question)) { |
| | | return Flux.just(new FebsResponse().fail().message("问题不能为空")); |
| | | } |
| | | |
| | | List<ChatMessage> messages = new ArrayList<>(); |
| | | |
| | | final ChatMessage systemMessage = ChatMessage.builder() |
| | | .role(ChatMessageRole.SYSTEM) |
| | | .content("你是豆包,是由字节跳动开发的 AI 人工智能助手") |
| | | .build(); |
| | | messages.add(systemMessage); |
| | | //获取消息记录 |
| | | if (StrUtil.isNotEmpty(dto.getTalkId())){ |
| | | |
| | | // 获取历史消息记录 |
| | | if (StrUtil.isNotEmpty(dto.getTalkId())) { |
| | | List<AiTalkItem> aiTalkItems = aiTalkItemService.getListByTalkId(dto.getTalkId()); |
| | | if(CollUtil.isNotEmpty(aiTalkItems)){ |
| | | for (AiTalkItem aiTalkItem : aiTalkItems){ |
| | | if (aiTalkItem.getType() == 1){ |
| | | ChatMessage memberMessage = ChatMessage.builder() |
| | | .role(ChatMessageRole.USER) |
| | | .content(aiTalkItem.getContext()) |
| | | .build(); |
| | | messages.add(memberMessage); |
| | | } |
| | | if (aiTalkItem.getType() == 2){ |
| | | ChatMessage assistantMessage = ChatMessage.builder() |
| | | .role(ChatMessageRole.ASSISTANT) |
| | | .content(aiTalkItem.getContext()) |
| | | .build(); |
| | | messages.add(assistantMessage); |
| | | if (CollUtil.isNotEmpty(aiTalkItems)) { |
| | | for (AiTalkItem aiTalkItem : aiTalkItems) { |
| | | ChatMessage chatMessage = buildChatMessageFromItem(aiTalkItem); |
| | | if (chatMessage != null) { |
| | | messages.add(chatMessage); |
| | | } |
| | | } |
| | | } |
| | |
| | | return new FebsResponse().success().data("END"); |
| | | } |
| | | |
| | | |
| | | ApiMemberTalkStreamVo apiMemberTalkStreamVo = new ApiMemberTalkStreamVo(); |
| | | // 判断是否触发深度思考,触发则打印模型输出的思维链内容 |
| | | ChatMessage message = choice.getMessage(); |
| | | if (message.getReasoningContent()!= null &&!message.getReasoningContent().isEmpty()) { |
| | | apiMemberTalkStreamVo.setReasoningContent(message.getReasoningContent()); |
| | | System.out.print(message.getReasoningContent()); |
| | | ApiMemberTalkStreamVo apiMemberTalkStreamVo = new ApiMemberTalkStreamVo(); |
| | | |
| | | // 处理 reasoning content |
| | | String reasoningContent = message.getReasoningContent(); |
| | | if (StrUtil.isNotEmpty(reasoningContent)) { |
| | | apiMemberTalkStreamVo.setReasoningContent(reasoningContent); |
| | | log.debug("Reasoning Content: {}", reasoningContent); |
| | | } |
| | | |
| | | String content = message.getContent() == null ? "" : message.getContent().toString(); |
| | | // 安全处理 content |
| | | String content = ""; |
| | | if (message.getContent() != null) { |
| | | content = message.getContent().toString(); |
| | | } |
| | | apiMemberTalkStreamVo.setContent(content); |
| | | System.out.print(content); |
| | | log.debug("Content: {}", content); |
| | | |
| | | return new FebsResponse().success().data(apiMemberTalkStreamVo); |
| | | }) |
| | | .onErrorResume(throwable -> { |
| | | log.error("流式调用AI服务失败,问题输入: {}", question, throwable); |
| | | FebsResponse errorResponse = new FebsResponse().message("AI服务调用失败"); |
| | | FebsResponse errorResponse = new FebsResponse().fail().message("AI服务调用失败"); |
| | | return Flux.just(errorResponse); |
| | | }); |
| | | } |
| | | |
| | | // 提取为私有方法,提高可读性和复用性 |
| | | private ChatMessage buildChatMessageFromItem(AiTalkItem item) { |
| | | if (item == null) return null; |
| | | |
| | | switch (item.getType()) { |
| | | case 1: |
| | | return ChatMessage.builder() |
| | | .role(ChatMessageRole.USER) |
| | | .content(item.getContext()) |
| | | .build(); |
| | | case 2: |
| | | return ChatMessage.builder() |
| | | .role(ChatMessageRole.ASSISTANT) |
| | | .content(item.getContext()) |
| | | .build(); |
| | | default: |
| | | return null; |
| | | } |
| | | } |
| | | |
| | | |
| | | |
| | | private Report tryRepairTruncatedJson(String truncatedJson) { |
| | | String[] repairAttempts = { |