它是什么,接在哪条缝上
DSH Free Search 是一个已发布到 npm 的包,包名 dsh-free-search,当前版本 0.4.26,MIT 许可,作者 DDDMUC。它自己的 README 称它为「DeepSeek Harness 免费搜索插件」,而它要解决的问题写得相当具体:dsh 默认的搜索 provider 依赖 DeepSeek 官方 API key,所以既没有官方 key、又用着 opencode-go 这类 OpenAI 兼容端点(该端点不支持 web_search 工具)的用户,会遇到内置搜索必然失败、agent 只好说「无法联网」的情况。
接入点就是 Harness 自己的扩展缝。README 的原话是这个插件「注册进 ctx.web seam」,并且更具体地说明它实现官方 WebSearchProvider 接口(id / available() / search()),因此内置的 web_search 工具会自动选用它。这个区别很关键:它不是让模型新学一个工具,而是插进 Harness 本来就会查询的一条缝;README 也表示它刻意与官方插件共存。
包的 dsh 字段声明了 bundle patch(cordis.patch.yml)、一个注入 @deepseek-ai/dsh-client-runtime 的 web 平台客户端、>=0.1.1-rc.1 的 Harness 下限,以及一张兼容表——其中标为兼容的版本从 0.1.1-rc.1 一直到 0.1.5-rc.2。除原生搜索行之外,README 还记录了三个宿主端工具:advanced_search、platform_search、free_search_test。需要单独点明的是,它宣传的网页抓取能力来自官方 dsh-web-fetch-http provider,并不是这个包自己提供的——功能列表把它们写成了一整块,容易让人误读。
引擎清单、默认值与切换方式
README 列出了十二个引擎 id。免费的有 ddg、ddg-lite、bing、anysearch、searxng、exa、tavily、keenable、firecrawl;付费的有 parallel、perplexity、deepseek-official。
默认引擎是 bing,README 说它最稳定,并通过 zh-CN 市场做了中文优化——不是 DuckDuckGo。DuckDuckGo 是以 HTML 与 Lite 两个变体的形式存在,README 对这两者都标注了偶发的反爬限流。因此,把这款插件描述成「后端是 DuckDuckGo」既低估也误述了它,本目录原先的 tagline 已按来源更正。
切换引擎有三条路。设置卡片上的 Search engine 下拉框,保存即生效;旁边的 Use Bing default 按钮把首选引擎切回 Bing。聊天框里输入 /free-search-engine 会弹出引擎选择窗口,交互与 /model 选模型一致,当前引擎会被标记出来。也可以直接改 ~/.dsh/settings.yaml 里的 free-search: 段:provider: 放引擎 id,旁边还有 lang:、bingMarket:、region:、searxngInstances: 以及各引擎的 API key 字段。此外 tools/ 目录附带一个零依赖的 Windows 启动器和一个无界面的 PowerShell 脚本,做的是同一件事。
自动回退,以及「无需 key」到底指什么
README 的主打说法是零成本、无需 key、无需注册。仔细读会发现,这个说法针对的是免费引擎和开箱即用的体验——包描述本身就写着「Bing/DuckDuckGo/AnySearch/SearXNG/Exa/Tavily/Keenable/Firecrawl keyless; Parallel/Perplexity/DeepSeek with key」。十二个引擎里有三个是要 key 的:Parallel 需要 PARALLEL_API_KEY,Perplexity 需要 PERPLEXITY_API_KEY,DeepSeek 官方需要 DEEPSEEK_API_KEY。谁把「无需 API key」推广到整张引擎表,谁就超出了来源。
让无 key 路线成立的是统一回退。任何引擎失败——免费或付费、缺 key、401、限流、网络错误、反爬挑战——都会把这次搜索交给下一个引擎。README 描述的顺序是:先试配置的首选引擎,再试其他引擎,其中 exa、tavily、keenable、firecrawl 即使没配 key 也会被尝试,因为它们自带 keyless 匿名额度;最后试 Bing、AnySearch 这些剩余免费引擎。结果里会附一条说明,指明实际生效的引擎,README 给的例子是 Note: perplexity unavailable or failed, using exa.。README 的措辞相当强:中文写「搜索永不直接失败」,英文写 “Search never fails outright.”
有两处细节容易被忽略。一是当查询带 timeRange 时,支持时间过滤的引擎会被排到引擎链前面,所以默认的 Bing 不会悄悄吞掉过滤条件。二是各引擎能力并不等价:Bing 和 AnySearch 完全没有时间过滤参数;Tavily、Firecrawl、SearXNG 与 DuckDuckGo 两兄弟只能把自定义区间映射到最近的固定档(≤2 天 → day,≤14 天 → week,≤90 天 → month,否则 year);只有 Exa、Keenable、Parallel 能精确处理自定义或绝对日期。也就是说,一次「搜最近 3 天」如果最终由 Tavily 服务,实际生效的是一天的过滤。
设置页、密钥与附带工具
README 建议用 Harness 自带的插件命令、按你实际使用的 profile 名安装,然后重启 dsh web。它对一件事说得很重:@deepseek-ai/dsh-settings 与 @deepseek-ai/dsh-tools 被刻意声明为 peerDependencies,因为运行时必须使用安装树中的唯一实例——把 DSH 核心包复制进 profile 本地的 node_modules 可能让工具调度器失效。
配置卡片挂在官方设置页的 settings.plugin.item 插槽;README 说明读写走插件自建的 bridge,不依赖 dsh-web-ui,插件可独立使用。除引擎选择外,卡片还提供 Exa / Tavily / Keenable / Firecrawl / Parallel / Perplexity / DeepSeek 的 key 输入框、一个直测当前引擎(不走回退链)的「测试引擎」按钮、用于过滤 platform_search 的平台勾选项、0–5 分钟的缓存时长滑块,以及 EN / 中文界面切换。免费引擎带绿色 FREE 徽章,付费引擎带橙色 API KEY 徽章,付费行还链到厂商的取 key 页面。
关于密钥处理,来源只支持两个结论:输入框是密码框,保存后界面只显示「已配置」而不回显内容。存储方面,README 明确建议把付费引擎的 key 写进 Harness 凭据中心 ~/.dsh/.credentials.yaml,并给出读取优先级为凭据中心 > 设置页 > 环境变量,设置页字段仅作遗留兼容。来源没有说文件权限、没有说加密方式、也没有说 key 会从日志里被清洗——所以「安全存储」不是这份条目能断言的事,能说的只有「界面脱敏,且 README 引导你用凭据中心」。
- 时间过滤:
advanced_search接受固定档(day/week/month/year)、自定义相对值(12h、3d、2mo、1y)与绝对日期(2026-07-01)三种形式,可显式指定engine,返回结构与web_search相同。 - 平台搜索:
platform_search覆盖 GitHub、V2EX、B站、Reddit、Hacker News、Stack Overflow、维基百科与 npm。README 称全部走公开 API、零外部依赖、无需任何 key。其中 Reddit 被点名为「部分网络环境可能被反爬拦截」,维基百科会跟随界面语言在中文与英文域名之间切换。 - 引擎测试:
free_search_test逐个测试引擎,并报告每个引擎的成功或失败原因。 - 结果缓存:相同查询(含引擎与时间过滤参数)命中 LRU 缓存(50 条),最长 5 分钟,可在设置页调到 0 关闭。README 给出的目的是防免费引擎限流、省付费额度。
- 系统提示词注入:agent 知道当前生效的引擎以及哪些引擎需要 key,设置变更时自动刷新。
- 检查更新:设置卡片显示当前版本,并直连 npm registry 对比最新版,有新版本时可一键跳转。
运行要求
- Node
>=20—— 来自包的engines字段。README 的代理说明另外指出,NODE_USE_ENV_PROXY需要 Node 24+。 - Harness
>=0.1.1-rc.1—— 来自包的dsh.engines.dsh字段。兼容表把0.1.1-rc.1、0.1.1-rc.2、0.1.2-alpha.2至0.1.2-alpha.4、0.1.2-rc.1、0.1.5-rc.1、0.1.5-rc.2标为 compatible,把rc.7、rc.8、0.1.2-alpha.1、0.1.2-alpha.5标为unknown。本站把这份 compatible 清单逐字记录为dshTarget;如果你跑在表里标为 unknown 的构建上,请当作未经验证,而不是当作已损坏。 - web 平台与同版本客户端运行时 ——
dsh.client.platform为web且注入@deepseek-ai/dsh-client-runtime,所以设置卡片与弹出式切换都假定你在 Web GUI 里。 - 网络访问,以及国内部分引擎需要的代理。由于 Node 的
fetch默认不走系统代理,README 要求在 dsh 进程上设置NODE_USE_ENV_PROXY=1与HTTPS_PROXY/HTTP_PROXY,否则 DuckDuckGo 这类引擎可能根本不可达。
README 没有给出操作系统要求。附带的切换小工具偏 Windows,但插件本身被描述为纯 JavaScript,运行时依赖只有 @deepseek-ai/schemastery。
已知限制与注意事项(按来源原话)
- 查询会离开你的机器。 每个引擎都是外部 HTTP 端点——Bing、DuckDuckGo、AnySearch、某个 SearXNG 实例,或厂商 API。README 的架构说明把这些网络调用放在宿主进程里,描述的是请求与响应在该进程与引擎之间直接往来,通篇没有提到任何中转转发搜索流量。来源没有描述任何第一方服务器会收集你的查询,但同样也没有任何隐私姿态的说明——没有留存、日志或匿名化声明,而宿主里确实存在一个
raw-search调试接口。所以「会不会离开本机」答案是明确的会;「还有谁看得到」则属于未说明。 - 限流与拦截是常态而非例外。 DuckDuckGo 被标注偶发反爬挑战、解封自动恢复;AnySearch 的匿名额度有限流;Reddit 在部分网络环境可能被直接拦截。README 自己的框架就是「用多个免费引擎互相回退」来换取稳定。此前目录条目里那句兼容性警告——公共后端有速率限制、可能随时变动,搜索成为关键流程时应换用带密钥的 provider——与 README 的说法一致,且比 README 更保守。
- 覆盖度逐项不齐。 Bing 与 AnySearch 忽略
timeRange;另有四个引擎只能近似处理;platform_search覆盖的是八个指定平台而不是开放网页,且未勾选的平台会被跳过。 web_fetch没有 SSRF 防护。 README 用警告标记写明 agent 理论上可访问内网地址。同样要再说一次:这个抓取能力来自官方dsh-web-fetch-httpprovider,所以这条警告挂在「本插件启用」的组件上,而不是它自带的组件上。- peerDependencies 是承重的。 请用 Harness 的插件命令安装,不要把 DSH 核心包塞进 profile。
- 来源未说明的事: 跨引擎去重或排序、任何内容过滤或偏向性政策、任何遥测披露、操作系统支持,以及搜索结果只缓存在内存还是也会落盘。设置页的 key 字段被保留为「遗留兼容」,这暗示凭据中心才是推荐路径,但来源没有说旧路径已废弃或将被移除。
什么时候用它、什么时候不要用
当内置搜索正因为这个插件要解决的问题而失败时——没有 DeepSeek key,或者所在网关的端点不暴露 web_search——就用它。如果你希望「换引擎」是一个设置项而不是一次改代码、想要聊天框里直接切换、或者特别需要带日期的搜索(回退链会为此重排顺序),它也是合理选择。免费档无需任何配置即可真实可用。
但不要把它当作搜索质量或隐私的保证。它把请求发给你无法控制限流策略的第三方端点,对这些端点是否留存数据没有任何说明,而它的「零成本」建立在匿名额度而不是任何协议之上。如果搜索处在关键流程里,README 自己的建议就是去配置 key——付费档正是为此存在。而如果你真正需要的是 X/Twitter 覆盖,或者一条带 SSRF 防护的加固抓取通道,那是别的插件该做的事。
与 modsearch 的区别。 两者都是免费、MIT 许可、带回退的 dsh 搜索插件,但构造方式不同。modsearch 是「skill + CLI」,同时也以原生 dsh bundle 的形态存在;它的默认是 Firecrawl 的 keyless 档;它通过 Grok Build 提供 X 搜索;它公布了逐引擎多 key 轮换和带 SSRF 防护的抓取路径;它还明说仓库不接受 pull request。Free Search 没有对 X 作任何声明,也没有为抓取发布安全文档——反而警告 web_fetch 没有 SSRF 防护;它的一等界面是 React 设置卡片与聊天框弹出选择器。该按这些具体差异来选,而不是按共同的「免费搜索」标签来选。
FAQ
它的后端是 DuckDuckGo 吗?
不是。默认引擎是 Bing,DuckDuckGo 只是两个可选的免费变体。README 称 Bing 最稳定,并为它配置了 zh-CN 市场。DuckDuckGo HTML 与 Lite 可以选用,两者都带着 README 关于偶发反爬限流的警告。
我到底需不需要 API key?
搜索本身不需要:默认引擎链由无 key 引擎组成,exa、tavily、keenable、firecrawl 即使没配 key 也会被尝试,因为它们有 keyless 额度。但十二个引擎里有三个——Parallel、Perplexity、DeepSeek 官方——确实需要 key,所以「所有引擎永远都不需要 key」这个说法是错的。配置 key 的作用是在接受 key 的引擎上提高额度、稳定结果。
我的查询会去哪里?
会经由 HTTP、从 dsh 宿主进程发往实际服务该次请求的第三方引擎。README 记录了它调用的端点,也没有把其中任何一个说成是其他引擎的代理,但它对这些厂商的留存、日志或匿名化没有任何表述。请假定查询对回答你的那个引擎可见;如果这件事对你重要,请去读对应厂商的政策。
搜索真的永不失败吗?
这是 README 的说法,其依据是回退链会逐个尝试所有引擎而不是在第一次失败时停下。实际上,如果所有免费引擎在同一时刻都拒绝服务,这条链依然可能走完而拿不到可用结果;而回退逻辑本身出问题你也不会直接看到——结果里那条指明生效引擎的提示,是值得留意的信号。
我在设置页填的 key 存得安全吗?
来源只支持两点:key 输入框是密码框;保存后界面只显示「已配置」而不回显内容。除此之外,README 建议把付费 key 放进 Harness 凭据中心 ~/.dsh/.credentials.yaml,并说明那里也是官方 LLM provider key 的存放位置,设置页与环境变量的优先级更低。它没有描述文件权限、加密或日志清洗,所以这份条目无法为存储层本身背书。
