- Главная
- Плагины
- Процессы и автоматизация
- ai-news-feed
ai-news-feed
laowang5/ai-news-feed
AI news sidebar plugin for DeepSeek Harness (DSH): scores RSS/Atom feeds on five axes, surfaces top items, and imports them into chat for follow-up.
Установка
dsh plugin --profile web add github:laowang5/ai-news-feedREADME
ai-news-feed
是什么:DeepSeek Harness (DSH) 原生一体化的端到端 AI 前沿情报流插件,零外部 Python/进程依赖。
给我什么:可配置信源自动抓取 + 大模型五轴量化研判打分 + 侧栏实时抽屉阅读 + 每日会话内晨报/晚报主动推送。
怎么装:从源码目录安装dsh plugin --profile desktop add "file:<源码路径>"。
版本:v1.0.0 · MIT · 零外部进程依赖

🌟 核心特性
- ⚡ 六大原生信源:Hacker News、GitHub Releases、AIHot 每日情报、OpenAI 官方博客、Google DeepMind、Simon Willison。可按需自定义配置支持RSS/ATOM订阅的信息源。
- 🎯 五轴量化评分:
industry/rubric.md单一事实源 + sha256 版本哈希,打分与精炼摘要严格分离;信源权重与首报惩罚全在代码后置结算、不传入 Prompt,模型无从被名气影响。 - 📰 两层情报台:L1「今日必看」= 自然日、未读、跨源合并后 ≥80 分的重大事件(硬上限 5 条);L2「原始流」= 全量信号,默认展开,支持「智能 / 最新 / 分数」三态排序。
- 💬 一键导入对话:通过“导入对话”按钮直接将资讯导入到对话框中,输入需要进一步分析的提示,获取更多的研判信息。
- 🔗 跨源事件合并:同一天、同一事件的多源报道自动聚合,卡片显示「N 源报道」,并严格区分型号后缀(
Gemini 4 Hydrogen≠Gemini 4 Carbon)。 - 🎛️ 关注方向个性化:Agent 基建 / 模型发布 / 开源工具 / 融资与商业,默认只勾前两项。勾选项注入评分 system 段,最高 +5 加权且不污染 S 级判定——全选等于没选。
- 🌏 中英双语标题:中文源与英文源都同时具备
title_zh/title_en,界面文案与标题跟随语言设置切换;摘要按当前语言单语生成,不写两份译文。 - 🛡️ 成本护栏 + 零模型可用:
dailyModelCallBudget默认 120 次/天,触顶自动停止评分并转纯列表展示,本地零点重置;没配模型也能用,展示按权重排序的原始流,不空白不崩溃。 - 📬 会话内晨报 / 晚报:借助宿主
@deepseek-ai/dsh-schedule,晨报 08:00、晚报 20:00 注入原会话,可直接对某条追问 Agent;卡片支持一键把摘要、评分与链接引入对话框。
🚀 快速上手
1. 环境要求
- DSH 版本需带
@deepseek-ai/dsh-llm服务(当前桌面端都满足)。 - 从源码构建需要 Node.js 22+ 与 pnpm。
- 在 DSH 会话里选好一个默认模型(用于评分)。没选也能跑,只是降级为原始流模式。
构建链就是 typescript + react/react-dom 类型 + tsx(跑测试),pnpm install 一次装齐,不需要额外手动装别的东西。
2. 安装插件
注意:本包不发布到 npm,只通过源码目录安装。
dsh plugin add ai-news-feed这类按包名从 registry 拉取的写法不适用,请用下面的方式。
方式 A:从源码目录安装(推荐)
git clone https://github.com/laowang5/ai-news-feed.git
cd ai-news-feed
pnpm install
pnpm build
# 把本目录作为本地包装进 desktop profile
dsh plugin --profile desktop add "file:$(pwd)"
dsh plugin add "file:<path>" 会自动做三件事:把包写进 profile 的 dependencies、追加到 dsh.profile.bundles、用 pnpm 把构建产物复制进 node_modules。装完后插件即可热加载,不需要重启应用。
💡 已经在本地 clone 过的话,直接
dsh plugin --profile desktop add "file:<已有的仓库路径>"即可,不必再下一份。💡 改完代码要生效,必须重新
pnpm build后再次add(pnpm 看到版本号没变会跳过重装,换产物时先remove再add)。
方式 B:手动挂载到 profile
如果不想用 CLI,可以直接编辑 profile 的 cordis.patch.yml(不是 cordis.yml):
# ~/.dsh/profiles/desktop/cordis.patch.yml
- id: ai-news-feed
name: "ai-news-feed"
config:
syncIntervalMinutes: 60
firstSyncDelaySeconds: 5
dailyModelCallBudget: 120
⚠️ 常见误区:
cordis.yml是宿主生成的只读合并结果,里面写着「改我无效,请改 cordis.patch.yml」。往cordis.yml里加插件不会生效。另外 patch 文件的顶层是一个 YAML 数组(- id:/- insert:),不是plugins:映射。手动挂载只写了 patch,还需要
node_modules里有这个包(name要能解析到真实目录),否则宿主加载会失败。所以除非你已经用方式 A 装过一次,否则优先用方式 A。
✅ 不需要重启桌面端
当前 DSH 通过 bundle patch 热加载插件:安装或更新后,宿主会重新读取 patch 并挂载服务,侧栏入口立即可用。刷新页面即可看到新版本,无需退出应用。
如果你的宿主版本确实没有热加载(旧版本),再考虑完整重启。
自查验证:
# 1. 插件是否注册成功(应返回 state: live)
curl http://127.0.0.1:12333/dsh-market/installed
# 2. 插件自身健康检查
curl http://127.0.0.1:12333/dsh-plugins/ai-news-feed/health
health 里重点看三个字段:
| 字段 | 含义 |
|---|---|
llm_state | available 正常 / missing 没有可用模型 / misconfigured 有模型但调用失败 |
llm_backend | host-stream 走宿主 LLM(零配置)/ fetch 走自定义 API / none |
llm_last_error | misconfigured 时的具体报错,用于定位模型名或 provider 写错 |
⚙️ 配置参数详解
所有配置项均可在 PluginConfig 中自定义:
| 参数名 | 类型 | 默认值 | 作用说明 |
|---|---|---|---|
syncIntervalMinutes | number | 60 | 后台全源周期同步间隔(分钟)。设为 0 表示关闭后台定时同步。 |
firstSyncDelaySeconds | number | 5 | 宿主启动后触发首次轻量同步的延迟(秒),保障新用户首装 5 秒内见内容。设为 0 则禁用首同步。 |
dailyModelCallBudget | number | 120 | 每日模型调用次数上限(评分与摘要共用此计数器)。到顶后只抓取不打分。 |
maxScoresPerRun | number | 10 | 每轮同步中最多使用大模型评分的待处理条目数。 |
scoreCalls | number | 2 | 单条新闻的大模型评分采样次数(默认串行 2 次取向下取整均值,提升鲁棒性)。 |
thresholds | object | 见下文 | 自定义三层门槛分级配置。 |
featuredMaxItems | number | 20 | 精选流候选上限。今日必看硬上限固定 5 条(Math.min(5, 配置值)),调大无效。 |
appearance | 'auto' | 'light' | 'dark' | 'auto' | 抽屉配色,默认跟随宿主浅/深色主题。 |
display.language | 'auto' | 'zh' | 'en' | 'auto' | 界面与文案语言。auto 跟随系统 locale;同时决定摘要与「为什么重要」的生成语言。 |
display.topics | string[] | ['agent-infra','model-release'] | 关注方向,影响评分加权与「为什么重要」的写作侧重。 |
fetchArticle.enabled | boolean | true | 评分前抓取原文正文(5s 超时 + 1 次重试);正文不足 400 字符的条目跳过模型调用并标记 insufficient_content。 |
storePath | string | <dataDir>/signals.json | 信号持久化存储路径。 |
大模型配置 (llm*)
默认零配置:只要 DSH 会话里选好了默认模型,插件就会自动继承它(通过宿主的 agentDefaultModel 服务),不需要填写下面任何一项。下面这些只在你需要指定一个不同的模型(比如用便宜的小模型专门打分)时才需要。
| 参数名 | 类型 | 默认值 | 作用说明 |
|---|---|---|---|
llmModel | string | 继承会话默认模型 | 打分用的模型名,如 deepseek-chat。填了它就只覆盖模型,provider 仍会从宿主里自动匹配。 |
llmProvider | string | 自动匹配 | 模型所属 provider,如 deepseek / openai。同名模型存在于多个 provider 时用它消除歧义。 |
llmBaseUrl | string | 无 | 走 OpenAI 兼容的外部 HTTP 接口时填写,如 http://127.0.0.1:3425/v1。填了它并且 llmApiKey 也填了,插件就绕过宿主 LLM 直连这个地址。 |
llmApiKey | string | 无 | 配合 llmBaseUrl 的 Bearer token。只有 llmBaseUrl + llmApiKey 同时存在才会走直连;只填 Key 不填地址不会生效,插件仍走宿主模型。 |
llmTimeoutMs | number | 60000 | 单次模型调用超时(毫秒)。慢模型或长文摘要可调大。 |
三种后端(
health.llm_backend):host-stream= 走宿主 LLM 服务(默认,零配置);fetch= 直连llmBaseUrl;none= 两者都不可用,此时插件降级为「原始流」模式,条目全部标注「⏳ 未评分」,但抓取、排序、阅读完全正常。如果你写错了
llmModel或llmProvider,health.llm_state会变成misconfigured,抽屉顶部弹出红色提示条并附上具体报错,条目会被标上skip_reason: score_failed: <原因>——不会像旧版那样静默卡在pending。
门槛配置默认值 (thresholds)
thresholds:
featuredMinScore: 80 # 决定首屏是否展示(实测覆盖约 45% 的权威动态)
sTierScore: 85 # S 级高光徽标门槛(占总数前 20% 以内)
browseMinScore: 60 # 浏览线,低于此分数的低质资讯将被过滤,不生成研判摘要
三个阈值作用面不同,不是三档筛选:
featuredMinScore是「今日必看」的唯一产品门槛;sTierScore只决定卡片上的S 级徽标;browseMinScore是原始流过滤线兼日报子事件豁免线。
📡 信源管理 (sources.yaml)
插件启动后会在数据目录(默认 <project-dir>/data/sources.yaml 或系统配置目录)自动生成配置文件。你可以直接编辑它来启用、禁用或新增 RSS/Atom 源:
sources:
# Hacker News 前沿动态(Algolia API,免 Key)
- id: hn
type: api
enabled: true
keywords: [AI, LLM, Agent]
windowHours: 48
maxItemsPerRun: 20
# GitHub 重点仓库版本发布(公开 REST API,免 Key)
- id: github
type: api
enabled: true
repos:
- deepseek-ai/DeepSeek-V3
- vllm-project/vllm
- huggingface/transformers
- anthropics/anthropic-sdk-python
maxItemsPerRun: 15
# AIHot 每日情报(中文,人工策展)
- id: aihot
type: rss
enabled: true
tier: tier_a # 人工策展,评分优先级高于讨论帖
url: https://aihot.news/feed/daily.xml
maxItemsPerRun: 2 # 一个 item = 一整天日报,只取当天 + 前一天
# OpenAI 官方技术动态
- id: rss-openai
type: rss
enabled: true
url: https://openai.com/news/rss.xml
maxItemsPerRun: 20
# Google DeepMind 研究与新闻
- id: rss-deepmind
type: rss
enabled: true
url: https://deepmind.google/blog/rss.xml
maxItemsPerRun: 20
# Simon Willison 的博客(Atom)
- id: rss-simonw
type: atom
enabled: true
url: https://simonwillison.net/atom/everything/
maxItemsPerRun: 20
# 自定义行业 RSS(示例)
- id: my-custom-feed
type: rss
tier: tier_b
enabled: true
url: https://example.com/feed.xml
maxItemsPerRun: 20
未写
tier的源按default(×0.9)结算。tier只影响代码层的权重乘数,不会进入模型 Prompt。
信源分级系数:
tier_a(×1.15)、tier_b(×1.0)、tier_c(×0.75)、default(×0.9)。信源权重完全在代码层后置结算,绝不传入大模型 Prompt。
📰 每日情报台(v1.0 两层信息密度)
今日必看(L1)
- 当日(CST)+ 未读 + 已评分 + 未被合并,跨源聚合后达到
featuredMinScore(默认 80)的重大事件;硬上限 5 条,打开抽屉默认展开。 - 日报拆条子事件豁免 80 分线,下探至
browseMinScore(60):AIHot 是人工策展,单条子事件未必够 80,整份日报仍然值得看。 - 卡片额外呈现「N 源报道」计数、
S 级高光徽标(is_s_tier,不含主题加权)、命中关注方向徽标,以及单行「为什么重要」。 - 打开抽屉不会自动标记已读;点击标题、展开摘要、点「引入对话」或顶部「全部已读」才写已读,可用「显示全部(含已读)」切回。
原始流(L2)
- 默认展开——今日必看为空时也不会看到空面板;呈现全量入库信号(含未评分条目与日报拆出的子条目)。
- 支持「智能 / 最新 / 分数」三态本地排序;顶部
⚙可把它收起。
设置面板
抽屉右上角 ⚙(或主题摘要行末尾的 ⚙)就地展开,三项:
| 项 | 内容 |
|---|---|
| 语言 | 跟随系统 / 中文 / English,持久化到 preferences.json |
| 关注方向 | 4 个 chip 多选,改动只影响后续评分,不重算历史条目 |
| 门槛 | 80 / 85 / 60 只读展示(阈值是开发者工作,不开放编辑) |
主界面顶部只留一行摘要:关注:Agent 基建 · 模型发布 ⚙。
主题个性化怎么起作用
- 内置 4 个方向:
agent-infra(Agent 基建)、model-release(模型发布)、open-source(开源工具)、business(融资与商业)。 - 默认只勾前两项,建议保持 2-3 个——全选会稀释个性化效果。
- 加权上限 +5,且不参与
is_s_tier判定:82 分的条目不会靠加权冒充 S 级。
语言与双语标题
title_zh/title_en由同一次文案调用产出:原文是中文就给英文标题,原文是英文就给中文标题,缺失时回落原文标题。- 摘要与「为什么重要」按
display.language生成一份,随语言设置显示。 - 切换语言只改变「显示哪一版」,不会重写历史条目的文案:老条目缺的那份语言按原样回落。
🤖 原生 Agent 工具
插件向 DSH 宿主注册了 7 个强大的工具函数,Agent 可在对话中自主调用:
get_top_ai_news:获取近期高分精选 AI 资讯,附带当前候选总数、未评分数与预算使用率元数据。search_ai_signals:根据关键词(如DeepSeek-V4.1,reasoning)全文检索本地情报知识库。trigger_feed_sync:手动触发信源异步抓取与大模型评分流水线。get_feed_health:查询各信源健康状态、成功率、最后抓取时间及模型预算消耗。enable_briefing:为当前会话开启定时晨报(默认 08:00:00)与晚报(默认 20:00:00)。disable_briefing:关闭当前会话的定时简报任务,清理计划任务以解锁会话归档。get_briefing_prompt:获取标准的晨报与晚报生成 Prompt 模板。
❓ 常见问题 (FAQ)
Q1: 如果我没有配置大模型服务,插件还能正常工作吗?
能,完全可用。 插件具备 Graceful Zero-LLM Degradation(零模型平稳可用)机制。若宿主未注入 LLM 且未提供 API Key,侧栏会自动展示「原始流」,条目标注「⏳ 未评分」,并根据信源权重(如 OpenAI 博客优先于普通流)与发布时间综合排序,保证新装用户绝不面对空白页面。
补充:绝大多数情况下你不需要配置。插件会继承会话当前选中的默认模型。只有当
health.llm_backend为none时,才需要手动填llmBaseUrl+llmApiKey(或用会话默认模型)。
Q2: 每日 120 次模型调用预算是如何计量的?用完了会怎样?
- 计量口径:实际调用 LLM 的物理次数。打分阶段单条消耗 2 次调用(取均值),摘要阶段消耗 1 次调用。120 次预算约可支持每天研判 40 条精选深度情报。
- 触顶保护:当日达到 120 次后,插件会自动暂停大模型打分,后续抓取的新闻保持
pending原始状态入库展示,不会报错,也不会意外产生超额账单。每天本地零点自动重置。
Q3: 为什么晨报/晚报不弹桌面通知,而是出现在聊天会话里?
DSH 桌面宿主(0.2.2-rc.2)未暴露系统的桌面通知 API,但挂载了强一致、可持久化的计划任务内核 @deepseek-ai/dsh-schedule。更重要的是,简报出现在会话中才是最有价值的交互:
- 它是真实可读、可截图、可沉淀在上下文中的资产;
- 你可以直接在对话框里对 Agent 追问:“展开说说第 2 条技术的实现方案”,瞬间进入深度探讨。
Q4: 归档会话时提示有活跃任务(Active Reminders),该怎么办?
宿主出于安全保护机制,会拒绝归档名下带有未完成循环提醒任务的会话。你只需在对话框中对助手说“关闭当前会话的早晚报”或调用 disable_briefing 工具,即可一键注销定时任务并顺利归档会话。
Q5: 为什么评分 Prompt 里看不到文章的来源网站名称?
这是出于严格的防偏见与防欺骗设计。如果将“来自 OpenAI 官方博客”传入模型,模型打分极易受到名气影响而产生通胀。我们严格遵循“输入只给事实,权重后置结算”原则,大模型只看事件本质,信源倍率在代码层计算。
Q6: 卸载插件后会有数据残留吗?
零外部散落。 插件产生的所有运行时数据(signals.json、sources.yaml、budget.json、preferences.json)均严格收拢在 <dataDir> 目录中,卸载插件后重启宿主不会触发任何异常引用。如需彻底删除数据,直接移除 data/ 目录即可。
Q7: 切换语言后,为什么老条目的标题和摘要没变?
文案是在评分那一刻按当时的 display.language 生成的,写完就固化在数据里。切语言只决定「显示哪一版字段」,不会重写历史条目:
- 标题:
title_en/title_zh缺失时回落原文标题,所以中文源的老条目在英文模式下仍显示中文标题。 - 摘要与「为什么重要」:只有一份,语言由评分时的设置决定。
想彻底解决只能重新评分,而预算不该花在这上面——新抓取的条目会自动带上双语标题。
Q8: 为什么摘要不像标题那样出双语?
标题是标识,缺了就没法读——中文标题对英文用户等于一堵墙,所以必须两个语言都有。摘要是解读,写两份等于同一次调用把同样的意思输出两遍,输出 token 接近翻倍,而读者任何时刻只看一种语言,多出来的那份永远不会被看到。
所以只有标题走双语,摘要与「为什么重要」按 display.language 生成一份。
📄 开源许可证
本项目采用 MIT 许可证。
Похожие плагины
webnovel-writer
lingfengqaq/webnovel-writer
loopx (dsh-loopx-plugin)
loopx-project/loopx
ouroboros (dsh-plugin)
q00/ouroboros
loopx (dsh-loopx-plugin)
huangruiteng/loopx