AI Daily Paper V2:按 Topic 从 RSS、GitHub、明确配置的静态网页采集资讯,过去 24 小时筛选、清洗、领域过滤、合并、历史去重、评分排序后,仅对 Top K 调用 LLM(OpenAI 兼容协议,默认 DashScope 千问),生成中文摘要、标题和导读,以同一个飞书群机器人 interactive card 推送。GitHub Actions 多时段运行(.github/workflows/information-hub.yml,北京时间 08:00~17:00)。
- Python 3.11+,uv 管理依赖
- requests / feedparser / BeautifulSoup / PyYAML(均为硬依赖,无可选降级路径)
uv sync --extra dev # 安装依赖与 pytest
uv run python -m src.main --topic ai --dry-run --top-k 10 # 本地预览(不推送,不写历史)
uv run python -m src.main --topic all --dry-run # 一次预览全部主题
uv run python -m src.main --topic github --dry-run # GitHub 领域预览
uv run python -m src.main --topic ai --date 2026-08-17 --dry-run # 指定自然日调试
uv run python -B -m pytest -q -p no:cacheprovider # 测试configs/
sources.yaml # RSS / GitHub / Webpage 源与多 Topic 绑定,兼容 name + url
topics.yaml # 领域、窗口、Top K、评分权重、关键词、公司名单、Cron
categories.yaml # 分类关键词
prompt_templates.yaml # LLM 提示词模板(summarize / title / digest)
src/
main.py # 单 Topic Pipeline:筛选→合并→历史过滤→评分→排序→Top K→LLM→飞书
topics.py # Topic 校验与关键词匹配
schedule.py # 根据触发 Cron 解析 Topic,不依赖实际启动时间
config.py # 配置加载(.env + 环境变量,Settings 为全局唯一入口)
fetchers/ # rss_fetcher / github_fetcher / webpage_fetcher / source_manager
processors/ # cleaner / deduplicator / classifier / keyword_extractor / hot_scorer / ranker
storage/ # 原子本地 JSON 历史 / GitHub 专用 data branch 状态
llm/ # LLM 客户端 llm_client / 摘要 summarizer / 标题生成 title_generator
publishers/ # 飞书机器人推送 feishu_bot
models/schemas.py # NewsItem / DailyArticle 数据结构
utils/ # 日期工具 date_utils / 重试装饰器 retry
tests/ # pytest(网络层全部 mock,可离线跑)
- LLM 失败不中断流水线:
LLMClient.complete无 key 或调用失败时返回[fallback]前缀文本;上层用is_fallback_response()判断后走模板兜底(summarizer / title_generator 各有自己的 fallback) - 单源失败不中断整轮:
SourceManager.fetch_all对每个源 try/except,失败只记日志 - 飞书推送支持 dry-run:
--dry-run输出卡片 payload 预览,不实际发送 - 配置与代码分离:源、分类、提示词全部在
configs/*.yaml;密钥走环境变量 / GitHub secrets,代码中无业务硬编码 - 去重是合并不是丢弃:重复条目合并来源/链接/标题到
merged_*字段,保留信息量更大的一方作为主体 - 先排名再 LLM:不得在评分排序前截取 Top K;卡片仅对入选条目按分类展示,分类按首次出现排序,组内保留热度顺序
- 手动支持全部主题:Actions 默认
all,CLI--topic all依次生成独立卡片;定时任务仍按 Cron 运行单 Topic。某个 Topic 失败后继续其余主题,最终以非零退出码报告部分失败 - 时间不能编造:缺失/非法发布日期跳过;
--date用指定时区自然日,其余默认滚动 24h - 历史只在成功推送后写入:dry-run 仅读历史;飞书确认成功业务码后保存;CI 使用
information-hub-data分支,每 Topic 一个 JSON,禁止写默认分支 - 离线测试不加载密钥:测试 fixture 设置
LOAD_DOTENV=false,网络由 mock 隔离