dsh-websift:把网页压成 token,把检索变准

前言

DeepSeek Harness(DSH)自带的 web_fetch 是一个 HTTP 抓取器:没有 JS 引擎、不保持登录态、不认系统代理。遇到 SPA 页面、搜索结果跳转壳、需要登录的内容、被墙站点时,它就失效了,而 agent 最常撞上的恰恰是这些。

dsh-websift 是一个 DSH 插件,定位为「联网工具」:它用一颗真 Chrome(headless + CDP)作为底座,在宿主进程里完成压缩和检索,不额外调用模型。装一次,四个工具在每个会话、每个工作区都有:web_digest、web_find、browser、browser_proxy。

核心能力

压缩:把网页压成预算内的摘要

  • 按「正文字数分档给预算」:1200 / 3000 / 4000 字符。
  • 抽取式:不调用模型,只挑句子,相邻句合并成段落,按原文顺序还原。
  • 实测压缩率:80–98%。
  • 输出开头带「账本」:正文字符数 → 摘要字符数 → 压缩率 → 预估 token 数。

检索:把搜索结果筛成可信的几条

  • 搜前清洗:去掉「帮我搜一下 / 是什么」这类指令壳;拆别名(逗号、又名、括号)各搜一轮。
  • 重排:按标题与查询词的字面重合度排序;丢掉首页、纯域名、符号堆砌这类低质标题。
  • 去重:URL 规范化去重;15 分钟缓存、最多 60 条。
  • 相关性闸门:正文里真的出现查询词才算命中(≥2 词或 ≥30%)。不命中就跳过,不硬凑摘要。
  • 数值豁免:带单位的数字(公里 / 千米 / km / 米 / 马赫 / 吨 / kg / MB / GB / TB / ms / %)即使所在句没命中查询词也会被保留。

安装与启用

需要 DSH(桌面版或 CLI)和一份本机 Chrome/Chromium。

dsh plugin --profile <你的 profile> add dsh-websift

装完必须重启 DSH —— 插件的宿主半和 client 半都在进程启动时组装一次。

内核路径:一般不用改

留空 = 自动探测。插件会按顺序找:
- 环境变量 DSH_CHROME
- 系统安装的 Chrome / Edge / Brave / Chromium
- 有界扫描:%LOCALAPPDATA%、%APPDATA%、Program Files、(x86)、~/Desktop、DSH/resources(深度 4–5,认识豆包 / 夸克 / 360 / QQ / 搜狗 / UC / 猎豹 / Vivaldi / Opera,并要求目录里有 icudtl.dat 或 *.pak 才算真内核)

找不到才需要你手动指一个:

// ~/.dsh/storages/websift/settings.json
{ "chromePath": "C:/Program Files/Google/Chrome/Application/chrome.exe" }

或在「设置 → 浏览器代理 → 自定义 → 内核路径」里填(校验 .exe)。

代理配置

  • 默认端口:9333(CDP 调试端口)。
  • 默认代理 URL:http://127.0.0.1:7897(Clash Verge 的 mixed 端口)。
  • 默认代理模式:auto(直连不通再走代理)。
  • 默认代理站点:github / google / youtube / x …(命中就直接走代理,不做直连探测)。

如需修改,可在 ~/.dsh/storages/websift/settings.json 中设置 proxyUrl、port、proxyMode(auto / always / never)、proxySites。

工具参考

browser

用本机 Chrome 内核打开网页,拿 JS 渲染之后的内容。

参数 类型 默认 说明
url string 必填 完整 URL(含 https://)
action string text text / html / eval / screenshot / login
js string — action=eval 时执行的表达式
wait_ms number 600 readyState 完成后再等多久;SPA 建议 1500–3000
max_chars number 4000 返回文本上限
proxy string 跟随设置 单次覆盖:auto / always / never
full_page boolean true 截图是否整页
out string ~/.dsh/storages/websift/shots/ 截图保存路径
actions string — 批量动作(JSON 数组,最多 12 个),在取正文前一次性做完,只返回最终页面
wait_until string — action=login 时,出现这个 CSS 选择器就算登录成功
timeout_s number 180 action=login 的等待秒数(最少 20,最多 600)

批量动作示例:

[
  { "click": "a.morelink" },
  { "wait": 800 },
  { "scroll": "bottom" },
  { "type": { "selector": "#q", "text": "关键词" } }
]

截图返回文件路径,之后用 read_image 看 —— 图片不进对话 token。

登录(action: “login”)会强制打开可见窗口,往页面里注入一条工具条(「✅ 我已登录」/「✕」)。你扫码、填密码、过验证码都行,点一下确认就回传成功。插件不碰你的密码,cookie 只留在插件自己的 profile 目录里,后续调用自动带上。

web_find

用真浏览器搜一次,只返回链接清单(标题 + 真实 URL)。

参数 默认 说明
query 必填 搜索词;人话会先洗成关键词(「帮我搜一下东风41的射程」→「东风41 射程」)
engine auto auto 先 Bing → 采用少于 3 条换 Google → 再换百度;也可指定 bing / google / baidu / 360
aliases — 别名,逗号分隔(最多 4 个),每个别名各搜一轮
limit 8 3–15
proxy 跟随设置 auto / always / never

返回固定抬头:采用 / 弃用 / 建议深挖,按标题与查询词的字面重合度排序。标 ★ 的前 3 条直接丢给 web_digest({ urls })。

web_digest

把「查资料」压成一次调用:搜索(或给定链接)→ 抓正文 → 相关性筛选 → 抽取并合并关键句 → 返回紧凑摘要。

参数 默认 说明
query — 搜索词;给了 urls 可省略
urls — 逗号或空格分隔;跳过搜索,只深挖这些页
max_pages 3 1–6;同一站点只取一条,保证来源多样
budget_chars 3000 600–20000
allow_browser true HTTP 抓不到时是否升级到真浏览器
strict false 更严:标题与查询词零重合的页不抓;正文须命中 ≥3 词或 ≥45%
links_only false 只返回排好序的链接,不抓正文

管线(全部在宿主进程里完成,不调用模型,所以零额外 token):
1. 搜前清洗:去掉指令壳;拆别名。
2. 去重 + 缓存:URL 规范化去重;15 分钟缓存、最多 60 条。
3. 抓取:先 ctx.web.fetch()(直连、无 JS)→ 失败或只有 JS 空壳 → 真浏览器(auto:直连不通再走代理)。
4. 相关性闸门:正文里真的出现查询词才算命中(≥2 词或 ≥30%)。不相关的页跳过并在头部列出;一页都不命中时不硬凑摘要。
5. 抽取:命中的页面按「查询词命中 + 段落感 + 短行惩罚」挑句子,相邻句合并成段落再按原文顺序还原;跨页去重;按预算拼成一段。

输出开头自带账本,让你知道这次调用值不值。

browser_proxy

参数 说明
action status(默认)/ set / test / stop
mode action=set 时:auto / always / never
url action=test 时:要探测的 URL

适用场景与注意

  • 适合需要 JS 渲染、登录态、真实搜索链接、代理访问的场景。
  • 插件以当前 DSH 进程权限运行,安装前应检查源码与许可证。

短结尾

dsh-websift 用真 Chrome 做底座,把压缩和检索放在宿主进程里完成,不额外调用模型,省下来的 token 是真省。适合需要 JS 渲染、登录态、真实搜索链接、代理访问的 agent 开发场景。

目录页:https://www.skillhub.cn/plugins/KNLCXY/dsh-websift
GitHub:https://github.com/KNLCXY/dsh-websift

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

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

Xiaoye