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 腳本,靈活定義子插件的組合邏輯。