dsh-workbuddy2api-panel

modeltested: passnpmMIT

Reads a running workbuddy2api-panel over its HTTP API and syncs its models into the DSH model picker with credit multipliers, CN/international realm labels and per-model reasoning-effort levels; also shows remaining credits and usage in a settings page and a sidebar badge.

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

Install

dsh plugin --profile web add dsh-workbuddy2api-panel

Sandbox test results

StageResult
1 install✓
2 list✓
3 mount✓
4 boot—

Four stages run in an isolated sandbox: install (network on) → list → mount → boot (last three with no network).

README

dsh-workbuddy2api-panel

![ci](https://github.com/jerry9692/dsh-workbuddy2api-panel/actions/workflows/ci.yml)

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

把 workbuddy2api-panel 接进 DeepSeek Harness:

自动嗅探面板地址、把面板上的模型同步成 DSH 的模型(带倍率、分国内/国际、可裁剪思考档位),

并在设置页里实时显示剩余额度与模型用量。

不用再手写 cordis.patch.yml 里的 models 列表了。

适用面板 · workbuddy2api-panel 1.13.0-panel(实测通过);接口见下文「依赖的面板接口」,面板改字段这里要跟着改

适用 DSH · @deepseek-ai/dsh-desktop-runtime 0.2.0-rc.2(llm-pi-ai / dsh-settings / dsh-credentials 都按这个版本对过)

与本项目的关系 · 这是个客户端插件,不修改、不代理面板本身;它只读面板的 HTTP 接口,把结果写进 DSH 自己的 llm-pi-ai 配置


它解决什么

原来要在 ~/.dsh/profiles/<profile>/cordis.patch.yml 里手写:

- id: llm-pi-ai
  config:
    providers:
      workbuddy2api:
        baseURL: http://192.168.1.10:7863/v1
        apiKeyEnv: WORKBUDDY2API_API_KEY
        models:
          - id: cn:deepseek-v4.1-flash
            name: Deepseek-V4.1-Flash
            contextWindow: 1000000
            maxTokens: 393216
          # ……面板有 50 多个模型,得一个个抄

面板一加模型就得重抄一遍,抄漏了还不知道。装上这个插件之后:

1. 装完打开 设置 → WorkBuddy 面板,填面板地址(http://192.168.1.10:7863),点「保存并同步」;

2. 面板上的模型自动出现在 DSH 的模型选择器里,名字带分区和倍率,例如

Deepseek-V4.1-Flash · 国内版 · ×0.11;

3. 面板加/删模型,插件每 2 分钟自动同步一次,不需要重启 DSH;

4. 同一页里能看每个账号剩多少积分、哪些号在冷却、72 小时内的请求数/积分消耗/缓存命中。

前提是插件所在机器能访问面板。如果你只想要一个 OpenAI 兼容的 /v1 端点、不需要倍率和额度这些信息,

那用更轻的桥接方式就够了,这个插件是多余的。


安装

dsh plugin --profile desktop add dsh-workbuddy2api-panel

改插件代码、想立刻看到效果时,用 link 方式装本地目录(把路径换成你 clone 出来的位置):

dsh plugin --profile desktop add "link:$PWD"

dsh plugin add 会自动把包名写进 profile 的 dependencies 和 dsh.profile.bundles,

插件自带的 cordis.patch.yml 也随之生效(id: workbuddy-panel)。

装完重启一次 DeepSeek Harness(首次安装要加载宿主侧代码)。

之后改插件配置、改模型选择都不再需要重启。

卸载:

dsh plugin --profile desktop remove dsh-workbuddy2api-panel

只想临时停用、不卸载的话,在 cordis.patch.yml 里给它加一行 disabled: true,重启后生效。


使用

1. 连接面板

设置页里的卡片分四块。最上面是连接:

字段 · 说明

面板地址 · 每行一个地址,按顺序试连,用第一个通的。填 192.168.1.10:7863、http://…/v1、http://…/panel 都会自动纠正;行尾可加超时秒数(http://nas:7863 8)。子路径反代(https://nas.example.com/wb/)直接填整条,插件会保留 /wb 前缀

面板 API Key · 存在 DSH 的凭据库里(引用名 WORKBUDDY2API_API_KEY),不写进设置文件;留空表示沿用已有的

自动探测 · 依次试已填地址、当前主机 + 7863、127.0.0.1:7863、localhost:7863,命中即保存

测试连接 · 只验证,不保存

自动同步到 DSH · 关掉之后就只展示、不改 DSH 配置

API Key 和 llm-pi-ai 用的是同一个引用名,所以你原来 export WORKBUDDY2API_API_KEY=... 的配置继续有效,

不需要在插件里再填一遍。面板没开鉴权(auth_required: false)时可以留空。

首次启动会自动接管:如果插件自己还没存地址,它会先读你 cordis.patch.yml 里已有的

providers.workbuddy2api.baseURL 和 apiKeyEnv 并直接沿用——以前手写过配置的人不用重填。

⚠️ 这个 Key 权限很大:面板的 /v1/ 和 /panel/api/ 由同一个 Bearer Key 保护
(internal/server/handler.go 的 withAuth 用的是 h.loadLive().APIKey)。
拿到 Key 就等于拿到账号池的管理权限,别外泄,也别贴进 issue。

2. 选模型

模型区按「国内版 / 国际版」分组,每行:

  • 勾选框:这个模型要不要出现在 DSH 的模型选择器里;
  • 模型名 + id + 上下文窗口 + 最大输出 + 是否支持图片;
  • 倍率标签(×0.11)——面板的 credits 原文,促销倍率优先;
  • 思考档位:面板声明的档位逐个列出,点一下就能关掉某一档。

「全选 / 全不选」在右上角。改完立刻生效(插件会重写 llm-pi-ai 的 models 数组,

llm-pi-ai 监听 loader/volatile-update 后自行重注册模型)。

面板默认有 50 多个模型,插件默认全部勾选——不静默丢模型。第一次装完建议先「全不选」,
再挑常用的几个勾上,模型选择器会清爽很多。

3. 告警与策略

设置页顶部会出现告警条(可逐条关掉,同一条 24 小时内不再弹):

告警 · 触发条件

面板 API Key 失效 · 面板返回 401/403

面板连续不可达 · 连续失败 5 轮(默认约 10 分钟)

某个域额度不足 · 剩余积分低于 max(50, 总额 10%)

积分包即将到期 · 3 天内到期且还有余额

底部「策略」卡片:

  • 新上架模型:自动勾选(默认)/ 不勾选 / 只提示。首次导入不受影响(否则选「不勾选」会一个模型都不剩);
  • 额度不足标注:某个域剩余积分为 0 时,该域模型显示名后加 · 额度不足(不影响能不能调用);
  • 清除插件写入的配置:两次点击确认,用 unset 把 providers.workbuddy2api 整条移除,并停止自动同步。

面板下架的模型不会立刻消失:先进 24 小时宽限期,期间显示 · 已下架,可以点「立即移除」提前删掉。

面板重新上架则自动复活。

4. 额度与用量

  • 剩余额度:按国内版/国际版汇总剩余积分、账号数、健康/冷却/停用数量,下面列出前 8 个账号;
  • 用量:请求数、积分消耗、缓存命中率、平均延迟,以及按模型排的用量表(24h / 72h / 168h 可切)。

数据来自面板的 /panel/api/overview、/panel/api/usage?hours=N 和 /panel/api/packages。

5. 侧边栏徽标

侧边栏底部、设置按钮旁边有一个小徽标(56px 窄轨下只显示 WB),

旁边的小圆点表示状态(绿=正常、黄=有告警、红=最近一次请求失败)。

点一下就地弹出明细(分域剩余/总量、待处理告警数、面板版本)。

显示什么可以在设置里改(设置 → WorkBuddy 面板 → 策略 → 侧边栏徽标):

方式 · 宽轨上显示 · 适合

剩余 / 总额 · WB 1,800 / 3,300 · 想知道「还能用多久」

分域显示 · WB 国内 1,500 · 国际 300 · 两个池子的额度分开看

仅剩余 · WB 1,800 · 只要一个数,最省地方

不显示 · 徽标整体隐藏 · 不想占位置(设置页里照样有完整数据)

默认是「剩余 / 总额」。切换立刻生效,不用重启,也不会重新请求面板。

设置页和侧边栏徽标是两个独立的 React 根:改完设置,设置页自己会重渲染,但徽标原先只知道自己
每 60 秒轮询一次,于是「改了要等一分钟才变」。现在两者通过 bundle 内的一个小发布订阅(store)
同步:设置页每次拿到新快照就广播,徽标立刻跟着重渲染。

它挂在宿主的 sidebar.footer.action 插槽上,读的是插件自己的内存快照(60 秒一次),

不会额外请求面板。这个插槽拿不到「打开设置」的句柄,所以明细做成就地浮层,不假装能跳转。


依赖的面板接口

接口 · 用途

GET /panel/api/models · 模型列表(id 前缀 cn: / global:、倍率、档位、上下文、促销信息)

GET /panel/api/overview · 账号池状态(剩余积分、冷却、健康度、面板版本)

GET /panel/api/usage?hours=N · 用量聚合(totals / by_realm / by_model)

三个都用 Authorization: Bearer <api_key>。面板源码对应

internal/panel/panel.go(handleModels 的 panelModelEntry)、internal/pool/entry.go(Status)、

internal/usage/usage.go(Snapshot)。


设计说明(几个不显然的决定)

为什么倍率写进模型名?

DSH 的模型选择器只渲染 name 一个字段,没有副标题。想让用户在选择器里就看出价格差异,只能写进名字。

为什么 compat.supportsReasoningEffort 必须显式置 true?

pi-ai 默认按 baseURL 猜这个能力。局域网地址(192.168.x.x:7863)会被判成「不支持 reasoning_effort」,

于是思考档位静默失效、所有请求都用面板默认档。面板的 payload.go 正是按 reasoning_effort 分档的,

所以插件写配置时固定带上 compat: { supportsReasoningEffort: true, thinkingFormat: 'openai' }。

「关闭思考」为什么不是真的关闭?

面板的 normalizeReasoningEffort 会把 reasoning_effort: "off" 抬到该模型最低支持的档位;

真正能关掉的路径是发 thinking: {type: "disabled"},但那要求 pi-ai 用 thinkingFormat: "deepseek",

而这个格式会给非 DeepSeek 模型也塞 thinking 字段,

…(truncated)

Rendered from the README published on npm. Formatted only, not edited.

Versions

Published on npm::5,最后更新 2026-10-19

Links

GitHub · Homepage · npm

Same category