|
|
from __future__ import annotations |
|
|
from typing import Dict, Optional, TYPE_CHECKING |
|
|
|
|
|
if TYPE_CHECKING: |
|
|
from .llm import LLMClient |
|
|
from .sheets import SheetsClient |
|
|
from .supabase_db import SupabaseClient |
|
|
from .embedding import EmbeddingClient |
|
|
from .reranker import Reranker |
|
|
from .channel import Channel |
|
|
|
|
|
class ChannelManager: |
|
|
""" |
|
|
Quản lý tất cả các channel (ví dụ: các Page Facebook) đang hoạt động. |
|
|
Lưu trữ các client dùng chung để truyền cho các channel, tối ưu hóa tài nguyên. |
|
|
""" |
|
|
def __init__(self): |
|
|
self.channels: Dict[str, Channel] = {} |
|
|
|
|
|
self.llm_client: Optional[LLMClient] = None |
|
|
self.sheets_client: Optional[SheetsClient] = None |
|
|
self.supabase_client: Optional[SupabaseClient] = None |
|
|
self.embedding_client: Optional[EmbeddingClient] = None |
|
|
self.reranker: Optional[Reranker] = None |
|
|
|
|
|
def set_shared_clients( |
|
|
self, |
|
|
llm_client: LLMClient, |
|
|
sheets_client: SheetsClient, |
|
|
supabase_client: SupabaseClient, |
|
|
embedding_client: EmbeddingClient, |
|
|
reranker: Reranker, |
|
|
): |
|
|
"""Gán các client được chia sẻ từ main.py.""" |
|
|
self.llm_client = llm_client |
|
|
self.sheets_client = sheets_client |
|
|
self.supabase_client = supabase_client |
|
|
self.embedding_client = embedding_client |
|
|
self.reranker = reranker |
|
|
|
|
|
def get_or_create_channel(self, platform: str, page_id: str) -> Channel: |
|
|
"""Lấy hoặc tạo một channel mới và truyền các client dùng chung vào.""" |
|
|
channel_key = f"{platform}:{page_id}" |
|
|
if channel_key not in self.channels: |
|
|
|
|
|
if not all([self.llm_client, self.sheets_client, self.supabase_client, self.embedding_client, self.reranker]): |
|
|
raise RuntimeError("Một hoặc nhiều client dùng chung chưa được thiết lập cho ChannelManager.") |
|
|
|
|
|
from .channel import Channel |
|
|
self.channels[channel_key] = Channel(platform=platform, page_id=page_id, llm_client=self.llm_client, sheets_client=self.sheets_client, supabase_client=self.supabase_client, embedding_client=self.embedding_client, reranker=self.reranker) |
|
|
return self.channels[channel_key] |
|
|
|
|
|
|
|
|
channel_manager = ChannelManager() |