dsh-thin-search
DeepSeek Harness 免费搜索插件 —— 零成本、零 API key、零模型调用。
DSH 官方网页搜索强制依赖 DeepSeek V4 Flash 模型(Anthropic 格式),每次搜索都消耗一次模型调用。本插件用纯 HTTP 抓取免费搜索引擎(Bing / DuckDuckGo / SearXNG / AnySearch),不调用任何模型、不需要任何 API key,任何第三方网关/中转用户都能直接联网搜索。
中文
为什么需要它
DSH 官方自带的网页搜索插件(dsh-web-search-deepseek)会强制调用 DeepSeek V4 Flash 模型,并以 Anthropic 格式(/anthropic/v1/messages + web_search_20250305 工具)发起请求:
- 使用第三方 DeepSeek V4 Flash 网关时,对方不一定提供 Anthropic 协议,搜索直接不可用;
- 即使可用,每次搜索都会消耗一次模型调用,需要额外付费。
本插件用普通 HTTP 抓取免费搜索引擎,完全不调用模型,任何网络环境都能用,搜索本身零成本。
功能一览
| 功能 | 说明 |
|---|---|
| 🆓 零成本搜索 | 全部引擎免费、无需 API key、无需注册 |
| 🚫 零模型调用 | 只发普通 HTTP 请求,不消耗任何 token,不依赖 Anthropic 协议 |
| 🔁 自动回退 | 任一引擎失败(限流/反爬/网络错误/0 结果)自动尝试下一个,结果注明实际生效引擎 |
| 🌐 多引擎 | AnySearch(默认)/ Bing / DuckDuckGo / SearXNG,支持自定义 SearXNG 实例 |
| ⚙️ 网页设置页 | 设置 → 搜索引擎:引擎选择、官方搜索切换、增强开关、平台开关、缓存时长 |
| 💬 弹出式切换 | 聊天框输入 /thin-search-engine,点选即切换引擎 |
| 🧪 引擎测试 | free_search_test 工具 + 设置页"测试引擎"按钮 |
| 🕒 时效 | 按时间范围限定搜索结果,如「最近一周的新闻」 |
| 🔎 平台搜索 | platform_search:GitHub / V2EX / Bilibili / Reddit / Hacker News / Stack Overflow / Wikipedia / npm(公开 API,零 key) |
| 🧠 搜索增强 | 可选(默认关):LLM 把口语化输入规范化为搜索关键词,改善中文问句效果;⚠️ 开启后消耗 Token;支持自定义提示词 |
| 🚀 网络代理 | 内置 HTTP/HTTPS 代理(undici ProxyAgent),仅本插件生效,不污染 DSH 全局 |
| 📦 结果缓存 | LRU 50 条,TTL 0-5 分钟可配,防免费引擎限流 |
| 🤝 干净集成 | 实现官方 WebSearchProvider seam,与官方插件共存,patch 自动接管 web.searchProvider |
引擎
| id | 引擎 | 说明 |
|---|---|---|
anysearch |
AnySearch AI | 默认引擎,对中文自然语言问句理解最好,免费无 key |
bing |
Bing | 免费,速度快,中文优化(bingMarket: zh-CN) |
searxng |
SearXNG 元搜索 | 免费,多个公开实例自动切换,支持自定义实例 |
ddg |
DuckDuckGo HTML | 免费,共享 IP 上可能限流(自动回退) |
ddg-lite |
DuckDuckGo Lite | 免费,同上 |
安装
# 从 npm 安装(发布后)
dsh plugin --profile web add dsh-thin-search
# 或从 GitHub 安装
dsh plugin --profile web add github:loommii/dsh-thin-search
# 或本地源码(开发/自用)
git clone git@github.com:loommii/dsh-thin-search.git
dsh plugin --profile web add /path/to/dsh-thin-search
安装后重启 dsh web 生效。插件通过 patch 自动把 web.searchProvider 指向本插件,无需手动配置。
卸载
dsh plugin --profile web remove dsh-thin-search
卸载后重启 dsh web,即可恢复 DSH 官方默认搜索。
依赖说明:对
@deepseek-ai/dsh-settings和@deepseek-ai/dsh-tools使用peerDependencies,DSH 运行时必须使用安装树中的唯一实例。请用dsh plugin --profile <profile> add ...安装,不要把 DSH 核心包复制进 profile 的本地node_modules。
快速开始
安装重启后,在任意会话直接对 agent 说"帮我搜索……"即可 —— 默认引擎 AnySearch,开箱即用。
使用
网页设置页(推荐)
打开 设置 → 搜索引擎:
- 搜索提供方:免费引擎(默认)/ 官方 DeepSeek 搜索 —— 切换会写 profile 的
cordis.patch.yml,重启 DSH 后生效(页面会提示) - 搜索引擎:下拉框切换,保存即生效(默认
anysearch) - 搜索增强:默认关闭。开启后会用 LLM 把口语化输入规范化为搜索关键词(如「今天美元兑换日元的汇率多少?」→「美元 日元 汇率」),改善 Bing 等引擎对中文问句的效果。⚠️ 开启后每次搜索会消耗 Token;关闭则完全免费、零模型调用。支持自定义增强系统提示词:在"搜索增强"卡片中,文本框始终显示当前实际生效的提示词(内置默认或自定义),可直接编辑;"恢复默认"按钮会覆盖为内置默认提示词
- 增强模型:可选指定用于搜索增强的 LLM 模型(下拉列出 DSH 中已配置的全部模型)。留空 = 跟随 DSH 默认模型;指定模型失败时自动回退默认模型
- 网络代理:可选填 HTTP/HTTPS 代理地址(如
http://127.0.0.1:7890),用于访问需要外网的引擎。V2Ray / Clash 需开启 HTTP 端口;不支持 SOCKS5。留空 = 直连,保存即生效 - 平台搜索:勾选启用的平台(
platform_search工具按此过滤) - 结果缓存时长:0 关闭缓存,1-5 分钟
- 测试引擎:直测当前引擎可用性
聊天框切换引擎(/thin-search-engine)
输入 /thin-search-engine 弹出引擎选择窗口(和 /model 一样的交互),点选即切换,当前引擎会标记出来。命令只改首选引擎,搜索仍走自动回退链。
配置文件(~/.dsh/settings.yaml)
thin-search:
provider: anysearch # anysearch / bing / ddg / ddg-lite / searxng
searchEnhance: false # 搜索增强:LLM 规范化搜索词(默认关,开启消耗 Token)
enhanceModel: "" # 增强模型 "provider:model";空 = 跟随 DSH 默认模型
proxy: "" # HTTP/HTTPS 代理,如 http://127.0.0.1:7890;空 = 直连
bingMarket: zh-CN # Bing 市场
region: cn-zh # DuckDuckGo 区域(可选)
searxngInstances: # 自定义 SearXNG 实例(可选)
- https://your-instance.example
platforms: # platform_search 启用列表
- github
- v2ex
- bilibili
- reddit
- hn
- stackoverflow
- wikipedia
- npm
cacheTtl: 5 # 结果缓存分钟数(0-5)
网络代理(国内用户)
Bing / AnySearch 在多数网络环境可直接访问;DuckDuckGo / SearXNG / GitHub 等可能需要代理。本插件内置 HTTP/HTTPS 代理支持(基于 undici ProxyAgent),无需设置系统环境变量:
- 设置 → 搜索引擎 → 网络代理:填
http://127.0.0.1:7890(V2Ray / Clash 的 HTTP 端口),保存即生效,无需重启 - 或直接写
~/.dsh/settings.yaml的thin-search.proxy - 留空 = 直连
作用域:代理只作用于本插件的 11 处引擎请求,不设置全局 dispatcher、不修改 DSH 全局 fetch,其他插件和 DSH 本身不受影响。
⚠️ 已知限制:DuckDuckGo 对代理/数据中心出口 IP 有反爬(HTTP 202 风控页),公共 SearXNG 实例对代理 IP 普遍限流(HTTP 429)。代理场景下推荐 Bing / AnySearch(实测稳定)。如自建 SearXNG 实例,填入
searxngInstances即可。
工具
free_search_test
对 agent 说"测试一下所有搜索引擎",它会调用 free_search_test 工具并报告:
Search engine test:
- bing: OK (3 results, e.g. "DeepSeek Harness developer preview: Everything is a plugin")
- anysearch: OK (3 results, ...)
- ddg: FAIL - DuckDuckGo anti-bot challenge (HTTP 202): DDG blocks datacenter/proxy egress IPs. Try Bing instead.
时效(advanced_search)
对 agent 说「最近一周的新闻」「最近 3 天的消息」,搜索即自动限定在对应时间段,返回较新的结果。
| 形式 | 示例 | 含义 |
|---|---|---|
| 固定档 | day / week / month / year |
1 / 7 / 30 / 365 天 |
| 自定义相对值 | 12h、3d、2mo、1y |
最近 N 小时/天/月/年 |
| 绝对日期 | 2026-07-01 |
该日期(含)之后发布的结果 |
实现上,支持时间范围的引擎(SearXNG / DDG / DDG Lite)会把天数映射到最近似档位(≤2 天 → day,≤14 天 → week,≤90 天 → month,否则 year);Bing / AnySearch 无对应参数会忽略。带 timeRange 时支持时间范围的引擎自动排到回退链前面。
platform_search(平台搜索)
platform_search 支持 GitHub / V2EX / Bilibili / Reddit / Hacker News / Stack Overflow / Wikipedia / npm,全部走公开 API(零 key)。可在设置页勾选启用哪些平台。
工作原理
lib/index.js(host 端):实现WebSearchProvider(id: thin-search/available()/search()),统一引擎路由 + 自动回退 + 时间过滤解析 + 结果缓存;注册thin-searchsettings namespace;提供/api/dsh-thin-search-settings读写桥(describe / mutate / raw-search,仅限 loopback);注册free_search_test、platform_search、advanced_search工具;动态注入引擎清单到系统提示词lib/client.js(浏览器端):React 设置页(挂settings.section插槽,设置 → 搜索引擎)+/thin-search-engine弹出式命令(commandUipopupSelect)lib/proxy.js:undiciProxyAgent封装,单例缓存 +fetchWithProxy,仅本插件使用cordis.patch.yml:插件 loader 配置,patch 同时把web.searchProvider设为thin-search(保留fetchProvider: http)
兼容性
| 项目 | 要求 |
|---|---|
| DSH | >= 0.1.2-alpha.2(依赖 @deepseek-ai/dsh-settings >= 0.1.2-alpha.2 / dsh-tools >= 0.1.0-rc.6) |
| Node.js | >= 20 |
从 v0.1.x 升级:dsh v0.1.2-alpha.2 对 settings seam 做了破坏性重构——
installSettingsSection/settingsNamespace被移除,改用SettingsProvider.installSection(见 dsh-v0.1.2-alpha.2+)。因此本插件 v0.2.0 仅支持 dsh ≥ 0.1.2-alpha.2;仍在 dsh 0.1.1 的用户请继续使用插件 v0.1.1。
与官方插件的关系
- 官方
web-search-deepseek(deepseek-official)与本插件可共存;searchProvider指向谁就用谁 - 本插件默认通过 patch 接管搜索(无需 key、零成本);设置页"搜索提供方"开关一键切回官方(写 profile patch 的
searchProvider: deepseek-official,需重启 DSH 生效),也可手动改~/.dsh/profiles/<profile>/cordis.patch.yml - 本插件不包含任何模型调用逻辑,也不读取
DEEPSEEK_API_KEY—— 第三方网关用户可直接使用
License
MIT
English
Why
DSH's official web-search plugin forces a DeepSeek V4 Flash model call in Anthropic format (/anthropic/v1/messages + web_search_20250305). If you use a third-party gateway, it may not speak the Anthropic protocol — and even when it does, every search costs a model turn.
This plugin scrapes free search engines with plain HTTP (Bing / DuckDuckGo / SearXNG / AnySearch). No model calls, no Anthropic protocol, no API keys — searching costs nothing and works with any gateway.
Features
- Zero cost — all engines free, no keys, no registration
- Zero model calls — plain HTTP only; no tokens consumed
- Auto fallback — any engine failure (rate limit / anti-bot / network / 0 results) automatically tries the next free engine, with a
Note: ... using ...marker - Engines:
anysearch(default, best for Chinese natural-language queries) ·bing(fast, zh-CN) ·searxng(multi-instance, custom instances) ·ddg·ddg-lite - Search enhancement — optional (default OFF): rewrites natural-language queries into compact keywords via the current default LLM. ⚠️ Consumes tokens while ON; OFF keeps searching fully free. Supports custom system prompt: the textarea always shows the effective prompt (built-in default or custom), editable; "Reset to default" overwrites with the built-in default prompt
- Web settings page — Settings → Search Engine
- Popup command —
/thin-search-enginein chat - Engine test —
free_search_testtool + "Test engine" button - Fresh results — ask for "last week's news" or "the latest updates" and get recent results instead of stale ones
- Platform search — GitHub / V2EX / Bilibili / Reddit / Hacker News / Stack Overflow / Wikipedia / npm
- HTTP(S) proxy — built-in (undici ProxyAgent), plugin-scoped only; works with V2Ray / Clash HTTP ports; no SOCKS5
- Result caching — LRU 50, TTL 0-5 min
- web_fetch preserved — official
dsh-web-fetch-httpstays enabled - Clean integration — official
WebSearchProviderseam; coexists with official plugins
Install
dsh plugin --profile web add dsh-thin-search # from npm (once published)
dsh plugin --profile web add github:loommii/dsh-thin-search # from GitHub
Restart dsh web after installing. The plugin's patch points web.searchProvider to itself automatically.
To uninstall:
dsh plugin --profile web remove dsh-thin-search
Restart dsh web afterwards to restore DSH's official search.
Usage
Settings page: Settings → Search Engine (provider switch, engine, enhancement, platforms, cache TTL, proxy). Chat command: /thin-search-engine. Config file: ~/.dsh/settings.yaml under thin-search: (see the Chinese section above for the full schema).
Proxy notes
Set thin-search.proxy (e.g. http://127.0.0.1:7890) in the settings page or ~/.dsh/settings.yaml — no env vars needed. HTTP/HTTPS only; no SOCKS5. Only this plugin's requests go through the proxy; DSH and other plugins are untouched.
Known limits: DuckDuckGo anti-bot (HTTP 202) and public SearXNG rate limits (HTTP 429) apply to proxy/datacenter egress IPs. Prefer Bing / AnySearch behind a proxy. Self-hosted SearXNG instances can be added via
searxngInstances.
Compatibility
| Item | Requirement |
|---|---|
| DSH | >= 0.1.2-alpha.2 |
| Node.js | >= 20 |
Upgrading from v0.1.x: dsh v0.1.2-alpha.2 shipped a breaking settings-seam refactor — the module-level
installSettingsSection/settingsNamespacehelpers were removed in favor ofSettingsProvider.installSection. Plugin v0.2.0 therefore requires dsh ≥ 0.1.2-alpha.2; stay on plugin v0.1.1 if you are still on dsh 0.1.1.
License
MIT
No comments yet. Be the first to write one.