dsh-web-search-anysearch: Connect web_search to AnySearch and enable one-click switching in settings.

前言

DeepSeek Harness(DSH)里 Agent 常用的联网入口是内置的 web_search,默认走后端 deepseek-official。如果你希望改用 AnySearch 的 MCP 检索,又不想改工具名、参数或提示词,就需要在 Host 侧注册新的 search provider,并在客户端里方便地切回官方搜索。

下面介绍社区插件 dsh-web-search-anysearch(维护者 sheen945):它只替换 web_search 的后端,并在 设置 → 插件 提供一张卡片,在 AnySearch 与 DeepSeek 官方之间即时切换。

这是什么

dsh-web-search-anysearch 是一个 DSH Host 插件 bundle,分类属于联网工具。它向 ctx.web 注册 id 为 anysearch 的搜索 provider,通过 https://api.anysearch.com/mcp(MCP streamable HTTP,JSON-RPC 2.0)调用 AnySearch 的 search 工具;同时在浏览器端注册设置页卡片,读写与内置「网页搜索」相同的 web 配置命名空间。

插件当前版本 1.2.1(MIT),面向 DeepSeek Harness 0.2.1-rc.2 或兼容版本;profile 目录默认 ~/.dsh/profiles/desktop。项目与 AnySearch、DeepSeek 无隶属关系,只是把公开 MCP 端点接到 Harness 的搜索 seam 上。

核心功能

不改工具契约,只换后端

web_search 的名称、参数、返回结构保持原样。插件把 AnySearch 返回的 markdown 结果块(### N. 标题、- **URL**:、摘要行)映射为 WebSearchSource { url, title, snippet },并按 URL 去重。网页正文抓取仍由 fetchProvider: http 负责;本插件只替换搜索 provider。

Host 与 patch 行为

index.js 注册 provider;cordis.patch.yml 会:

  1. insert 注册插件行 web-search-anysearch(inject: [web])。
  2. 覆盖内置 web 行:searchProvider: anysearch、fetchProvider: http。原 web-search-deepseek 仍注册但不再被选中;删掉覆盖即可回滚。

设置页卡片

client.js 在 设置 → 插件 注册 id 为 anysearch 的卡片(order 21)。两个选项:

  • AnySearch —— 写入 web.searchProvider = anysearch;若已是部署默认则清除本地冗余覆盖。
  • DeepSeek 官方 —— 写入 deepseek-official,回退内置搜索。

卡片仅依赖 react 与 ctx.configForms(官方 ConfigFormController),不 import Harness 客户端包。内置「网页搜索」卡片与本卡片读写同一 web 命名空间,任一处改提供方都会覆盖另一处,属预期行为。

限流、重试与错误码

AnySearch 约 20 QPS,超限可能返回 403/429。插件按 retryDelayMs × attempt 指数退避重试(默认共 3 次尝试)。交给 seam 的错误码与内置 provider 同构:WEB_PROVIDER_ERROR、WEB_PROVIDER_RATE_LIMITED、WEB_PROVIDER_TIMEOUT。实现零第三方依赖,使用全局 fetch / AbortController 与 Node 内置模块。

安装与启用

安装前请自行查看仓库源码与 MIT 许可证;插件以当前 DSH 进程权限运行,密钥与网络访问需你评估是否可接受。

需要 Harness 0.2.1-rc.2 或兼容版本。

方式一:让 Agent 装(README 推荐)

通过 plugin_manager 安装 bundle,target 为仓库 URL:

plugin_manager → install_bundle → target: https://github.com/sheen945/dsh-web-search-anysearch

也可指定本地目录绝对路径,安装为目录链接(link:);改代码即时生效,移动目录会失效。

方式二:手动装

在 profile 的 package.json 增加依赖并 pnpm install,再在 profile 的 cordis.patch.yml(或 bundle 列表)中启用本包;可用 plugin_manager 的 list_bundles / set_bundle 完成启用。README 中完整步骤含从 GitHub 克隆仓库,此处从略,见 仓库 README。

方式三:只要远端 provider,不要设置卡片

将 cordis.patch.yml 里 insert 段抄入自己的 profile patch;不加载 client.js 时 provider 仍可用。

配置密钥

仓库不含任何凭据。密钥按顺序解析,命中即用:

  1. 插件行 apiKey(cordis.patch.yml 默认留空)
  2. 环境变量 ANYSEARCH_API_KEY
  3. 文件 ~/.dsh/anysearch.key(Windows:%USERPROFILE%\.dsh\anysearch.key)

文件方式示例:

# macOS / Linux
printf 'as_sk_你的密钥' > ~/.dsh/anysearch.key && chmod 600 ~/.dsh/anysearch.key
# Windows PowerShell
"as_sk_你的密钥" | Set-Content -NoNewline "$env:USERPROFILE\.dsh\anysearch.key"

密钥可在 anysearch.com 控制台获取。AnySearch 支持匿名低额度访问,但无密钥时插件 available() === false,web_search 会报 WEB_PROVIDER_CONFIGURED_UNAVAILABLE。

其余可调项(插件行):

键 默认 说明
endpoint https://api.anysearch.com/mcp MCP 端点
apiKey 空 优先级最高的密钥来源
client mcp/1.0.0 X-Anysearch-Client 头
timeoutMs 60000 单次搜索超时
maxAttempts 3 含首次的总尝试次数
retryDelayMs 1500 退避基数(毫秒)

典型用法与验证

  1. 配置好密钥后,让 Agent 执行一次 web_search:返回含 Sources: 列表且来源为 AnySearch 检索结果,即表示 provider 生效。
  2. 打开 设置 → 插件,应看到「网页搜索 · AnySearch」卡片,当前值为 AnySearch。
  3. 临时回退:卡片选 DeepSeek 官方;或 plugin_manager → remove_bundle dsh-web-search-anysearch;或将 profile 里 web.searchProvider 改回 deepseek-official。

常见报错对照(README):

  • WEB_PROVIDER_CONFIGURED_MISSING / UNAVAILABLE —— 密钥未落到上述三处任一处。
  • WEB_PROVIDER_RATE_LIMITED —— 撞上约 20 QPS,可调大 maxAttempts 或降低并发。

本地开发可跑 node --test(7 个用例,不触网)。

适用场景与注意

适合谁: 已有 AnySearch API key、希望 web_search 走 AnySearch MCP,又要在 UI 里一行切回 DeepSeek 官方;偏好零第三方依赖、仓库不带凭据、设置页分段切换的实现(README 中与生态内其他 AnySearch 相关插件做了取舍说明)。

需要注意:

  • 搜索结果条数上限 10(AnySearch 侧限制),请求更多时会截断。
  • 目录链接安装依赖源目录存在;tarball 安装无此约束(package.json 中 install.preferred 为 tarball)。
  • 密钥文件为明文,多用户机器建议环境变量或系统密钥环注入 ANYSEARCH_API_KEY。
  • 插件以 DSH 进程权限访问网络与读密钥文件,安装前请审查源码。

结尾

dsh-web-search-anysearch 把 Harness 的 web_search 接到 AnySearch 远端 MCP,并通过设置页卡片在 AnySearch 与 DeepSeek 官方搜索之间切换,工具面不变、回滚路径清晰。

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

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

Xiaoye