import os import sys from dotenv import load_dotenv load_dotenv() def _get_base_dir() -> str: """获取基础目录(支持 PyInstaller 打包后的路径)""" if getattr(sys, 'frozen', False): # PyInstaller 打包后,exe 所在目录 return os.path.dirname(sys.executable) else: # 开发模式,backend 目录 return os.path.dirname(os.path.dirname(os.path.abspath(__file__))) BASE_DIR = _get_base_dir() class Settings: # App APP_HOST: str = os.getenv("APP_HOST", "0.0.0.0") APP_PORT: int = int(os.getenv("APP_PORT", "8000")) UPLOAD_DIR: str = os.getenv("UPLOAD_DIR", os.path.join(BASE_DIR, "uploads")) EXPORT_DIR: str = os.getenv("EXPORT_DIR", os.path.join(BASE_DIR, "exports")) DB_DIR: str = os.getenv("DB_DIR", os.path.join(BASE_DIR, "data")) # LLM LLM_PROVIDER: str = os.getenv("LLM_PROVIDER", "xiaomi") LLM_MODEL: str = os.getenv("LLM_MODEL", "MiMo-V2-Flash") LLM_BASE_URL: str = os.getenv("LLM_BASE_URL", "https://api.xiaomimimo.com/v1") LLM_API_KEY: str = os.getenv("LLM_API_KEY", "") # Extraction SEGMENT_MAX_LINES: int = int(os.getenv("SEGMENT_MAX_LINES", "500")) STORY_MIN_LINES: int = int(os.getenv("STORY_MIN_LINES", "50")) CONFIDENCE_THRESHOLD: float = float(os.getenv("CONFIDENCE_THRESHOLD", "0.5")) TEMPERATURE: float = float(os.getenv("TEMPERATURE", "0.3")) @property def database_url(self) -> str: os.makedirs(self.DB_DIR, exist_ok=True) return f"sqlite+aiosqlite:///{self.DB_DIR}/story_extractor.db" settings = Settings()