前言¶
DeepSeek Harness(DSH)内置 web_search、web_fetch 工具,实际检索与抓取由 ctx.web 上的 provider 完成。默认的 web-search-deepseek 依赖上游实现 Anthropic 的 web_search_20250305 服务端搜索工具,并返回 web_search_tool_result 块。
9router 是 OpenAI 兼容网关:它把该工具定义以普通 function 形式交给模型,而不是在服务端执行搜索,因此无法单独提供与默认 provider 相同形态的「原生搜索」。若你在 DSH 里把模型路由到 9router,仍希望 Agent 能联网搜索、抓取页面,就需要把 DSH 的 web 能力接到 9router 自带的 /v1/search 与 /v1/web/fetch。
下面介绍社区插件 dsh-web-search-9router(维护者 rebron1900,仓库 rebron1900/dsh-web-search-9router)。它在 DSH 的 web seam 上注册 provider 9router,直接调用上述端点,并把响应映射为 DSH 期望的 WebSource 与 WebFetchBody 类型。
这是什么¶
dsh-web-search-9router 是面向 DSH >=0.2.0-rc.2 的 ESM 插件(当前发布版本 0.2.4,MIT 许可证)。它不引入额外构建步骤,纯 JavaScript 实现。
数据流可以概括为:
web_search / web_fetch (DSH 原生工具)
│
▼
ctx.web seam
│ provider = "9router"
▼
dsh-web-search-9router
├── search → POST {baseURL}/search → WebSource[]
└── fetch → POST {baseURL}/web/fetch → WebFetchBody
│
▼
9router 网关
与默认方案的对比如下(依据仓库 README):
web-search-deepseek(默认) |
9router(本插件) | |
|---|---|---|
| 依赖 | Anthropic web_search_20250305 服务端工具 |
任意 9router 兼容网关 |
| 与 9router 配合 | 否 | 是 |
| 搜索 | 由模型侧工具链路提供 | POST /v1/search |
| 抓取 | 由模型侧工具链路提供 | POST /v1/web/fetch |
核心功能¶
搜索 provider¶
DSH 调用原生 web_search 时,插件向 9router 的 search 端点发起请求,返回经去重处理的 WebSource 列表(含 title、snippet、published date 等字段)。
抓取 provider¶
web_fetch 经插件转发到 9router 的 web fetch 端点,返回整理后的文本或 markdown 正文(WebFetchBody)。
配置与凭据¶
插件在 bundle 详情页提供表单:可配置 base URL、搜索/抓取模型名、结果上限、超时等。API Key 通过 DSH credentials 服务写入,默认凭据引用为 NINE_ROUTER_API_KEY;密钥不会写入插件 settings 明文配置。
错误行为¶
失败以可路由的 WebError 码暴露(如 WEB_PROVIDER_ERROR、WEB_PROVIDER_CREDENTIAL_MISSING、WEB_ABORTED)。fetch 的非 2xx 响应作为结果返回,而不是静默抛错。
环境要求¶
- DSH:
>=0.2.0-rc.2 - Node.js:
>=20
安装与启用¶
1、安装插件¶
在 README 给出的命令中,profile 为 web:
npx @deepseek-ai/dsh plugin --profile web add github:rebron1900/dsh-web-search-9router
若需固定版本,可在 GitHub 源后追加 release 标签,例如:
npx @deepseek-ai/dsh plugin --profile web add github:rebron1900/dsh-web-search-9router#v0.2.4
2、启用 bundle¶
安装并启用 bundle 后,search 与 fetch 会自动选用 provider 9router。在 Plugins 中关闭整个 bundle 时,会恢复由其余配置层选择的 provider(通常为 deepseek-official 与 http)。
若你曾在 profile、home 配置或 launch 覆盖里显式指定过 web provider,更高优先级的选择仍会生效。要让 bundle 启用主导 provider,需移除旧的 id: web provider 配置覆盖。
3、填写配置¶
重启 DSH 并刷新浏览器。打开 Plugins,进入 dsh-web-search-9router 的 bundle 详情页完成配置。填写 API Key 时,内容存入 DSH credentials,对应你选择的 credential reference。
配置项说明¶
| Key | 类型 | 默认值 | 说明 |
|---|---|---|---|
baseURL |
string | 9router 默认端点 | 9router 兼容 API 的 Base URL;环境变量 NINE_ROUTER_BASE_URL 也可生效 |
searchModel |
string | search-combo |
搜索端点使用的模型名 |
fetchModel |
string | fetch-combo |
抓取端点使用的模型名 |
searchType |
string | web |
传给搜索端点的 search_type |
maxResults |
number | 8 |
单次搜索最多返回条数 |
timeoutMs |
number | 30000 |
单次请求超时(毫秒) |
| API key | credential | — | 只写字段,由 DSH credentials 存储 |
apiKeyEnv |
credential-ref | NINE_ROUTER_API_KEY |
解析 API Key 时使用的凭据引用 |
典型用法¶
启用并配置完成后,无需在 Agent 侧单独调用插件 API:DSH 会话里使用内置 web_search、web_fetch 即可,底层由 provider 9router 转发到网关。
开发仓库中,维护者用以下命令跑测试(供二次开发参考,非终端用户必做步骤):
pnpm install
pnpm test
入口与布局见仓库:src/index.js(search + fetch providers)、client.js(bundle 设置表单)、cordis.patch.yml(bundle 注册)。
适用场景与注意¶
适合谁: 已在 DSH 中使用或计划使用 9router 作为 OpenAI 兼容网关,且希望保留 DSH 原生联网工具语义、又不想依赖 web-search-deepseek 所要求的服务端 Anthropic 搜索工具实现。
分发与版本: GitHub 仓库为唯一分发源;稳定版以 v<version> 形式的 GitHub Releases 发布。插件也收录于社区列表 awesome-dsh-plugin。SkillHub 等目录页为社区索引,与 DeepSeek / 幻方无官方从属关系。
安全: 插件在当前 DSH 进程权限下运行,会向配置的 9router 端点发送搜索与抓取请求。安装前请阅读源码与 MIT 许可证,确认 base URL、凭据引用与网络策略符合你的环境。
结尾¶
dsh-web-search-9router 把 DSH 的 web_search、web_fetch 接到 9router 的 /v1/search 与 /v1/web/fetch,填补「网关不执行默认 deepseek 搜索工具、但仍需联网」这一组合下的能力缺口。