| """Application configuration for Hugging Face Spaces. |
| |
| Defaults live in code; a small set of values can be overridden via env vars. |
| """ |
|
|
| from __future__ import annotations |
|
|
| from functools import lru_cache |
| from pathlib import Path |
| from typing import Literal |
|
|
| from pydantic import Field, model_validator |
| from pydantic_settings import BaseSettings, SettingsConfigDict |
|
|
|
|
| class Settings(BaseSettings): |
| model_config = SettingsConfigDict( |
| env_file=".env", |
| env_prefix="RAG_", |
| extra="ignore", |
| ) |
|
|
| data_dir: Path = Path("data") |
| storage_dir: Path = Path("storage/qdrant") |
| qdrant_collection: str = "rag_chunks" |
|
|
| chunk_size: int = Field(default=1500, ge=500) |
| chunk_overlap: int = Field(default=200, ge=0) |
| top_k: int = Field(default=5, ge=1, le=64) |
|
|
| llm_provider: Literal["gemini"] = "gemini" |
| llm_model: str = "gemini-flash-lite-latest" |
| llm_temperature: float = Field(default=0.1, ge=0.0, le=2.0) |
| llm_max_new_tokens: int = Field(default=10000, ge=1, le=20000) |
|
|
| embedding_provider: Literal["local"] = "local" |
| embedding_model: str = "sentence-transformers/paraphrase-multilingual-MiniLM-L12-v2" |
|
|
| gemini_api_key: str | None = Field(default=None, validation_alias="GEMINI_API_KEY") |
|
|
| summarize_batch_size: int = Field(default=10, ge=1) |
| summarize_retrieval_k: int = Field(default=12, ge=1, le=128) |
| generation_retrieval_k: int = Field(default=16, ge=1, le=128) |
| quiz_default_count: int = Field(default=8, ge=1, le=50) |
| flashcards_default_count: int = Field(default=15, ge=1, le=100) |
|
|
| @model_validator(mode="after") |
| def validate_config(self) -> "Settings": |
| if self.chunk_overlap >= self.chunk_size: |
| raise ValueError("chunk_overlap must be smaller than chunk_size.") |
|
|
| return self |
|
|
|
|
| @lru_cache(maxsize=1) |
| def get_settings() -> Settings: |
| return Settings() |
|
|
|
|
| settings = get_settings() |
|
|
|
|