"""配置管理 - 环境变量 + 默认值""" import os from pathlib import Path from pydantic_settings import BaseSettings, SettingsConfigDict class Settings(BaseSettings): """应用配置""" model_config = SettingsConfigDict(env_file=".env", env_file_encoding="utf-8", extra="ignore") # RSSKeeper 连接 RSSKEEPER_BASE_URL: str = "http://localhost:7329" # LLM API(兼容 OpenAI 格式) OPENAI_API_KEY: str = "" OPENAI_BASE_URL: str = "https://api.openai.com/v1" OPENAI_MODEL: str = "gpt-4o-mini" OPENAI_TIMEOUT: int = 60 OPENAI_MAX_RETRIES: int = 3 # dataClean 数据目录 DATA_DIR: Path = Path("/app/data") DATABASE_URL: str = "/app/data/dataclean.db" # 简报输出目录 BRIEF_OUTPUT_DIR: Path = Path("/app/data/briefs") # 调度时间(分钟) SUMMARIZE_INTERVAL_MINUTES: int = 60 TAG_SCORE_INTERVAL_MINUTES: int = 1440 DAILY_BRIEF_HOUR: int = 8 DAILY_BRIEF_MINUTE: int = 0 # 去重阈值 TITLE_SIMILARITY_THRESHOLD: float = 0.85 CONTENT_SIMILARITY_THRESHOLD: float = 0.80 # 摘要长度 MAX_AI_SUMMARY_LENGTH: int = 300 MIN_ORIGINAL_SUMMARY_LENGTH: int = 100 # 每篇简报每个分类显示文章数 BRIEF_TOP_N_PER_CATEGORY: int = 10 # 日志级别 LOG_LEVEL: str = "INFO" # Web UI / API 安全 # 为空时不启用 API Token 鉴权(仅建议在内网使用);生产环境请设置强密码 API_TOKEN: str = "" # CORS 允许来源,逗号分隔;生产环境请填写具体域名,如 "https://dataclean.example.com" CORS_ALLOWED_ORIGINS: str = "" @property def database_path(self) -> str: """返回 SQLite 数据库路径""" return str(Path(self.DATABASE_URL)) @property def brief_output_dir_path(self) -> Path: """返回简报输出目录""" return self.BRIEF_OUTPUT_DIR settings = Settings()