From c315b32c990966b392a8b267beb27b065896aa98 Mon Sep 17 00:00:00 2001 From: perf3ct Date: Sun, 16 Mar 2025 18:21:43 +0000 Subject: [PATCH] wait for DB init even to emit before starting LLM services --- src/app.ts | 42 ++++++++++++++++++++++++----- src/services/events.ts | 4 ++- src/services/llm/embeddings/init.ts | 7 +++++ src/services/llm/index_service.ts | 7 +++++ src/services/sql_init.ts | 6 +++++ 5 files changed, 59 insertions(+), 7 deletions(-) diff --git a/src/app.ts b/src/app.ts index 91fc85e45..9896c8e77 100644 --- a/src/app.ts +++ b/src/app.ts @@ -15,6 +15,8 @@ import error_handlers from "./routes/error_handlers.js"; import { startScheduledCleanup } from "./services/erase.js"; import sql_init from "./services/sql_init.js"; import { t } from "i18next"; +import eventService from "./services/events.js"; +import log from "./services/log.js"; await import("./services/handlers.js"); await import("./becca/becca_loader.js"); @@ -26,13 +28,41 @@ const scriptDir = dirname(fileURLToPath(import.meta.url)); // Initialize DB sql_init.initializeDb(); -// Initialize embedding providers -const { initializeEmbeddings } = await import("./services/llm/embeddings/init.js"); -await initializeEmbeddings(); +// Listen for database initialization event +eventService.subscribe(eventService.DB_INITIALIZED, async () => { + try { + log.info("Database initialized, setting up LLM features"); -// Initialize the index service for LLM functionality -const { default: indexService } = await import("./services/llm/index_service.js"); -await indexService.initialize().catch(e => console.error("Failed to initialize index service:", e)); + // Initialize embedding providers + const { initializeEmbeddings } = await import("./services/llm/embeddings/init.js"); + await initializeEmbeddings(); + + // Initialize the index service for LLM functionality + const { default: indexService } = await import("./services/llm/index_service.js"); + await indexService.initialize().catch(e => console.error("Failed to initialize index service:", e)); + + log.info("LLM features initialized successfully"); + } catch (error) { + console.error("Error initializing LLM features:", error); + } +}); + +// Initialize LLM features only if database is already initialized +if (sql_init.isDbInitialized()) { + try { + // Initialize embedding providers + const { initializeEmbeddings } = await import("./services/llm/embeddings/init.js"); + await initializeEmbeddings(); + + // Initialize the index service for LLM functionality + const { default: indexService } = await import("./services/llm/index_service.js"); + await indexService.initialize().catch(e => console.error("Failed to initialize index service:", e)); + } catch (error) { + console.error("Error initializing LLM features:", error); + } +} else { + console.log("Database not initialized yet. LLM features will be initialized after setup."); +} // view engine setup app.set("views", path.join(scriptDir, "views")); diff --git a/src/services/events.ts b/src/services/events.ts index 2b24a5826..5ffc93f82 100644 --- a/src/services/events.ts +++ b/src/services/events.ts @@ -10,6 +10,7 @@ const ENTITY_CHANGE_SYNCED = "ENTITY_CHANGE_SYNCED"; const ENTITY_DELETE_SYNCED = "ENTITY_DELETE_SYNCED"; const CHILD_NOTE_CREATED = "CHILD_NOTE_CREATED"; const NOTE_CONTENT_CHANGE = "NOTE_CONTENT_CHANGED"; +const DB_INITIALIZED = "DB_INITIALIZED"; type EventType = string | string[]; type EventListener = (data: any) => void; @@ -72,5 +73,6 @@ export default { ENTITY_CHANGE_SYNCED, ENTITY_DELETE_SYNCED, CHILD_NOTE_CREATED, - NOTE_CONTENT_CHANGE + NOTE_CONTENT_CHANGE, + DB_INITIALIZED }; diff --git a/src/services/llm/embeddings/init.ts b/src/services/llm/embeddings/init.ts index 7d6d563d3..4f888f2d7 100644 --- a/src/services/llm/embeddings/init.ts +++ b/src/services/llm/embeddings/init.ts @@ -2,6 +2,7 @@ import log from "../../log.js"; import options from "../../options.js"; import { initEmbeddings } from "./index.js"; import providerManager from "./providers.js"; +import sqlInit from "../../sql_init.js"; /** * Initialize the embedding system @@ -10,6 +11,12 @@ export async function initializeEmbeddings() { try { log.info("Initializing embedding system..."); + // Check if the database is initialized before proceeding + if (!sqlInit.isDbInitialized()) { + log.info("Skipping embedding system initialization as database is not initialized yet."); + return; + } + // Initialize default embedding providers await providerManager.initializeDefaultProviders(); diff --git a/src/services/llm/index_service.ts b/src/services/llm/index_service.ts index 64e42c453..e1469eeef 100644 --- a/src/services/llm/index_service.ts +++ b/src/services/llm/index_service.ts @@ -19,6 +19,7 @@ import eventService from "../events.js"; import type { NoteEmbeddingContext } from "./embeddings/embeddings_interface.js"; import type { OptionDefinitions } from "../options_interface.js"; import sql from "../sql.js"; +import sqlInit from "../sql_init.js"; class IndexService { private initialized = false; @@ -45,6 +46,12 @@ class IndexService { if (this.initialized) return; try { + // Check if database is initialized before proceeding + if (!sqlInit.isDbInitialized()) { + log.info("Index service: Database not initialized yet, skipping initialization"); + return; + } + const aiEnabled = await options.getOptionBool('aiEnabled'); if (!aiEnabled) { log.info("Index service: AI features disabled, skipping initialization"); diff --git a/src/services/sql_init.ts b/src/services/sql_init.ts index fa70a87db..6ef049b0d 100644 --- a/src/services/sql_init.ts +++ b/src/services/sql_init.ts @@ -17,6 +17,7 @@ import zipImportService from "./import/zip.js"; import becca_loader from "../becca/becca_loader.js"; import password from "./encryption/password.js"; import backup from "./backup.js"; +import eventService from "./events.js"; const dbReady = deferred(); @@ -153,6 +154,11 @@ function setDbAsInitialized() { optionService.setOption("initialized", "true"); initDbConnection(); + + // Emit an event to notify that the database is now initialized + eventService.emit(eventService.DB_INITIALIZED); + + log.info("Database initialization completed, emitted DB_INITIALIZED event"); } }