plain-rag/app/core/config.py

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"