package com.wok.supportbot.config; import com.wok.supportbot.entity.AiModelConfig; import com.wok.supportbot.service.AiModelConfigService; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.boot.context.event.ApplicationReadyEvent; import org.springframework.context.ApplicationListener; import org.springframework.stereotype.Component; /** * 模型配置加载器 * 应用启动完成后,从数据库读取活跃配置并与 application.yml 中的配置进行一致性校验 */ @Component @Slf4j public class ModelConfigLoader implements ApplicationListener { @Autowired private AiModelConfigService aiModelConfigService; @Value("${spring.ai.dashscope.api-key:}") private String dashscopeApiKey; @Value("${spring.ai.dashscope.chat.options.model:qwen-turbo}") private String chatModelName; @Value("${spring.ai.dashscope.embedding.options.model:text-embedding-v2}") private String embeddingModelName; @Override public void onApplicationEvent(ApplicationReadyEvent event) { log.info("========== AI 模型配置校验 =========="); try { checkAppTypeConfig("CHAT", chatModelName); checkAppTypeConfig("PRODUCT_EXTRACT", chatModelName); checkAppTypeConfig("EMBEDDING", embeddingModelName); checkAppTypeConfig("RAG_REWRITE", chatModelName); log.info("========== AI 模型配置校验完成 =========="); } catch (Exception e) { log.warn("模型配置校验异常(不影响启动): {}", e.getMessage()); } } /** * 校验指定应用类型的数据库配置与 application.yml 配置是否一致 * * @param appType 应用类型 * @param ymlModelName yml 中配置的模型名称 */ private void checkAppTypeConfig(String appType, String ymlModelName) { AiModelConfig activeConfig = aiModelConfigService.getActiveConfigWithFullKey(appType); if (activeConfig == null) { log.warn(" [{}] 数据库中无活跃配置,将使用 application.yml 默认值", appType); return; } String dbModelName = activeConfig.getModelName(); String dbApiKey = activeConfig.getApiKey(); boolean modelMismatch = !ymlModelName.equals(dbModelName); boolean apiKeyMismatch = !dashscopeApiKey.equals(dbApiKey); if (modelMismatch || apiKeyMismatch) { log.warn(" [{}] ⚠️ 数据库配置与 application.yml 不一致!", appType); log.warn(" DB : modelName={}, apiKey={}****", dbModelName, AiModelConfigService.maskApiKey(dbApiKey)); log.warn(" YML : modelName={}, apiKey={}****", ymlModelName, AiModelConfigService.maskApiKey(dashscopeApiKey)); log.warn(" 提示:请更新 application.yml 并重启服务使配置生效"); } else { log.info(" [{}] ✅ 活跃配置 [{}] provider={} (与 application.yml 一致)", appType, dbModelName, activeConfig.getProvider()); } } }