File size: 2,886 Bytes
7248d39
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
"""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