Horizon 新闻雷达:自建中英文 AI 日报

Horizon 是 Thysrael 开源的 AI 新闻雷达,用 Python 写成,把 RSS、Hacker News、Reddit 等来源聚合去重,交给大模型打分筛选,生成中英文每日简报并推送到 Pages、邮件或聊天工具。这篇梳理它的档案机制、配置项和实际使用中踩过的坑,帮你判断值不值得自建。

资讯散落在 RSS 阅读器、论坛和社交平台的时间线里,想每天不漏掉重要的事,代价是把这些地方翻一遍。Horizon 把这套动作交给程序:按你配置的来源定时抓取,用大模型判断每条内容值不值得看,最后拼成一份按类别排好的日报。

Horizon 把 RSS、Hacker News、Reddit 等来源的条目聚合去重,交给大模型打分筛选,产出中英文每日简报。想自建一套稳定信息源、又不想手动翻的人可以用它。

它处理内容的单位是 profile。profile 是一组可复用的编辑规则,规定哪些条目属于这个档案、什么样的内容值得留下、最后要写成什么样子。仓库自带三个示例:tech-news 面向科技新闻,输出事件、影响与社区讨论;tech-blog 面向工程深度文章,输出背景、方案和可上手的要点;ai-creator 面向内容创作者,输出摘要与可用的选题角度。一条内容只会走进一个档案,分析、过滤、去重在前,背景补充和讨论抓取在后,选中的条目按档案分组,成为当天的简报。

Horizon 项目封面图,AI 新闻雷达的中英文日报界面

它不做什么

项目仓库在 Thysrael/Horizon,采用 MIT 许可证,主要语言是 Python,语言占比 99.7%。截至抓取时 Star 9475、Fork 1462、开放 Issue 为 0。

Horizon 不自带大模型能力。所有打分和写作都交给外部模型完成,运行前必须在 .env 里配好所选服务商的 API key。仓库文档给出的 provider 取值覆盖 anthropic、openai、azure、ali、gemini、doubao、minimax 等,具体以官方配置指南为准。

Docker 镜像里没有装 twitter 源需要的 Playwright 浏览器和系统依赖,README 写明了这一点。想用 X 作为来源,得在本地环境自己补齐。

金融新闻源走 OpenBB,属于可选 extra,要单独安装;机器上没有对应预编译包时,还要改成只装二进制的方式手动拉 SDK。

它也不提供内容,全部条目来自你配置的外部来源。Reddit、X 这类站点的可达性由你的网络决定,程序本身不做绕行。

用之前先准备好什么

运行环境方面,本地安装需要 Python 与 uv(用 pip 也可以),或者选 Docker 方式跑 docker compose。开发依赖定义在 pyproject.toml 里,dev 是可选 extra,要跑 pytest 得用 uv sync --extra dev。

密钥方面,准备一个目标服务商的 API key 写进 .env。配置从 .env.example 拷贝,来源清单从 data/config.example.json 拷到 data/config.json 后自行修改。

网络方面,要访问 Reddit、X、Telegram 这类境外站点的用户,需要自备可达的网络路径。Issue 里有相当多关于 Reddit 访问失败的讨论。

主要功能

  • 多来源聚合:内置 RSS、Hacker News、Reddit、Telegram、X、GitHub 以及金融新闻等来源类型。RSS 在 sources.rss 下按数组配置,每条写 name、url 和可选的 profile。
  • 档案式筛选:来源的 profile 字段填具体档案名就直接使用;留空或写 "auto",交给 AI 在所有档案里匹配;写成数组如 ["tech-news", "finance-news"],就把 AI 的匹配范围限制在这几个档案内。
  • 打分与主题去重:每个档案能在 processing.profile_settings 里设 threshold 和 topic_dedup。低于阈值的条目被丢掉,重复报道的同一话题在档案内合并。这类用户偏好写在 processing.profile_settings,不写进档案文件本身。
  • 内容加工模板:每条内容要输出摘要、背景、解决方案还是要点,由 Markdown 提示词和 JSON block 定义控制。仓库自带的三个示例档案可以直接改,多数情况下不用动 Python 代码。
  • 平衡摘要:digest.max_items 限制整份日报的条目上限,digest.category_groups 给每个分组单独设 limit,避免某个热门话题把版面占满。分组依据来自来源配置里的 category 字段。
  • 多渠道分发:日报以 Markdown 形式生成,可以发布到 GitHub Pages,也可以走邮件或 webhook 推送到飞书、钉钉等,支持英文与中文两种输出。README 提到已支持 GitHub Pages、Webhook、Email、MCP 等输出与集成方式。
  • 配置向导:uv run horizon-wizard 用问答方式收集你的兴趣方向,自动生成 data/config.json,省去手写来源清单。
  • MCP 接入:除了用命令行跑完整流水线,AI 助手也能通过 MCP 调用它的各个阶段。

安装与最短示例

本地安装用 uv,或者退回 pip:

git clone https://github.com/Thysrael/Horizon.git
cd Horizon

# uv(推荐)
uv sync

# 或者 pip
pip install -e .

Docker 方式在首次运行前构建镜像,可选 extra 用逗号分隔写在 EXTRAS 参数里:

git clone https://github.com/Thysrael/Horizon.git
cd Horizon

docker compose build --build-arg EXTRAS=openbb horizon

装完之后,用向导生成配置,再跑一次完整流水线:

uv run horizon-wizard
uv run horizon

不走向导的话,先拷贝两份模板文件,再自己填 key 和来源:

cp .env.example .env
cp data/config.example.json data/config.json

一份最小配置长这样,ai 段声明模型服务,sources 段列出要抓的源,processing 段指定档案目录与阈值:

{
  "ai": {
    "provider": "openai",
    "model": "gpt-4",
    "api_key_env": "OPENAI_API_KEY"
  },
  "sources": {
    "rss": [
      {
        "name": "Simon Willison",
        "url": "https://simonwillison.net/atom/everything/",
        "profile": "tech-news"
      }
    ]
  },
  "processing": {
    "profiles_dir": "profiles",
    "default_profile": "tech-news",
    "profile_settings": {
      "tech-news": {
        "threshold": 7.0,
        "topic_dedup": true
      }
    }
  }
}

关键参数

ai 下面有四个常用字段:provider 选服务商,model 填模型名,api_key_env 指向存放密钥的环境变量名,temperature 控制输出随机性,示例配置里给的是 0.3。

processing 下面,profiles_dir 是档案文件所在目录,默认 profiles;default_profile 是没指定档案时用的兜底项;profile_settings 按档案名分组,每组写 threshold 和 topic_dedup。

digest 下面,max_items 是整份日报的条目上限,category_groups 里每个分组写 limit 与 categories 数组。

来源项的 profile 字段支持三种写法:具体档案名、字符串 "auto"、或者字符串数组。仓库没有在这段文档里说明字段缺失时的隐含默认值,配之前最好对着配置指南核一遍。

结果在哪里看

跑完一次会先在终端打出处理日志。生成物是英文与中文两份 Markdown 简报,发布目标由你配置的分发方式决定:GitHub Pages、邮件、webhook 推送到聊天工具,或者通过 MCP 交给 AI 助手。仓库 README 的这段节选没有写明 Markdown 文件落在哪个目录,需要看完整配置指南确认。

Issue 区还出现过让第三方系统主动拉取日报的需求,希望能提供 HTTP API,这条请求的状态是已解决。

实际使用中的坑

Reddit 访问失败是出现最多的一类问题,18 条评论。用户挂了代理仍然报错,用 curl 直接请求也失败,最终按已解决关闭。拿 Reddit 当来源之前,先确认网络路径真的通。

找不到 .env 文件、不知道该在哪里填 API key,是第二高频的问题,16 条评论。仓库里只有 .env.example,得自己复制成 .env;只设系统环境变量不一定生效。该问题已解决。

钉钉机器人按模板配好参数、运行不报错,但一直收不到消息,10 条评论,已解决。同类困扰还包括正文太长发不过去。

配 deepseek 时启动报配置校验错误,提示 ai.provider 只接受若干取值。这条也已解决,说明 provider 列表在版本之间变过,升级或换版本时留意配置指南。

同类项目对比

下面两个项目与 Horizon 能解决部分相同的问题,重合点在飞书类通知推送与信息聚合,不重合的地方在整条流水线的覆盖范围。放在这里给同类选型的读者做参照。

项目适合谁部署方式主要限制什么情况下选它更合适项目地址
Horizon想每天收到中英文精选日报、愿意自己维护新闻源与模型密钥的人本地 Python 安装(uv sync 或 pip install -e .),或 docker compose必须自备大模型 API key;twitter 源依赖 Playwright,Docker 镜像未装;Reddit 等来源受网络可达性限制你要的是一条从抓取、筛选、加工到分发的完整流水线Horizon
know-where(知归)习惯把公众号、掘金、小红书等链接随手存下来、事后再让 AI 归档的个人仓库没有说明面向单条链接的归档整理,不负责定时抓取多源并打分排序你的场景是「看到好文章先存、事后再整理」,不需要每天被动收简报know-where
ANotify已有内容产出、只缺推送环节的开发者仓库没有说明只做通知发送,不做内容抓取、筛选与摘要你缺的只是把结果推到企业微信、飞书等多个渠道的一个组件ANotify

只想把通知推出去,ANotify 这类工具比 Horizon 省事得多,Horizon 要同时维护模型密钥、来源清单和运行环境三样东西。手上是一堆零散文章链接、想事后归档,know-where 的做法更贴近。Horizon 的价值集中在每天自动产出一份筛过的日报,如果你根本不想维护筛选标准和来源清单,它的配置成本会显得偏高。

合规边界

Horizon 会按你配置的来源主动抓取外部站点内容,包括 Reddit、X、Telegram 和各类 RSS。抓取范围只应覆盖自有资产或已获得授权的目标,同时遵守目标站点的服务条款与抓取约定。把抓取结果二次分发、商用,或者在未授权的情况下高频请求,可能触发平台封禁,也可能带来著作权与不正当竞争方面的法律风险。定期生成的简报里如果包含第三方原文,公开传播前先确认授权情况。

适合谁

Horizon 适合每天要盯一批固定信息源、又不想一条条翻的人:技术团队的资讯岗、需要跟踪竞品动态的从业者、想同时拿到中英文简报的独立开发者。愿意花一次时间配好来源和筛选阈值,之后每天收一份结果,这套流程就成立。

只想把推送接到手机上、不打算维护大模型密钥和来源配置的人,用现成的通知工具或订阅服务更划算。对境外来源的可达性没有把握、又不愿意处理网络问题的用户,也会在上手阶段卡住。

内容核验说明

一份自建 AI 日报的实操清单,重点落在容易略过的地方:profile 怎么定义筛选和输出,threshold 与 category_groups 怎么限制版面,provider 取值在版本之间变过。Star 数与安装路径可以当选型起点,Reddit 可达性、镜像缺 Playwright 这类前置条件交代得直白。

Star、Fork、开放 Issue 数量与语言占比取自 GitHub 页面公开披露,诀.com 未独立验证;文中按问题分类统计的 Issue 条数同样未经复核。安装步骤、配置字段与 provider 取值以仓库当前文档为准,版本间可能已变。项目没有提供可复现的测试或基准数据,实际产出效果取决于来源清单、模型与网络环境,不保证复现。

项目来源与说明

开源项目:Thysrael(Thysrael)

本文由诀.com 编辑基于该项目的公开信息独立撰写,属原创解读,不是对项目文档的翻译或转载;文中提到的功能与参数以官方仓库为准,代码与文档版权归原作者所有。

查看项目仓库