package main import ( "context" "log/slog" "os" "os/signal" "syscall" "ai-service/internal/config" "ai-service/internal/llm" "ai-service/internal/migrate" "ai-service/internal/store" "ai-service/internal/transcription" "ai-service/internal/worker" ) func main() { cfg := config.Load() slog.SetDefault(slog.New(slog.NewJSONHandler(os.Stdout, nil))) ctx, stop := signal.NotifyContext(context.Background(), syscall.SIGINT, syscall.SIGTERM) defer stop() db, err := store.Open(ctx, cfg.DatabaseURL) if err != nil { slog.Error("db_open_failed", "error", err) os.Exit(1) } defer db.Close() if cfg.MigrateOnStart { if err := migrate.Up(ctx, db); err != nil { slog.Error("migrate_failed", "error", err) os.Exit(1) } } if cfg.LLMBaseURL == "" { slog.Error("llm_not_configured") os.Exit(1) } llmClient := llm.New(cfg.LLMBaseURL, cfg.LLMAPIKey, cfg.LLMModel, cfg.LLMTimeout) transcriber := transcription.New(cfg.WhisperXURL, cfg.WhisperXTimeout, cfg.FfmpegPath, cfg.WhisperXLeadSilence) w := worker.New(db, llmClient, transcriber, cfg.WorkerID, cfg.LLMModel, cfg.WorkerTaskTypes, cfg.WorkerModelProfiles, cfg.WorkerPollInterval, cfg.WorkerLeaseTimeout, cfg.WorkerClaimLimit) slog.Info("ai_worker_started", "worker_id", cfg.WorkerID, "model", cfg.LLMModel, "whisperx_enabled", transcriber != nil, "whisperx_lead_silence", cfg.WhisperXLeadSilence.String(), "task_types", cfg.WorkerTaskTypes, "model_profiles", cfg.WorkerModelProfiles, "poll_interval", cfg.WorkerPollInterval.String(), "lease_timeout", cfg.WorkerLeaseTimeout.String(), "claim_limit", cfg.WorkerClaimLimit, ) w.Run(ctx) }