DeepSeek Harness (DSH) 的插件开发中,当多个插件需要共享同一个能力(例如统一搜索或网页抓取)时,直接调用全局 ctx 容易造成冲突或状态混乱。@wangmuy/dsh-provider-dispatcher 是一个通用提供者调度器,它将多个普通 DSH 子插件代理到一个能力后,让它们协作工作。
这是一个通用提供者调度器,属于工作流类别,由 wangmuy 维护,采用 MIT 许可证。它允许多个子插件在隔离的 realm 中运行,框架将子插件的注册调用记录下来,并通过一个 setup 脚本构建代理,将单一操作分发给所有记录的子提供者。
核心功能¶
- 将多个普通 DSH 子插件代理到一个能力后。
- 支持 web search 和 web fetch 能力的分发。
- 提供并行(parallel)合并和失败即止(bail)策略。
- 支持自定义 merge 函数。
- 为子插件提供隔离的 realm。
- 通过
cordis.patch.yml集成配置。
安装与启用¶
安装插件需要执行以下命令:
dsh plugin --profile web add @wangmuy/dsh-provider-dispatcher
配置与使用¶
安装完成后,需要在 cordis.patch.yml 中定义配置。配置主要包含注入服务、setup 脚本和子插件列表。
- inject: 指定注入的服务(例如
['web'])。 - setup: 指定 setup 脚本的模块路径。
- children: 子插件数组,每个子插件包含
name(模块路径)和config。
插件随带两个内置的 setup 脚本:
* web-search-setup: 用于分发搜索提供者(registerSearchProvider)。
* web-fetch-setup: 用于分发抓取提供者(registerFetchProvider)。
配置参数(params)由 setup 脚本读取:
* providerId: 代理在全局注册的 ID(默认 dispatcher-search 或 dispatcher-fetch)。
* strategy: 策略,支持 parallel(运行所有并合并)或 bail(遇到第一个成功即止)。
* tolerateFailures: 是否容忍子插件失败,默认为 true。
* merge: 自定义合并函数的模块路径。
子插件是普通的 DSH 插件,它们通过 ctx.web.registerSearchProvider 或 registerFetchProvider 注册提供者。这些调用不会直接注册到全局 ctx,而是在隔离的 realm 中被捕获。
注意事项¶
子插件如果是 bundles,必须从 dsh.profile.bundles 中移除。
如果子插件(例如 @liustack/modsearch)既在 bundles 中又在 children 中,其 bundle 层会绕过调度器代理,直接注册到全局 ctx.web 或 ctx.tools。移除 bundles 配置项后,插件将正确走代理流程。
总结¶
该插件通过隔离 realm 和代理模式,解决了多插件共享能力时的协调问题。开发者可以通过编写自定义 setup 脚本,灵活定义子插件的组合逻辑。