dsh-websift

browsertested: passnpmMIT

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.

下载量 / Downloads
1,837
依赖体积 / node_modules
0.41 MB
测试时间 / Tested
2026-11-06
DSH 版本 / Version
0.2.2-rc.1

Install

dsh plugin --profile web add dsh-websift

Sandbox test results

StageResult
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

![license](LICENSE)

![dsh](https://github.com/deepseek-ai)

![release](https://github.com/KNLCXY/dsh-websift/releases/latest)

![npm](https://www.npmjs.com/package/dsh-websift)


下载

已在 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

Links

GitHub · Homepage · npm

Same category