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("========================================");
|
}
|
|
}
|