dsh-as-one: Embedding As One Gateway and Panel into DSH

前言

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。

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

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

Xiaoye