Horizon 完整配置指南:5 步跑通 AI 新闻雷达日报管道
Horizon 完整配置指南:5 步跑通 AI 新闻雷达日报管道
【免费下载链接】Horizon📡 Your own AI-powered news radar. Generates daily briefings in English & Chinese. | 用 AI 构建你专属的新闻雷达项目地址: https://gitcode.com/gh_mirrors/horizon39/Horizon
早上要花一小时刷 20 个网站找行业新闻的,缺的不是时间,是过滤器。Horizon 是一个 AI 新闻雷达:它按你配置的信息源抓取 RSS、Hacker News、Reddit 等内容,交给 AI 模型评分和总结,再按data/config.json里的推送设置,把中英双语日报送到你的邮箱或飞书群。下面按"原理 → 配置拆解 → 跑通步骤 → 调优 → 排错"的顺序讲清楚。
Horizon 工作原理:信息源到日报的生成链路 📡
一次uv run horizon的执行链路是:先按collection.time_window_hours定义的时间窗从各信息源抓取条目;每条内容被路由到一个处理档案(tech-news、tech-blog、finance-news等),由该档案的评分规则打 0–10 分;达到你设定阈值的条目进入下一轮,先做主题去重,再按分类配额选出最终条目;然后 AI 对入选条目做富化总结,按ai.languages生成 Markdown 日报,落到data/summaries/;最后按 email、webhook、wechat 配置推送。理解这条链路后,你就知道每个配置字段卡在哪个环节上。
Horizon config.json 逐项拆解:模型、信息源、过滤与推送
AI 模型与 API 密钥配置
ai段决定用哪个模型来评分和总结。api_key_env填的是环境变量名而不是密钥本身,密钥放在.env里。
"ai": { "provider": "openai", "model": "gpt-4", "api_key_env": "OPENAI_API_KEY", "temperature": 0.3, "throttle_sec": 0 }- 支持的 provider 包括
openai、anthropic、gemini、azure、minimax、ali(通义)、ollama,各有对应的api_key_env变量名 - 走代理或私有网关时加
base_url字段即可,密钥仍不进 JSON 文件 - 本地模型用
provider: "ollama",api_key_env留空,base_url指向你的 Ollama 地址
添加 RSS、Hacker News 与 Reddit 信息源
信息源全部在sources段下,每种源独立启停,互不影响。以 RSS 为例,一条订阅就是一个对象:
"rss": [ { "name": "My Blog", "url": "https://example.com/feed.xml", "enabled": true, "category": "ai-ml", "profile": "auto" } ]category是你自定义的分类标签,后面digest.category_groups会用它做配额profile指定该源归哪个档案评分;"auto"或省略则交给 AI 匹配- Hacker News、Reddit 等结构化源同样支持限流字段,直接控制抓取量:
{ "hackernews": { "enabled": true, "fetch_top_stories": 20, "min_score": 100 }, "reddit": { "enabled": true, "subreddits": [{ "subreddit": "MachineLearning", "sort": "hot", "fetch_limit": 15, "min_score": 50 }] } }设置 AI 评分阈值与抓取时间窗
评分阈值是整条管道里最像"信息过滤器"的开关:每个档案一个threshold,低于分数的条目不进日报,topic_dedup控制同主题是否合并。
{ "processing": { "default_profile": "tech-news", "profile_settings": { "tech-news": { "threshold": 7.0, "topic_dedup": true } } }, "collection": { "time_window_hours": 24 } }threshold支持 0–10,设为null表示只评分不过滤,适合先观察分数分布- 内置档案默认值有差异:
tech-news7.0 偏严,tech-blog4.0 偏宽,可按口味覆盖 time_window_hours决定只抓最近 N 小时的内容,窗口太大会让评分成本线性上涨
邮件订阅与飞书 Webhook 推送
email段用 SMTP 发日报,用 IMAP 检查订阅/退订邮件,适合团队内部分发:
"email": { "enabled": true, "smtp_server": "smtp.qq.com", "smtp_port": 465, "email_address": "your@email.com", "password_env": "EMAIL_PASSWORD", "sender_name": "Horizon Daily" }password_env同样指向环境变量名,密码写进.env- 只发不收的 SMTP 服务商把
imap_enabled设为false - 收件人通过向
email_address发主题含SUBSCRIBE的邮件自助订阅
webhook段把日报推到飞书、钉钉、Slack 等群机器人:
"webhook": { "enabled": true, "url_env": "HORIZON_WEBHOOK_URL", "platform": "feishu", "layout": "collapsible", "languages": ["zh"] }url_env指向存放机器人 URL 的环境变量,密钥类信息不落 JSON- 飞书想渲染成折叠卡片就
platform: "feishu"+layout: "collapsible";其他平台用layout: "markdown" delivery选summary(一条完整消息)或summary_and_items(总览 + 每条新闻单独一条),后者适合对长消息限制严格的平台languages只作用于 webhook,例如["zh"]只推中文版日报
用环境变量保护敏感值
配置里任何字符串字段都支持${VAR_NAME}语法,运行时从环境变量(含.env)展开。付费 RSS、私有网关地址、webhook 鉴权头都能借此脱敏:
"sources": { "rss": [ { "name": "Paid Feed", "url": "https://example.com/feed?key=${FEED_KEY}", "enabled": true } ] }对应地,把真实值写进仓库根目录的.env:
OPENAI_API_KEY=sk-YOUR_API_KEY FEED_KEY=YOUR_FEED_KEY HORIZON_WEBHOOK_URL=https://example.com/hook- 未设置的变量会原样保留为
${NAME},让配置错误显式暴露而不是变成空字符串 - 这样
config.json可以放心提交版本控制,.env加入.gitignore
从零跑通 Horizon 配置流程
- 克隆仓库:
git clone https://gitcode.com/gh_mirrors/horizon39/Horizon - 生成配置:
uv run horizon-wizard(按兴趣问答,自动生成data/config.json;也可手动cp data/config.example.json data/config.json) - 把 API 密钥写入仓库根目录的
.env,变量名与api_key_env一致 - 打开
data/config.json,确认 AI provider 和想启用的信息源,其余源保持enabled: false - 验证:
uv run horizon --hours 1
最后一步只抓取最近 1 小时内容,终端会依次输出各源抓取数、AI 评分进度,收尾显示"入选 N / 抓取 M 条",日报 Markdown 落在data/summaries/。看到这条输出,配置就算跑通了。
Horizon 进阶调优:并发限流、双语日报与自定义评分 🔧
并发与限流控制 API 节奏
把ai.throttle_sec改为 4.5(约每分钟 13 次的免费档限速),analysis_concurrency提高到 4,效果是评分吞吐上去了但不会触发 429;配额充足时把throttle_sec改回 0 拿最大速度。
"ai": { "throttle_sec": 4.5, "analysis_concurrency": 4, "enrichment_concurrency": 2 }双语日报设置
把ai.languages改成["en", "zh"],日报、webhook、wechat 各渠道都会同步生成两种语言版本;只想要单一语言时改成["zh"],或省略它只用默认的["en"]。
"ai": { "languages": ["en", "zh"] }自定义评分标准
改processing.profile_settings里对应档案的threshold可以快速调松紧;想改"什么算高分"本身,编辑profiles/<档案>/analysis.md中的评分规则(rubric),例如把"工程深度文章"从 7 分档提到 9 分档,当天即生效。
微信渠道长文拆分
开启wechat.enabled: true并设chunk_size: 4000,长日报会按段落边界拆成多条微信消息发送;先用uv run horizon-wechat login扫码绑定机器人。
"wechat": { "enabled": true, "languages": ["zh"], "chunk_size": 4000 }Horizon 配置排错速查:5 个高频问题
| 现象 | 原因 | 修复 |
|---|---|---|
| 启动即报 JSON 解析错误 | config.json多了或少了逗号 | 用任意 JSON 校验工具检查,data/config.example.json是结构基准 |
| AI 评分全部认证失败 | api_key_env填的是变量名,但.env里没这个变量或名字不一致 | 核对.env中的变量名与配置完全一致后重跑 |
| 飞书收到的是纯文本而非卡片 | platform/layout组合不对 | 设platform: "feishu"且layout: "collapsible" |
| Twitter 源抓取失败或被限流 | 缺少 cookie 文件或 cookie 过期 | 按docs/twitter-cookies.md导出 cookie 保存为data/x_cookies_1.json,多账号可建多个文件轮询 |
| 日报条目少得可怜 | 阈值过高或时间窗太窄 | 调低profile_settings中的threshold(或设null观察分数),同时调大collection.time_window_hours |
Horizon 延伸资源:文档与源码目录
- 完整配置参考 —— 所有字段、provider 示例与推送模板变量
- 评分体系与管道说明 —— 打分分档、去重与配额执行的顺序
- 内置处理档案 ——
tech-news等档案的match.md/analysis.md/enrichment.md提示词 - 信息源抓取器源码 —— 每种源的实现,加新源从这里入手
- AI 分析与总结源码 —— 评分、富化、翻译的调用链
下一步建议:先用 1 个 RSS 源加一个 4.0 的宽阈值跑一轮完整管道,确认日报内容形态符合预期,再逐源开启、逐步收紧threshold。
【免费下载链接】Horizon📡 Your own AI-powered news radar. Generates daily briefings in English & Chinese. | 用 AI 构建你专属的新闻雷达项目地址: https://gitcode.com/gh_mirrors/horizon39/Horizon
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考