|
@@ -3,43 +3,35 @@ from pathlib import Path
|
|
|
|
|
|
|
|
from dotenv import load_dotenv
|
|
from dotenv import load_dotenv
|
|
|
|
|
|
|
|
-# Load .env from project folder so Groq/debug flags are available under uvicorn/nohup.
|
|
|
|
|
_HERE = Path(__file__).resolve().parent.parent
|
|
_HERE = Path(__file__).resolve().parent.parent
|
|
|
load_dotenv(_HERE / ".env")
|
|
load_dotenv(_HERE / ".env")
|
|
|
|
|
|
|
|
DATA_DIR = Path(os.getenv("NEWS_MCP_DATA_DIR", Path(__file__).resolve().parent / "data"))
|
|
DATA_DIR = Path(os.getenv("NEWS_MCP_DATA_DIR", Path(__file__).resolve().parent / "data"))
|
|
|
DATA_DIR.mkdir(parents=True, exist_ok=True)
|
|
DATA_DIR.mkdir(parents=True, exist_ok=True)
|
|
|
-
|
|
|
|
|
DB_PATH = Path(os.getenv("NEWS_MCP_DB_PATH", str(DATA_DIR / "news.sqlite")))
|
|
DB_PATH = Path(os.getenv("NEWS_MCP_DB_PATH", str(DATA_DIR / "news.sqlite")))
|
|
|
|
|
+PROMPTS_DIR = Path(os.getenv("NEWS_PROMPTS_DIR", str(_HERE / "prompts")))
|
|
|
|
|
|
|
|
-# Backward-compatible aliases for older config names.
|
|
|
|
|
NEWS_FEED_URL = os.getenv("NEWS_FEED_URL", os.getenv("NEWS_RSS_FEED_URL", "https://breakingthenews.net/news-feed.xml"))
|
|
NEWS_FEED_URL = os.getenv("NEWS_FEED_URL", os.getenv("NEWS_RSS_FEED_URL", "https://breakingthenews.net/news-feed.xml"))
|
|
|
-# Optional multi-feed mode: comma-separated feed URLs.
|
|
|
|
|
-# If set (non-empty), this overrides NEWS_FEED_URL.
|
|
|
|
|
NEWS_FEED_URLS = os.getenv("NEWS_FEED_URLS", os.getenv("NEWS_RSS_FEED_URLS", "")).strip()
|
|
NEWS_FEED_URLS = os.getenv("NEWS_FEED_URLS", os.getenv("NEWS_RSS_FEED_URLS", "")).strip()
|
|
|
-
|
|
|
|
|
-# Legacy names kept for compatibility.
|
|
|
|
|
RSS_FEED_URL = NEWS_FEED_URL
|
|
RSS_FEED_URL = NEWS_FEED_URL
|
|
|
RSS_FEED_URLS = NEWS_FEED_URLS
|
|
RSS_FEED_URLS = NEWS_FEED_URLS
|
|
|
|
|
|
|
|
-# Clusters TTL (hours)
|
|
|
|
|
CLUSTERS_TTL_HOURS = float(os.getenv("NEWS_CLUSTERS_TTL_HOURS", "24"))
|
|
CLUSTERS_TTL_HOURS = float(os.getenv("NEWS_CLUSTERS_TTL_HOURS", "24"))
|
|
|
-
|
|
|
|
|
DEFAULT_TOPICS = ["crypto", "macro", "regulation", "ai", "other"]
|
|
DEFAULT_TOPICS = ["crypto", "macro", "regulation", "ai", "other"]
|
|
|
|
|
|
|
|
-# Optional LLM enrichment (Groq)
|
|
|
|
|
|
|
+# LLM extraction / summarization
|
|
|
GROQ_API_KEY = os.getenv("GROQ_API_KEY")
|
|
GROQ_API_KEY = os.getenv("GROQ_API_KEY")
|
|
|
-GROQ_MODEL = os.getenv("GROQ_MODEL", "llama4-16e")
|
|
|
|
|
|
|
+OPENAI_API_KEY = os.getenv("OPENAI_API_KEY")
|
|
|
|
|
+NEWS_EXTRACT_PROVIDER = os.getenv("NEWS_EXTRACT_PROVIDER", "groq")
|
|
|
|
|
+NEWS_EXTRACT_MODEL = os.getenv("NEWS_EXTRACT_MODEL", os.getenv("GROQ_MODEL", "llama4-16e"))
|
|
|
|
|
+NEWS_SUMMARY_PROVIDER = os.getenv("NEWS_SUMMARY_PROVIDER", "groq")
|
|
|
|
|
+NEWS_SUMMARY_MODEL = os.getenv("NEWS_SUMMARY_MODEL", os.getenv("GROQ_MODEL", "llama4-16e"))
|
|
|
GROQ_DEBUG = os.getenv("GROQ_DEBUG", "false").lower() == "true"
|
|
GROQ_DEBUG = os.getenv("GROQ_DEBUG", "false").lower() == "true"
|
|
|
|
|
|
|
|
-# Groq enrichment is the default for all incoming news.
|
|
|
|
|
-# Set GROQ_ENRICH_OTHER_ONLY=true only if you want to restrict it for cost control.
|
|
|
|
|
|
|
+NEWS_ENTITY_BLACKLIST = [x.strip().lower() for x in os.getenv("ENTITY_BLACKLIST", "").split(",") if x.strip()]
|
|
|
GROQ_ENRICH_OTHER_ONLY = os.getenv("GROQ_ENRICH_OTHER_ONLY", "false").lower() == "true"
|
|
GROQ_ENRICH_OTHER_ONLY = os.getenv("GROQ_ENRICH_OTHER_ONLY", "false").lower() == "true"
|
|
|
-
|
|
|
|
|
-# Limit enriched clusters per refresh call.
|
|
|
|
|
GROQ_MAX_CLUSTERS_PER_REFRESH = int(os.getenv("GROQ_MAX_CLUSTERS_PER_REFRESH", "20"))
|
|
GROQ_MAX_CLUSTERS_PER_REFRESH = int(os.getenv("GROQ_MAX_CLUSTERS_PER_REFRESH", "20"))
|
|
|
|
|
|
|
|
-# Background refresh
|
|
|
|
|
NEWS_REFRESH_INTERVAL_SECONDS = int(os.getenv("NEWS_REFRESH_INTERVAL_SECONDS", "900"))
|
|
NEWS_REFRESH_INTERVAL_SECONDS = int(os.getenv("NEWS_REFRESH_INTERVAL_SECONDS", "900"))
|
|
|
NEWS_BACKGROUND_REFRESH_ENABLED = os.getenv("NEWS_BACKGROUND_REFRESH_ENABLED", "true").lower() == "true"
|
|
NEWS_BACKGROUND_REFRESH_ENABLED = os.getenv("NEWS_BACKGROUND_REFRESH_ENABLED", "true").lower() == "true"
|
|
|
NEWS_BACKGROUND_REFRESH_ON_START = os.getenv("NEWS_BACKGROUND_REFRESH_ON_START", "true").lower() == "true"
|
|
NEWS_BACKGROUND_REFRESH_ON_START = os.getenv("NEWS_BACKGROUND_REFRESH_ON_START", "true").lower() == "true"
|