dsh_WebFocus:用 focus 关键词精读网页,控制 web 抓取注入量

前言

在 DeepSeek Harness(DSH)里做联网智能体时,内置 web_fetch 会把页面 Markdown 按宿主上限整段注入上下文。长文档、维基类页面很容易占满 token,而真正需要的往往只是与当前问题相关的几句事实。

社区插件 dsh-plugin-web-focus(仓库 shutongcao1-design/dsh_WebFocus)注册独立工具 web_focus:先经宿主 ctx.web.fetch() 拉取同一 URL,再按你写的 focus 关键词做句级相关度筛选,压缩链接、去掉导航噪音,并在结果里标明省略比例;未压缩原文会落盘并可回取,页面级结果还会缓存。自 0.2.0 起插件不再接管 fetch 路径,禁用 bundle 也不会影响内置 web_fetch。

这是什么

  • 定位:面向 DSH 的「聚焦阅读」联网工具(社区目录分类:联网工具)。
  • 维护者:shutongcao1-design;当前包版本 0.2.2(MIT)。
  • 与 web_fetch 的关系:web_fetch 行为保持默认;需要按关注点裁剪正文时,改用 web_focus。

核心功能

下面介绍 README 与源码中可核对的能力。

独立工具 web_focus

必填参数为 url(绝对 http/https)和 focus(一句话关键词查询,不是「请总结」类指令)。工具按页内 IDF × 与 focus 的 token 重叠给句子打分,并做稀有词覆盖、角色/日期行补全等后处理;输出主要为 notice + content,并附带 kept、total、truncated、rawPath 等字段供排查。

可选参数包括:

  • full=true:不做相关度筛选,注入整页(仍受 maxTextLength 硬上限约束);focus 仍必填。
  • refresh=true:绕过页面缓存与失败缓存,重新抓取。
  • offset / limit:进入分段窗口路径。
  • max_age:缓存允许的最大秒数,过期则重新抓取。

正文处理与缓存

处理流水线(README 摘要):去不可见字符 → 压缩链接 / 丢弃导航 → 分句 → 强制保留首尾句与含 focus 词的标题(最多 8 个)→ 按 focus 规模在约 4k–12k 字符预算内打分填充 → 保护高相关答案句 → 覆盖与块内聚 → 预算 reconcile → 输出覆盖率头与稀疏匹配提示。

  • 原文保留:默认在插件目录下的 data/raw 写入未压缩正文(可通过 rawDir 改路径);默认约 30 天启动时清理(rawCleanupDays)。
  • 页面缓存:默认 TTL 1800 秒;同一 URL 换不同 focus 会重新筛选,不是回放旧摘要。
  • 失败缓存:默认 240 秒;命中时 web_focus 会抛错而非立刻重试,可用 refresh: true 清缓存。

0.2.x 相对早期原型的变化

README 中的对照基准显示:在 10k–200k 字符的测试页上,0.2.x 在保持关键句覆盖率的同时,注入体量明显小于 0.1.0 的「低保留率则回退整页压缩文」策略。开发期实页检查示例(focus 为 population mayor mission founding date):en.wikipedia.org/wiki/San_Francisco 约 459,687 字符原始体量 → 约 3,765 字符正文片段;zh.wikipedia.org/wiki/Xiamen 约 335,038 → 约 3,946 字符。

已知边界

基于词面重叠的选取无法覆盖与 focus 完全无共同词汇 的表述(README 中的 paraphrase 基准案例)。缓解方式:在 focus 里写上页面可能出现的词、对同义改写多的页使用 full=true,或读取保留的 raw 全文。

环境与依赖

  1. 已启用 DSH 内置 web 服务(@deepseek-ai/dsh-web-app)。
  2. Node.js ≥ 18。
  3. @deepseek-ai/schemastery(peer;由 DSH 提供)。

长页注意:宿主 HTTP 抓取默认在解码正文 100,000 字符处截断。插件在 truncated: true 时会警告;若截断发生在 infobox 之前,聚焦选取无法看到未到达的正文。README 建议在宿主配置中提高 web-fetch-http 的 maxBodyChars(测试配置示例为 2000000),修改后需重启宿主。

- id: web-fetch-http
  config:
    maxBodyChars: 2000000

安装与启用

包未发布到 npm。按 README,先从仓库取得源码,再用 plugin_manager 安装 bundle(cordis.patch.yml 仅插入 web-focus 插件行,不修改 web 行)。

git clone https://github.com/shutongcao1-design/dsh_WebFocus.git

在 DSH 中对 plugin_manager 执行(将路径换成你本机 clone 的绝对路径):

plugin_manager  action: install_bundle   target: <absolute path to the checkout>

若曾安装过带 fetchProvider 的旧版,需先移除旧 bundle,并检查 profile 里是否仍引用旧 provider id。

安装前建议阅读仓库源码与 LICENSE、SECURITY.md。插件在当前 DSH 进程权限下运行,抓取与落盘行为与宿主 web 策略一致,但 raw 目录可能含页面中的个人数据。

典型用法

智能体侧调用工具 web_focus(名称以注册结果为准)。思路是:URL 指向目标页,focus 写你期望出现在答案里的词,而不是自然语言任务描述。

README 开发期实页检查使用的 focus 示例:

population mayor mission founding date

对应维基英文旧金山条目时,人口、市长姓名与建城日期等事实仍出现在约千级字符的摘要中,而非整页 Markdown。

需要通读或 focus 词面覆盖不足时:

  • 设 full=true 获取 capped 全文注入;
  • 或根据返回的 rawPath 读取磁盘上的未压缩原文(注意默认目录在包内,重装 bundle 可能丢失,持久化请配置 rawDir)。

抓取失败或刚失败过的 URL:使用 refresh=true 避免短时间内的失败缓存。

主要配置项

在插件 web-focus 的 config 中可调整(默认值见 README 配置表):

配置项 默认 含义摘要
rawDir 插件下 data/raw 未压缩原文目录
rawMaxChars 4194304 单文件上限
rawCleanupDays 30 启动时清理超过该天数的 raw(0 关闭)
pageCacheTtlSeconds 1800 页面缓存 TTL
negativeCacheTtlSeconds 240 失败缓存 TTL
maxTextLength 80000 注入上下文硬上限
sourcesMax 30 来源脚注条数上限
enableFocusTool true 是否注册 web_focus
exposeInternals false 是否在 ctx.__webFocus 暴露内部对象

适用场景与注意

适合:需要从固定 URL(文档、维基、公告)里按多个事实点抽句、且愿意用关键词表达关注点的 DSH 智能体;与 web_fetch 并存,按任务选择工具。

注意:

  • focus 是关键词查询;问法再完整,若词不在页面上,相关句也不会被选中。
  • 非 2xx 响应会作为结果返回并进入失败缓存,不是抛宿主级网络错误。
  • 抓取经 ctx.web.fetch,SSRF、重定向与大小限制仍由宿主负责;插件不把安全拦截伪装成成功。
  • README 声明其为独立社区插件,与 DeepSeek 无隶属或背书关系;社区目录 SkillHub 亦为独立站点,非官方应用商店。

结尾

dsh_WebFocus 把「整页注入」拆成「按 focus 精读 + 可回取原文 + 缓存复用」,在 0.2.x 中用稀疏摘要替代整页回退,更适合 token 敏感的 Harness 工作流。查阅条目与源码:

羽毛球分组比赛记分
小程序二维码

欢迎使用《羽毛球分组比赛记分》微信小程序

小夜