File size: 5,856 Bytes
ce323cf
c089adf
 
 
c21d29c
8ec2c5a
ce323cf
 
c21d29c
bb5dde5
c089adf
c6a2a56
 
 
9fd6e20
c6a2a56
c5fe6f5
9fd6e20
c6a2a56
92e41ba
c21d29c
c6a2a56
 
ce323cf
c089adf
 
 
f7e11c1
c089adf
 
 
 
 
 
 
bb5dde5
f7e11c1
47ead95
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
f7e11c1
47ead95
 
 
 
f7e11c1
47ead95
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
from dependency_injector.containers import DeclarativeContainer
from dependency_injector.providers import Callable, Resource, Singleton
from importlib import import_module
from pathlib import Path
from slack_bolt.adapter.socket_mode.async_handler import AsyncSocketModeHandler
from slack_bolt.async_app import AsyncApp

from ctp_slack_bot.core.config import Settings
from ctp_slack_bot.db.mongo_db import MongoDBResource
from ctp_slack_bot.db.repositories.mongo_db_vectorized_chunk_repository import MongoVectorizedChunkRepositoryResource
from ctp_slack_bot.mime_type_handlers.base import MimeTypeHandlerMeta
from ctp_slack_bot.services.answer_retrieval_service import AnswerRetrievalService
from ctp_slack_bot.services.content_ingestion_service import ContentIngestionService
from ctp_slack_bot.services.context_retrieval_service import ContextRetrievalService
from ctp_slack_bot.services.embeddings_model_service import EmbeddingsModelService
from ctp_slack_bot.services.event_brokerage_service import EventBrokerageService
from ctp_slack_bot.services.google_drive_service import GoogleDriveService
from ctp_slack_bot.services.language_model_service import LanguageModelService
from ctp_slack_bot.services.question_dispatch_service import QuestionDispatchService
from ctp_slack_bot.services.schedule_service import ScheduleServiceResource
from ctp_slack_bot.services.slack_service import SlackServiceResource
from ctp_slack_bot.services.vectorization_service import VectorizationService


def __load_plugins(plugin_dir) -> None:
    for path in Path(plugin_dir).glob("*.py"):
        if path.stem == "__init__":
            continue # Skip __init__.py files
        module_name = f"{plugin_dir.replace('/', '.')}.{path.stem}"
        import_module(module_name)


__load_plugins("ctp_slack_bot/mime_type_handlers")


class Container(DeclarativeContainer): # TODO: audit for potential async-related bugs.
    settings                    = Singleton(Settings)
    event_brokerage_service     = Singleton(EventBrokerageService)
    schedule_service            = Resource (ScheduleServiceResource,
                                            settings=settings)
    mongo_db                    = Resource (MongoDBResource, # TODO: generalize to any database.
                                            settings=settings)
    vectorized_chunk_repository = Resource (MongoVectorizedChunkRepositoryResource,
                                            settings=settings,
                                            mongo_db=mongo_db)
    embeddings_model_service    = Singleton(EmbeddingsModelService,
                                            settings=settings)
    vectorization_service       = Singleton(VectorizationService,
                                            settings=settings,
                                            embeddings_model_service=embeddings_model_service)
    content_ingestion_service   = Singleton(ContentIngestionService,
                                            settings=settings,
                                            event_brokerage_service=event_brokerage_service,
                                            vectorized_chunk_repository=vectorized_chunk_repository,
                                            vectorization_service=vectorization_service)
    context_retrieval_service   = Singleton(ContextRetrievalService,
                                            settings=settings,
                                            vectorization_service=vectorization_service,
                                            vectorized_chunk_repository=vectorized_chunk_repository)
    language_model_service      = Singleton(LanguageModelService,
                                            settings=settings)
    answer_retrieval_service    = Singleton(AnswerRetrievalService,
                                            settings=settings,
                                            event_brokerage_service=event_brokerage_service,
                                            language_model_service=language_model_service)
    question_dispatch_service   = Singleton(QuestionDispatchService,
                                            settings=settings,
                                            event_brokerage_service=event_brokerage_service,
                                            content_ingestion_service=content_ingestion_service,
                                            context_retrieval_service=context_retrieval_service,
                                            answer_retrieval_service=answer_retrieval_service)
    slack_bolt_app              = Singleton(lambda settings: AsyncApp(token=settings.SLACK_BOT_TOKEN.get_secret_value()),
                                            settings)
    slack_service               = Resource (SlackServiceResource,
                                            event_brokerage_service=event_brokerage_service,
                                            slack_bolt_app=slack_bolt_app)
    socket_mode_handler         = Singleton(lambda _, app, settings: AsyncSocketModeHandler(app, settings.SLACK_APP_TOKEN.get_secret_value()),
                                            slack_service,
                                            slack_bolt_app,
                                            settings)
    mime_type_handler_factory   = Callable (lambda mime_type: MimeTypeHandlerMeta._registry[mime_type]())
    google_drive_service        = Singleton(GoogleDriveService,
                                            settings=settings)
    # file_monitor_service        = Singleton(FileMonitorService,
    #                                         settings=settings,
    #                                         google_drive_service=google_drive_service,
    #                                         mime_type_handler_factory=mime_type_handler_factory)