Files
news/config.example.toml
connor 2157dfc076
Check / guardrails (push) Successful in 1m36s
Check / bundle (push) Successful in 1m8s
Image / image (push) Successful in 1m50s
Check / check (push) Successful in 1m44s
v0.2 wave 3: AP eng language filter, SourceConfig.name convergence, 12-feed example config with clustering/llm blocks
2026-09-04 09:52:14 -04:00

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