界面已本地化;技能介绍与说明文档按所选语言由 AI 自动翻译,代码、命令、路径和专业术语保留原文,以原作者文档为准。
探索技能
开发与工程 · SKILL.md

morning-newspaper-assistant-skill

morning-newspaper-assistant-skill

【开发与工程】当用户希望生成 AI 早报、运行晨报链路、查看今日资讯摘要,或消息中包含”早报””晨报””今日资讯””新闻摘要”等关键词时触发。

独立 GitHub 快照 · 自动分类 · 以原作者文档为准

技能说明

GitHub

name: morning-newspaper-assistant-skill description: 当用户希望生成 AI 早报、运行晨报链路、查看今日资讯摘要,或消息中包含”早报””晨报””今日资讯””新闻摘要”等关键词时触发。

Morning Newspaper Assistant Skill

当用户希望运行中文 AI 晨报助手链路、生成 top10_publishable.json、输出静态页面、启动 8510 固定链接,或者排查邮箱提醒与成稿稳定性时,使用本 Skill。

项目依赖

这个 Skill 依赖完整项目仓库,不能只拷贝 SKILL.md 单独使用。

按以下顺序定位项目根目录:

  1. 环境变量 MORNING_NEWSPAPER_ROOT
  2. ~/projects/agentic-ai/morning-newspaper
  3. ~/.openclaw/workspace/morning-newspaper

若这些路径都不存在,应明确告诉用户:当前环境尚未部署完整项目仓库,请先完成部署。

主要入口:

  • <repo_root>/scripts/run_daily_pipeline.py
  • <repo_root>/config/sources.yaml

稳定目标

  1. runtime/top10_publishable.json 稳定为 10 条
  2. runtime/dashboard.html 稳定可生成
  3. 8510 固定链接稳定可用
  4. 右侧”今日待办提醒”优先读取真实邮箱结果,而不是占位 JSON
  5. 如果 IMAP 连通但收不到新邮件,自动继续走 POP3 fallback

稳定工作流

A. 每日稳定主流程

重要:不要直接执行 run_daily_pipeline.py。 该脚本是批处理入口,不会生成 LLM 结果文件。必须按以下步骤逐步执行,在每个"LLM 关口"处读取 prompt 文件、生成结果、再继续。

第一阶段:采集与准备

python3 scripts/collect_mailbox.py
python3 scripts/collect_raw.py
python3 scripts/enrich_content.py
python3 scripts/prepare_title_shortlist.py

产出:

  • runtime/collected_raw.json
  • runtime/content_enriched.json
  • runtime/title_candidates.json
  • runtime/title_shortlist_prompt.txt

LLM 关口 1:标题粗筛

读取 runtime/title_shortlist_prompt.txt,按 prompt 要求生成结果,写入 runtime/title_shortlist_result.json。

必须基于本轮 title_candidates.json 生成,不能复用旧文件。

然后继续:

python3 scripts/apply_title_shortlist.py
python3 scripts/prepare_draft_input.py

产出:runtime/shortlist.json、runtime/draft_input.json、runtime/draft_prompt.txt

LLM 关口 2:中文成稿

读取 runtime/draft_prompt.txt,按 prompt 要求生成结果,写入 runtime/draft_result.json。

必须基于本轮 draft_input.json 生成,不能复用旧文件。

然后继续:

python3 scripts/apply_draft_results.py
python3 scripts/prepare_top10_ranking.py

产出:runtime/drafted_items.json、runtime/top10_ranking_input.json、runtime/top10_ranking_prompt.txt

LLM 关口 3:Top10 精排

读取 runtime/top10_ranking_prompt.txt,按 prompt 要求生成结果,写入 runtime/top10_ranking_result.json。

必须基于本轮 top10_ranking_input.json 生成,不能复用旧文件。

然后继续:

python3 scripts/apply_top10_ranking.py
python3 scripts/build_dashboard.py
python3 scripts/check_runtime_status.py

产出:runtime/top10_publishable.json、runtime/dashboard.html

防串轮次机制

每个 apply 脚本会检查结果文件的修改时间是否晚于输入文件。如果结果文件更旧,说明是上一轮遗留的,脚本会报错要求重新生成。遇到此错误时,必须删掉旧文件、重新读取当前 prompt 生成新结果。

B. 只重建页面

python3 scripts/run_daily_pipeline.py --rebuild-dashboard-only

C. 8510 固定链接服务

./scripts/serve_dashboard_8510.sh

这个脚本会:

  • 停掉已有的 8510 服务实例
  • 在 runtime/ 目录下启动 python3 -m http.server 8510 --bind 0.0.0.0

人工或模型回填点

以下 3 个结果文件当前仍可由模型或人工回填:

  • runtime/title_shortlist_result.json
  • runtime/draft_result.json
  • runtime/top10_ranking_result.json

如果缺少这些文件,Skill 不应假装完成,而应明确指出缺的是哪一步。

页面与数据规则

  • Top10 必须完整展示 10 条
  • summary/summary_main 不允许是 [TEST] 标题 这类占位文本
  • Tavily 条目没有发布时间时,页面可以显示 -,不要额外加“待确认”文案
  • Tavily 图标不应退回默认 •
    • HN → 📰
    • GitHub → 🧰
    • 官方模型/研究页 → 🧠
    • 商业/融资新闻 → 💼
    • 其他 Tavily → 🔎
  • 邮箱提醒区如果没有真实提醒,应显示空态;不要保留“邮箱模块已切换为独立区域”这种占位卡片

邮箱规则

  • 真实邮箱提醒写入:runtime/executive_mailbox.json
  • 事件队列写入:runtime/mail_event_queue.json
  • 采集报告写入:runtime/mailbox_collect_report.json
  • 若 IMAP 成功但 alerts/events 都为空,且已开启 pop3_fallback_enabled,则必须继续尝试 POP3

邮箱配置

支持任何提供 IMAP/POP3 服务的邮箱(163、QQ、Gmail、Outlook 等),服务器地址在 config/sources.yaml 的 assistant_mailbox 段配置。

项目根目录 .env 至少需要:

IMAP_USER=your_email@example.com
IMAP_PASS=your_imap_authorization_code

注意:IMAP_PASS 填邮箱后台生成的客户端授权码 / 应用专用密码,不是网页登录密码。

页面输出

  • 静态页面:runtime/dashboard.html
  • 固定分享链接:http://<服务器IP>:8510/dashboard.html
  • Streamlit 看板入口:scripts/dashboard_app.py

回复要求

执行完后,至少汇报:

  • 当前链路完成到了哪一步
  • runtime/dashboard.html 是否已更新
  • 8510 页面服务是否正常
  • 采集总数、候选池数量、成稿数量、Top10 数量、邮箱提醒数量、异常来源数量
  • 如果缺少模型回填文件,明确指出缺的是哪一个
我的收藏