- Default model: gpt-5.2 - New models use client.responses.create() (Responses API) - Older models (gpt-3.5-turbo) still use chat.completions.create() - Response parsing handles both API formats - Updated valid models list Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
101 lines
2.8 KiB
Python
101 lines
2.8 KiB
Python
"""Application settings via pydantic-settings."""
|
|
|
|
import secrets
|
|
import os
|
|
from pathlib import Path
|
|
from pydantic_settings import BaseSettings
|
|
|
|
|
|
class Settings(BaseSettings):
|
|
"""Application settings loaded from environment variables and .env file."""
|
|
|
|
# App
|
|
APP_NAME: str = "Oliver Metadata Tool"
|
|
APP_VERSION: str = "4.0.0"
|
|
DEBUG: bool = False
|
|
DOCKER_MODE: bool = False
|
|
ROOT_PATH: str = "" # Subpath prefix, e.g. "/solventum-image-metadata"
|
|
|
|
# Security
|
|
SECRET_KEY: str = secrets.token_hex(32)
|
|
HTTPS_ONLY: bool = False
|
|
ENABLE_TEST_USER: bool = False
|
|
|
|
# Paths
|
|
UPLOAD_FOLDER: str = ""
|
|
DB_PATH: str = ""
|
|
SESSION_DB_PATH: str = ""
|
|
TEMPLATES_DIR: str = ""
|
|
|
|
# OpenAI
|
|
OPENAI_API_KEY: str = ""
|
|
AI_MODEL: str = "gpt-5.2"
|
|
MAX_TOKENS: int = 500
|
|
TEMPERATURE: float = 0.5
|
|
MAX_TEXT_LENGTH: int = 4000
|
|
API_TIMEOUT: int = 30
|
|
API_MAX_RETRIES: int = 3
|
|
|
|
# Azure SSO
|
|
AZURE_CLIENT_ID: str = ""
|
|
AZURE_CLIENT_SECRET: str = ""
|
|
AZURE_TENANT_ID: str = ""
|
|
REDIRECT_URI: str = "http://localhost:5001/auth/callback"
|
|
|
|
# OCR
|
|
OCR_LANGUAGES: str = "eng+chi_sim+chi_tra+jpn+kor"
|
|
TESSERACT_PATH: str = ""
|
|
FFMPEG_PATH: str = ""
|
|
|
|
# Limits
|
|
MAX_UPLOAD_SIZE_MB: int = 500
|
|
SESSION_EXPIRE_HOURS: int = 24
|
|
FILE_CLEANUP_HOURS: int = 24
|
|
|
|
# Superadmin
|
|
SUPERADMIN_EMAIL: str = "vadymsamoilenko@oliver.agency"
|
|
|
|
model_config = {
|
|
"env_file": ".env",
|
|
"env_file_encoding": "utf-8",
|
|
"extra": "ignore",
|
|
}
|
|
|
|
def __init__(self, **kwargs):
|
|
super().__init__(**kwargs)
|
|
project_root = Path(__file__).parent.parent
|
|
|
|
if self.DOCKER_MODE:
|
|
if not self.UPLOAD_FOLDER:
|
|
self.UPLOAD_FOLDER = "/app/uploads"
|
|
if not self.DB_PATH:
|
|
self.DB_PATH = "/app/data/oliver_metadata.db"
|
|
if not self.SESSION_DB_PATH:
|
|
self.SESSION_DB_PATH = "/app/data/oliver_sessions.db"
|
|
else:
|
|
if not self.UPLOAD_FOLDER:
|
|
self.UPLOAD_FOLDER = str(project_root / "uploads")
|
|
if not self.DB_PATH:
|
|
self.DB_PATH = str(project_root / "oliver_metadata.db")
|
|
if not self.SESSION_DB_PATH:
|
|
self.SESSION_DB_PATH = str(project_root / "oliver_sessions.db")
|
|
|
|
if not self.TEMPLATES_DIR:
|
|
self.TEMPLATES_DIR = str(project_root / "templates")
|
|
|
|
# Ensure upload directory exists
|
|
Path(self.UPLOAD_FOLDER).mkdir(parents=True, exist_ok=True)
|
|
|
|
# Ensure data directory exists (for Docker)
|
|
Path(self.DB_PATH).parent.mkdir(parents=True, exist_ok=True)
|
|
|
|
|
|
_settings = None
|
|
|
|
|
|
def get_settings() -> Settings:
|
|
"""Get cached settings instance."""
|
|
global _settings
|
|
if _settings is None:
|
|
_settings = Settings()
|
|
return _settings
|