技術解析 · Field Manual 2026-05-30 版本快照
github.com/Thysrael/Horizon · 5.1k+ ★
Hz
AI News Radar / Personal Briefing Pipeline

多來源抓取、AI 打分與分發的新聞雷達

Horizon 是一個 Python 與 uv 驅動的自架 AI 新聞雷達。它從 RSS、Hacker News、Reddit、Telegram、Twitter/X、GitHub、OpenBB 與 OSSInsight 抓取內容,先做去重與 AI 重要性打分,再補背景、整理社群討論,最後產出中英雙語 Markdown 日報,並能發布到 GitHub Pages、Email、Webhook 或 MCP Server。

3.11+
Python Runtime
8 src
News Source Families
12 MCP
Agent Tools
MIT
Open License
01
Repository Signal

可分段編排的多來源資訊篩選系統

Horizon 把「資訊來源、重要性判斷、背景補全、摘要輸出」拆成一條明確 pipeline。使用者保留自己的來源設定,AI 負責初篩,只有通過分數閾值的條目才進入後續摘要流程。

GitHub metadata 顯示這個 repo 以 Python 為主,採 MIT 授權,首頁指向 horizon1123.top,主題包含 newsllmmcpwebhookfeishu-botopenclaw。中文 README 把它定位為「你專屬的 AI 新聞雷達」,而不是單純的摘要工具。

這份手冊建議用兩個角度看 Horizon:第一,它是個人或團隊的每日情報中台;第二,它是可以被 Codex、Claude Code、Cursor 或其他 MCP client 呼叫的 staged news pipeline。後者是它最值得拆解的地方,因為 fetch、score、filter、enrich、summarize 都被做成可重入階段。

02
Operating Model

標準流程是抓取、去重、打分、補全、生成與分發。

Horizon Daily Run
Sources Fetch Deduplicate AI Score Enrich Summaries Distribution

src/orchestrator.py 是主要協調器。它先根據 time_window_hours 或 CLI 的 --hours 決定時間窗,再並發呼叫各種 scraper。接著會合併跨來源重複 URL,送入 AI analyzer,依 ai_score_threshold 篩選重要條目,做主題層面的語義去重,必要時展開 Twitter 討論,最後補背景並針對每個設定語言生成日報。

資料模型集中在 src/models.py。每一筆新聞都會被統一成 ContentItem,包含來源類型、標題、URL、作者、發布時間、metadata,以及 AI 後處理欄位:分數、理由、摘要與標籤。這個統一模型讓 RSS、HN、Reddit、OpenBB 或 GitHub release 可以進入同一個判斷流程。

階段對應模組判讀重點
Fetchsrc/scrapers/*來源插件化,支援 GitHub、HN、RSS、Reddit、Telegram、Twitter、OpenBB、OSSInsight。
Analyzesrc/ai/analyzer.py使用可選 provider 對內容打 0-10 分,搭配理由、摘要與 tags。
Enrichsrc/ai/enricher.pysrc/search.py對高分內容補陌生概念、專案、公司或技術背景。
Summarizesrc/ai/summarizer.py依語言產出 Markdown 日報,並複製到 GitHub Pages posts。
Deliversrc/services/email.pywebhook.py支援 SMTP/IMAP 訂閱、Feishu/DingTalk/Slack/Discord/自訂 webhook。
03
Install & First Run

本地用 uv, 自動化用 Docker 或 GitHub Actions。

pyproject.toml 顯示 Horizon 需要 Python >=3.11,核心依賴包含 httpxfeedparseranthropicopenaigoogle-genaipydanticddgsbeautifulsoup4markdownmcp。開發依賴在 dev extra,金融新聞源 OpenBB 則在 openbb extra。

# 本地安裝 git clone https://github.com/Thysrael/Horizon.git cd Horizon uv sync # 開發測試依賴 uv sync --extra dev # OpenBB 金融新聞源 uv sync --extra openbb
# 建立環境與來源設定 cp .env.example .env cp data/config.example.json data/config.json # 互動式來源設定向導 uv run horizon-wizard # 執行預設 24 小時新聞雷達 uv run horizon uv run horizon --hours 48
Docker 模式使用 docker compose run --rm horizon。定時化可以直接參考 repo 的 .github/workflows/daily-summary.ymldeploy-docs.yml,把生成的 Markdown 發布到 GitHub Pages。
04
Module Map

每個處理層均可獨立替換、觀察與重跑。

Source Graph

多來源抓取器

RSS/HN/Reddit/Telegram/Twitter/GitHub/OpenBB/OSSInsight 都包成 scraper,輸出統一 ContentItem。新增來源時先看 src/scrapers/base.py 與現有測試。

Preference Layer

JSON 設定即個人品味

data/config.json 控制來源、模型、語言、閾值與分發方式。任意字串值可用 ${VAR_NAME} 引用環境變數,適合放私有 feed 或 webhook。

AI Gateway

多模型 Provider

README 與 docs 列出 Claude、OpenAI、Azure OpenAI、Gemini、DeepSeek、豆包、MiniMax、Ollama 與 OpenAI-compatible API。可設 throttle 與 concurrency。

Filtering

0-10 分的閱讀門檻

先讓 AI 對候選內容評分,再以 ai_score_threshold 篩選。這比「全部摘要」更接近人工編輯台:重點是省掉不值得看的條目。

Enrichment

背景與社群討論

高分新聞會補充背景資訊,並可整理 Hacker News、Reddit、Twitter/X 這類社群討論,讓日報不是只有標題摘要。

Output

Markdown 是中心格式

日報先落在 data/summaries/,再複製到 docs/_posts 供 GitHub Pages 使用,也能走 Email、Webhook 或 MCP artifact。

MCP

Agent 可操作的階段工具

horizon-mcp 提供 validate、fetch、score、filter、enrich、summary、run_pipeline、list_runs 等工具,讓 AI 助手能分段調用新聞流程。

Tests

測試覆蓋重點模組

tests/ 包含 analyzer、summarizer、RSS、Reddit、Twitter、OpenBB、Email、Webhook 與 MCP service smoke tests。修改來源或分發層時先跑相關測試。

05
Configuration Pattern

從少量可信來源開始, 再讓 AI 幫你擴展。

最小可用配置只需要一個 AI provider、一組來源與分數閾值。建議不要一開始就塞滿所有平台;先用 5-15 個高品質 RSS、幾個 GitHub release、少量 subreddit 或 HN top stories,確認日報品質後再擴充。

{ "ai": { "provider": "openai", "model": "gpt-4", "api_key_env": "OPENAI_API_KEY", "analysis_concurrency": 1, "enrichment_concurrency": 1 }, "sources": { "rss": [ { "name": "Simon Willison", "url": "https://simonwillison.net/atom/everything/", "enabled": true, "category": "ai-tools" } ], "hackernews": { "enabled": true, "fetch_top_stories": 20, "min_score": 100 } }, "filtering": { "ai_score_threshold": 6.0, "time_window_hours": 24 } }
調校旋鈕建議常見失誤
ai_score_threshold從 6.0 或 7.0 起步,依日報數量調整。閾值太低會變成另一個資訊垃圾桶。
time_window_hours日報用 24,小週報可拉長到 72 或 168。時間窗過長會讓熱門舊文反覆出現。
analysis_concurrency付費 API 或自架 endpoint 可提高到 2-4。免費額度或代理服務容易被限流。
來源清單保留你真的願意閱讀的來源。用數量替代品味,導致 AI 只是在濾雜訊。
06
Agent Interface

MCP 讓 Horizon 從排程工具變成可查詢的研究服務

src/mcp/README.md 明確說明 MCP layer 不重寫商業邏輯,而是重用 Horizon 原本的 fetch、score、filter、enrich、summarize 模組。這是很好的 agent 工程設計:工具層只負責分段入口與 artifacts,核心判斷仍在主程式。

MCP run artifacts 會寫入 data/mcp-runs/<run_id>/,包含 meta.jsonraw_items.jsonscored_items.jsonfiltered_items.jsonenriched_items.jsonsummary-<lang>.md。這讓你能讓 Codex 先抓取,再人工檢查 scored stage,最後只重跑摘要。

uv sync uv run horizon-mcp # MCP tools include: hz_validate_config hz_fetch_items hz_score_items hz_filter_items hz_enrich_items hz_generate_summary hz_run_pipeline hz_list_runs hz_get_run_meta hz_get_run_stage hz_get_run_summary hz_get_metrics
對內容團隊而言,MCP 版本較典型的用法是把「今日 AI/開源/金融/競品動態」做成可被代理查詢的內部情報服務,再讓 agent 產出週報、社群貼文或產品策略摘要,而不是每天全量盲跑。
07
Operational Notes

新聞自動化最容易失控的地方不是程式, 是來源與判斷標準。

  • 不要把 AI 分數當真相。 它是排序工具,不是事實查核。高分內容仍需要保留來源連結與人工判斷。
  • 保護 API keys 與私有 feed。 使用 .env${VAR_NAME} 引用敏感值,不要把私有 RSS、Webhook URL 或模型 key commit 到 repo。
  • 注意平台條款。 Reddit、Twitter/X、Telegram 與金融資料源都有各自的使用限制;團隊部署前要確認抓取頻率與分發方式。
  • 先建立你的 editorial rubric。 如果沒有明確偏好,Horizon 只會把大眾熱度包裝得更漂亮。先定義「什麼值得你看」。
  • GitHub Actions 適合公開日報, 不一定適合私有情報。 內部競品、客戶、投資或安全資訊應放在私有部署與受控分發渠道。
08
Advanced Playbook

把 Horizon 做成團隊情報系統的五個切入點。

01

分領域設定檔

為 AI、開源、金融、競品、資安建立不同 config.json,避免一份日報混雜所有任務。

02

保留 scored artifacts

不要只看最終 summary。定期審核 scored_items,調整來源、prompt、threshold 與模型。

03

接到內容工作流

Webhook 可推到 Slack/Discord/飛書,再由 Codex 或 Claude 轉成 newsletter、LinkedIn、部落格選題。

04

用 MCP 做查詢層

讓 agent 讀取某次 run 的 filtered/enriched stage,再回答「本週最值得追的三個 repo 是什麼」。

05

建立來源貢獻機制

README 已把分享來源導向 horizon1123.top。團隊內也可以建立一個小型 source review 流程。