package bootstrap import ( "context" "log/slog" "code.tczkiot.com/wlw/ai-agent/internal/ai/rag/vectordb" "code.tczkiot.com/wlw/ai-agent/internal/pkg/config" "code.tczkiot.com/wlw/ai-agent/internal/pkg/i18nx" "code.tczkiot.com/wlw/ai-agent/internal/pkg/logx" "code.tczkiot.com/wlw/ai-agent/internal/services/cronx" _ "code.tczkiot.com/wlw/ai-agent/internal/services/event_handlers" "code.tczkiot.com/wlw/ai-agent/internal/wxwork" "gorm.io/gorm" ) type LoadSettingsFunc func(ctx context.Context, prefix string) (map[string]string, error) // InitModule initializes AI Agent with infrastructure owned by the host // application. It never opens a database connection or reads a private // configuration table, and it never creates or migrates database tables. func InitModule(database *gorm.DB, tablePrefix string, loadSettings LoadSettingsFunc) error { settings, err := loadSettings(context.Background(), config.SettingsPrefix) if err != nil { return err } cfg, err := config.FromSettings(settings) if err != nil { return err } config.SetCurrent(cfg) i18nx.SetDefaultLocale(cfg.LanguageOrDefault()) if err := UseDatabase(database, tablePrefix); err != nil { return err } if err := vectordb.Init(&cfg.VectorDB); err != nil { slog.Error("init vector db failed", "error", err) return err } cronx.Init() wxwork.SetSettingsLoader(wxwork.SettingsLoader(loadSettings)) wxwork.Init() return nil } func Init(configPath string) error { cfg, err := config.Load(configPath) if err != nil { slog.Error("init config failed", "error", err) return err } config.SetCurrent(cfg) i18nx.SetDefaultLocale(cfg.LanguageOrDefault()) logx.Init(logx.Config{ Level: cfg.Logger.Level, Format: cfg.Logger.Format, AddSource: cfg.Logger.AddSource, }) if _, err := InitDB(cfg.DB); err != nil { slog.Error("init db failed", "error", err) return err } if err := vectordb.Init(&cfg.VectorDB); err != nil { slog.Error("init vector db failed", "error", err) return err } // 启动任务调度器 cronx.Init() wxwork.SetSettingsLoader(nil) wxwork.Init() return nil }