"""Central configuration for blog-app. All values can be overridden via environment variables (BLOG_APP_* prefix, except SECRET_KEY which uses the conventional FLASK_SECRET_KEY). """ import os from pathlib import Path BASE_DIR = os.path.dirname(os.path.abspath(__file__)) # NOTE: actual data lives at ~/opencode-blog-showcase/data (outside blog-app/). # The default below mirrors the pre-refactor behavior. DB_PATH = os.environ.get( "BLOG_APP_DB_PATH", os.path.expanduser("~/opencode-blog-showcase/data/projects.db"), ) WATCHDOG_DB = os.environ.get( "BLOG_APP_WATCHDOG_DB", os.path.expanduser("~/opencode-blog-showcase/data/watchdog.db"), ) WATCHDOG_SCRIPT = os.path.join(BASE_DIR, "scripts", "daily_watchdog.py") WATCHDOG_RUN_LOG = os.path.expanduser( "~/opencode-blog-showcase/logs/daily-watchdog-run.log" ) LLM_URL = os.environ.get("BLOG_APP_LLM_URL", "http://127.0.0.1:4000/v1") LLM_MODEL = os.environ.get("BLOG_APP_LLM_MODEL", "default") LLM_TIMEOUT = int(os.environ.get("BLOG_APP_LLM_TIMEOUT", "300")) # LLM prompt trimming budgets, in characters (OPT-10). Shared by # services/analysis.py (_slim_for_llm) and scripts/daily_watchdog.py. # LLM_TOTAL_LIMIT: 12000 chars ≈ 3000 tokens, 留余量给 system prompt + # user question (典型 4k-8k context 模型). 单字段阈值控制 prefill 体积. LLM_BODY_LIMIT = int(os.environ.get("BLOG_APP_LLM_BODY_LIMIT", "500")) LLM_FIELD_LIMIT = int(os.environ.get("BLOG_APP_LLM_FIELD_LIMIT", "300")) LLM_MESSAGE_LIMIT = int(os.environ.get("BLOG_APP_LLM_MESSAGE_LIMIT", "200")) LLM_TOTAL_LIMIT = int(os.environ.get("BLOG_APP_LLM_TOTAL_LIMIT", "12000")) RATE_LIMIT_MAX = int(os.environ.get("BLOG_APP_RATE_LIMIT_MAX", "3")) RATE_LIMIT_WINDOW = int(os.environ.get("BLOG_APP_RATE_LIMIT_WINDOW", "60")) WATCHDOG_RUN_COOLDOWN = int(os.environ.get("BLOG_APP_WATCHDOG_COOLDOWN", "60")) SECRET_KEY = os.environ.get("FLASK_SECRET_KEY", "dev-watchdog-secret-change-me")