"""Shared service initialization for FastAPI and Gradio.""" from __future__ import annotations import logging from typing import Optional from db.chat_store import ChatStore from db.faiss_client import FaissDB from models.embedder import MiniCPMEmbedder from models.llm import MiniCPMLLM from models.ocr import MiniCPMVOCR from services.chart_extractor import ChartExtractorService from services.ingestion import IngestionService from services.qa import QAService from services.summarizer import SummarizerService logger = logging.getLogger(__name__) _embedder: Optional[MiniCPMEmbedder] = None _llm: Optional[MiniCPMLLM] = None _ocr: Optional[MiniCPMVOCR] = None _db: Optional[FaissDB] = None _chat_store: Optional[ChatStore] = None _ingestion: Optional[IngestionService] = None _qa: Optional[QAService] = None _summarizer: Optional[SummarizerService] = None _chart_extractor: Optional[ChartExtractorService] = None def init_services() -> None: """Initialize all backend services (call once at startup).""" global _embedder, _llm, _ocr, _db, _chat_store global _ingestion, _qa, _summarizer, _chart_extractor logger.info("Initializing FinSight services…") _embedder = MiniCPMEmbedder() _llm = MiniCPMLLM() _ocr = MiniCPMVOCR() _db = FaissDB() _chat_store = ChatStore() _chat_store.init_db() _ingestion = IngestionService(_embedder, _ocr, _db) _qa = QAService(_embedder, _llm, _db) _summarizer = SummarizerService(_llm, _db) _chart_extractor = ChartExtractorService(_ocr) logger.info("FinSight services ready.") def shutdown_services() -> None: """Release resources (FAISS index flush, etc.).""" global _db if _db is not None: _db.close() _db = None logger.info("FinSight services shut down.") def get_embedder() -> MiniCPMEmbedder: assert _embedder is not None, "Services not initialized" return _embedder def get_llm() -> MiniCPMLLM: assert _llm is not None, "Services not initialized" return _llm def get_ocr() -> MiniCPMVOCR: assert _ocr is not None, "Services not initialized" return _ocr def get_db() -> FaissDB: assert _db is not None, "Services not initialized" return _db def get_chat_store() -> ChatStore: assert _chat_store is not None, "Services not initialized" return _chat_store def get_ingestion_service() -> IngestionService: assert _ingestion is not None, "Services not initialized" return _ingestion def get_qa_service() -> QAService: assert _qa is not None, "Services not initialized" return _qa def get_summarizer_service() -> SummarizerService: assert _summarizer is not None, "Services not initialized" return _summarizer def get_chart_extractor_service() -> ChartExtractorService: assert _chart_extractor is not None, "Services not initialized" return _chart_extractor