package cn.iocoder.yudao.server; import lombok.extern.slf4j.Slf4j; import org.springframework.ai.model.anthropic.autoconfigure.AnthropicChatAutoConfiguration; import org.springframework.ai.model.deepseek.autoconfigure.DeepSeekChatAutoConfiguration; import org.springframework.ai.model.google.genai.autoconfigure.chat.GoogleGenAiChatAutoConfiguration; import org.springframework.ai.model.google.genai.autoconfigure.embedding.GoogleGenAiEmbeddingConnectionAutoConfiguration; import org.springframework.ai.model.google.genai.autoconfigure.embedding.GoogleGenAiTextEmbeddingAutoConfiguration; import org.springframework.ai.model.openai.autoconfigure.OpenAiAudioSpeechAutoConfiguration; import org.springframework.ai.model.openai.autoconfigure.OpenAiAudioTranscriptionAutoConfiguration; import org.springframework.ai.model.openai.autoconfigure.OpenAiChatAutoConfiguration; import org.springframework.ai.model.openai.autoconfigure.OpenAiEmbeddingAutoConfiguration; import org.springframework.ai.model.openai.autoconfigure.OpenAiImageAutoConfiguration; import org.springframework.ai.model.openai.autoconfigure.OpenAiModerationAutoConfiguration; import org.springframework.ai.model.ollama.autoconfigure.OllamaApiAutoConfiguration; import org.springframework.ai.model.ollama.autoconfigure.OllamaChatAutoConfiguration; import org.springframework.ai.model.ollama.autoconfigure.OllamaEmbeddingAutoConfiguration; import org.springframework.ai.model.stabilityai.autoconfigure.StabilityAiImageAutoConfiguration; import org.springframework.ai.vectorstore.milvus.autoconfigure.MilvusVectorStoreAutoConfiguration; import org.springframework.ai.vectorstore.qdrant.autoconfigure.QdrantVectorStoreAutoConfiguration; import org.springframework.ai.vectorstore.redis.autoconfigure.RedisVectorStoreAutoConfiguration; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.boot.context.metrics.buffering.BufferingApplicationStartup; /** * 项目的启动类 * * 如果你碰到启动的问题,请认真阅读 https://doc.iocoder.cn/quick-start/ 文章 * 如果你碰到启动的问题,请认真阅读 https://doc.iocoder.cn/quick-start/ 文章 * 如果你碰到启动的问题,请认真阅读 https://doc.iocoder.cn/quick-start/ 文章 * * @author 超级管理员 */ @Slf4j @SuppressWarnings("SpringComponentScan") // 忽略 IDEA 无法识别 ${yudao.info.base-package} @SpringBootApplication(scanBasePackages = {"${yudao.info.base-package}.server", "${yudao.info.base-package}.module"}, // 注意:这里排除的 Spring AI 自动配置,与各 profile 的 spring.autoconfigure.exclude 保持一致,但写在代码里的 // 原因是:注解里的排除项与 yaml 里的排除项是「并集」,不会被外部 profile 配置文件覆盖,保证换任何 profile 都能正常启动。 // 1. 向量库:AI 模块由 AiModelFactoryImpl 手动构建 VectorStore,三个自动配置同时启用会争抢 vectorStore 这个 bean 名 // 2. 模型:AI 模块的模型由 AiModelFactoryImpl 手动构建(走 DB 里 ai_model 配置的 apiKey),不需要 Spring AI 的模型 Bean; // 且未配置 api-key 时自动配置会在启动阶段直接抛「API key cannot be empty.」 exclude = { // ========== 向量库自动配置 ========== QdrantVectorStoreAutoConfiguration.class, RedisVectorStoreAutoConfiguration.class, MilvusVectorStoreAutoConfiguration.class, // ========== 模型自动配置 ========== OpenAiChatAutoConfiguration.class, OpenAiEmbeddingAutoConfiguration.class, OpenAiImageAutoConfiguration.class, OpenAiAudioSpeechAutoConfiguration.class, OpenAiAudioTranscriptionAutoConfiguration.class, OpenAiModerationAutoConfiguration.class, DeepSeekChatAutoConfiguration.class, AnthropicChatAutoConfiguration.class, GoogleGenAiChatAutoConfiguration.class, GoogleGenAiEmbeddingConnectionAutoConfiguration.class, GoogleGenAiTextEmbeddingAutoConfiguration.class, OllamaApiAutoConfiguration.class, OllamaChatAutoConfiguration.class, OllamaEmbeddingAutoConfiguration.class, StabilityAiImageAutoConfiguration.class, }) public class YudaoServerApplication { public static void main(String[] args) { long startTime = System.currentTimeMillis(); SpringApplication app = new SpringApplication(YudaoServerApplication.class); app.setApplicationStartup(new BufferingApplicationStartup(4096)); app.run(args); long cost = System.currentTimeMillis() - startTime; log.info("========================================"); log.info("应用启动完成,耗时: {} 秒 ({} 毫秒)", cost / 1000.0, cost); log.info("========================================"); } }