159 lines
4.4 KiB
TOML
159 lines
4.4 KiB
TOML
# Example configuration for news-triage.
|
|
#
|
|
# Copy to ~/config/news/config.toml (mounted read-only at /config/config.toml
|
|
# in the container) and edit. The sources, [notify], and [topics] sections
|
|
# are required; poll_interval_secs is optional (defaults to 300 seconds).
|
|
# The [clustering] and [llm] sections are optional too — they are spelled
|
|
# out below with their defaults ([llm] ships disabled). The server reloads
|
|
# this file on SIGHUP.
|
|
|
|
# Feed sources to poll. kind is "rss" or "news-sitemap".
|
|
#
|
|
# name is optional: when set, it becomes the publisher label used for
|
|
# distinct-source story counting (both BBC feeds share "BBC" so the double
|
|
# feed counts as one publisher); when omitted, an existing row keeps its
|
|
# name (seeded rows like "Al Jazeera" and "AP") and a new row defaults to
|
|
# its URL.
|
|
[[sources]]
|
|
url = "https://www.aljazeera.com/xml/rss/all.xml"
|
|
kind = "rss"
|
|
weight = 1.0
|
|
enabled = true
|
|
poll_interval_secs = 300
|
|
|
|
[[sources]]
|
|
url = "https://feeds.bbci.co.uk/news/world/rss.xml"
|
|
kind = "rss"
|
|
name = "BBC"
|
|
weight = 1.2
|
|
enabled = true
|
|
|
|
[[sources]]
|
|
url = "https://apnews.com/news-sitemap-content.xml"
|
|
kind = "news-sitemap"
|
|
weight = 0.9
|
|
enabled = true
|
|
|
|
# The nine feeds below were added in v0.2 (all verified live 2026-09-03).
|
|
# Not included: DW (RSS 1.0/RDF — unsupported parser, silently yields zero
|
|
# items) and Reuters (no public RSS).
|
|
[[sources]]
|
|
url = "https://feeds.bbci.co.uk/news/rss.xml"
|
|
kind = "rss"
|
|
name = "BBC"
|
|
weight = 1.1
|
|
enabled = true
|
|
poll_interval_secs = 600
|
|
|
|
[[sources]]
|
|
url = "https://theguardian.com/world/rss"
|
|
kind = "rss"
|
|
name = "Guardian World"
|
|
weight = 1.1
|
|
enabled = true
|
|
poll_interval_secs = 900
|
|
|
|
[[sources]]
|
|
url = "https://rss.nytimes.com/services/xml/rss/nyt/World.xml"
|
|
kind = "rss"
|
|
name = "NYT World"
|
|
weight = 1.1
|
|
enabled = true
|
|
poll_interval_secs = 900
|
|
|
|
[[sources]]
|
|
url = "https://feeds.npr.org/1001/rss.xml"
|
|
kind = "rss"
|
|
name = "NPR"
|
|
weight = 1.0
|
|
enabled = true
|
|
poll_interval_secs = 900
|
|
|
|
[[sources]]
|
|
url = "https://feeds.skynews.com/feeds/rss/world.xml"
|
|
kind = "rss"
|
|
name = "Sky World"
|
|
weight = 0.9
|
|
enabled = true
|
|
poll_interval_secs = 600
|
|
|
|
[[sources]]
|
|
url = "https://cbc.ca/webfeed/rss/rss-world"
|
|
kind = "rss"
|
|
name = "CBC World"
|
|
weight = 0.9
|
|
enabled = true
|
|
poll_interval_secs = 900
|
|
|
|
[[sources]]
|
|
url = "https://abc.net.au/news/feed/51120/rss.xml"
|
|
kind = "rss"
|
|
name = "ABC AU"
|
|
weight = 0.9
|
|
enabled = true
|
|
poll_interval_secs = 600
|
|
|
|
[[sources]]
|
|
url = "https://pbs.org/newshour/feeds/rss/headlines"
|
|
kind = "rss"
|
|
name = "PBS NewsHour"
|
|
weight = 0.9
|
|
enabled = true
|
|
poll_interval_secs = 1800
|
|
|
|
[[sources]]
|
|
url = "https://france24.com/en/rss"
|
|
kind = "rss"
|
|
name = "France24"
|
|
weight = 0.9
|
|
enabled = true
|
|
poll_interval_secs = 1200
|
|
|
|
[notify]
|
|
notify_opinions = true
|
|
quiet_hours_start = "22:00"
|
|
quiet_hours_end = "07:00"
|
|
budget_refill_per_day = 2.0
|
|
budget_burst = 3.0
|
|
bypass_ceiling_per_day = 4
|
|
# Relevance-percentile thresholds: notify_percentile gates immediate
|
|
# real-time pushes; digest_floor_percentile is the lower edge of the daily
|
|
# digest band. Both optional (defaults 90 and 75).
|
|
notify_percentile = 90.0
|
|
digest_floor_percentile = 75.0
|
|
# Bypass-lane floor (importance percentile) and the source-count delta that
|
|
# re-opens an already-notified cluster. Both optional (defaults 99.0 and 2).
|
|
bypass_importance_percentile = 99.0
|
|
material_update_source_delta = 2
|
|
# IANA timezone for quiet hours, the 07:00 digest boundary, and the 03:00
|
|
# pruning schedule. Optional (default "America/Louisville").
|
|
timezone = "America/Louisville"
|
|
|
|
[topics]
|
|
interests = ["middle east", "ukraine", "science"]
|
|
blocklist = ["royal", "celebrity"]
|
|
|
|
# Lexical-clustering tunables; every field is optional and defaults to the
|
|
# value shown. A merge needs score >= similarity_threshold AND at least
|
|
# corroboration_min shared non-proper-noun title tokens; pairs scoring in
|
|
# the gray_zone_width band below the threshold are routed to the LLM layer.
|
|
[clustering]
|
|
similarity_threshold = 0.45
|
|
window_hours = 48
|
|
gray_zone_width = 0.15
|
|
corroboration_min = 2
|
|
proper_noun_weight = 2.0
|
|
|
|
# LLM consolidation layer for gray-zone pairs. Ships disabled: the pipeline
|
|
# runs exactly as without it until enabled is flipped to true. base_url is
|
|
# the LiteLLM proxy root and model the exact flash-class model string; the
|
|
# API key is read from api_key_env at call time. daily_budget_calls is an
|
|
# approximate per-UTC-day call cap (a restart resets it).
|
|
[llm]
|
|
enabled = false
|
|
base_url = ""
|
|
model = ""
|
|
api_key_env = "LITELLM_API_KEY"
|
|
timeout_secs = 10
|
|
daily_budget_calls = 200
|