起因:官方 Web 搜索为什么"贵"
最近在用 DeepSeek Harness (dsh) 搭自己的 Agent 工作流,发现一个容易被忽略的坑:dsh 默认给对话模型接的 Web 搜索通道 deepseek-official,并不是一个独立的搜索接口,而是每次搜索都要发起一次完整的 Messages 模型调用(POST …/anthropic/v1/messages,带官方原生的 web_search 服务端工具)。
也就是说,用户随口一句"帮我搜一下今天的新闻",背后其实烧了两份 token:
这两份 token 都从你的 DEEPSEEK_API_KEY 余额里扣。更麻烦的是,官方通道强制依赖 DEEPSEEK_API_KEY:如果你的对话模型走的其实是第三方/自建渠道,很可能压根没配这个 key——但 dsh 判断"该 provider 是否可用"时,只检查"有没有 key 解析器"(永远有),所以照样会选中它,直到模型真的调用 web_search 才会抛出 WEB_PROVIDER_CREDENTIAL_MISSING,界面上完全看不出异常,排查起来很折腾。
于是就有了这个插件:dsh-web-search-free。
这插件做了什么
一句话概括:把 dsh 的 web 能力通道(同时管搜索和网页抓取)从官方那条"经过 LLM"的链路,换成直连各搜索引擎专用检索端点的链路——纯检索,不经过任何大模型,自然也就不烧模型 token。
| 检索方式 | 一次完整 LLM 调用 + 服务端搜索工具 | 直接调用各引擎自己的检索 API |
| 模型 token | 每次搜索都烧(input + output) | 0,纯检索,不碰 LLM |
| 计费来源 | DeepSeek API 余额 | 各搜索 API 自己的额度(大多有免费层) |
| 凭据要求 | 必须 DEEPSEEK_API_KEY | 各引擎各自的 API Key |
除了省 token,插件还做了几件我认为比较实用的事:
- 多引擎 + 自动 fallback:目前接入了 TinyFish、AnySearch、Exa (Metaphor)、Tavily、Firecrawl、Brave Search、SerpApi、Jina AI 共 8 个引擎,可以按自己的顺序排列调用优先级,前一个失败(限流、额度耗尽等)自动落到下一个;同一引擎还支持填多个 Key(每行一个),引擎内部按顺序轮换,进一步抗限流。
- 可视化设置卡片:装完之后在 dsh Web 界面的"设置 → 插件 → 免费 Web 搜索"里,就能看到一张卡片——已配置 Key 的引擎在"调用顺序"分组里,按 #1、#2 排序,拖一下左边的 ⋮⋮ 手柄就能重新排序;没配 Key 的引擎折叠收在"其他可用引擎"里,点开填 Key、点行内按钮直达对应引擎的申请页,非常省心。文案还跟着 dsh 的语言设置在中英文之间切换。
- web_fetch 工具开关:除了搜索,插件同时接管网页抓取(fetchProvider),卡片里有个"启用 web_fetch"开关,开着的时候模型可以对指定 URL 抓全文;关掉时这个工具会直接从模型工具表里摘掉(不是留着报错),即开即生效,无需重启。
- 装/卸都不用手改配置:本质是 dsh 的一个 bundle 层,dsh plugin –profile web add dsh-web-search-free 装上就自动接管 web 搜索/抓取;remove 之后(重启一下)自动回落到官方默认通道,全程不用手动改 profile 或 patch 文件。
引擎怎么选、免费额度差异有多大
不同引擎的免费额度机制差别不小,简单列一下(按插件默认顺序,从可持续免费量大到小排):
| TinyFish | ✓ | ✓ | 完全免费,只按速率限(搜索 30 req/min) |
| AnySearch | ✓ | ✓ | 1,000 次/天(每天重置) |
| Exa (Metaphor) | ✓ | ✓ | 注册送 $20 + 每月补 $10 credit(累积不清零) |
| Tavily | ✓ | ✓ | 1,000 credits/月(每月重置) |
| Firecrawl | ✓ | ✓ | 1,000 credits/月 |
| Brave Search | ✓ | ✗ | $5 额度/月(需绑卡不扣费,多数结果带日期) |
| SerpApi | ✓ | ✗ | 250 次/月 |
| Jina AI | ✓ | ✓ | 新 key 一次性送 10M tokens(约 1,000 次搜索) |
需要注意两点:
- Brave Search 和 SerpApi 都没有 URL 抓取端点,只能进搜索链,不会进抓取链。如果只填了这两家的 Key,抓取会报 No web fetch providers configured.,得再配一个支持抓取的引擎。
- 搜索结果的时效性(发布日期)覆盖率差别很大:Brave 的 page_age 字段基本每条结果都有,Exa、Jina 部分有,Tavily 在本插件走的通用搜索模式下几乎没有日期字段,Firecrawl、AnySearch 干脆没有日期字段。如果你的场景很在意"这条结果是不是新的",可以把 Brave 挪到调用顺序靠前的位置,代价是牺牲掉 Tavily 自带的"直接回答"片段。
快速上手
前提:已经装好 dsh,且 pnpm 在 PATH 上。
# 装插件(会自动接管 web 搜索/抓取,无需手改 profile)
dsh plugin –profile web add dsh-web-search-free
# 启动 Web 界面
dsh web
打开「设置 → 插件 → 免费 Web 搜索」,随便挑一两个引擎,去对应官网申请 API Key(免费额度基本秒批),粘贴进去点保存,就能用了。至少要配一个引擎的 Key,否则会报 No web search providers configured.。
卸载也很干净:
dsh plugin –profile web remove dsh-web-search-free
不过卸载前建议先点卡片底部的"清空全部配置",把写进 settings.yaml 的 Key 清掉;卸载后需要重启 dsh 才会真正回落到官方通道。
顺带一提:dsh-desktop
如果你不想自己折腾 dsh 的命令行安装、profile 配置这一套,也可以直接用我做的 dsh 桌面客户端 dsh-desktop——dsh-web-search-free 这个插件已经内置在里面(也可以单独去 dsh-market 里搜到装上),装完 dsh-desktop 基本等于开箱自带这套免费搜索方案,不用再单独执行插件安装命令。
官网:dsh-desktop.cc.cd GitHub 仓库:https://github.com/MochiNek0/dsh-desktop
相关链接
- 插件 GitHub 仓库:https://github.com/MochiNek0/dsh-web-search-free
- npm 包:https://www.npmjs.com/package/dsh-web-search-free
- dsh-desktop 官网:dsh-desktop.cc.cd
欢迎试用、提 Issue,也欢迎在评论区交流各引擎的使用体验~




