File size: 3,127 Bytes
dbb6988
 
 
 
c0907f8
a9e2887
dbb6988
 
 
a9e2887
273eb0a
 
 
a9e2887
dbb6988
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
047ffe2
dbb6988
c025e27
9dcf8cb
 
c025e27
06dc89b
eab288c
 
f0e68b1
 
cddaff2
06dc89b
dfd32d8
 
3670aeb
dfd32d8
 
 
 
f6c9376
 
 
f0e68b1
 
 
c0907f8
f0e68b1
 
 
c0907f8
dbb6988
 
 
 
 
 
 
 
 
 
 
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
from pydantic_settings import BaseSettings
from functools import lru_cache
import os
from dotenv import load_dotenv
from pydantic import field_validator
from loguru import logger

load_dotenv()

# Debug: Check environment variables
logger.info(f"[CONFIG] FACEBOOK_APP_SECRET from env: {os.getenv('FACEBOOK_APP_SECRET', 'NOT_SET')[:5]}...")
logger.info(f"[CONFIG] FACEBOOK_VERIFY_TOKEN from env: {os.getenv('FACEBOOK_VERIFY_TOKEN', 'NOT_SET')[:5]}...")
logger.info(f"[CONFIG] SUPABASE_URL from env: {os.getenv('SUPABASE_URL', 'NOT_SET')[:5]}...")

class Settings(BaseSettings):
    """
    Lưu trữ và quản lý cấu hình ứng dụng từ biến môi trường.
    Các thuộc tính: facebook_verify_token, facebook_app_secret, ...
    """
    # Facebook Configuration
    facebook_verify_token: str = os.getenv("FACEBOOK_VERIFY_TOKEN") or ""
    facebook_app_secret: str = os.getenv("FACEBOOK_APP_SECRET") or ""
    
    # Google Sheets Configuration
    google_sheets_credentials_file: str = os.getenv("GOOGLE_SHEETS_CREDENTIALS_FILE") or ""
    google_sheets_token_file: str = os.getenv("GOOGLE_SHEETS_TOKEN_FILE") or ""
    conversation_sheet_id: str = os.getenv("CONVERSATION_SHEET_ID") or ""
    
    # Supabase Configuration
    supabase_url: str = os.getenv("SUPABASE_URL") or ""
    supabase_key: str = os.getenv("SUPABASE_KEY") or ""
    
    # Server Configuration
    host: str = os.getenv("HOST", "0.0.0.0") or ""
    port: int = int(os.getenv("PORT", "8000")) or 8000
    
    # Logging Configuration
    log_level: str = os.getenv("LOG_LEVEL", "DEBUG") or "DEBUG"

    # Search Configuration
    match_count: int = int(os.getenv("MATCH_COUNT", "20")) or 20
    max_docs_to_rerank: int = int(os.getenv("MAX_DOCS_TO_RERANK", "20")) or 20

    # Gemini Configuration
    # Hỗ trợ nhiều API key và model cho Gemini
    # Định nghĩa biến môi trường: GEMINI_API_KEYS="key1,key2,..."; GEMINI_MODELS="model1,model2,..."
    gemini_api_keys: str = ""
    gemini_models: str = ""
    gemini_base_url: str = os.getenv("GEMINI_BASE_URL", "https://generativelanguage.googleapis.com/v1") or ""

    # LLM (chat/completion) provider/model
    llm_provider: str = os.getenv("LLM_PROVIDER", "gemini") or ""
    llm_model: str = os.getenv("LLM_MODEL", "gemini-2.5-flash") or ""
    # Embedding provider/model
    embedding_provider: str = os.getenv("EMBEDDING_PROVIDER", "gemini") or ""
    embedding_model: str = os.getenv("EMBEDDING_MODEL", "models/embedding-001") or ""

    rerank_provider: str = os.getenv("RERANK_PROVIDER", "") or llm_provider
    rerank_model: str = os.getenv("RERANK_MODEL", "") or llm_model

    @property
    def gemini_api_keys_list(self):
        return [k.strip() for k in self.gemini_api_keys.split(",") if k.strip()]

    @property
    def gemini_models_list(self):
        return [m.strip() for m in self.gemini_models.split(",") if m.strip()]

    class Config:
        env_file = ".env"

@lru_cache()
def get_settings() -> Settings:
    """
    Lấy instance Settings đã cache (singleton).
    Input: None
    Output: Settings instance.
    """
    return Settings()