package com.vincent.rsf.server.ai.service.impl; import com.vincent.rsf.server.ai.config.AiDefaults; import com.vincent.rsf.server.ai.dto.AiResolvedConfig; import com.vincent.rsf.server.ai.service.AiConfigResolverService; import com.vincent.rsf.server.ai.service.AiMcpMountService; import com.vincent.rsf.server.ai.service.AiParamService; import com.vincent.rsf.server.ai.service.AiPromptService; import com.vincent.rsf.framework.exception.CoolException; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Service; import org.springframework.util.StringUtils; @Service @RequiredArgsConstructor public class AiConfigResolverServiceImpl implements AiConfigResolverService { private final AiParamService aiParamService; private final AiPromptService aiPromptService; private final AiMcpMountService aiMcpMountService; /** * 按租户解析一次完整的 AI 运行配置。 * 该方法是对话入口、运行态摘要和配置中心共用的统一解析点, * 负责把当前生效的参数、Prompt 和 MCP 挂载聚合成一个不可再拆分的配置对象。 */ @Override public AiResolvedConfig resolve(String promptCode, Long tenantId) { if (tenantId == null) { throw new CoolException("当前租户不存在"); } String finalPromptCode = StringUtils.hasText(promptCode) ? promptCode : AiDefaults.DEFAULT_PROMPT_CODE; return AiResolvedConfig.builder() .promptCode(finalPromptCode) .aiParam(aiParamService.getActiveParam(tenantId)) .prompt(aiPromptService.getActivePrompt(finalPromptCode, tenantId)) .mcpMounts(aiMcpMountService.listActiveMounts(tenantId)) .build(); } }