Administrator
2025-08-19 0b7f5d136824a74f491ee3566088402f5223589b
src/main/java/cc/mrbird/febs/ai/service/impl/AiServiceImpl.java
@@ -1,11 +1,16 @@
package cc.mrbird.febs.ai.service.impl;
import cc.mrbird.febs.ai.controller.enumerates.AiTypeEnum;
import cc.mrbird.febs.ai.entity.AiProductRole;
import cc.mrbird.febs.ai.req.ai.AiMessage;
import cc.mrbird.febs.ai.req.ai.AiRequest;
import cc.mrbird.febs.ai.res.ai.AiResponse;
import cc.mrbird.febs.ai.res.ai.RadarDataItem;
import cc.mrbird.febs.ai.res.ai.Report;
import cc.mrbird.febs.ai.service.AiProductRoleService;
import cc.mrbird.febs.ai.service.AiService;
import cn.hutool.core.collection.CollUtil;
import cn.hutool.json.JSONUtil;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;
@@ -98,7 +103,7 @@
    }
    @Override
    public AiResponse start(String productRoleId, String content) {
    public AiResponse start(List<AiMessage> aiMessageDtoList,Integer type,String productRoleId, String content, String question) {
        if (!StringUtils.hasText(productRoleId)) {
            log.warn("productRoleId 不能为空");
            return buildErrorResponse(CODE_NOT_FOUND, "AI陪练不存在");
@@ -110,19 +115,35 @@
            return buildErrorResponse(CODE_NOT_FOUND, "AI陪练不存在");
        }
        String promptTemplate = aiProductRole.getPromptTemplate();
        String linkId = aiProductRole.getLinkId();
        if (!StringUtils.hasText(promptTemplate) || !StringUtils.hasText(linkId)) {
            log.warn("角色配置不完整,promptTemplate 或 linkId 为空,productRoleId: {}", productRoleId);
        String promptTemplate = "作为一个智能助手,请回答我提出的问题。";
        if (AiTypeEnum.QUESTION.getCode() ==  type){
            promptTemplate = aiProductRole.getPromptHead();
        }
        if (AiTypeEnum.ANSWER.getCode() ==  type){
            promptTemplate = aiProductRole.getPromptTemplate()+question;
        }
        log.info("promptTemplate: {}", promptTemplate);
        String linkId = aiProductRole.getLinkId();
        String jsonTemplate = aiProductRole.getJsonTemplate();
        if (
                !StringUtils.hasText(promptTemplate)
                || !StringUtils.hasText(linkId)
                || !StringUtils.hasText(jsonTemplate)
        ) {
            log.warn("角色配置不完整,promptTemplate 或 linkId 或 jsonTemplate为空,productRoleId: {}", productRoleId);
            return buildErrorResponse(CODE_ERROR, "角色配置不完整");
        }
        AiRequest aiRequest = new AiRequest();
        aiRequest.setPromptTemplate(promptTemplate);
        aiRequest.setJsonTemplate(jsonTemplate);
        aiRequest.setLinkId(linkId);
        aiRequest.setContent(content);
        if (CollUtil.isNotEmpty(aiMessageDtoList)){
            aiRequest.setAiMessageDtoList(aiMessageDtoList);
        }
        return this.question(aiRequest);
    }
@@ -131,19 +152,34 @@
        String promptTemplate = aiRequest.getPromptTemplate();
        String linkId = aiRequest.getLinkId();
        String content = aiRequest.getContent();
        if (!StringUtils.hasText(promptTemplate) || !StringUtils.hasText(linkId) || !StringUtils.hasText(content)) {
            log.warn("请求参数不完整,promptTemplate: {}, linkId: {}, content: {}", promptTemplate, linkId, content);
        String jsonTemplate = aiRequest.getJsonTemplate();
        if (
                !StringUtils.hasText(promptTemplate)
                        || !StringUtils.hasText(linkId)
                        || !StringUtils.hasText(content)
                        || !StringUtils.hasText(jsonTemplate)
        ) {
            log.warn("请求参数不完整,promptTemplate: {}, linkId: {}, content: {}, jsonTemplate: {}", promptTemplate, linkId, content, jsonTemplate);
            return buildErrorResponse(CODE_ERROR, "请求参数不完整");
        }
        final List<ChatMessage> messages = new ArrayList<>();
        final ChatMessage systemMessage = ChatMessage.builder().role(ChatMessageRole.SYSTEM).content(promptTemplate).build();
        final ChatMessage userMessage = ChatMessage.builder().role(ChatMessageRole.USER).content(content).build();
        List<ChatMessage> messages = new ArrayList<>();
        ChatMessage systemMessage = ChatMessage.builder().role(ChatMessageRole.SYSTEM).content(promptTemplate).build();
        ChatMessage userMessage = ChatMessage.builder().role(ChatMessageRole.USER).content(content).build();
        messages.add(systemMessage);
        if (CollUtil.isNotEmpty(aiRequest.getAiMessageDtoList())){
            aiRequest.getAiMessageDtoList().forEach(aiMessageDto -> {
                ChatMessage message = ChatMessage.builder()
                        .role(aiMessageDto.getRole())
                        .content(aiMessageDto.getContent())
                        .build();
                messages.add(message);
            });
        }
        messages.add(userMessage);
        try {
            JsonNode schemaNode = objectMapper.readTree(SCHEMA_JSON);
            JsonNode schemaNode = objectMapper.readTree(jsonTemplate);
            ChatCompletionRequest.ChatCompletionRequestResponseFormat responseFormat = new ChatCompletionRequest.ChatCompletionRequestResponseFormat(
                    "json_schema",
                    new ResponseFormatJSONSchemaJSONSchemaParam(
@@ -170,7 +206,6 @@
                    .filter(contentObj -> contentObj != null)
                    .map(Object::toString)
                    .collect(Collectors.joining());
            Report report = this.extractReportData(result);
            return buildSuccessResponse(report, result);
        } catch (JsonProcessingException e) {
@@ -180,6 +215,27 @@
            log.error("调用AI服务失败,modelId: {}", linkId, e);
            return buildErrorResponse(CODE_ERROR, "AI服务调用失败");
        }
    }
    public static void main(String[] args) {
        Report report = new Report();
        List<RadarDataItem> radarDataItems = new ArrayList<>();
        RadarDataItem item1 = new RadarDataItem();
        item1.setName("A");
        item1.setCode("A");
        item1.setScore("80");
        radarDataItems.add(item1);
        RadarDataItem item2 = new RadarDataItem();
        item2.setName("A");
        item2.setCode("A");
        item2.setScore("80");
        radarDataItems.add(item2);
        report.setRadarDataItems(radarDataItems);
        System.out.println(JSONUtil.parse( report));
    }
    @Override
@@ -278,7 +334,7 @@
    public Report extractReportData(String modelOutput) {
        Matcher matcher = JSON_PATTERN.matcher(modelOutput);
        if (!matcher.find()) {
            log.warn("未匹配到FunctionCall内容,原始输出长度: {}", modelOutput.length());
            log.warn("未匹配到FunctionCall内容,原始输出长度: {}", modelOutput);
            return null;
        }