dsh-web-search-free: Free Web Search Plugin for dsh with Multi-Engine Fallback

前言

用 dsh 做智能体开发时,联网搜索默认走官方的 deepseek-official 通道。这个通道不是专用搜索端点:每次搜索都会发起一次完整的 Messages 模型调用,先消耗一份搜索请求本身的 token,再把结果回灌对话、作为对话 token 计费,两份都从 DEEPSEEK_API_KEY 余额里扣;而且它强制依赖这个 key——如果你的对话模型走的是第三方渠道,很可能根本没配。下面介绍的 dsh-web-search-free 把这条通道替换成多引擎 + 自动 fallback 的纯检索实现,检索本身不消耗任何模型 token。

这是什么

dsh-web-search-free 是面向 DeepSeek Harness (dsh) 的免费 Web 搜索 / 网页抓取插件,由 MochiNek0 维护,当前版本 1.3.0。装上后它注册为 dsh 的 web 能力通道,同时提供 searchProviderfetchProvider(id 均为 web-search-free),接管默认的搜索/抓取。

它是作为 dsh bundle 层安装的(package.json 里声明 dsh.bundle.patch):装上即接管 web 搜索/抓取,卸载并重启 dsh 后自动回落到默认通道,全程不需要手改 profile。

工作方式:纯检索,0 模型 token

所有检索请求由 dsh 的宿主进程(Node)直接发往各引擎的专用检索端点,例如 Tavily 的 /search、Exa 的 /search、Jina 的 s.jina.ai。这条链路不经过官方搜索后端,也不经过任何 LLM;计费走各引擎自身的 API 额度,多数有免费层。浏览器侧只有那张设置卡片,不发任何网络请求。

与官方通道的对比:

官方 deepseek-official 本插件 web-search-free
检索方式 一次完整 Messages 模型调用 直接调各引擎专用检索端点
模型 token 每次搜索都消耗 0
计费来源 DEEPSEEK_API_KEY 余额 各引擎自身额度
凭据 强制依赖 DEEPSEEK_API_KEY 各引擎各自的 API Key
结果内容 sources sources + snippet(Tavily 另给直接回答)

支持的引擎与免费额度

支持 8 个引擎,表格顺序即默认调用顺序:

引擎 搜索 抓取 免费额度
TinyFish 免费(限速:Search 30 req/min、Fetch 150 url/min)
AnySearch 1,000 次/天,每日重置
Exa (Metaphor) 注册送 $20 + 每月补 $10,累积不清零
Tavily 1,000 credits/月
Firecrawl 1,000 credits/月
Brave Search $5 额度/月,需绑卡但不扣费
SerpApi 250 次/月
Jina AI 新 key 送 10M tokens,一次性,不重置

两点注意:

1、Brave Search 和 SerpApi 是纯 SERP,没有 URL 抓取端点,不会进入抓取链。如果只配了这两家的 Key,抓取会以 No web fetch providers configured. 报错——请再给一个支持抓取的引擎配上 Key。

2、结果日期(publishedAt)覆盖差异大:Brave 的 page_age 覆盖最多;Tavily 的 published_date 仅在 topic: 'news' 下返回,本插件走通用网页搜索,因此实际为空;Firecrawl 和 AnySearch 的搜索结果没有日期字段。在意时效判断的话,可以把 Brave 往调用顺序前面挪。

安装与启用

前置条件:已安装 dsh 且 dsh 命令可用;pnpmPATH 上;目标 profile 一般是 web(插件的客户端半边声明 platform: web,设置卡片只在 Web 界面出现)。

从 npm 安装(推荐):

dsh plugin --profile web add dsh-web-search-free

执行后插件以 bundle 层接管 web 搜索/抓取。

从本地源码安装(开发 / 二次开发用),先构建再装入:

cd /path/to/dsh-web-search-free
pnpm install
pnpm build
dsh plugin --profile web add .

也可以用绝对路径从任意目录执行:dsh plugin --profile web add /absolute/path/to/dsh-web-search-free

配置

先启动 dsh Web 界面:

dsh web          # 等价于 dsh --profile web

打开 设置 → 插件 → 免费 Web 搜索(英文界面为 Web Search Free)卡片:

1、逐个填引擎的 API Key。同一引擎支持多个 Key,每行一个,引擎内按行顺序轮换;任一 (引擎, Key) 成功即返回。

2、已填 Key 的引擎进入调用链,拖动行左侧的 ⋮⋮ 手柄调整调用顺序:排在前面的先调用,前一个失败或额度耗尽自动落到下一个。

3、按需开关模型侧的 web_fetch 工具:开启即挂载,关闭即从模型工具表移除(不是留着报错)。

4、点「保存」。配置通过 dsh 的设置命名空间(web-search-free)持久化,保存后即时生效,无需重启。卡片文案跟随 dsh 语言设置在中英之间切换。

两点提醒:至少配置一个引擎的 Key,否则搜索/抓取会以 No web search providers configured. 报错;web_fetch 默认开启(dsh 官方组合默认关掉它),在意出网面可以在卡片里关掉,代价是模型无法读取贴给它的 URL 或精读长文档。

验证

在对话里让模型实际用一次 Web 能力,例如「搜一下今天的新闻」或「抓取 https://example.com 的内容」。第二条需要卡片里「启用 web_fetch」处于开启状态,否则模型的工具表里没有这个工具。请求会按你排定的引擎顺序执行,某个引擎失败或额度耗尽时自动落到下一个。

更新与卸载

# npm 安装:升级到新版本
dsh plugin --profile web update dsh-web-search-free

# 本地源码链接安装:重新构建即可
cd /path/to/dsh-web-search-free && pnpm build

卸载分两步。先点卡片底部的「清空全部配置」(需点两次确认)——dsh 的卸载流程不会清理设置命名空间,跳过这一步 API Key 会留在 $DSH_HOME/settings.yaml 里。然后再执行:

dsh plugin --profile web remove dsh-web-search-free

卸载后需要重启 dsh,搜索/抓取才真正回落到默认的官方通道。

适用场景与注意

它适合这几类情况:对话模型走第三方渠道、没有 DEEPSEEK_API_KEY(官方通道强制依赖它);在意搜索带来的 token 成本(这里检索 0 模型 token,只花各引擎免费额度);想自己控制调用顺序、用多 Key 轮换提高可用性。

安全方面需要说明:插件以当前 dsh 进程的权限运行,安装前建议先浏览仓库源码、确认许可证信息。截至本文写作(2026-09-07),该仓库的 README 与 package.json 中未见明确的 license 字段,介意的话先向作者确认再用。

结尾

dsh 的理念是一切皆插件,dsh-web-search-free 是这个思路下的一个实用件:不改 profile 就能接管/回落 web 通道,检索不烧模型 token,引擎顺序和 Key 都由你在设置卡片里自己排。相关链接:

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

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

Xiaoye