它是什么
@anysearch/anysearch-dsh 是 AnySearch 官方为 DeepSeek Harness 写的接入插件。它同时做两件事,而第二件最容易被忽略。
第一,它在 harness 的 ctx.web seam 上注册一个由 AnySearch 支撑的 Web Search Provider 与 Web Fetch Provider。随包的 cordis.patch.yml 把现有 web 行的 searchProvider 与 fetchProvider 都改成 anysearch,并插入自己的行 id: web-search-anysearch。实际后果是 DSH 的内置 web_search 和 web_fetch 不再是本地能力——每一次普通搜索都发往 https://api.anysearch.com,每一次抓取 URL 都发给 AnySearch 的 Extract 接口。如果你以为它是在现有搜索之外再挂一个工具,那就读反了:它替换的是 provider。
第二,它另外挂载三个面向模型的工具。总共五个模型可见入口,README 全部列出,src/index.ts 与已发布的 lib/ 也都能对上:
| 工具 | 是什么 |
|---|---|
web_search |
harness 原生工具,改由 AnySearch 提供结果 |
web_fetch |
harness 原生工具,改为调用 AnySearch /v1/extract |
anysearch_capabilities |
读取 AnySearch 实时的领域/子领域目录,含每个垂直域声明的参数名 |
anysearch_search |
完整搜索请求,支持 tag、params、zone、language 与可选的 includeContent |
anysearch_batch_search |
一至五个独立搜索并发执行,结果按输入顺序返回,单项失败单独保留 |
插件有意不提供 anysearch_extract。README 明说不重复注册提取工具,源码也一致:正文清洗只通过原生 web_fetch 这一行暴露。
它是一家商业第三方搜索服务的客户端
这是安装前最该弄清的性质,来源也说得很直白。仓库的 homepage 指向 https://www.anysearch.com,所有请求都发往 api.anysearch.com。本地不解析任何东西:插件不自带索引、爬虫或引擎,src/provider.ts、src/fetch-provider.ts 与 src/client.ts 就是 HTTP 适配层,别无其他。AnySearch 自己的定价页列出 Free 档——$0 /mo、结构化输出、“1,000 requests/day”、“20 QPS rate limit per key”——另有标注 Coming Soon 的 “Professional Search Pro” 和走销售的 Enterprise。那是厂商的产品页而不是插件文档,请当成当前的商务条款读,而不是插件本身给出的承诺。
可以不配 Key 开始用,但免费路径是共享的
README 的快速开始写得很清楚:“No API key is required for a quick start. Requests use AnySearch’s anonymous quota until you configure one.” docs/agent-installation.md 与中文使用指南都重复了这句。实现上,src/client.ts 在没有解析到凭据时直接省掉 Authorization 头,并在诊断信息里标出这次响应走的是匿名还是凭据鉴权。
注册会改变条款。README 说配置账号 Key 后每天有 1000 次免费搜索调用,并指向 https://www.anysearch.com/console/api-keys。中文使用指南对匿名路径的说法更谨慎:匿名请求受共享免费额度和更低限流约束,额度用尽或触发限流后,要么稍后重试,要么配置 Key。所以“不配 Key 能用”是真的,“不配 Key 可以无限用”没有任何来源这样讲。
Key 只以凭据引用的形式存在,不会进入组合配置:配置里保留的是 apiKeyEnv: ANYSEARCH_API_KEY,真实值由 DSH 的 credentials provider 在每次操作开始时解析。因此改 ~/.dsh/.credentials.yaml 下一次调用即生效、无需重启;而改启动环境变量需要重启进程。有两处防线是代码里真实实现的,不只是文档承诺——字面占位符 ANYSEARCH_API_KEY 与 as_sk_your_key 会在发出任何请求之前被拒绝;客户端使用 redirect: 'error',所以查询词和凭据都不会被转发到重定向目标。
会送出去什么
一次搜索向 POST /v1/search 提交 query,以及(在提供时)max_results、tag、params、zone、language;一次抓取向 POST /v1/extract 提交 { url }。请求头只有 accept、在解析到 Key 时才有 authorization,以及两个标识——来自 src/version.ts 的 user-agent: dsh/0.1.4 与 x-anysearch-client: dsh/0.1.4。
不会送出去的部分同样值得说清楚:client、两个 provider 适配器和三个工具都没有读取会话、对话历史、系统提示词或你的文件。搜索 seam 交给 provider 的是一个 WebSearchRequest,字段只有 query 和 maxResults。
也没有任何隐私说明。README、使用指南和安装指南都未提及隐私政策、遥测、留存或数据处理;AnySearch 站点上的 /legal?type=… 页面在本次核对中未能渲染出可读正文。请直接假设 api.anysearch.com 的运营方能看见你发出的查询词与 URL——因为它必然收到这些内容。
运行要求与安装
- Node
^22.19.0 || >=24.0.0,直接来自package.json的engines。README 另加 pnpm 11.7,因为 DSH 的插件命令用 pnpm 管理 profile 依赖。 - 安装:
npx -y @deepseek-ai/dsh plugin --profile web add @anysearch/anysearch-dsh,然后npx -y @deepseek-ai/dsh web。 - harness 目标版本:peer 依赖与固定版本的 dev 依赖都指向
0.1.0-rc.6——dsh-web、dsh-tools、dsh-tool-web、dsh-system-prompt、dsh-credentials均为>=0.1.0-rc.6 <0.1.1 || >=0.1.1-rc.1 <0.1.2,pnpm-workspace.yaml也钉在同一版本。rc.6是本站核对时依据的版本;这些范围之外没有任何兼容性声明。 - 依赖:运行时依赖只有
@deepseek-ai/schemastery;六个@deepseek-ai/*包是 peer,不随包打包。 - 凭据:插件注入
credentials服务,使用指南称官方 base profile 已包含该服务。DSH 设置页没有第三方 Provider 的凭据输入项,因此只能改受管凭据文件或环境变量。 - 网络:每次操作都需要出站 HTTPS 访问
https://api.anysearch.com(可用配置项baseURL覆盖)。 - 包内有
prepare脚本——tsc -p tsconfig.json——而prepare会在npm install时执行(包括从 git URL 安装),因此按源码安装会在你的机器上执行代码。它用devDependencies里的 TypeScript 编译包自身的tsconfig.json并产出lib/;从 npm registry 安装拿到的则是构建好的lib/。它不拉取也不执行任何远程内容,但这确实是安装期代码执行,在此如实披露。其余脚本(build、check、typecheck、test,以及需显式开启的test:e2e)都不会在安装时触发。
已知限制
- 它不是免费的本地搜索后端。 此后每一次普通
web_search都依赖第三方的可用性、限流与额度。api.anysearch.com不可达或匿名额度耗尽时,原生搜索会退化成 provider 报错。 web_search会丢信息。 使用指南明确说通用 seam 只接收title、url、snippet;清洗正文只有用anysearch_search并传includeContent: true才会保留,垂直标签和结构化参数也无法通过原生那一行使用。- 一条结果格式不对就可能让整次搜索失败。 适配层要求
data.results[i].url是可解析的绝对 URL,否则抛错。Issue #10(2026-09-12 开启,本条目写作时仍开着)报的正是这种情况,PR #9 提出修复但尚未合并。 - 文档有一处自相矛盾。
docs/user-guide.zh-CN.md的“功能边界”一节仍写着插件不提供网页正文提取,而该文档的抬头又写着“适用版本:包含 AnySearch Fetch Provider 的待发布版本”。已发布的 0.1.4 包内lib/index.js确实调用了ctx.web.registerFetchProvider,同一份指南也描述了web_fetch可用。请把那句话当作过期文字。 - 返回内容没有隔离。 清洗后的页面正文会以“untrusted external data, not instructions”的标记进入模型,但它仍然是可被攻击者控制的文本,会进入上下文窗口。
- 没有客户端半,也没有设置页输入项。
package.json只声明了 bundle patch,没有dsh.client段;DSH 设置页也没有第三方 Provider 的凭据输入项。
什么时候用它、什么时候不要用
如果你本来就打算用 AnySearch 做搜索后端,并且希望它接进 harness 自己的 web_search / web_fetch seam,而不是增加几个模型得重新学习的工具,那它合适。垂直检索那部分是原生能力没有对应物的:anysearch_capabilities 读的是实时目录而不是硬编码清单,anysearch_batch_search 返回五项搜索并逐项标注成功或失败,而不是一个聚合结果。匿名可用的起步路径也让你能在正式注册之前先评估它。
如果你想要的是摆脱对外部搜索 API 的依赖,那就不要装——它的方向恰好相反:这是一次主动迁移到商业服务,而免费档是厂商的引导性条款,不是保证。如果你需要对自己查询内容的隐私保证,也不要装,因为来源里没有任何相关文档。也不要把它和另一个同样抢占搜索 provider 的插件叠在一起:README 明确要求不要用另一个 ID 再加一个 AnySearch provider,而 patch 是直接替换原有选择。
就形态而非评分而言:这个包自带基于 Extract 的抓取 provider 和垂直目录,而像 dsh-free-search 这类多引擎插件是路由到你自己挑选的引擎,并依赖官方 dsh-web-fetch-http 提供正文。这笔交换值不值取决于你优化的是哪一端,而两个项目都没有公布结果质量的实测数据。
FAQ
用它可以不配 API Key 吗?要花钱吗?
可以不配 Key 起步:README、面向 AI Agent 的安装指南和中文使用指南都说未配置时请求使用 AnySearch 的匿名额度,src/client.ts 在没有解析到凭据时直接省略 Authorization 头。没写清楚的是这份额度的规模——指南只说它是共享的、限流更低。README 说注册后的 Key 每天有 1000 次免费搜索调用;AnySearch 定价页列出 $0/mo 的 Free 档,含每天 1000 次请求和每 Key 20 QPS 限流,另有一档标注 Coming Soon,Enterprise 走销售。插件本身是 MIT 许可,不收费。
它会把我的会话上下文发给 AnySearch 吗?
按代码看不会。provider 收到的是只带 query 和 maxResults 的 WebSearchRequest,src/client.ts 也只序列化这些字段,加上可选的结果数量、tag、params、zone、language,抓取时则是目标 URL。任何请求体里都没有会话 ID、对话记录、系统提示词或文件内容;客户端确实会发 x-anysearch-client: dsh/0.1.4 用于流量归属统计。插件没有任何隐私或留存说明,所以服务方拿到查询词之后如何处理,这些来源回答不了。
安装时的 prepare 脚本做什么?
package.json 里写着 "prepare": "tsc -p tsconfig.json"。npm 会在 npm install 之后执行 prepare,所以从 git URL 安装会在你机器上用 devDependencies 里的 TypeScript 编译这个包;从 npm registry 安装则直接拿到构建好的 lib/。它不拉取也不执行任何远程内容,但确实是安装期代码执行,在此披露。
它和免费的多引擎搜索插件有什么区别?
形态上的区别:它注册一个 provider(anysearch),同时充当搜索和抓取 provider,另加垂直搜索、批量搜索和能力发现工具。像 dsh-free-search 这类插件是多引擎 provider,路由到你选择的引擎,正文抓取交给官方 dsh-web-fetch-http。差别在依赖形态而非质量:换来的是一套更完整的单一商业 API 加垂直目录,代价是把默认搜索绑到那家厂商的可用性和额度上。两个项目都没有公布结果质量的实测数据,本条目也不给它们排序。
不配 Key、或者断网时会怎样?
不配 Key 时以匿名模式工作,直到共享额度用尽或触发限流;指南给的建议是稍后重试或配置 Key。访问不到 api.anysearch.com——或 baseURL 指向一个不可达地址——时,web_search 与 web_fetch 会以 provider 错误失败,而且没有任何来源描述会自动回退到本地或官方引擎。