vi0let-dev/dsh-free-web-search ↗★ 0

dsh-free-web-search

免密钥的第三方 Web 搜索提供方:向 DeepSeek Harness 的 ctx.web 搜索缝隙注册一个免费搜索后端(SearxNG / DuckDuckGo / Wikipedia),无需任何 API key,并默认以「兜底」姿态与已装搜索提供方共存。 适合需要免费网页搜索功能且不想配置API Key的用户。

パッケージ
dsh-free-web-search
互換性
未検証
バージョン
1.0.0
ライセンス
MIT
最終更新
2026/10/12

同名パッケージの別リポジトリ

インストール

$npx -p @deepseek-ai/dsh dsh plugin --profile web add github:vi0let-dev/dsh-free-web-search

ドキュメント

README 全文を読む ↗

3. 延迟测试(只给建议,不改配置)

点击「开始测速」后,插件逐个连接每个已启用后端的服务器,测量分段耗时:

阶段含义
连接TCP 连接,或经代理的隧道建立(HTTP CONNECT / SOCKS5)
TLSTLS 握手
总延迟上述之和,加上首字节时间

它不发任何搜索请求,也不使用查询词——探测的是各服务的首页(HEAD /)。这里要回答的是「从这台机器访问这个服务有多快」,而不是「能搜到什么」。用 HEAD 而不是 GET,是因为首页动辄几百 KB,为了测延迟把七个页面都拉下来既慢又不礼貌;服务器回 405 也算可达。

排序仅按总延迟,未响应的后端排最后。插件只给建议 + 可复制的配置片段,决定权在你。

⚠️ 可达 ≠ 可用,这一点界面上也会明说。实测中:Google 返回不含结果的 JavaScript 空壳页、Yandex 返回验证码、公开 SearxNG 实例可能关闭了 JSON 输出——它们都会被测成「可达」。所以只按延迟排序,可能把一个快但搜不到东西的后端排到前面。这也是插件不自动应用建议的原因。

配置项

配置项默认说明
backends['bing']启用的后端与顺序。未知名字丢弃并告警;你给的顺序会被保留,不再重排。
proxy''(直连)全局代理:http:// https:// socks5:// socks5h://
proxyByBackend{}按后端覆盖;direct/none/off = 该后端直连
noProxy[]始终直连的域名(父域名匹配)
useEnvProxytrue是否读取 HTTPS_PROXY 等环境变量
searxngInstances5 个公开实例建议换成自己搭的
timeoutMs12000单请求超时(上限 60000)
totalTimeoutMstimeoutMs × 2整条链总预算(上限 120000)
maxResults5结果条数(上限 20)
wikipediaLangen中文用 zh
takeoverfalsetrue = 无条件抢占搜索槽位
digestfalsetrue = 额外把结果渲染成纯文本放进 content

环境变量前缀 DSH_FREE_WEB_SEARCH_:BACKENDS TIMEOUT_MS TOTAL_TIMEOUT_MS SEARXNG_INSTANCES WIKIPEDIA_LANG MAX_RESULTS TAKEOVER DIGEST PROXY NO_PROXY PROXY_BY_BACKEND(形如 google=http://a:1,baidu=direct)USE_ENV_PROXY。

预算为什么是「预留式分配」

只设单请求超时不够:链上每多一个后端,最坏情况就多一份超时时间,几个后端就能把一次搜索拖到一分多钟。

但单纯共享一个 deadline 也不够——这是实测出来的:4 个后端、24s 预算时,5 个卡住的 SearxNG 实例把预算全吃光,后面三个后端全部报 skipped,根本没被尝试。这恰恰是最糟的失效模式,因为「第一个挂了、后面某个本来能work」正是这条链存在的唯一理由。

所以预算是预留式:每个后端只拿「剩余 − 给后面每个预留的一份」;快速失败把时间还回池子;预算小到无法预留时改为平均分配(短尝试还可能成功,不尝试必然失败)。