67 lines
1.9 KiB
Python
67 lines
1.9 KiB
Python
"""配置管理 - 环境变量 + 默认值"""
|
|
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()
|