mirror of
https://github.com/Sosokker/plain-rag.git
synced 2025-12-18 14:34:05 +01:00
103 lines
2.7 KiB
Python
103 lines
2.7 KiB
Python
import os
|
|
import secrets
|
|
from functools import lru_cache
|
|
from pathlib import Path
|
|
|
|
from pydantic import PostgresDsn, model_validator
|
|
from pydantic_settings import BaseSettings, SettingsConfigDict
|
|
|
|
ROOT = Path(__file__).resolve().parent.parent.parent
|
|
ENV_FILE = ROOT / ".env"
|
|
|
|
|
|
class Settings(BaseSettings):
|
|
# Project
|
|
PROJECT_NAME: str = "Chat Hub"
|
|
VERSION: str = "0.1.0"
|
|
API_V1_STR: str = "/api/v1"
|
|
SECRET_KEY: str = secrets.token_urlsafe(32)
|
|
ACCESS_TOKEN_EXPIRE_MINUTES: int = 60 * 24 * 8 # 8 days
|
|
|
|
# Security
|
|
ALGORITHM: str = "HS256"
|
|
|
|
# Database
|
|
POSTGRES_SERVER: str = "localhost"
|
|
POSTGRES_USER: str = "postgres"
|
|
POSTGRES_PASSWORD: str = ""
|
|
POSTGRES_DB: str = "chat_hub"
|
|
POSTGRES_PORT: str = "5432"
|
|
DATABASE_URI: PostgresDsn = PostgresDsn.build(
|
|
scheme="postgresql+asyncpg",
|
|
username=POSTGRES_USER,
|
|
password=POSTGRES_PASSWORD,
|
|
host=POSTGRES_SERVER,
|
|
port=int(POSTGRES_PORT),
|
|
path=f"/{POSTGRES_DB or ''}",
|
|
)
|
|
|
|
@model_validator(mode="after")
|
|
def assemble_db_connection(self) -> "Settings":
|
|
if self.DATABASE_URI is None:
|
|
self.DATABASE_URI = PostgresDsn.build(
|
|
scheme="postgresql+asyncpg",
|
|
username=self.POSTGRES_USER,
|
|
password=self.POSTGRES_PASSWORD,
|
|
host=self.POSTGRES_SERVER,
|
|
port=int(self.POSTGRES_PORT),
|
|
path=f"/{self.POSTGRES_DB or ''}",
|
|
)
|
|
return self
|
|
|
|
# LLM Configuration
|
|
OPENAI_API_KEY: str | None = None
|
|
ANTHROPIC_API_KEY: str | None = None
|
|
|
|
# Vector Store
|
|
VECTOR_STORE_TYPE: str = "pgvector" # or "chroma", "faiss", etc.
|
|
EMBEDDING_MODEL: str = "sentence-transformers/all-mpnet-base-v2"
|
|
|
|
# File uploads
|
|
UPLOAD_DIR: str = "uploads" # Relative to project root
|
|
MAX_UPLOAD_SIZE: int = 100 * 1024 * 1024 # 100MB
|
|
ALLOWED_DOCUMENT_TYPES: list[str] = ["pdf", "txt", "md"]
|
|
|
|
# Logging
|
|
LOG_LEVEL: str = "INFO"
|
|
|
|
# Environment
|
|
ENVIRONMENT: str = "development"
|
|
DEBUG: bool = False
|
|
TESTING: bool = False
|
|
|
|
# Rate Limiting
|
|
RATE_LIMIT: str = "100/minute"
|
|
|
|
# Caching
|
|
CACHE_TTL: int = 300 # 5 minutes
|
|
|
|
GEMINI_API_KEY: str
|
|
|
|
model_config = SettingsConfigDict(
|
|
env_file=ENV_FILE,
|
|
env_file_encoding="utf-8",
|
|
case_sensitive=True,
|
|
extra="ignore",
|
|
)
|
|
|
|
|
|
@lru_cache
|
|
def get_settings() -> Settings:
|
|
"""
|
|
Get cached settings instance.
|
|
This function uses lru_cache to prevent re-reading the environment on each call.
|
|
"""
|
|
return Settings()
|
|
|
|
|
|
# Create settings instance
|
|
settings = get_settings()
|
|
|
|
# Set environment variables for third-party libraries
|
|
os.environ["TOKENIZERS_PARALLELISM"] = "false"
|