DeepSeek Harness 的无密钥 Web 搜索插件

前言

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

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

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

小夜