sousuo:DSH 桌面端 AnySearch 搜索 Provider 与 402 Key 轮换

前言

在 DeepSeek Harness(DSH)官方桌面里,web_search 和 web_fetch 需要可靠的联网后端。若你使用 AnySearch HTTP API,单把 Key 在额度或计费触发 HTTP 402 时,整次搜索会直接失败;本机 DNS 若缓存到失效节点,还可能出现 fetch failed 而搜索不可用。社区插件 sousuo(仓库 yueyexiayu/dsh-sousuo)面向官方桌面,把 AnySearch 适配为 DSH 的 search/fetch Provider,并在 402 时在本机多把 Key 间轮换重试。下面介绍它是什么、能做什么,以及如何安装启用。

这是什么

sousuo 由维护者 yueyexiayu 发布,在 SkillHub 目录中归类为 联网工具。当前版本 0.1.6(见仓库 package.json)。一句话定位:DSH desktop search provider —— 后端仍是 AnySearch 的 web_search / web_fetch HTTP API;插件负责 Provider 适配、遇到 HTTP 402 时用本地多把 API Key 立刻换下一把并重试同一请求(一次请求最多转一圈 Key,然后失败),以及搜完后必须作答相关的系统提示。401 / 403 / 429 不换 Key。

项目说明中强调:当前深度适配个人使用,供思路与借鉴,尽量不要直接照搬;面向 官方桌面,不要把 Key 写进 patch、README、Git 或对话。

核心功能

AnySearch 与官方 tool-web 的分工

  • web_search / web_fetch 仍由官方 tool-web 注册并控制开关;插件只提供 AnySearch provider,不会把已关闭的 web_fetch 重新开启。
  • 原生搜索的安全声明由官方 tool-web 渲染;provider 不把声明伪装成 content / answer。
  • 正常零结果显示 No results found.;来源被裁剪后为空时有明确提示;请求失败和取消仍抛出官方 WEB_PROVIDER_ERROR / WEB_ABORTED,不返回空成功。

HTTP 402 与多 Key 轮换

  • Key 存放在本机 $DSH_HOME/plugins/sousuo/keys(默认 $DSH_HOME 为 ~/.dsh),一行一把,# 开头为注释;state.json 记录当前序号,同样不进 Git。
  • 每次请求捕获独立的 current-first 候选槽位快照,最多遍历一轮 Key,并发下不会因切换而跳过或重复 Key。
  • 402 换下一把 Key 重试;401 / 403 / 429 不轮换,并保留 Retry-After。

连接与 DNS

  • 连不上 API 的 TypeError: fetch failed 会先按系统 DNS 再试一次;仍失败且目标无需环境代理时,才用公共 DNS/DoH 解析到的 IPv4 直连(SNI 仍是请求主机名),减轻本机缓存失效 GTM 节点导致整次搜索失败的情况。
  • 配置了 HTTP_PROXY / HTTPS_PROXY / ALL_PROXY 时保留系统代理路径,不绕代理发送凭据;NO_PROXY 仅对能安全确认的常用规则启用直连。

高级工具(默认关闭)

默认 不 向模型暴露 anysearch_capabilities / anysearch_search / anysearch_batch_search,避免部分高推理模型先做能力发现后在思考里「再搜一次」并 stop,界面像联网自动停了。普通问题走 web_search 即可,后端已是 sousuo。若需要垂直 tag,在 desktop patch 里为本插件设置 advancedTools: true。

其他行为(README 已说明)

  • 连接、正文读取和 DNS fallback 共用当前 HTTP 请求的 55 秒时限;502 / 503 / 504 会重试并释放旧响应。
  • API 响应 JSON 解析前限制 5,000,000 字节;搜索最多保留 50 个来源,并对标题、摘要、URL 等有长度上限。
  • 本地 55 秒截止映射为官方 WEB_FETCH_TIMEOUT;响应过大映射为 WEB_FETCH_TOO_LARGE;取消为 WEB_ABORTED。

安装与启用

安装步骤来自仓库 README,不是 dsh plugin add github:... 一类 CLI 安装;README 写明本方案直接管理已声明的 file: 依赖,不另外运行 CLI 插件安装,也不把 sousuo 再加入 dsh.profile.bundles(用户 patch 负责启用,避免重复注册)。

1、复制插件到 plugins 目录

将本仓库复制到 $DSH_HOME/plugins/sousuo。

2、在 desktop profile 声明 file 依赖

在 $DSH_HOME/profiles/desktop/package.json 的 dependencies 中增加:

"sousuo": "file:../../plugins/sousuo"

保留其他依赖及 dsh.profile.bundles。使用当前 DSH 随附的 pnpm 在该 profile 运行:

pnpm install --ignore-scripts

并保留生成的 pnpm-lock.yaml。profile 的 pnpm-workspace.yaml 保持 nodeLinker: hoisted、autoInstallPeers: false。

包声明 @deepseek-ai/dsh-web / @deepseek-ai/schemastery 等为 Host 提供的 peer,不另装一套官方 DSH runtime。

3、写入 cordis.patch.yml

在 $DSH_HOME/profiles/desktop/cordis.patch.yml 写入:

- insert:
    - id: sousuo
      name: ./node_modules/sousuo/lib/index.js
      config:
        baseURL: https://api.anysearch.com
        # advancedTools: true   # 可选:重新暴露 anysearch_* 垂直搜索工具

- id: web
  config:
    searchProvider: sousuo
    fetchProvider: sousuo

注意:- id: web 会整段替换 web 的 config。完成后 完全退出 DeepSeek Harness(macOS:⌘Q)再打开。

4、配置本机 Key 文件

cp keys.example keys
chmod 600 keys

用编辑器把真实 Key 写入 keys,不要贴到聊天或 Git。C0/C1 控制字符在 trim 前会被拒绝,错误仅报告行号。

典型用法

启用后,在对话里像使用官方联网一样调用 web_search、web_fetch 即可;searchProvider 与 fetchProvider 均指向 sousuo 时,流量经本插件转发到 AnySearch(默认 baseURL: https://api.anysearch.com)。

若已在 patch 中打开 advancedTools: true,模型还可使用 anysearch_* 系列垂直搜索与批量搜索工具;默认关闭时无需改用法,普通检索仍走 web_search。

适用场景与注意

适合谁: 已在官方 DSH 桌面使用 AnySearch、希望用多把 Key 缓解 402、并需要 DNS/代理策略与官方错误语义一致的个人或自建环境开发者。

权限与安全: 插件以当前 DSH 进程权限运行;安装前应自行阅读源码与许可证(仓库打包白名单含 LICENSE),确认 Key 仅留在本机 keys 与运行态,不进 Git 与对话。

生态说明: DSH 理念是「一切皆插件」;SkillHub 目录页 为社区站点,与 DeepSeek / 幻方无官方从属关系。

开发同步: 修改插件源码后,README 要求递增 package.json 与 lib/version.js,并在 desktop profile 用 bundled pnpm 移除再添加 file: 依赖、frozen-lockfile 安装,然后完全退出 Host 再打开实测;普通 install / update 可能保留旧硬链接,不能保证与源码完全同步。

结尾

sousuo 把 AnySearch 接到 DSH 官方桌面的 web_search / web_fetch 上,用本地 Key 轮换应对 402,并在连接层做了 DNS 与代理相关的补救;默认隐藏高级 anysearch 工具,减少模型误用导致的「假停」。需要细节与开发测试命令时,以仓库 README 为准。

羽毛球分组比赛记分
小程序二维码

欢迎使用《羽毛球分组比赛记分》微信小程序

小夜