oliver-metadata-tool/app/config.py
SamoilenkoVadym d4b71ff34e Switch AI to GPT-5.2 with Responses API (v1/responses)
- 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>
2026-02-09 22:13:55 +00:00

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