Ai daily digest
Generate and publish a daily AI-vendor news card digest. Fetches the latest Anthropic (and later OpenAI, etc.) official announcements, curates them into concise Chinese summaries, renders editorial 小红书 (1080×1440) and 微信公众号 cards, updates a GitHub Pages review page, and can push a mobile notification. Use when the user wants to "做今天的 AI 日报 / Anthropic 动态卡片", "抓取最新 Anthropic 新闻并生成小红书图", "更新每日 AI 速递", refresh the gh-pages review page, or run the daily digest pipeline.From its SKILL.md
npx -y skills add yinjialu/ai-frontier-daily --skill ai-daily-digestAssembled from the repository path, not quoted from the project. Check it against their README if it does not work.
2 things to look at
- no licenseNo license file was found in the repository. Code published without one is not open source by default, so using it at work is a question for whoever answers licensing questions where you are.
- 3 stars3 stars. Stars are a popularity signal and not a quality one, but at this level it is likely that nobody has read this closely except its author, and you would be relying on your own review.
SKILL.md
22.3 KB, ~8.0k tokens by cl100k_base, as published. Nobody here has run it
AI Daily Digest(每日 AI 大厂动态卡片)
抓取 AI 大厂(当前 Anthropic + OpenAI,可继续扩展)官方动态 → 中文策展 → 渲染 小红书 / 公众号卡片 → 更新 GitHub Pages 展示页 → 推送移动端通知。发布到平台的 最后一步由人工完成(符合各平台规则)。
多厂商(vendor)
每个厂商一条独立轨道,用 --vendor <id>(缺省 anthropic)贯穿全流程:
- 数据/产物分轨:
data/<vendor>/<date>.json、output/<vendor>/<date>/*.jpg、output/<vendor>/latest.json;展示页索引output/index.json汇总所有厂商(每天一条带vendor)。 - 主题厂商化:
cards.css用语义 token(--bg/--fg/--accent/--feature-*),.v-<vendor>作用域换肤; 默认(Anthropic)暖陶土色,.v-openai深墨黑 + 青绿。cards.js的VENDORS注册表决定品牌文案。 - 当前 id:
anthropic、openai、gemini、nvidia(单品牌轨)+cn(国内大模型聚合轨)。新增见文末「扩展到更多厂商」。
聚合轨(cn 国产大模型)
国内厂商分散、单家更新低频,故合成一条聚合轨:一条 cn 轨汇集 DeepSeek / 通义千问 / 智谱 GLM /
Kimi / 豆包 / 文心 / 混元 / MiniMax / 阶跃星辰 / 百川 / 零一万物 / 蚂蚁百灵 等多家。与单品牌轨的差别:
- 每条 update 多一个
company字段(来源公司中文名,如"DeepSeek"),渲染成卡片上的公司徽标; 单品牌轨不带company,徽标自动不显示。 - 跨公司择优:每天把各家动态放一起按重要性降序,最多 10 条(单品牌轨是 6 条)。
- cn 抓取以 WebSearch 为主(重要,与国外四家不同):实测国内厂商官网/changelog(火山/腾讯云/
文心/智谱/MiniMax/DeepSeek 等)对
WebFetch普遍返回 403(反爬 + 海外 IP 限制),不可靠。 故 cn 的发现路径反过来:- 首选
WebSearch按daily-search-matrix.json逐家公司查近 1~3 天动态(如「智谱 GLM 发布 2026年6月」「MiniMax 新模型」), 这是 cn 唯一稳定可达的路径(国外四家用 WebFetch RSS,cn 用 WebSearch)。 WebFetch仅作补充:搜到具体文章 URL 后可试抓细节,403 就退回用搜索摘要,不要因抓不到就编造。- **
sources.yaml的vendors.cn.rss(GitHub releases.atom)**可正常抓,但多为 CLI/SDK 线, 作为「有动静」弱信号兜底,不是模型发布主信号。
- 首选
- 来源质量(cn 尤其注意):WebSearch 命中多为中文科技媒体(二手)。严格按下文「官方 vs 媒体来源区分」: 能找到官方原文/官方引述的写实,单一媒体源的加「据报道/据梳理」限定词,不编造版本号与跑分。 某家今天没有可靠近 1~3 天动态就跳过它(聚合轨满刊靠跨公司汇总,不靠给每家硬凑)。
两种运行方式
| 方式 | 适用 | 摘要来源 |
|---|---|---|
| A. Claude 驱动(推荐给 routine / 交互) | Claude Code / 定时 agent | 由 Claude 直接用 web 工具抓取并策展,质量最高 |
| B. 纯 Python(GitHub Actions 无人值守) | CI | run.py --live:抓 RSS + 调 Claude API |
两种方式产出同一套 data/<date>.json 与 output/<date>/*.png,由同一渲染器
(render.js + cards.js + cards.css,唯一真源)渲染,风格一致。
A. Claude 驱动(推荐;云端 routine 与交互会话通用的执行细则)
在仓库根目录执行以下步骤(output/、data/ 写到当前工作目录)。
厂商列表动态读取,不要写死数量或名字。
-
日期与刊号:按 Asia/Shanghai(UTC+8) 取
DATE=YYYY-MM-DD(云端 runner 多为 UTC, 直接date会差一天,用TZ=Asia/Shanghai date +%F);edition用年内第几天 VOL.NNN(TZ=Asia/Shanghai date +%j)。 1.5 发布链路 doctor(前置健康检查):正式抓取/渲染前先跑只读 preflight,提前暴露 Python/Node/Playwright/Pages 索引等环境问题:python3 scripts/doctor_publish.py --stage daily --stage pages -
取厂商清单:运行
python3 skills/ai-daily-digest/run.py --vendors,得到 JSON 数组, 每项含{id, name, brand, sources:[抓取URL]},遍历其中每一个厂商(数量与名字以输出为准)。 若某项sources为空(环境缺 pyyaml),改读sources.yaml的vendors.<id>下 rss/webfetch 的 url。 先建立本次抓取覆盖记录(这是提交 guard 的硬前置,不是可选笔记):python3 scripts/validate_daily_coverage.py --init --date <DATE>抓取完成后,把每个厂商的官方搜索 query/来源 URL、
firsthand.query的候选数量填入output/daily-research/<DATE>.json,并运行python3 scripts/validate_daily_coverage.py --check --date <DATE>。cn聚合轨必须逐一记录daily-search-matrix.json中的每家公司,即使搜索无结果也要写sources: ["none-found"];缺任何一家,后续 guard 会拒绝提交。这样“没有结果”与“没有搜索”不再混淆。 -
抓取真实最新动态(对每个厂商 V):依次
WebFetchV.sources 的 URL——RSS/Atom/网页 都可直接 WebFetch,Google 系 RSS 也能抓;需要细节再WebSearch。厂商特例:Anthropic 主站 JS 渲染、无官方 RSS(抓anthropic.com/news顶部条目);openai.com/news网页对 WebFetch 返回 403,用其 RSShttps://openai.com/news/rss.xml。 3.5 补内参(本机抓取,补云端盲区——重要):云端 Routine 是数据中心 IP,anthropic.com/news、claude.com/blog等 Cloudflare/JS 站常被拦(早报因此会漏 news/blog 内容,只剩 GitHub releases)。 本机内参监控用住宅 IP 已抓好这些,导出在data/firsthand/index.json。对每个厂商 V,额外读内参近 1~2 天条目作候选:python3 -m scripts.firsthand.query --vendor <anthropic|openai|gemini|cn> --days 2 --json --include-open-prs把这些条目并入候选池,与 WebFetch/WebSearch 结果一起去重策展(同一事件只留一条,优先内参的官方一手 + 真实发布日期)。内参覆盖:anthropic(claude-blog/news/research/engineering/transformer-circuits)、openai、gemini(deepmind/google)、cn(qwen/蚂蚁百灵);nvidia 暂无内参源,仍走 WebFetch。
--include-open-prs会只读 open / 已拉取的firsthand/*PR 中data/firsthand/**/*.md的 OKF 内容, 让「已发现但尚未合入 main」的一手官方动态也能进入当天早报候选池;它不读取 PR 里的代码改动。 JSON 输出会给这类候选加candidate_origin: "open-pr"与candidate_ref: "firsthand/<date>", 日报 Issue/最终回复里要保留这个来源标注,便于 review 时知道该候选尚未进入 main。 -
去重(Claude 链路):看
data/<V.id>/里最近的 *.json,只挑近 1~3 天的「新」条目, 避免与已发布重复;若今天data/<V.id>/<DATE>.json已存在且已覆盖当日要点,则该厂商 跳过、不覆写。(B 链路的seen.db去重不适用于本链路。) -
价值筛选 + 中文策展。只保留对中文 AI 从业者有价值的条目(模型发布、能力 更新、重要研究、重大合作、定价/政策),过滤纯招聘/办公室开设/人事任命等。 每条:选一个标签【模型发布/开发者/企业/研究/生态/政策/安全】,写 50–80 字 客观中文摘要(说清「变了什么 + 对用户意味着什么」,不夸张不编造),按重要性 降序,最多 6 条。
- 聚合轨
cn:跨多家公司统一择优,最多 10 条,且每条必须带company字段(来源公司中文名,如「DeepSeek」「通义千问」「智谱」「Kimi」「豆包」「文心」「混元」 「MiniMax」「阶跃星辰」「百川」「零一万物」「百灵」),用于渲染公司徽标。 - 同事件跨源聚合(去重,重要):同一件事被多个信息源报道(如 Anthropic 同一发布同时出现在
anthropic.com/news与claude.com/blog,或内参 + web 抓到同一条)时,合并成一条, 不要重复占用名额。择优规则:优先官方一手来源作主链接、取真实发布日期(内参的published); 正文可点明"多家/多源报道"。判据:标题/主体指向同一事件(同一产品名、同一公告)。聚合轨cn同理——同一新闻被多家媒体转载只算一条,company取最权威来源。 摘要必须保留对应中文限定词(「可能」「据报道」「疑似」),不得改写为断言。 - 官方 vs 媒体来源区分:涉及根因分析、「史上最大/最严重」等定性描述, 须区分是官方 postmortem/Status Dashboard 确认,还是媒体推测或用户反馈; 若官方仅承认故障存在但未给出根因,摘要只写「官方确认」,不写未经证实的技术原因。
- 聚合轨
-
写当天数据到
data/<vendor>/<YYYY-MM-DD>.json(必含"vendor"字段),字段见下面 schema。 该厂商今天无值得发的内容则跳过它、不写文件。 渲染默认输出 JPEG(移动端优先:1080×1440、deviceScaleFactor:1、质量 86, 单张约 100–300KB,低于公众号在文图片 1MB 上限,省去后压缩)。可用环境变量CARD_FORMAT=png|jpeg、CARD_QUALITY、CARD_SCALE覆盖。- 卡片质感(风格层,正交于 vendor 主题):默认「经典」(与历史像素一致)。
CARD_STYLE=glass(或数据里加"style":"glass")切到「液态玻璃 / Apple Liquid Glass」—— 彩色渐变底 + 磨砂玻璃面板 + 镜面高光,仅换材质不改主题色,新增厂商自动可用。 backdrop-filter 仅 Chromium(Playwright)/浏览器生效,wkhtml 退化为半透明无模糊。 本地预览对比:浏览器打开skills/ai-daily-digest/glass-preview.html; 展示页index.html顶部「质感」可一键切换(存localStorage)。
- 卡片质感(风格层,正交于 vendor 主题):默认「经典」(与历史像素一致)。
-
渲染卡片: 渲染前先跑一次环境自检(幂等;用
uv管 Python 依赖、安装 npm 依赖与 Playwright Chromium, 并做 Python + Chromium smoke test):scripts/ensure-daily-render-env.shnode "$SKILL_DIR/render.js" data/<vendor>/<date>.json output/<vendor>/<date> --engine playwright(
$SKILL_DIR= 本 skill 目录;Playwright 渲染器已使用整页 clip 截图,避免元素稳定性等待导致的elementHandle.screenshot超时。) -
更新展示页指针与索引(所有厂商处理完后执行一次):调
python "$SKILL_DIR/run.py" --reindex, 它按实际生成的 *.jpg 重建各厂商output/<vendor>/latest.json+ 汇总output/index.json, 不要手拼这两个文件。 -
提交并推送(触发 GitHub Pages 重新发布):若本次有任意厂商产出新内容:
git add -A data output python3 scripts/validate_daily_coverage.py --check --date <DATE> scripts/guard-daily-content-commit.sh <DATE> git commit -m "daily: <DATE>"一次提交涵盖所有厂商;commit 格式必须是
daily: YYYY-MM-DD(auto-merge guard 的 正则依赖此标记,写成daily: <vendor> <date>会被整支跳过)。推送遵循仓库根目录 AGENTS.md / CLAUDE.md 与下文「推送策略(routine 必读)」:云端只推当前工作分支 (Codex 用Codex/daily-YYYY-MM-DD,Claude 用claude/*),本机会话可直推 main。guard-daily-content-commit.sh是 hard guard:当前分支必须是Codex/daily-<DATE>, staged diff 必须只含data/+output/且不能含data/firsthand/,否则直接停止。 所有厂商今天都无新内容则不提交、直接结束。 -
开当天 GitHub Issue(每日讨论贴,仅当本次有新内容时执行):在本仓库创建 Issue, 标题
📰 VOL.NNN · YYYY-MM-DD 每日 AI 动态,labeldaily-digest。正文按厂商分节, 每节列出今日各条目(标题加粗 + 一句话摘要 + 源链接),末尾附展示页链接并邀请讨论。 优先用 GitHub MCP 的 issue 创建工具(如mcp__github__issue_write,method=create), 没有就用gh issue create;若 label 不存在或打 label 失败,就不带 label 创建, 确保 Issue 本身建成功。创建前先查当天是否已有同标题 Issue,已有则跳过,每天最多一个。 -
推送移动端:用
PushNotification发一条通知:一句话概括今天各厂商各发了几条 + Issue 链接(若本次创建了)+ 展示页https://yinjialu.github.io/ai-frontier-daily/(工具不可用则写进最终回复)。微信草稿由本机定时任务处理,云端无需管。
data JSON schema
{
"vendor": "anthropic",
"date": "2026.05.31", "cnDate": "5月31日 周日",
"edition": "VOL.151", "brand": "AI 前哨 · 每日 Anthropic",
"updates": [
{"tag": "模型发布", "title": "标题", "summary": "50-80字中文摘要", "source": "anthropic.com"}
// 聚合轨 cn 每条还需带 "company": "DeepSeek"(来源公司中文名 → 渲染公司徽标)
],
"outroTitle": "每天一条\n看懂 AI 大厂动向",
"outroDesc": "…", "outroCta": "关注 · 不错过任何更新"
}
vendor 取 run.py --vendors 输出的任一 id(不要写死取值范围)。brand 用该 vendor 的 brand 字段。
edition 用年内第几天(TZ=Asia/Shanghai date +%j)。今天无值得发的内容则不发卡片。
B. 纯 Python(无人值守 / CI)
pip install -r requirements.txt # pyyaml feedparser
export DIGEST_OUT="$PWD" # data/ output/ 写到这里(默认即当前目录)
python run.py # mock:用 fixtures,离线跑通,不需要 key(anthropic)
python run.py --vendor openai # 指定厂商
python run.py --live # 真实:抓 sources.yaml 的 RSS + 调 Claude API(需 ANTHROPIC_API_KEY)
python run.py --force # 忽略去重强制处理
python run.py --engine playwright # 字体保真渲染(生产推荐)
python run.py --reindex # 仅重建 latest.json + index.json(扫描所有厂商)
python run.py --vendors # 打印厂商清单 JSON [{id,name,brand,sources}](routine/CI 自适应遍历用)
- 去重
seen.db(SQLite,指纹按vendor|归一化标题)写到DIGEST_OUT,各厂商互不干扰,每天只推增量。 - live 摘要在
curator.py调 Claude API(system prompt 随 vendor 切换);mock 用离线启发式。 - CI(
.github/workflows/daily.yml)每天循环跑所有厂商(for v in $(run.py --vendors …)),再一次性提交; 新增厂商自动覆盖。CCR 每日 routine 同样自适应。
文件结构
skills/ai-daily-digest/
SKILL.md # 本文件
ADD_VENDOR.md # 新增厂商 runbook(加 Gemini/英伟达等照此走)
run.py # 编排:采集→去重→摘要→渲染→更新指针(--vendor / --reindex)
collector.py # 采集(mock 读 fixtures / live 抓 vendors.<vendor>.rss)
curator.py # 策展+摘要(mock 启发式 / live 调 Claude;VENDOR_META 品牌文案)
dedup.py # SQLite 去重(指纹按 vendor 命名空间)
render.js # 渲染器(playwright / wkhtmltoimage)
cards.js # 卡片构建逻辑 + VENDORS 注册表(浏览器与 Node 共用,唯一真源)
cards.css # 卡片样式(语义 token + .v-<vendor> 主题)
sources.yaml # 信息源(按 vendors.<vendor> 分组的 RSS / webfetch)
fixtures/ # mock 样例数据
# 数据/产物(写到 DIGEST_OUT,默认仓库根):
data/<vendor>/<date>.json # 当天结构化数据
output/<vendor>/<date>/*.jpg # 渲染卡片
output/<vendor>/latest.json # 该厂商最新一天指针(发布脚本消费)
output/index.json # 汇总所有厂商,供展示页(每天一条带 vendor)
仓库根目录的 index.html(展示页)读 output/index.json,顶部 Anthropic/OpenAI
切换 Tab,按厂商主题展示当天卡片轮播 + 采集热力图,由 GitHub Pages 部署。
输出卡片
- 小红书 1080×1440:封面 + 每条一张内容卡(含
01/06页码与水印序号)+ 结尾卡。 - 微信公众号:900×383 封面 + 正文长图(高度自适应)。
发布(人工,符合平台规则)
-
小红书【全自动,2026-06-11 起】:走本机 xiaohongshu-mcp 服务(二进制
~/.local/bin/xiaohongshu-mcp,cookie/工作目录~/.config/xiaohongshu-mcp/, HTTP MCP 端口 18060,账号 ai-report)。一条命令发一厂商:python skills/ai-daily-digest/publish_xhs_newspic.py --vendor <id> [--private|--dry-run]—— 内部先调to_xhs_post.py组装素材(标题≤20 字/正文≤1000 字/标签数组/竖图清单, 标签随厂商切换),再把卡片复制为 ASCII 临时名(服务不接受中文路径)调publish_content。 服务未启动会自动拉起;登录态失效时在~/.config/xiaohongshu-mcp/下重跑~/.local/bin/xiaohongshu-login扫码。watch-and-publish.sh的 [4/4] 步已挂入每日链路 (去重标记.last_published_xhs.<vendor>,厂商间隔 45s 防风控连发)。 注意:xiaohongshu-mcp 是独立登录态,与浏览器里 creator 后台网页登录可能互踢;--private发「仅自己可见」笔记,用于测试链路。 -
公众号个人订阅号:草稿接口权限已回收,手动建草稿贴图,或用 135/壹伴等已授权 编辑器导入草稿箱。
-
公众号【已认证服务号】——「云端抓取 → 本机合并+推送」半自动链路(仍由人工群发):
推送策略(routine 必读):云端 GitHub 代理只允许推当前工作分支, 直推 main 会得到 403——这是预期行为,不要把 403 当失败重试,也不要尝试推 main。 routine 只需把
daily: YYYY-MM-DD提交推到自己的工作分支(Codex 用Codex/daily-YYYY-MM-DD, Claude 用claude/*),.github/workflows/auto-merge-daily.yml会在分支只含data/+output/改动时自动合并入 main 并删除分支。代码 / 文档 / 配置改动不要混进每日内容分支——guard 会整支跳过; 这类改动请单独开分支提 PR 人工合并(纯文档推送不会触发 workflow,混推会滞留在分支上流失)。一条命令搞定「合并分支 + 各厂商建草稿」:
scripts/watch-and-publish.sh --dry-run # 演练:照常合并每日内容分支,但微信只打印结构不碰 API scripts/watch-and-publish.sh # 合并 daily-* / Codex/daily-* → main → 为当天每个厂商建微信贴图草稿 VENDORS_PUBLISH="anthropic openai" scripts/watch-and-publish.sh # 只给指定厂商发微信它做三件事:①
git fetch,把未合并的origin/daily-<DATE>/origin/Codex/daily-<DATE>用-X theirs合并进 main、run.py --reindex重建指针、push main、删远端分支;② 对每个有当天data/<vendor>/<DATE>.json的厂商跑publish_wechat_newspic.py --vendor <id>建**贴图(newspic)**草稿;③.last_published.<vendor>去重(每家每天只成功一次)。凭据~/.config/wechat-official-draft/config.yaml,本机公网 IP 须在 公众号 IP 白名单,且需已认证服务号。- 单厂商手动发:
scripts/publish-local.sh [--vendor <id>](只发不合并)。 - 图文文章形态(可选):
to_wechat_md.py [--vendor <id>]→push_draft.mjs。
每日自动:
scripts/launchd-publish.plist(LaunchAgent,每天 23:15/23:45/次日 00:30 通过独立 publisher worktree 跑watch-and-publish.sh, 多次兜底吸收云端 cron 抖动)。安装/更新:cp scripts/launchd-publish.plist ~/Library/LaunchAgents/com.yinjialu.ai-frontier-daily.publish.plist launchctl unload ~/Library/LaunchAgents/com.yinjialu.ai-frontier-daily.publish.plist 2>/dev/null launchctl load -w ~/Library/LaunchAgents/com.yinjialu.ai-frontier-daily.publish.plist - 单厂商手动发:
扩展到更多厂商
完整步骤见 ADD_VENDOR.md(含调研信息源、配色、产出首期、验证的逐步 runbook,
附 Gemini / 英伟达候选配置)。速览——改动集中在 5 个文件;云端定时与渲染器无需改:
sources.yaml:在vendors.<新id>下加rss/webfetch源(先curl -sI/ WebFetch 实测)。cards.js:在VENDORS注册表加一项(name/daily/label)。cards.css:加一个.v-<新id>主题块覆盖语义 token(深底主题记得加.v-<id>.card::after{screen})。index.html:加两处颜色——.vtab[data-v="<id>"]{--vc}(Tab 选中色)+body.v-<id>{...--clay/--h0..h4}(页面强调色 + 热力图梯度)。易漏:缺了 Tab 选中态没色、页面 chrome 不换色。curator.py:在VENDOR_META加品牌名/brand/结尾文案;发布脚本(to_xhs_post/to_wechat_md/ publish_wechat_newspic)的VENDOR_NAME/标签按需补。- 云端定时无需改:Codex Automation / CCR routine 与
daily.yml都自适应——跑run.py --vendors读出厂商清单 再遍历;只要新厂商在curator.pyVENDOR_META+sources.yaml登记好即可被自动带上。
展示页 Tab 的显示名与顺序也自动派生(名字取 cards.js 的 VENDORS.name、顺序按其定义序);
只有上面第 4 步的颜色需手加。run.py --vendors 可本地自测厂商清单与各家源 URL。
What ships with it: 19 files
122.6 KB alongside SKILL.md, 11 of them executable
fixtures/
- sample_data.json1.4 KB
- sample_items.json1.2 KB
- ADD_VENDOR.md13.3 KB
- cards.css19.7 KB
- cards.jsruns12.7 KB
- collector.pyruns7.0 KB
- curator.pyruns7.9 KB
- daily-search-matrix.json214 B
- dedup.pyruns1.4 KB
- glass-preview.html5.8 KB
- publish_wechat_newspic.pyruns7.7 KB
- publish_xhs_newspic.pyruns6.6 KB
- render.jsruns5.1 KB
- requirements.txt28 B
- run.pyruns9.8 KB
- sources.yaml11.5 KB
- test_deepdive_cards.jsruns2.5 KB
- to_wechat_md.pyruns3.4 KB
- to_xhs_post.pyruns5.1 KB