dsh-search-picker:在 DSH 桌面侧栏一键切换联网搜索后端

前言

在 DeepSeek Harness(DSH)里做带联网能力的智能体时,ctx.web 的搜索后端通常要在设置里改 searchProvider,或在不同插件、不同 API 之间来回对照文档。换引擎往往意味着打开 Plugins › Web search、确认凭据是否齐全,再重启或刷新才能验证行为是否生效。

下面介绍社区插件 dsh-search-picker(维护者 xiaoxiaosrm,分类:联网工具)。它在 DSH 桌面侧栏底部(Settings 行上方)增加 Search: … 按钮,用菜单在多种搜索后端之间切换,写入与官方设置页相同的 web.searchProvider 字段,切换后立即生效并持久化到宿主配置文档。

这是什么

dsh-search-picker 是一个 DSH bundle 插件:服务端通过 cordis.patch.yml 注册搜索提供方补丁;客户端在 web 平台注入 UI,在侧栏提供搜索引擎选择器。

它解决的核心问题是:在不与官方 Plugins › Web search 打架的前提下,用一次点击在 DeepSeek Messages、DeepSeek Search API、OpenCode Go、Tavily、Exa 之间切换 ctx.web 的搜索实现。菜单里未配置凭据的引擎会灰显;若在设置里选了未注册/不可用的提供方,web_search 会返回明确的 WEB_PROVIDER_* 错误,而不是静默落到别的引擎。

插件以当前 DSH 进程权限运行;安装前请自行阅读仓库源码与 MIT 许可证,并只在可信来源获取代码。

支持的搜索引擎

资料中的引擎列表如下(id 即 searchProvider 取值方向):

id 引擎 凭据环境变量 说明
deepseek-official DeepSeek 官方 Messages DEEPSEEK_API_KEY 内置;Anthropic Messages + web_search_20250305;每次搜索消耗模型 token
deepseek-search-api DeepSeek 官方 Search API DEEPSEEK_API_KEY 内置;直连检索端点;不消耗模型 token
opencode-go OpenCode Go OPENCODE_GO_API_KEY 由本插件提供;Anthropic Messages + x-opencode-session 头;约 $0.01/次搜索
tavily Tavily TAVILY_API_KEY 由本插件提供;未配置 key 时菜单灰显
exa Exa EXA_API_KEY 由本插件提供;未配置 key 时菜单灰显

凭据不由插件直接读写凭据文件;搜索时通过 ctx.credentials 解析 apiKeyEnv 所指引用,并回退到进程环境变量。缺失时抛出 WEB_PROVIDER_CREDENTIAL_MISSING,错误信息会点名对应变量名。

核心功能

与官方设置共用同一字段

选择器写入官方 web 命名空间下的 searchProvider,与 Plugins › Web search 编辑的是同一字段,因此:

  1. 切换后立刻生效,无需重启 DSH;
  2. 选择会随宿主设置文档持久化,重启后仍保留;
  3. 侧栏菜单与设置页不会互相覆盖不同字段。

侧栏 UI 行为

按钮位于侧栏底部、Settings 行正上方。菜单为 position: fixed 弹出层:宽度跟随侧栏内容宽度(侧栏默认 280px,可拖拽 264–420px,菜单约 240–396px),拖拽时实时更新,避免被侧栏列 overflow: hidden 裁切。侧栏收起到 56px 图标轨时,菜单向右侧以 280px 宽度弹出。

菜单背景为不透明材质(浅色主题为白、深色主题为深灰,使用 --dsw-alias-bg-layer-1),带官方 popover 描边与 --dsw-elevation-panel 阴影;未采用仅 58% 不透明度且依赖 backdrop-filter 的官方菜单材质,以免侧栏文字透出。

仓库 docs/ui.png 中有界面示意。

安装与启用(desktop profile)

官方 README 面向 desktop profile,通过本地 file: 依赖把 bundle 挂进 profile。下面步骤对应资料原文逻辑;请将插件完整目录放到固定路径(README 示例为 Windows D:\tools\dsh-search-picker,POSIX 下自选等价路径),不要与未核实的 dsh plugin add github:... 类命令混用。

  1. 编辑 %DSH_HOME%\profiles\desktop\package.json(POSIX:$DSH_HOME/profiles/desktop/package.json):
    - 在 dependencies 中增加 "dsh-search-picker": "file:D:/tools/dsh-search-picker"(路径按你本机实际目录修改);
    - 在 dsh.profile.bundles 中追加 "dsh-search-picker"。
  2. 在 %DSH_HOME%\profiles\desktop 下执行:
pnpm install
  1. 完全退出并重新打开 DSH 桌面应用。Loader 仅在启动时扫描 profile bundles,客户端半部也在启动时读入内存,仅刷新页面不足以加载新插件。

若 file: 依赖无法解析,可将插件目录复制到 %DSH_HOME%\profiles\desktop\node_modules\dsh-search-picker,并仍将包名加入 dsh.profile.bundles(无需 file: 依赖项)。

运行环境要求 Node >= 20(见 package.json → engines)。

配置

bundle 自带默认补丁项(cordis.patch.yml),字段均可选,省略则用下列默认值。可在 profile 的 cordis.patch.yml 中针对同一 entry id(search-picker)覆盖。

- insert:
    - id: search-picker
      name: dsh-search-picker
      config:
        opencodeGo:
          baseURL: https://opencode.ai/inference/go/anthropic/v1
          model: deepseek-v4.1-flash
          maxTokens: 4096
          maxUses: 5
        tavily:
          baseURL: https://api.tavily.com
          apiKeyEnv: TAVILY_API_KEY
        exa:
          baseURL: https://api.exa.ai
          apiKeyEnv: EXA_API_KEY

典型用法

  1. 按上一节完成 profile 安装并冷启动桌面端。
  2. 在 DSH 凭据或环境中配置目标引擎所需变量(例如 DEEPSEEK_API_KEY、TAVILY_API_KEY)。
  3. 点击侧栏 Search: …,选择当前要用的引擎;未配凭据的项保持灰显不可选。
  4. 在对话或工作流中触发 web_search;行为与在 Plugins › Web search 中选择同一 searchProvider 一致。

需要改回内置路径时,在菜单选 deepseek-official,或打开官方 Plugins › Web search 页面修改。

卸载与回退

  1. 在菜单或官方页面切回 deepseek-official。
  2. 从 profile 的 package.json 中移除 dsh-search-picker 依赖及 dsh.profile.bundles 中的包名,执行 pnpm install,再完全重启桌面应用。

适用场景与注意事项

适合谁: 经常在 DSH 桌面端对比 DeepSeek 官方 Messages / Search API、OpenCode Go、Tavily、Exa 检索效果或成本的开发者;希望少进设置页、但仍与官方 searchProvider 保持一致的团队。

务必注意:

  • 菜单内引擎列表固定;若官方提供方把 apiKeyEnv 映射到其他凭据名,灰显逻辑仍按默认引用名检查。
  • 与运行时接管 web.searchProvider 的插件(如 dsh-free-search、dsh-web-search-free 等)冲突,勿同时安装。
  • opencode-go 在无法取得当前 session id 时,x-opencode-session 使用进程内随机 UUID(中继仅需不透明且稳定)。
  • deepseek-official 返回 404:检查 profile 补丁或其他插件是否改写了 web-search-deepseek.baseURL;应保持内置默认 https://api.deepseek.com/anthropic/v1,误指向搜索提供方主机会导致异常。
  • 菜单宽度不跟随侧栏:popover 依赖 ResizeObserver;修改 profile/bundle 后需重启桌面应用以重载客户端 bundle。

DSH 生态强调「一切皆插件」;SkillHub 等社区目录为独立站点,与 DeepSeek / 幻方无官方从属关系。本插件 GitHub 星标数为 1(以目录页/仓库公开信息为准),使用前请自行评估维护活跃度与风险。

结尾

dsh-search-picker 把 web.searchProvider 的切换搬到侧栏,与官方 Web search 设置同源同字段,适合在桌面 profile 下快速试验多种联网后端。详情与 Issue 见 GitHub:https://github.com/xiaoxiaosrm/dsh-search-picker;插件索引见 SkillHub:https://www.skillhub.cn/plugins/xiaoxiaosrm/dsh-search-picker。

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

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

小夜