前言¶
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