dsh-web-search-ddg:为 DSH 提供免 API Key 的 DuckDuckGo 网页搜索后端

前言

在 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 选择逻辑有机会切换到其它已注册后端,而不是长期返回空结果。

核心功能

接缝与工具形态

插件挂载后,模型侧 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 工具对外形态不变时。

需要知晓的限制:

  1. 抓取 HTML 结果页受目标站点反爬、限流与页面结构变更影响;插件通过失败预算与冷却降级,但不能保证与商业搜索 API 同等的 SLA。
  2. 插件在 当前 dsh 进程权限 下发起 HTTP 请求;安装前应阅读源码与 MIT 许可证,确认 outbound 访问与依赖(cheerio 等)符合你的安全与合规要求。
  3. 社区目录 SkillHub 是独立生态站点,与 DeepSeek / 幻方无官方从属关系;插件为社区维护,星标与活跃度以 GitHub 页面为准。
  4. HTML 抓取仅适用于 DuckDuckGo 公开静态结果页场景;若你的策略禁止对外抓取或要求可审计的搜索合同,应继续使用官方或自备 API backend。

结尾

dsh-web-search-ddg 把 DSH 的 web_search 后端换成免 Key 的 DuckDuckGo HTML 解析,一条 dsh plugin --profile web add 即可完成 profile 初始化、依赖安装与 searchProvider: ddg 切换,适合在 web profile 下快速获得可降级、可配置的联网搜索能力。

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

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

小夜