前言¶
在 DeepSeek Harness(DSH)里,模型侧通常通过内置的 web_search 工具联网检索。默认实现往往依赖官方搜索能力或第三方 API,需要配置密钥,有时还会为单次查询额外消耗模型轮次或计费 token。对本地部署、内网环境或「能搜就行、不想维护搜索 Key」的场景,这类成本并不总是可接受。
下面介绍社区插件 dsh-web-search-ddg(维护者 korosu):它不改模型看到的 web_search 工具形态,只在 ctx.web 接缝处把搜索后端换成对 DuckDuckGo 静态 HTML 结果页的抓取解析,实现无 API Key、无辅助模型请求、一条命令安装。
这是什么¶
dsh-web-search-ddg 是一个 out-of-tree DSH bundle,在联网工具分类下发布。它在接缝上注册名为 ddg 的 search provider,并可通过 bundle 内的 patch 将 profile 的 searchProvider 固定为 ddg。面向模型的工具仍由 dsh-tool-web 提供;本包只贡献搜索后端。
与「自备搜索 API」相比,它的取舍是:用 HTML 抓取代替正式搜索 API,不持有任何凭证;当 DuckDuckGo 侧限流或异常页出现时,插件会按失败预算暂时标记自身不可用,让接缝上的 provider 选择逻辑有机会切换到其它已注册后端,而不是长期返回空结果。
- 仓库:github.com/korosu/dsh-web-search-ddg
- 社区目录:skillhub.cn 插件页
- 许可证:MIT(README 标注)
- 运行环境:Node.js >= 22(package.json
engines) - 当前 package 版本:0.2.1;README 标明在 DSH
0.2.0-rc.1等版本上做过兼容声明
核心功能¶
接缝与工具形态¶
插件挂载后,模型侧 web_search 的 schema 与展示保持不变,仅底层搜索实现变为 DuckDuckGo html.duckduckgo.com 结果页的解析(默认 endpoint 为 https://html.duckduckgo.com/html/,请求时追加 ?q=)。
无密钥、无额外模型轮次¶
README 明确说明:不需要 API key,不为每次查询单独发起辅助模型请求,也不按查询计费 token。配置表中没有凭证类字段,也没有 settings 卡片式的 Key 填写步骤。
失败预算与冷却¶
连续出现若干次「瞬时失败」(含超时等)后,provider 会报告不可用,并在可配置的冷却时间内让出接缝,便于其它已注册的 search provider 被选中。相关可调项包括 failureThreshold(默认 3)、cooldownMs(默认 300000,即 5 分钟)等,见下文配置节。
预构建产物与安装¶
仓库提交预构建的 lib/,安装时不执行本包的 build 生命周期,一般也无需在 profile 侧额外声明 allowBuilds。依赖包括 cheerio(解析 HTML)与 @deepseek-ai/schemastery。
安装与启用¶
安装目标为 web profile。任选下列一种方式,三种形式安装的是同一套预构建 lib/,仅来源不同。
从 GitHub 引用安装(README 原文):
dsh plugin --profile web add github:korosu/dsh-web-search-ddg
本地目录(需在该目录内曾执行过 pnpm install,以便 cheerio 等从插件真实路径解析):
dsh plugin --profile web add /path/to/dsh-web-search-ddg
固定 release 包(latest 可换成具体 tag 以锁定版本,例如 v0.2.0):
dsh plugin --profile web add https://github.com/korosu/dsh-web-search-ddg/releases/latest/download/dsh-web-search-ddg.tgz
dsh plugin add 会初始化 $DSH_HOME/profiles/web(若不存在)、在 profile 目录用 pnpm 安装依赖、读取 bundle 的 dsh.bundle.patch 并把 dsh-web-search-ddg 写入 dsh.profile.bundles,再由 loader 应用 cordis.patch.yml:挂载 provider 并将 searchProvider 设为 ddg。不要去改 profile 自有的 cordis.patch.yml 来重复声明同一层,否则会 shadow bundle 的 patch。
安装后在不启动完整会话的情况下可先核对配置层:
dsh --profile web --dump-config | grep -A2 searchProvider
dsh web
输出中应能看到标记为 # == dsh-web-search-ddg 的层,且 searchProvider: ddg。Host 侧插件行不支持热加载,改完后需重启 host。
用环境变量指定 provider¶
除 bundle 内对 searchProvider: ddg 的固定外,接缝还支持环境变量(README 截断处起笔):
export DSH_WEB_SEARCH_PROVIDER=ddg
可在不修改 patch 语义的情况下表达「使用 ddg 后端」的意图;具体与 profile patch 的优先级以 DSH / dsh-web 文档为准。
恢复默认或其它后端¶
移除 bundle:
dsh plugin --profile web remove dsh-web-search-ddg
或保留 bundle,在 profile 自有的 cordis.patch.yml 中把 web 行的 searchProvider 改回官方后端(README 示例为 deepseek-official,并需同时写全 fetchProvider: http,因 patch 行会整行替换 config,不做深合并)。
Profile 级 peer 警告¶
profile 是 pnpm workspace 且 autoInstallPeers: false,安装时可能出现 @deepseek-ai/cordis、@deepseek-ai/dsh-web 未在 profile 层找到的警告。README 说明运行中的 host 会自带这些依赖,警告通常可忽略;若需静默,可在 profile 的 pnpm-workspace.yaml 中配置 peerDependencyRules.ignoreMissing(README 给出示例)。
配置项¶
所有键均为可选,写在 bundle insert 行对应的 config 中(通过扩展 patch 或文档约定方式写入,以你使用的 DSH 版本为准)。
| 键 | 默认值 | 说明 |
|---|---|---|
endpoint |
https://html.duckduckgo.com/html/ |
结果页 URL,须为绝对 http(s) 地址 |
maxResults |
未设置 | 在过滤空标题、无效 URL、赞助行与重复项之后,对「可用」条目的上限;仅当请求未带 maxResults 时生效 |
userAgent |
桌面 Chrome 124(README 写为 live 验证过的 UA) | 请求 User-Agent;异常或过旧 UA 可能触发 bot 判定 |
acceptLanguage |
未设置 | 若设置则发送 accept-language 头 |
timeoutMs |
30000 |
单次请求超时(毫秒);超时计为瞬时失败并消耗失败预算 |
minIntervalMs |
0 |
两次请求起始的最小间隔;一次 web_search 批量多查询时会连续发请求,README 建议适当加大以降低异常页概率 |
failureThreshold |
3 |
连续瞬时失败次数,达到后 provider 暂时不可用 |
cooldownMs |
300000 |
上述不可用状态的持续时间(毫秒) |
典型用法¶
安装并重启 host 后,在已启用 web profile 的 DSH 会话中,模型调用方式与使用默认搜索后端时相同:仍通过内置 web_search 工具发起查询,无需改 prompt 或工具名。开发者侧的主要工作是指定 web profile、完成安装、确认 searchProvider 为 ddg,必要时按网络环境调整 timeoutMs、minIntervalMs 或 userAgent。
若需固定安装版本,可对 GitHub 源使用 commit SHA(github:korosu/dsh-web-search-ddg#<sha>),或使用 release tarball 的 tag URL。
适用场景与注意¶
更适合: 没有搜索 API Key、希望零 token 搜索后端、可接受 HTML 抓取稳定性与 DuckDuckGo 页面策略变化的部署;与 DSH ctx.web 接缝模型一致,需要保持 web_search 工具对外形态不变时。
需要知晓的限制:
- 抓取 HTML 结果页受目标站点反爬、限流与页面结构变更影响;插件通过失败预算与冷却降级,但不能保证与商业搜索 API 同等的 SLA。
- 插件在 当前 dsh 进程权限 下发起 HTTP 请求;安装前应阅读源码与 MIT 许可证,确认 outbound 访问与依赖(
cheerio等)符合你的安全与合规要求。 - 社区目录 SkillHub 是独立生态站点,与 DeepSeek / 幻方无官方从属关系;插件为社区维护,星标与活跃度以 GitHub 页面为准。
- HTML 抓取仅适用于 DuckDuckGo 公开静态结果页场景;若你的策略禁止对外抓取或要求可审计的搜索合同,应继续使用官方或自备 API backend。
结尾¶
dsh-web-search-ddg 把 DSH 的 web_search 后端换成免 Key 的 DuckDuckGo HTML 解析,一条 dsh plugin --profile web add 即可完成 profile 初始化、依赖安装与 searchProvider: ddg 切换,适合在 web profile 下快速获得可降级、可配置的联网搜索能力。