File size: 7,430 Bytes
f0fe0fd
 
ce323cf
f0fe0fd
c089adf
a1a6d79
6853a4c
98a6105
 
f0fe0fd
ce323cf
a1a6d79
bb7c9a3
c21d29c
bb5dde5
a1a6d79
c6a2a56
bb7c9a3
f0fe0fd
c6a2a56
9fd6e20
c6a2a56
c5fe6f5
bb7c9a3
a1a6d79
9fd6e20
f0fe0fd
c21d29c
f0fe0fd
c6a2a56
 
ce323cf
f0fe0fd
 
 
 
 
 
bb5dde5
f0fe0fd
 
 
 
 
 
 
 
 
 
 
 
 
 
 
a1a6d79
f0fe0fd
f7e11c1
47ead95
bb7c9a3
98a6105
47ead95
 
 
 
6853a4c
47ead95
6853a4c
 
 
47ead95
 
 
f0fe0fd
47ead95
 
f7e11c1
47ead95
 
 
 
f7e11c1
47ead95
6853a4c
 
47ead95
 
 
 
f0fe0fd
47ead95
 
 
 
 
f0fe0fd
47ead95
f0fe0fd
 
 
 
47ead95
 
 
 
 
 
bb7c9a3
 
f0fe0fd
 
a1a6d79
 
f0fe0fd
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
103
104
105
106
107
108
109
110
111
112
113
114
from asyncio import iscoroutine, isfuture
from dependency_injector import providers
from dependency_injector.containers import DeclarativeContainer
from dependency_injector.providers import Callable, Configuration, Dict, List, Resource, Singleton
from importlib import import_module
from itertools import chain
from openai import AsyncOpenAI
from pkgutil import iter_modules
from types import ModuleType
from typing import Any, Iterator, Sequence

from ctp_slack_bot.controllers import ControllerBase, ControllerRegistry
from ctp_slack_bot.core 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 import MimeTypeHandlerRegistry
from ctp_slack_bot.services.answer_retrieval_service import AnswerRetrievalService
from ctp_slack_bot.services.application_health_service import ApplicationHealthService
from ctp_slack_bot.services.content_ingestion_service import ContentIngestionServiceResource
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.http_client_service import HTTPClientServiceResource
from ctp_slack_bot.services.http_server_service import HTTPServerResource
from ctp_slack_bot.services.language_model_service import LanguageModelService
from ctp_slack_bot.services.question_dispatch_service import QuestionDispatchServiceResource
from ctp_slack_bot.services.slack_service import SlackServiceResource
from ctp_slack_bot.services.task_service import TaskServiceResource
from ctp_slack_bot.services.vectorization_service import VectorizationService


async def _await_or_return(value):
    if iscoroutine(value) or isfuture(value):
        return await value
    return value


class Container(DeclarativeContainer): # TODO: audit for potential async-related bugs.
    async def __get_http_controller_providers(container) -> Sequence[ControllerBase]:
        return [controller_class(**{dependency_name: await _await_or_return(container.providers[dependency_name]())
                                    for dependency_name
                                    in controller_class.model_fields.keys() & container.providers.keys()})
                for controller_class in ControllerRegistry.get_registry()]

    def __iter_mime_type_handler_providers() -> Iterator[tuple[str, Singleton]]:
        handler_provider_map = {}
        for mime_type, handler in MimeTypeHandlerRegistry.get_registry().items():
            if handler in handler_provider_map:
                provider = handler_provider_map[handler]
            else:
                provider = Singleton(handler)
                handler_provider_map[handler] = provider
            yield (mime_type, provider)

    __self__                    = providers.Self()
    settings                    = Singleton(Settings)
    event_brokerage_service     = Singleton(EventBrokerageService)
    http_client                 = Resource (HTTPClientServiceResource)
    mongo_db                    = Resource (MongoDBResource,
                                            settings=settings)
    vectorized_chunk_repository = Resource (MongoVectorizedChunkRepositoryResource,
                                            settings=settings,
                                            mongo_db=mongo_db)
    open_ai_client              = Singleton(lambda settings: AsyncOpenAI(api_key=settings.openai_api_key.get_secret_value()),
                                            settings=settings)
    embeddings_model_service    = Singleton(EmbeddingsModelService,
                                            settings=settings,
                                            open_ai_client=open_ai_client)
    vectorization_service       = Singleton(VectorizationService,
                                            settings=settings,
                                            embeddings_model_service=embeddings_model_service)
    content_ingestion_service   = Resource (ContentIngestionServiceResource,
                                            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,
                                            open_ai_client=open_ai_client)
    answer_retrieval_service    = Singleton(AnswerRetrievalService,
                                            settings=settings,
                                            event_brokerage_service=event_brokerage_service,
                                            language_model_service=language_model_service)
    question_dispatch_service   = Resource (QuestionDispatchServiceResource,
                                            settings=settings,
                                            event_brokerage_service=event_brokerage_service,
                                            context_retrieval_service=context_retrieval_service,
                                            answer_retrieval_service=answer_retrieval_service)
    slack_service               = Resource (SlackServiceResource,
                                            settings=settings,
                                            event_brokerage_service=event_brokerage_service,
                                            http_client=http_client)
    mime_type_handlers          = Dict     ({mime_type: handler_provider
                                             for mime_type, handler_provider
                                             in __iter_mime_type_handler_providers()})
    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)
    application_health_service  = Singleton(ApplicationHealthService,
                                            services=List(mongo_db, slack_service))
    task_service                = Resource (TaskServiceResource,
                                            settings=settings)
    http_server                 = Resource (HTTPServerResource,
                                            settings=settings,
                                            controllers=Callable(__get_http_controller_providers, __self__))