from .supabase_db import SupabaseClient from .llm import create_llm_client from .reranker import Reranker from .embedding import EmbeddingClient from .facebook import FacebookClient from .config import get_settings from .sheets import SheetsClient from app.message_processor import MessageProcessor from typing import Optional class ChatChannel: def __init__(self, page_id: str, channel_type: str = "facebook"): self.channel_type = channel_type self.page_id = page_id self.page_token = None # cache token settings = get_settings() self.supabase = SupabaseClient(settings.supabase_url, settings.supabase_key) self.sheets = SheetsClient( settings.google_sheets_credentials_file, settings.google_sheets_token_file, settings.conversation_sheet_id ) self.llm = create_llm_client( provider="gemini", base_url=settings.gemini_base_url, model=settings.gemini_models_list[0] if settings.gemini_models_list else "gemini-2.5-flash" ) self.reranker = Reranker() self.embedder = EmbeddingClient() self.conversations = {} # sender_id -> MessageProcessor def get_page_token(self, force_refresh=False): if self.page_token is None or force_refresh: self.page_token = self.supabase.get_page_token(self.page_id) return self.page_token def invalidate_page_token(self): self.page_token = None def get_sheets_client(self): settings = get_settings() return SheetsClient( settings.google_sheets_credentials_file, settings.google_sheets_token_file, settings.conversation_sheet_id ) def get_or_create_conversation(self, sender_id: str): if sender_id not in self.conversations: self.conversations[sender_id] = MessageProcessor(self, sender_id) return self.conversations[sender_id]