File size: 2,068 Bytes
1904012
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
7e85f61
 
1904012
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
from pydantic_settings import BaseSettings, SettingsConfigDict
from pydantic import field_validator
from typing import List, Union
import os
from dotenv import load_dotenv

load_dotenv()

class Settings(BaseSettings):
    model_config = SettingsConfigDict(
        env_file=".env",
        case_sensitive=True,
        extra="ignore"
    )
    
    PINECONE_API_KEY: str = ""
    PINECONE_INDEX: str = "mentorme-mentors"
    PINECONE_ENVIRONMENT: str = "us-east-1-aws"
    PINECONE_DIMENSION: int = 1024
    
    HOST: str = "0.0.0.0"
    PORT: int = int(os.getenv("PORT", "7860"))
    DEBUG: bool = False
    
    EMBEDDING_MODEL_NAME: str = "AITeamVN/Vietnamese_Embedding"
    USE_FP16: bool = True
    
    RECOMMENDATION_TOP_K: int = 30
    RECOMMENDATION_RERANK_K: int = 15
    RECOMMENDATION_FINAL_COUNT: int = 6
    SEMANTIC_WEIGHT: float = 1.0
    RULE_BASED_WEIGHT: float = 0.0
    
    @property
    def CORS_ORIGINS(self) -> List[str]:
        cors_str = os.getenv("CORS_ORIGINS", "*")
        if cors_str == "*":
            return ["*"]
        return [origin.strip() for origin in cors_str.split(",") if origin.strip()]
    
    @field_validator("DEBUG", "USE_FP16", mode="before")
    @classmethod
    def parse_bool(cls, v: Union[str, bool]) -> bool:
        if isinstance(v, str):
            return v.lower() in ("true", "1", "yes", "on")
        return bool(v)
    
    @field_validator("PORT", "PINECONE_DIMENSION", "RECOMMENDATION_TOP_K", "RECOMMENDATION_RERANK_K", "RECOMMENDATION_FINAL_COUNT", mode="before")
    @classmethod
    def parse_int(cls, v: Union[str, int]) -> int:
        if isinstance(v, str):
            return int(v)
        return v
    
    @field_validator("SEMANTIC_WEIGHT", "RULE_BASED_WEIGHT", mode="before")
    @classmethod
    def parse_float(cls, v: Union[str, float]) -> float:
        if isinstance(v, str):
            return float(v)
        return v

_settings: Settings = None

def get_settings() -> Settings:
    global _settings
    if _settings is None:
        _settings = Settings()
    return _settings