AI 每日精华(@local/ai-daily-digest)
DSH 桌面端的本地插件:每天 07:00 抓一遍公开 AI 资讯,在侧栏生成一份中文每日精华——1 条必读 + 四栏(Agent 新应用 / 模型跑分 / GitHub 热门 / DSH 插件推荐),杂志式版式。
- 只用公开页面与公开镜像,不读取本机登录态,不做浏览器自动化。
- 文案由 DSH 内置模型撰写(可在信源配置里关掉);榜单数字只搬运,不让模型编。
- 所有数据留在本机,不自动发布到任何外部平台。
安装
前置:DSH 桌面端可正常打开,插件目录已在本机。无需额外 API key(模型复用 DSH 内置服务)。
- 在 DSH 里执行(把
<插件目录>换成本仓库的绝对路径):
plugin_manager install_bundle target=link:<插件目录>
- 返回
applied后,在 DSH 窗口按 Ctrl+R 重载界面;不做这一步,侧栏入口不会出现。 - 侧栏出现「AI 每日精华」,点开即开始生成,完成后自动刷新。
升级
plugin_manager remove_bundle target=@local/ai-daily-digest
plugin_manager install_bundle target=link:<插件目录绝对路径>
然后 Ctrl+R;要立刻重出今日报时点面板右上角「刷新」(或 GET /api/ai-daily-digest/refresh)。
- Host 半会重新加载,Client 半只在页面加载时注册:不重载侧栏入口会消失,看起来像插件坏了。
- 若 install 报
already-installed:包已登记,先remove_bundle再装。 - 数据目录在插件目录之外,升级不会覆盖
sources.yaml与历史数据。
卸载
plugin_manager remove_bundle target=@local/ai-daily-digest
Ctrl+R 后入口消失。卸载不删除数据目录(sources.yaml、digest.sqlite、images/ 仍在),要彻底清理需手动删除该目录。
数据目录
默认放在 DSH 当前工作区的 ai-daily-digest/ 下:
<workspace>/ai-daily-digest/
digest.sqlite 当日报、生成记录、榜单快照、重试排期(含 -wal / -shm)
images/ 配图缓存(<sha1>.jpg + cover/agent1/agent2.jpg 兜底图)
sources.yaml 信源配置
sources.yaml.bak 保存信源时的上一版备份
需要固定到别处时,在 cordis.patch.yml 里显式加 config.dataDir:
- insert:
- id: ai-daily-digest
name: '@local/ai-daily-digest'
config:
dataDir: '/absolute/path/to/ai-daily-digest'
digest.sqlite 的 runs 表记录每次生成的状态与失败原因,排查先看它。
每天发生什么
| 时机 | 行为 |
|---|---|
| 每天 07:00 后 | 每分钟检查一次,当天没有报就生成;电脑休眠错过 07:00,唤醒后的下一次检查补跑 |
| 打开面板 | 当天没有报、也没有等待中或已放弃的重试时立即补生成 |
| 生成失败 | 按 5/15/30/60/120 分钟退避重试,共 5 次;第 6 次失败当天放弃 |
| 点「刷新」 | 清掉当天重试记录,立即重新生成 |
| 生成结束后 | 清理 30 天前的库记录(digests / runs / board_models / retry_queue) |
模型调用失败不影响出报:自动回退为机械拼装的导读与「为什么重要」。
面板内容
| 栏目 | 条数 | 数据来源 |
|---|---|---|
| 01 必读 | 1 | 公众号(wechat2rss 公开镜像)+ 知乎热榜 + X(r.jina.ai 镜像)合并去重后选 1 |
| 02 Agent · 新应用 | 2 | 同上,取必读之外的两条 |
| 03 模型跑分 | 前 20 | LMArena 文本榜(HuggingFace datasets-server) |
| 04 GitHub 热门 | 前 20 | github.com/trending?since=daily,按今日星标增量排序 |
| 05 DSH 插件推荐 | 前 10 | dsh.market/plugins.json,按市场评分与星标排序 |
- 每个榜单顶部显示「抓取于 今天 HH:mm · 数据源 …」,模型榜另印数据集里的榜单日期。
- 插件卡「查看 →」只在新标签打开项目主页,不触发安装。
- 某栏不足配额就少出,不硬凑;全部信源都抓不到时面板显示失败提示与重试按钮。
改信源
面板「信源」页可视化编辑三块:公众号、X 账号、知乎关键词。
- 每行一个输入框 + 删除;底部「+ 添加」;回车在下方新增一行。
- 顶部显示
sources.yaml路径与未保存状态;「保存」写回配置(原子写,旧文件备份为sources.yaml.bak),不需要重装插件。 - 「保存并重新生成今日」在保存成功后触发刷新,稍后到「今日」页看结果。
- 保存失败逐条列出原因,输入不会被清空;原始 YAML 可在折叠区查看。
字段限制:公众号 130 项(每项 140 字)、X 130 项(每项 130 字,字母/数字/下划线,UI 保存时会去掉前导 @)、关键词 150 项(每项 130 字);perAccount 150,sinceHours 1168,boardsTop / reposTop / pluginsTop 各 150 / 150 / 1~20。
直接调 POST /api/ai-daily-digest/sources 时按严格规则校验:handle 带前导 @ 会返回 400,调用方需自行剥除(UI 已自动处理)。
出问题怎么查
- 侧栏入口不见了:升级后没重载。Ctrl+R;仍没有就
remove_bundle后重装。 - 一直「正在生成」或没有今天的报:查
runs表(路径按实际数据目录):
$db = '<数据目录>/digest.sqlite'
node -e "const{DatabaseSync}=require('node:sqlite');const d=new DatabaseSync(process.argv[1]);console.table(d.prepare('select date,started_at,finished_at,status,detail from runs order by started_at desc limit 5').all())" $db
- 提示「已连续失败…自动重试已停止」:当天已放弃,点「刷新」手动再来一次,并先排除网络问题。
- 只有某一栏空:单源失败不影响其它栏目,
runs.detail会写哪个源失败、为什么。 - 接口 404 / 面板空白:DSH 的 Web 端口不固定,用
http://127.0.0.1:<当前端口>/api/ai-daily-digest/state确认。 - 图片不显示:图片下载失败会画斜纹占位,不影响文字与链接。
已知限制
- X 卡保留英文原文,但只挂在
title悬停里,没有展开切换。 - 单源失败只写进提示条与
runs.detail,不区分「限流」还是「页面改版」。 - 抓取没有并发上限控制(实测 6 个源无问题)。
- 30 天保留只清库记录,
images/下的旧图与孤儿图片(已无引用的缓存)不会自动删除。 - 榜单只显示「抓取于」文本,没有 18h / 36h 新鲜度圆点。
开发与测试
node dev/sources-config-test.mjs # YAML 解析/写回/校验,171 条断言
node dev/acceptance-sources.mjs # Part A:纯函数与本地文件写盘,73 条
node dev/retry-test.mjs # 重试退避 18 条
DSH_PORT=<当前端口> node dev/acceptance-sources.mjs --live # Part B:真机 API
--live 只做 GET、非法 POST 和 dryRun 合法 POST,不会真的改 sources.yaml。
隐私与合规
- 只抓公开渠道,不使用本机登录态,不做浏览器自动化:公众号走 wechat2rss 公开镜像,X 走
r.jina.ai+twitter.com,知乎走公开热榜接口。 - 图片下载到本机
images/缓存后由插件路由提供,不热链第三方。 - 仓库里的
assets/demo/三张图是本地生成的占位图,不含第三方版权素材;真实运行时会抓文章首图并缓存到数据目录。 - DSH 市场
robots.txt为use=reference、ai-train=no:本插件只引用插件名称、一句话描述与链接,不转载 README 正文。 - 写作走 DSH 内置模型服务,不额外申请 key、不额外计费;生成结果只落在本机,不自动发布。
License
MIT,见 LICENSE。
No comments yet. Be the first to write one.