前言¶
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 会:
insert注册插件行web-search-anysearch(inject: [web])。- 覆盖内置
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 仍可用。
配置密钥¶
仓库不含任何凭据。密钥按顺序解析,命中即用:
- 插件行
apiKey(cordis.patch.yml默认留空) - 环境变量
ANYSEARCH_API_KEY - 文件
~/.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 |
退避基数(毫秒) |
典型用法与验证¶
- 配置好密钥后,让 Agent 执行一次
web_search:返回含Sources:列表且来源为 AnySearch 检索结果,即表示 provider 生效。 - 打开 设置 → 插件,应看到「网页搜索 · AnySearch」卡片,当前值为
AnySearch。 - 临时回退:卡片选 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 官方搜索之间切换,工具面不变、回滚路径清晰。