dsh-websift
Token-efficient web reading for DeepSeek Harness: one call fetches several pages through a real Chrome/Edge over CDP, gates them by relevance and returns a single digest, cutting context tokens by 80-98%. Real search URLs, login flow, screenshots, three proxy modes.
Install
dsh plugin --profile web add dsh-websift
Sandbox test results
| Stage | Result |
|---|---|
| 1 install | ✓ |
| 2 list | ✓ |
| 3 mount | ✓ |
| 4 boot | — |
Four stages run in an isolated sandbox: install (network on) → list → mount → boot (last three with no network).
README
dsh-websift
两件事:把网页压成 token,把检索变准。
能力线 · 做什么
压缩 · 整页正文 → 一段带账本的摘要。按正文字数分档给预算(1200 / 3000 / 4000),抽取式、不调模型,实测压缩 80–98%
检索 · 搜前清洗(去「帮我搜一下」这类壳、拆别名)→ 按标题重合重排、丢首页与符号堆砌 → 抓完按 URL + 正文指纹去重 → 相关性闸门(不命中就明说,不硬凑)
底座是一颗真 Chrome(headless + CDP):JS 渲染、登录态、真实搜索结果链接、截图、三档代理。压缩和检索都在宿主进程里完成,不额外调用模型 —— 所以省下来的 token 是真省,不是换个地方花。
装一次,四个工具在每个会话、每个工作区都有:
web_digest 搜索或给定链接 → 抓正文 → 相关性闸门 → 摘要(省 80–98% token) web_find 真浏览器搜一次,只返回真实链接(不是 so.com/link 那种跳转壳) browser 打开网址取 JS 渲染之后的内容:正文 / DOM / 截图 / 执行 JS / 弹窗登录 browser_proxy 查看 / 切换 / 探测代理,实时生效,不用重启 DSH




下载
已在 npm 上(dsh-websift):直接装就行,不用 clone、不用找包——
dsh plugin --profile <你的 profile> add dsh-websift
也可以去 Release 页拿安装包(.tgz 和 SHA256SUMS.txt 在同一页):
→ 最新正式版(也可以看 全部 Release,含历史预发布)—— 下载其中的 dsh-websift-<版本>.tgz(约 100 KB,含 lib/、docs/、locale/、图标)
版本口径:1.x 起是正式版(Latest);0.9.x 及更早都是预发布,仅作历史留档。
dsh plugin --profile <你的 profile> add "file:<下载路径>/dsh-websift-<版本>.tgz"
校验(同页附件 SHA256SUMS.txt):
sha256sum -c SHA256SUMS.txt
源码可以直接用 Release 页底部的 Source code (zip / tar.gz),也可以 git clone。
每个版本都会打 tag(当前 v1.0.0,正式版)。0.9.x 及更早是预发布,历史留档。
目录
- [它解决什么问题](#它解决什么问题)
- [安装](#安装)
- [30 秒验证](#30-秒验证)
- [工具参考](#工具参考)
- [
browser](#browser) - [
web_find](#web_find) - [
web_digest](#web_digest) - [
browser_proxy](#browser_proxy) - [代理:为什么默认是 auto](#代理为什么默认是-auto)
- [省 token 的依据](#省-token-的依据)
- [设置面板与配置文件](#设置面板与配置文件)
- [资源占用与硬约束](#资源占用与硬约束)
- [已知限制](#已知限制)
- [排错](#排错)
- [开发](#开发)
- [许可](#许可)
它解决什么问题
DSH 自带的 web_fetch 是一个 HTTP 抓取器:没有 JS 引擎、不保持登录态、不认系统代理。遇到下面这些它就废了,而 agent 最常撞上的恰恰是这些:
场景 · web_fetch · dsh-websift
页面靠 JS 渲染(SPA、搜索结果页、文档站) · 只拿到「请启用 JavaScript」空壳 · 真 Chrome 跑完 JS 再取
搜索结果的跳转壳(so.com/link?m=…) · 原样返回壳 · 浏览器点进去,要 DOM 里真实的 href
需要登录才能看的内容 · 401 / 登录页 · browser({action:"login"}) 弹窗登录,cookie 留在插件自己的 profile 里
被墙的站点 · 直连失败(Node 的 fetch 不读代理环境变量) · 三档代理 + 按域名自动探测
一次查资料要读 5 个页面 · 5 份全文进上下文,几万 token · web_digest 一次调用,只回一段带账本的摘要
想知道页面长什么样 · 不行 · 整页 PNG 落盘,只返回路径,用 read_image 看
核心取舍:只调一次,只回一份。 每一步操作都返回一份摘要 = 5 步 5 倍 token;所以 web_digest 把搜索、抓取、筛选、抽取全放在宿主进程里做完,模型只看到最后那段压缩文本。
为什么做成插件,而不是工作区脚本
脚本换个对话、换个工作区就找不到了。插件是 profile 级的:装进 ~/.dsh/profiles/<name>/node_modules,由 DSH 在启动时组装,每个会话都带着这些工具,不依赖你把文件放在哪。
安装
需要 DSH(桌面版或 CLI 均可)和一份本机 Chrome/Chromium。
# ① 从 npm 装(最省事,版本固定) dsh plugin --profile <你的 profile> add dsh-websift # ② 从 git 装(跟随仓库最新) dsh plugin --profile <你的 profile> add github:KNLCXY/dsh-websift # ③ 从目录装(要改代码时) dsh plugin --profile <你的 profile> add "file:/绝对路径/dsh-websift" # ④ 从打包好的 tgz 装(离线分发) dsh plugin --profile <你的 profile> add "file:/绝对路径/dsh-websift-<版本>.tgz"
装完必须重启 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 才算真内核)
应用内置内核(豆包、夸克等)多是 Electron 套壳:能找到、能选,但可能只打开它自己的界面,
不一定能当浏览器用——优先选标准浏览器。
找不到才需要你手动指一个:
// ~/.dsh/storages/websift/settings.json
{ "chromePath": "C:/Program Files/Google/Chrome/Application/chrome.exe" }
或者在 设置 → 浏览器代理 → 自定义 → 内核路径 里填(校验 .exe)。
状态行会标明当前用的是哪个内核、是不是自动探测来的。
没有 Chrome?Edge 也行,Chromium 系的都可以:任何能跑 --remote-debugging-port 的内核都能用。
其他要改的默认值
字段 · 默认 · 说明
proxyUrl · http://127.0.0.1:7897 · Clash Verge 的 mixed 端口;没装代理就改成你本机的,或者把 proxyMode 设成 never
port · 9333 · CDP 调试端口,别和别的调试端口撞
proxySites · github / google / youtube / x … · 命中就直接走代理、不做直连探测。你那边能直连的站点请删掉
30 秒验证
装完重启 DSH,然后让 agent 依次跑:
browser_proxy({ action: "status" }) // 看模式、端口、配置文件路径
browser({ url: "https://example.com", action: "eval",
js: "({t:document.title, links:document.querySelectorAll('a').length})" })
web_digest({ query: "deepseek harness 插件", max_pages: 2, budget_chars: 1200 })
正常的话第二次调用会拉起内核(3–6 秒),之后每次 1–3 秒。
工具参考
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)
批量动作是省 token 的关键:点开折叠菜单、滚动到底、再取正文,三步合成一次调用,中间态不回流。
// actions 的语法(按顺序执行,任一失败即停止并报告是哪一步)
[
{ "click": "a.morelink" }, // CSS 选择器,或按钮文字(完全匹配)
{ "wait": 800 }, // 毫秒
{ "scroll": "bottom" }, // bottom 或像素值
{ "type": { "selector": "#q", "text": "关键词" } }
]
截图返回的是文件路径,之后用 read_image 看 —— 图片不进对话 token。
登录(action: "login")会强制打开可见窗口,往页面里注入一条工具条(「✅ 我已登录」/「✕」)。你扫码、填密码、过验证码都行,点一下确认就回传成功。插件*
…(truncated)
Rendered from the README published on npm. Formatted only, not edited.
Versions
Published on npm::7,最后更新 2026-10-24