dsh-as-one:在 DSH 內嵌 As One 網關與面板

前言

DeepSeek Harness(DSH)把能力拆成可安裝的插件,模型調用、路由和運維界面往往分散在不同進程或自建 HTTP 服務裏。若你已經在用 As One 做上游調度、憑據與路由,又希望在 DSH 裏用同一套邏輯——既要有 OpenAI 兼容的模型列表與對話接口,也要在側欄裏直接管配置——就需要把 As One 的「宿主半」掛進 DSH 的 webServer 與客戶端槽位,而不是再單獨起一個網關端口。

下面介紹社區插件 bvbhu/dsh-as-one(npm 包名 @as-one/plugin,維護者 bvbhu)。它把 @as-one/core、@as-one/panel、@as-one/panel-ui 裝進 DSH:打開 SQLite、裝配 Scheduler 與 Router,在宿主 ctx.webServer 上掛 OpenAI 兼容路由,並把 React 面板頁嵌進 DSH 側欄;同時通過 LLM adapter 把模型清單寫進 DSH 原生模型選擇器。

這是什麼

@as-one/plugin 是 As One 網關的 DSH(Cordis)插件:同一包裏包含宿主半與 client 半。Cordis 註冊條目爲 id: as-one-gateway、name: @as-one/plugin(見倉庫內 cordis.patch.yml)。

與 Electron 版 As One 共用同一份核心與面板 UI,差異只在裝配層:插件側去掉自建 http.Server 與窗口,改爲使用 DSH 提供的 ctx.webServer 註冊路由,並把 client 半以 platform: "web" 注入 DSH 客戶端。

分類上屬於模型推理;當前 GitHub 星標爲 0。許可證爲 MIT(見 package.json)。

核心功能

OpenAI 兼容網關面(ctx.webServer)

路由掛在 DSH 宿主 webServer 上,而不是插件自建 Node http.Server。README 中明確登記的路由包括:

方法 路徑 行爲概要
GET /v1/models 鑑權後返回 { object: "list", data: ModelEntry[] }(須 await rt.listModels())
POST /v1/chat/completions 鑑權、讀 body、resolveUpstream,按 stream 返回 SSE 或 JSON
POST /as-one/api/<method> 面板數據面;白名單來自 panel-routes.ts 的 PANEL_METHODS(64 項)加 getUsageSummary,共 65 條 exact 路由

宿主對 handler 拋錯會統一變成 HTTP 400,因此 401、404、503 等需要在 handler 內自行 writeJson,不能依賴 throw。SSE 流式路徑對 text/event-stream 放行 gzip 緩衝,與網關側 forwardStream 行爲一致。

側欄內嵌 As One 面板

client 半通過 package.json 的 dsh.client 配置注入 locale、UI slots 與 primitives,打包產物爲 lib/client.js(內聯面板 CSS 與 React 頁面)。面板 API 成功/失敗形態爲 { ok: true, value: T } / { ok: false, error: { code, message } }。

LLM adapter:模型進 DSH 原生選擇器

src/llm-adapter.ts 註冊 provider as-one(顯示名「As One · 合一」)。DSH 前端模型下拉通過 ctx.llm.listProviders() → listModels → resolveModelInfo 聚合 catalog,無需改 DSH 前端;若 listModels 返回空,GUI 中不會出現該 provider 組。

adapter 在 ctx.inject(["llm"], …) 的子 fiber 裏註冊,避免宿主缺少 llm 服務時整個插件連網關路由都無法加載。實現上需滿足宿主對流式 chunk、錯誤碼、模型元數據及完整 LlmAdapter 方法表的要求(README 中有四條硬規矩與測試用例說明)。

與 Electron 宿主的關係(維護者向)

/v1/models 清單的唯一真源在 @as-one/panel 的 modelcatalog.ts;gateway-upstream*.ts 在插件內是 Electron 側的逐字副本,修改後需手動 cp 同步。這些細節不影響使用者安裝,但說明插件與桌面版 As One 在路由與上游解析上刻意保持 parity。

安裝與啓用

  1. 確認環境:插件要求 Node >=22.5.0,並聲明對 @deepseek-ai/dsh-host-webserver、@deepseek-ai/cordis 等 peer 依賴(見 package.json)。當前發佈版本爲 0.4.20。

  2. 安裝形態:README 寫明,DSH 插件管理器按 github:owner/repo 安裝時會去掉 # 之後的路徑,倉庫根目錄必須就是插件包本身(lib/、cordis.patch.yml、package.json 直接在倉庫根)。本插件對應倉庫 bvbhu/dsh-as-one。

  3. 社區目錄:SkillHub 條目 bvbhu/dsh-as-one 提供「發送給 DeepSeek Harness 安裝」指引,標識爲 bvbhu/dsh-as-one,可與 DSH 的插件安裝流程配合使用。SkillHub 爲獨立社區站點,與 DeepSeek / 幻方無官方從屬關係。

  4. 構建說明(僅源碼/發佈維護):若從 monorepo 源碼發佈,需先執行 pnpm -C packages/dsh-plugin build 生成 lib/;通過 GitHub 安裝的已發佈倉庫應已包含構建產物。

啓用後,具備 llm 服務的 DSH 宿主會在模型選擇器中出現 As One · 合一 分組;網關路由隨宿主 webServer 在同一進程內可用,具體鑑權與數據目錄由 As One 裝配邏輯(setupAsOne)決定。

典型用法

README 未給出單獨的 curl 示例,用法可從掛載能力歸納如下。

在 DSH 內選模型對話:安裝並啓用插件後,在 DSH 原生模型下拉中選擇 provider as-one 下的模型,會話請求經 LLM adapter 轉同進程內的 resolveUpstream,流式輸出需符合 DSH dsh-llm 的塊語法(adapter 內 translateStream 從 OpenAI delta 合成)。

OpenAI 兼容客戶端對接宿主 webServer:對同一 DSH 進程暴露的 HTTP 面調用:

  • GET /v1/models 拉取模型列表;
  • POST /v1/chat/completions 發起對話(支持 stream SSE)。

調用方須滿足插件側的鑑權約定(具體 header 與憑據存儲由 As One 核心與 SQLite 配置決定,見 @as-one/core 與面板能力)。

在側欄管理網關:通過內嵌面板調用 /as-one/api/<method> 白名單內的 65 個方法,與 Electron 版共用 @as-one/panel 的 createPanel / dispatchPanel 邏輯。

適用場景與注意

適合誰:已在用或計劃用 As One 做多上游調度、憑據與路由,並希望把網關和運維面板收進 DSH 單進程,而不是另開網關服務或使用純 Electron 宿主。

權限與安全:插件以當前 DSH 進程權限運行,會打開 SQLite、處理上游憑據並註冊 HTTP 路由。安裝前應閱讀 GitHub 倉庫 源碼與 MIT 許可證,確認符合你的安全與合規要求。

宿主能力:LLM adapter 依賴宿主提供 llm 服務;老版本宿主或純 Web 形態若無 llm,子 fiber 不會註冊 adapter,但 README 設計仍儘量讓網關路由在 inject(["llm"]) 之外加載。peer 依賴版本區間以 package.json 爲準,升級 DSH 時注意兼容性。

勿與子目錄安裝混淆:不要把 monorepo 子路徑當作 github:owner/repo#subdir 安裝;發佈倉庫根即 @as-one/plugin 包本身。

結尾

bvbhu/dsh-as-one 把 As One 的調度、路由、OpenAI 兼容網關與 React 面板收進 DSH:路由走 ctx.webServer,模型走原生選擇器,面板走側欄 client 半。需要進一步瞭解條目說明與安裝指引,見 SkillHub 目錄頁 https://www.skillhub.cn/plugins/bvbhu/dsh-as-one;實現細節與路由表、adapter 約束見 GitHub https://github.com/bvbhu/dsh-as-one。

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

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

小夜