| from functools import lru_cache |
| from pathlib import Path |
|
|
| from pydantic import Field, field_validator |
| from pydantic_settings import BaseSettings, SettingsConfigDict |
|
|
|
|
| class Settings(BaseSettings): |
| hf_api_key: str | None = Field(default=None, alias="HF_API_KEY") |
| embedding_model: str = Field( |
| default="sentence-transformers/all-MiniLM-L6-v2", alias="EMBEDDING_MODEL" |
| ) |
| generation_model: str = Field( |
| default="meta-llama/Llama-3.2-1B-Instruct", alias="GENERATION_MODEL" |
| ) |
| chunk_size: int = Field(default=512, alias="CHUNK_SIZE", gt=0) |
| chunk_overlap: int = Field(default=64, alias="CHUNK_OVERLAP", ge=0) |
| top_k_default: int = Field(default=5, alias="TOP_K_DEFAULT", gt=0) |
| data_dir: Path = Field(default=Path("data"), alias="DATA_DIR") |
| max_upload_mb: int = Field(default=10, alias="MAX_UPLOAD_MB", gt=0) |
| hf_timeout_seconds: int = Field(default=60, alias="HF_TIMEOUT_SECONDS", gt=0) |
|
|
| model_config = SettingsConfigDict(env_file=".env", env_file_encoding="utf-8", extra="ignore") |
|
|
| @field_validator("chunk_overlap") |
| @classmethod |
| def overlap_must_be_smaller_than_size(cls, value: int, info) -> int: |
| chunk_size = info.data.get("chunk_size") |
| if chunk_size is not None and value >= chunk_size: |
| raise ValueError("CHUNK_OVERLAP must be smaller than CHUNK_SIZE") |
| return value |
|
|
|
|
| @lru_cache |
| def get_settings() -> Settings: |
| return Settings() |
|
|