中文EN

dsh-workbuddy2api-hub

model已测通过npmMIT

把本地 workbuddy2api-hub 网关的模型接进 DSH:网关里有几条 API Key 就同步成几条 provider,每条 key 的模型勾选各自独立;侧边栏徽标显示主 key 的积分余额和今日、本周的 tokens、积分与 API 等价花费。需本机运行 workbuddy2api-hub。

下载量 / Downloads
3,313
依赖体积 / node_modules
0.27 MB
测试时间 / Tested
2026-11-06
DSH 版本 / Version
0.2.2-rc.1

安装

dsh plugin --profile web add dsh-workbuddy2api-hub

沙箱测试结果

阶段结果
1 安装✓
2 列装✓
3 挂载✓
4 启动—

四阶段在隔离沙箱里跑:安装(有网)→ 列装 → 挂载 → 启动(后三步断网)。

README

dsh-workbuddy2api-hub

![CI](https://github.com/HimA6652/dsh-workbuddy2api-hub/actions/workflows/ci.yml)

![npm](https://www.npmjs.com/package/dsh-workbuddy2api-hub)

![node](https://nodejs.org)

![license](LICENSE)

把本地跑的 workbuddy2api-hub 接进 DSH 桌面端:hub 上的模型直接出现在模型选择器里(带上下文窗口、图片输入、思考档位),侧边栏底部常驻一个徽标显示余额和今日/本周用量。

不用再手写 cordis.patch.yml 里那段 providers 配置,也不用在 hub 上新出模型之后手动改 yaml——插件每轮轮询自己写。

适用 workbuddy2api-hub · 1.x(实测 v1.8、v1.10)。依赖的接口在「依赖的面板接口」一节

适用 DSH · 桌面端 profile。@deepseek-ai/* 全部是 peerDependencies,由 DSH 自己提供,不随包安装

与本项目的关系 · 客户端插件。只读 hub 的管理接口和 /v1/models,不调任何写入接口

运行时依赖 · 无。没有打包步骤,client/client.js 就是可直接加载的 __ModuleLoader__ bundle


它解决什么

读 hub 源码并实测之后,有三件事必须先说清楚,否则接进去就是一堆 401:

参数 · 真实作用 · 别当成

pwd · 面板密码(默认 admin)。POST /panel/login 换一个 X-Panel-Token,之后所有管理接口带这个头 · 不是 API Key。Authorization: Bearer <面板 Token> 一律 401

tab · 纯前端页签深链(dashboard.html 读 ?tab=,白名单 gateway/accounts/tasks/analytics/agents/settings/logs) · 不是 API 参数,服务端不认

?pwd=admin · 面板自己的便利参数 · 不代表鉴权已经完成,服务端不处理

所以插件分两条腿走路:

1. 管理面用 pwd 换面板 Token,读 /health、/panel/status、/v1/models、/v1/balance-summary、/usage、/accounts、/settings;

2. 对话面必须有一个真正的 API Key(DSH 调 /v1/chat/completions 时走 Authorization: Bearer)。取法三级:配置里写了 apiKey → 写进 DSH 凭据库;凭据库里已有同名引用 → 直接用;都没有 → 用面板 Token 读 /settings + /settings/reveal?id=<keyId>,取第一个启用的 Key。

拿不到 Key 时插件不会硬写一条注定 401 的路由,等你填(概览的「API Key 来源」会显示「未配置」)。

安装

前置:Node.js ≥ 20;本地 workbuddy2api-hub 已启动,浏览器能打开 http://127.0.0.1:8788;DSH 桌面端能正常打开。

装好了 DSH CLI 的机器上一条命令(本包声明了 dsh.bundle,安装时不需要构建):

dsh plugin --profile desktop add dsh-workbuddy2api-hub

然后重启 DSH。重启后进 设置 → workbuddy2api-hub,确认地址与密码 → 「测试连接」→「保存并刷新」,模型会出现在 设置 → 模型,provider 名 workbuddy2api-hub。

其他安装方式

从 npm 直接装进 profile(不登记 dsh.profile.bundles):

cd ~/.dsh/profiles/desktop
npm i dsh-workbuddy2api-hub

或者克隆后用仓库里的安装脚本(会顺带登记 dsh.profile.bundles,更稳,也可 --uninstall 退回):

git clone https://github.com/HimA6652/dsh-workbuddy2api-hub.git
cd dsh-workbuddy2api-hub
node scripts/smoke-live.mjs     # 先确认 hub 通不通(只读,不改任何东西)
node scripts/install-local.mjs  # 挂进 ~/.dsh/profiles/desktop

install-local.mjs 只做三件事,都可逆:在 profile 的 package.json 里加一条 file: 依赖、往 dsh.profile.bundles 追加一个名字、在 node_modules/ 下建一个指向本仓库的链接(Windows 用 junction,不需要管理员权限)。改之前备份 package.json,--dry-run 只看不做。

自己维护索引源的话,把仓库地址加进 设置 → 插件 → Discover → Index sources 也行。

使用

模型同步

把 /v1/models 写进 llm-pi-ai 的 providers.workbuddy2api-hub,每个模型带上 contextWindow / maxTokens / 图片输入 / 思考档位。按模型名排序(不区分大小写、数字按数值),设置页表格与写进 DSH 的顺序一致。模型名后面直接带网关倍率(GLM-5.1 ×0.79),免费模型标 Free——倍率写不进名字,选择器里就看不见。

模型下架先进宽限期(默认 24 小时,可一键立即移除),回来能复活;内容没变就不写配置,避免每次轮询都触发一次配置更新;配置冲突自动重取 revision 重试。

多 key

网关里有几条 API Key 就同步几条 provider:一个 key ↔ 一条 provider 路由 ↔ 一条凭据引用。主 key 固定 workbuddy2api-hub,其余 workbuddy2api-hub-<名字>。

路由键建好就不再变,所以网关里改 key 的名字、换倍率,都不会让会话里已经选中的模型消失。网关里删掉某条 key → 那条路由自动撤掉;删掉的是主 key → 徽标显示「主 key 已删除」、会话提示重新选模型,不会拿别的 key 偷偷顶替。

每条 key 每轮都拉模型清单(实测与绑定账号数无关),设置页里各自一份模型开关,模型多的那几条默认收起,点卡片头上那行「账号 N · 模型 6/19」展开。同步那行的分子是所有 key 启用模型的并集去重(同一条模型被几条 key 都勾上只算一次),分母是网关给的模型总数。

侧边栏徽标

展开态三行:第一行是主 key 的名字和「该 key 余额 / 整域余额」,第二行 今日、第三行 本周,右半边 tokens / 积分 / 等价 三列等宽右对齐。收起态是 36×36 圆形图标。

数字固定取主 key:第一行的名字、余额,下面今日/本周的 tokens、积分、等价,都是主 key 那条的。副窗里的「各 key 用量」表才逐条列出所有 key。

点一下出副窗:贴着徽标上沿弹出,内容是「各 key 用量」表(每条 key 一段「名字 + 账号 N」,再跟今日、本周两行,末尾 总计),上面两个格子是「这条 key 的余额」与「全部账号」,底部「打开面板」「关闭」。点遮罩或右上角 × 关闭。没有悬停提示,也不会一点就跳窗口。

所有数字两位小数(72.30M、¥10.39),全部来自网关:每条 key 的用量取 /usage/analytics 的按 API Key 分组(面板「用量明细 → 按 API Key」那张表),总计 取 /usage 的整域汇总。插件在本地只做两件事——保留两位小数、算 errors / requests。

余额拆不到 key 的只有 /v1/balance-summary(整域汇总),所以每条 key 的余额由后端拿 /accounts 里这条 key 绑定的账号求和得出(纯内存,不额外发请求)。账号没出现在 /accounts 里时显示 —,不报 0。

容错

hub 没开、密码错、超时、返回 HTML、返回半截 JSON,插件都只把它变成一段中文提示——设置页顶部一行原因,轮询按失败次数退避。/state 永远返回 200,前端永远有东西可渲染。

配置

改 profile 的 cordis.patch.yml(或本仓库的 cordis.patch.yml 作为默认值)。只改配置就能换地址/密码,不用改代码:

- id: workbuddy-hub
  name: dsh-workbuddy2api-hub
  config:
    baseUrl: http://127.0.0.1:8788   # 换机器就改成 http://192.168.1.10:8788
    pwd: admin                        # 面板密码
    tab: gateway                      # 打开面板时落在哪个页签

配置 · 默认 · 说明

baseUrl · http://127.0.0.1:8788 · 服务地址。从浏览器地址栏整条粘进来也行(?pwd=…&tab=… 会被剥掉),缺协议自动补 http://

pwd · admin · 面板密码。只用于换 Token,不会被当成 API Key

tab · gateway · 深链页签,白名单外的值退回 gateway

apiKey · 空 · 可选。写了就存进 DSH 凭据库(引用名见 apiKeyEnv),不落状态文件

apiKeyEnv · WORKBUDDY2API_HUB_API_KEY · DSH 凭据库里的引用名

providerEntry · llm-pi-ai · 写到哪个 settings 的 ns 下

routeKey · workbuddy2api-hub · 写进 providers.<routeKey>。故意不叫 wb,免得覆盖你已有的路由

maxKeys · 10 · 最多同步几条网关 key(1–50)。超出的只读不写,避免一次刷出几十个 provider

intervalSeconds · 120 · 轮询间隔,下限 30、上限 3600;连续失败会指数退避到 30 分钟

sync · true · 关掉就只看数据、不写模型

autoApiKey · true · 缺 Key 时是否允许从面板 /settings/reveal 自动取

newModelPolicy · select · hub 上新出的模型默认勾选(select)还是先不写(ignore)

retireHours · 24 · 模型下架后的宽限期

stateDir · 空 · 状态文件目录。默认跟 profile 同级(workbuddy2api-hub.json)

baseUrl / pwd / tab 三个字段按「显式字段指纹」判定:YAML 里改了值就覆盖状态,没改就保留你在设置页里最后改的值——所以「改配置即生效」和「UI 改动不被重启抹掉」不会打架。

错误处理

所有失败都折成一句话写进 lastError,同时决定轮询怎么退避:

情况 · 面板上看到的 · 还会做什么

服务没开 / 端口不通 · 连不上 hub(fetch failed):确认本地服务已启动(默认 http://127.0.0.1:8788) · 冷启动 60 秒内每 15 秒重试,之后指数退避

8 秒没响应 · 连不上 hub(请求超时) · 同上

密码错 · 面板密码(pwd)不对 · 不反复猛撞(5 次/60 秒上限)

60 秒内错 5 次 · 面板登

…(truncated)

以上内容来自 npm 上的 README,我们只做格式化,不改内容。

版本

npm 上共发布:16,最后更新 2026-10-28

链接

GitHub · Homepage · npm

同类插件