package main import ( "code-review/config" "code-review/handlers" "code-review/services" "code-review/services/ai" "code-review/utils" "fmt" "log" "github.com/gin-gonic/gin" ) func main() { // 初始化日志系统 if err := utils.InitLogger(); err != nil { log.Fatalf("初始化日志系统失败: %v", err) } defer utils.CloseLogger() if err := config.LoadConfig("config.yaml"); err != nil { log.Fatalf("加载配置失败: %v", err) } cfg := config.GetConfig() // 检查是否有可用的 AI 配置 if len(cfg.AIs) == 0 { log.Fatalf("未找到有效的 AI 配置") } // 初始化 AI 负载均衡器 config.ResetAIBalancer(cfg.AIs) // 获取一个 AI 配置 aiConfig, err := config.GetAIBalancer().Next() if err != nil { log.Fatalf("获取 AI 配置失败: %v", err) } // 创建 AI 客户端和审查器 client := ai.NewClient( aiConfig.APIBase, aiConfig.APIKey, aiConfig.Model, aiConfig.Type, aiConfig.Temperature, ) reviewer := ai.NewAI(aiConfig.Model, aiConfig.SystemMsg, client) // 创建服务和处理器 reviewService := services.NewReviewService(reviewer) webhookHandler := handlers.NewWebhookHandler(reviewService) configHandler := handlers.NewConfigHandler(cfg) // 初始化路由 r := gin.Default() r.Static("/static", "./static") r.StaticFile("/", "./static/index.html") api := r.Group("/api") configAPI := api.Group("/config") configAPI.Use(handlers.AuthRequired()) { configAPI.GET("", configHandler.GetConfig) configAPI.POST("", configHandler.UpdateConfig) } api.POST("/webhook/:platform", webhookHandler.HandleWebhook) log.Printf("服务启动在 :%d", cfg.Port) if err := r.Run(fmt.Sprintf(":%d", cfg.Port)); err != nil { log.Fatalf("服务器启动失败: %v", err) } }