File size: 2,463 Bytes
102dd4f
 
87c0663
102dd4f
 
 
 
 
1cd53ba
102dd4f
 
 
 
 
 
 
 
 
87c0663
102dd4f
1cd53ba
102dd4f
 
 
 
 
 
 
 
87c0663
 
 
 
0445c27
 
 
 
87c0663
 
102dd4f
87c0663
102dd4f
87c0663
102dd4f
 
 
 
 
 
 
1cd53ba
 
 
4ce08fd
1cd53ba
 
102dd4f
 
 
 
 
 
 
 
1cd53ba
102dd4f
 
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
from dataclasses import dataclass

from app.ai.router import LiteLLMOrchestration
from app.config import Settings
from app.database.supabase import SupabaseRepository, create_supabase_client
from app.services.admin_service import AdminService
from app.services.conversation_service import ConversationService
from app.services.embedding_service import JinaEmbeddingService
from app.services.group_message_service import GroupMessageService
from app.whatsapp.client import WhatsAppClient


@dataclass(slots=True)
class ServiceContainer:
    settings: Settings
    repository: SupabaseRepository
    embeddings: JinaEmbeddingService
    whatsapp: WhatsAppClient
    ai: LiteLLMOrchestration
    conversation: ConversationService
    group_message: GroupMessageService
    admin: AdminService

    @classmethod
    async def from_settings(cls, settings: Settings) -> "ServiceContainer":
        supabase_client = await create_supabase_client(settings)
        repository = SupabaseRepository(supabase_client)
        embeddings = JinaEmbeddingService(settings)
        whatsapp = WhatsAppClient(settings)
        
        ai = LiteLLMOrchestration(
            groq_api_key=settings.groq_api_key,
            groq_model=settings.groq_model,
            groq_api_key_2=settings.groq_api_key_2,
            groq_model_2=settings.groq_model_2,
            google_ai_api_key=settings.google_ai_api_key,
            google_ai_model=settings.google_ai_model,
            openrouter_api_key=settings.openrouter_api_key,
            openrouter_model=settings.openrouter_model,
            max_tool_iterations=settings.ai_max_tool_iterations,
            temperature=settings.ai_temperature,
        )
            
        conversation = ConversationService(
            repository=repository,
            embeddings=embeddings,
            whatsapp=whatsapp,
            ai=ai,
            settings=settings,
        )
        group_message = GroupMessageService(
            repository=repository,
            embeddings=embeddings,
            ai=ai,
            settings=settings,
        )
        admin = AdminService(repository=repository, embeddings=embeddings, settings=settings)
        return cls(
            settings=settings,
            repository=repository,
            embeddings=embeddings,
            whatsapp=whatsapp,
            ai=ai,
            conversation=conversation,
            group_message=group_message,
            admin=admin,
        )