前言¶
DeepSeek Harness(DSH)的 ctx.web 默认使用 deepseek-official 提供商,每次搜索都要扣除 DeepSeek 账户余额。余额耗尽时,web_search 会报 HTTP 402 Insufficient Balance,只能退回到 web_fetch,这会限制智能体的搜索能力。
dsh-web-bridge 是一个替代方案:它不依赖 API 密钥或账户,直接驱动浏览器或发送 HTTP 请求,从公开搜索结果页面提取链接。当官方余额不足时,这个插件可以让 web_search 继续工作。
是什么¶
dsh-web-bridge 是一个 DSH 插件,为 ctx.web 提供一个搜索提供者。它支持 Bing、DuckDuckGo、Marginalia 等引擎,通过 HTTP 或真实浏览器读取结果页,返回标准的 WebSearchResult。它不提供排名或聚合,只是把某个引擎的结果原样读出来。
插件维护者为 RGBcript,开源许可证为 MIT。
核心功能¶
支持的引擎与传输方式¶
- Bing:HTTP 和浏览器模式都可用,每页可提取约 15 个结果链接
- DuckDuckGo:HTTP 模式可用,但高负载时会出现验证码,此时退化为仅浏览器模式
- Marginalia:HTTP 模式可用,返回结果较少但干净
- Brave Search:需要会话 Cookie,默认关闭,HTTP 模式会被挑战
- Exa:语义搜索引擎,仅在所有词法引擎返回空结果时作为最后手段
插件优先使用 HTTP,仅在 HTTP 无法提取有效内容时才启动浏览器。
两种运行模式¶
- light:仅使用 HTTP,不启动任何浏览器进程
- auto:先用 HTTP 尝试所有候选引擎,全部失败后再启动浏览器
- browser:直接启动浏览器驱动
auto 模式下,如果 HTTP 能工作,就不会消耗浏览器资源。实测在启用浏览器时,会创建约 6 个进程,占用约 410 MB 内存,关闭后释放。
错误处理与重试¶
- API 端点请求受内部互斥锁保护,避免并发冲突
- 遇到
429(速率限制)会返回WEB_RATE_LIMITED,而不是空结果 - 插件会在本地保存
memo.json,记录哪个引擎/传输组合在你的机器上返回了结果,后续优先使用该组合
Exa 的定位¶
Exa 是唯一的无密钥语义搜索引擎,但被安排在最后执行,原因有两点:
- 延迟较高:每次调用约 1.5–5.6 秒,高于词法引擎的约 1 秒
- 速率限制更严格:五次并发调用会产生两次
429
安装与启用¶
安装¶
使用 DSH 的插件管理器安装:
dsh plugin --profile <profile> add dsh-web-bridge
配置¶
安装后,在对应 profile 的 cordis.patch.yml 中指向这个提供者:
- id: web
config:
searchProvider: bridge
fetchProvider: http
fetchProvider: http 很重要:当存在多个可用提供者且没有明确指定时,web_fetch 会因为歧义而失败。
重启¶
安装后必须重启 DSH。DSH 在启动时组合已挂载的条目,之后不会重新计算。如果修改已有条目的配置,会立即生效;添加新条目则不会。
Windows Electron 上的额外配置¶
某些 Windows Electron 构建可能无法自动识别 bundle patch,此时需要在 cordis.patch.yml 中显式声明:
- insert:
- id: web-bridge
name: dsh-web-bridge
config:
providerId: bridge
注意:顶层使用 - id: web-bridge 只会补丁已存在的条目,不会创建新条目。
配置选项¶
所有字段都是可选的,默认值来自 README 的测量结果。
| 字段 | 默认值 | 说明 |
|---|---|---|
providerId |
bridge |
提供者注册的 ID,web 条目通过它进行引用 |
engine |
auto |
引擎名称:auto、bing、duckduckgo、marginalia、brave |
mode |
auto |
运行模式:light(仅 HTTP)、auto(HTTP 优先)、browser |
channel |
auto |
要驱动的浏览器:auto、brave、edge、chrome |
executablePath |
— | 显式浏览器二进制路径,覆盖 channel |
headless |
true |
是否隐藏浏览器窗口 |
idleCloseMs |
45000 |
浏览器闲置多少毫秒后关闭 |
userDataDir |
— | 持久化浏览器配置目录,不填则使用临时目录 |
maxResults |
8 |
单次搜索返回结果数的上限 |
timeoutMs |
20000 |
每次搜索的超时时间(毫秒) |
fallbackEngines |
[] |
主引擎失败时额外尝试的引擎列表 |
provenance |
true |
是否在结果前添加一行来源信息(引擎 + 传输方式) |
useBridge |
true |
设置复选框,用于在 seam 之间切换提供者 |
工具脚本¶
tools/ 目录包含一些诊断和测试工具:
node tools/env-doctor.mjs # 检查每个已安装插件是否与当前运行时兼容
node tools/preflight.mjs # 检查 profile 是否就绪(重启前运行)
node tools/rollback.mjs # 不通过 DSH 切换提供者(插件无法加载时使用)
node tools/selftest.mjs # 对真实引擎进行端到端搜索测试
node tools/engine-matrix.mjs # 检查哪些引擎在当前网络下可用
node tools/footprint.mjs # 测量一次搜索的进程数和内存占用
env-doctor 存在的原因是 dsh --dump-config 无法看到插件管理器的兼容性门禁,该门禁仅在 Electron 环境运行。如果某个插件被 pin 到旧版本,会静默被拒绝——安装、声明、导入都成功,但不会挂载。
插件不做什么¶
- 不提供排名或聚合:每次搜索只使用一个引擎,不合并多个引擎的结果
light模式下不处理 JS 渲染页面:需要 JS 渲染的内容必须使用浏览器模式- 不访问需要认证的内容:付费墙、登录页面、社交平台不在能力范围内
- 不支持代理
- 不是
web_fetch的替代品:它通过searchProvider指定搜索提供者,而web_fetch有自己的提供者机制
适用场景¶
适合以下情况:
- DeepSeek 账户余额不足或不想消耗余额
- 不需要复杂的语义排名,只要能从公开搜索引擎获取链接
- 愿意接受搜索结果不排序、不聚合的代价
- 在没有 Docker 或不想运行额外服务器的环境使用
使用前建议:
- 检查插件源码与许可证(MIT)
- 确认 DSH 版本符合要求(>=0.2.0-rc.2 <0.3.0)
- 运行
node tools/preflight.mjs确认 profile 就绪 - 在测试环境先验证引擎在当前网络下的可用性
小结¶
dsh-web-bridge 用浏览器或 HTTP 直接读取公开搜索结果,在没有 API 密钥、账户和配额限制的情况下,为 DSH 提供了搜索能力。它与官方提供者是对称的选择:官方提供者按排名聚合结果但消耗余额,这个插件则牺牲排名和聚合,换取零成本、零配置的搜索能力。
插件主页与源码仓库:
- GitHub:https://github.com/RGBcript/dsh-web-bridge
- 目录页:https://www.skillhub.cn/plugins/RGBcript/dsh-web-bridge