DeepSeek Harness (DSH) 内置的 web_search 工具依赖 DeepSeek 的服务端接口,既需要 DEEPSEEK_API_KEY,又会消耗一个完整的模型轮次。dsh-keyless-search 是一个第三方 Provider 插件,用于替换 ctx.web 的底层搜索后端。它通过本地发起真实浏览器请求,实现了免 Key、不消耗模型轮次的检索功能。
核心功能¶
该插件基于 Node.js 实现,不依赖 DeepSeek 官方包,具备以下能力:
- 免 API Key:不消耗模型轮次,也不依赖环境变量中的 Key。
- 真实浏览器渲染:使用本地 Chrome/Edge 渲染 Google,绕过 HTTP 抓取必然遇到的 JS 墙。
- 多引擎并发与降级:默认链路为
google-browser(代理)+bing-global(国际版)+bing(直连)。代理不可用时自动收敛为直连,google-browser失败时自动降级。 - 代理自动探测:无需手动配置
proxyUrl,插件会自动扫描本地常见端口(如 7890、1080 等)。 - 语言感知:检测到中日韩字符时,自动跳过国际版 Bing,避免英文结果污染。
- 多主题拆分:针对“主题1、主题2”的复合查询,自动拆分为最多 8 个子查询,去重后合并返回。
- 浏览器实例回收:空闲(默认 5 分钟)后自动关闭由插件拉起的 Chrome 实例,不占用系统资源。
- 零 Host 依赖:仅使用
node:内置模块,不从@deepseek-ai/*import 任何东西。
安装与启用¶
安装该插件需要 DeepSeek Harness 环境。请确保 Node 版本 ≥ 22。
dsh plugin --profile <profile> add github:Wandering233/dsh-keyless-search
安装后需重启 DSH 生效。插件通过 dsh.bundle.patch 自动应用配置,无需手动修改 cordis.patch.yml。
配置说明¶
在 profile 的 cordis.patch.yml 中配置 web-search-local:
- insert:
- id: web-search-local
name: 'dsh-keyless-search'
config:
engines: [google-browser, bing-global, bing]
proxyUrl: '' # '' = 自动探测;'off' = 强制直连;或 'http://host:port'
maxSources: 16
browserTimeoutMs: 30000
searchTimeoutMs: 15000
chromePath: '' # 留空自动探测浏览器路径
browserIdleTimeoutMs: 300000 # 5分钟空闲后回收
关键字段说明:
* engines:指定搜索引擎列表。默认为 [google-browser, bing-global, bing]。
* proxyUrl:留空时自动探测本地端口;设置为 'off' 时强制直连。
* browserIdleTimeoutMs:设置浏览器实例空闲多久后回收,0 表示禁用回收。
已知限制¶
- 冷启动成本:首次使用浏览器引擎需要拉起 Chrome(约 3-6 秒),复用实例约 3-4 秒。
- 结果截断:工具层默认最多返回 8 条结果(
searchMaxResults),即使插件返回更多,也会被截断。该上限无法通过配置调整。 - 特定引擎问题:
- DuckDuckGo 已不可用,返回 botnet 页面。
- Mojeek 实测返回 0 条。
- SearXNG 需要特定配置且依赖 Unix 特有模块(如
os.uname()),公共实例通常不可用。
- 依赖要求:需要本地安装 Chrome / Chromium / Edge,且本地目录安装时建议显式安装
puppeteer-core。
开发与自检¶
包内提供 selftest.mjs,可在不启动 DSH 的情况下进行纯 Node 自检:
node selftest.mjs
总结¶
dsh-keyless-search 通过引入本地浏览器渲染和智能拆分策略,解决了 DSH 原生搜索需消耗模型轮次的问题。它适合需要高频、免 Key 搜索能力的场景,但在使用前需留意冷启动延迟及结果数量上限。