package com.vincent.rsf.server.ai.service.impl; import com.vincent.rsf.server.ai.config.AiDefaults; import com.vincent.rsf.server.ai.dto.AiConfigSummaryDto; import com.vincent.rsf.server.ai.dto.AiPromptPreviewDto; import com.vincent.rsf.server.ai.dto.AiPromptPreviewRequest; import com.vincent.rsf.server.ai.entity.AiMcpMount; import com.vincent.rsf.server.ai.dto.AiResolvedConfig; import com.vincent.rsf.server.ai.service.AiConfigOpsService; import com.vincent.rsf.server.ai.service.AiConfigResolverService; import com.vincent.rsf.server.ai.service.AiMcpMountService; import com.vincent.rsf.server.ai.service.AiPromptService; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Service; import org.springframework.util.StringUtils; import java.util.List; @Service @RequiredArgsConstructor public class AiConfigOpsServiceImpl implements AiConfigOpsService { private final AiConfigResolverService aiConfigResolverService; private final AiPromptRenderSupport aiPromptRenderSupport; private final AiPromptService aiPromptService; @Override public AiConfigSummaryDto getSummary(String promptCode, Long tenantId) { String finalPromptCode = StringUtils.hasText(promptCode) ? promptCode : AiDefaults.DEFAULT_PROMPT_CODE; AiResolvedConfig resolvedConfig = aiConfigResolverService.resolve(finalPromptCode, tenantId); List mounts = resolvedConfig.getMcpMounts(); return AiConfigSummaryDto.builder() .promptCode(resolvedConfig.getPrompt().getCode()) .promptName(resolvedConfig.getPrompt().getName()) .promptScene(resolvedConfig.getPrompt().getScene()) .activeParamName(resolvedConfig.getAiParam().getName()) .activeModel(resolvedConfig.getAiParam().getModel()) .activeParamUpdatedAt(resolvedConfig.getAiParam().getUpdateTime$()) .activeParamUpdatedBy(resolvedConfig.getAiParam().getUpdateBy()) .activeParamValidateStatus(resolvedConfig.getAiParam().getValidateStatus()) .activeParamValidateMessage(resolvedConfig.getAiParam().getLastValidateMessage()) .activeParamValidatedAt(resolvedConfig.getAiParam().getLastValidateTime$()) .enabledMcpCount(mounts.size()) .enabledMcpNames(mounts.stream().map(AiMcpMount::getName).toList()) .activePromptUpdatedAt(resolvedConfig.getPrompt().getUpdateTime$()) .activePromptUpdatedBy(resolvedConfig.getPrompt().getUpdateBy()) .build(); } @Override public AiPromptPreviewDto renderPromptPreview(AiPromptPreviewRequest request, Long tenantId) { return aiPromptService.renderPreview(request, tenantId); } }