前言¶
在 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 全文。
环境与依赖¶
- 已启用 DSH 内置
web服务(@deepseek-ai/dsh-web-app)。 - Node.js ≥ 18。
@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 工作流。查阅条目与源码: