dsh-workbuddy-hub
这是什么:WorkBuddy2API-Hub 的 DeepSeek Harness 插件壳 + 内置更新器。 原作者:网关本体由 @ardeyouxipianyi 开发,仓库 ardeyouxipianyi/workbuddy2api-hub(MIT)。本仓库只做「装进 Harness、看数据、管版本」这一层,不改上游代码;详见 CREDITS.md。
本仓库:https://github.com/zzzstarx/dsh-workbuddy-hub · 打包产物见 Releases。
把 WorkBuddy2API-Hub(WorkBuddy 国际版/国内版多账号反代网关,OpenAI 兼容)做成 DeepSeek Harness(DSH)插件,并带内置更新检测:插件自己查 GitHub Release、自己验签、自己解包、自己切换版本,失败自动回滚。
它解决什么问题
上游是 Python 网关 + 一堆 .bat 启动器,DSH 是 Node 插件宿主。中间原本有三处手工活:
| 手工活 | 这个插件怎么做 |
|---|---|
双击 .bat 起网关、看它在不在 |
插件探活 /health、按需启动/停止/重启,崩溃后限次数自动拉起 |
| 想知道有没有新版,去 GitHub 页面翻 | 内置检测:默认 24 小时节流 + 启动补查一次,结果落盘、进工具、上状态条 |
| 下载 zip、解压、搬账号目录、切版本 | 一条工具调用:下载 → SHA256 → 解包 → 冒烟 → 迁移 → 切换 → 校验 → 失败回滚 |
数据面板(搬进 Harness 的那个页面)
上游 dashboard 是一张 1.4 MB 的自带页面,在 Harness 里直接 iframe 会撞上三件事:主题不跟随、滚动被主栏裁掉、每次看数据都要跳出对话。所以这里做了一层「原生面板 + 原页面兜底」:
| 入口 | 位置 | 内容 |
|---|---|---|
侧栏 WorkBuddy 图标 |
sidebar.panellist + main |
完整数据面板(下面 8 个页签) |
| Settings → WorkBuddy | settings.section |
同一个面板,主栏被占用时也能进 |
| 输入框上方状态条 | conversation.input.dock |
在线/版本/可升级,点一下强制查更新 |
页签:概览(今日请求/tokens/积分/缓存命中 + 7 日柱状图 + 按模型占比)、账号(池里每个账号的区域、档位、剩余积分、凭证过期与冷却/封禁状态)、用量(每日明细表 + 按模型/账号分布)、请求(最近 N 条:结果、tokens、缓存、耗时、首帧、积分、账号)、模型(/v1/models + 每个模型的最近用量)、日志(网关日志或插件托管日志)、更新(当前/最新版本、检查/升级/回滚按钮、发布说明、磁盘占用)、原面板(上游 dashboard 原样内嵌,需要它自己的面板密码)。
数据是分层的,缺哪层都不挡路:
- 公开:
/health、/v1/models(Key 自动发现); - 本地:直接读
usage/usage.jsonl做聚合(请求量、tokens、积分、缓存命中、首帧、按模型/账号)——所以不填面板密码也能看到真实数字; - 面板:
POST /panel/login换X-Panel-Token后,账号池明细、请求明细、网关日志、/updates才是完整版。密码可以写在config.panelPassword,也可以在地面上那张「面板未解锁」卡片里输一次(token 存插件数据目录,权限 600)。
宿主侧接口(仅回环 + POST 必须 application/json):GET /api/workbuddy-hub/panel、POST /api/workbuddy-hub/panel/login、POST /api/workbuddy-hub/panel/logout、POST /api/workbuddy-hub/check、POST /api/workbuddy-hub/apply、POST /api/workbuddy-hub/update/rollback、GET /api/workbuddy-hub/summary。
安装
# 1) 挂进 desktop profile(幂等,可重复跑)
node scripts/install.mjs # 复制到 ~/.dsh/plugins/dsh-workbuddy-hub
node scripts/install.mjs --link # 或者用目录联接,改代码立刻生效
node scripts/install.mjs --dry-run # 只看会做什么
# 2) 重启 DSH,然后在会话里说「查一下 workbuddy 状态」
装完自检(不启动宿主、只用 mock ctx):
node scripts/selfcheck.mjs --zip <任一 release zip> # 12 项:注册/工具/更新检查/解包
node scripts/e2e-upgrade.mjs --port 8799 --root %TEMP%\\wbh-e2e --zip <release.zip>
e2e-upgrade.mjs 是隔离演练:独立端口 + 独立目录,真下载、真验签、真解包、真起进程、真查 /health,跑完自己停掉。不碰你正在跑的实例。
模型接入
插件不覆盖你既有的 provider 配置(那是模型面的事,误改会把在用的 provider 打掉)。要看当前网关能提供哪些模型、生成一段可粘贴的 YAML:
node scripts/install.mjs --print-provider
多数 DSH 安装里 profile/cordis.patch.yml 已经有这样一段:
- id: llm-pi-ai
name: "@deepseek-ai/dsh-llm-pi-ai"
config:
providers:
wb-proxy:
displayName: WB Proxy
apiKeyEnv: WB_PROXY_API_KEY
api: openai-completions
baseURL: http://127.0.0.1:8788/v1
API Key 不用手填:网关把 api_keys[].key 明文存在自己的 accounts/settings.json 里,插件按 config.apiKey → 环境变量 → settings.json 的顺序自动取(workbuddy_doctor 里能看到它用的是哪一路,但不会把 Key 打到输出里)。
工具
| 工具 | 干什么 |
|---|---|
workbuddy_status |
在线与否、版本、账号数、模型清单、更新检测结果 |
workbuddy_gateway |
start / stop / restart / discover / adopt |
workbuddy_logs |
托管进程日志尾部 |
workbuddy_models |
/v1/models 的模型 id |
workbuddy_update_check |
强制查一次(默认 24 小时节流) |
workbuddy_update_apply |
升级;必须带 confirm: true,否则只返回计划 |
workbuddy_update_rollback |
退回上一个版本 |
workbuddy_doctor |
Python / 端口 / 目录 / 进程 / Key / profile 接线自检 |
内置更新检测怎么工作
- 发现:
GET api.github.com/repos/<repo>/releases,只认vX.Y.Z稳定 tag,草稿与预发布跳过,取版本号最大的那个。403 / 限流 / JSON 坏掉时退回github.com/<repo>/releases/latest的 302 Location(那条路不吃匿名 API 的 60 次/小时配额)。 - 节流:默认 24 小时一次;启动补查延后 30 秒,且最多 6 次/小时(崩溃重启循环不会把配额刷穿)。缓存落在
<root>/update-state.json。 - 安装:选
workbuddy2api-hub-v<ver>.zip(便携包,自带 Python 3.12 运行时),用同版本的SHA256SUMS校验;解包到versions/<ver>(先.staging-<ver>,验证通过才 rename);python wb_proxy.py --help冒烟(导入全部模块);从旧目录补accounts/usage/catalog/pricing;停进程 → 切state.json指针 → 起进程 →/health校验;起不来就切回上一版本并重新拉起。 - 回滚:
workbuddy_update_rollback用previousVersion再来一遍,或手动把state.json的activeVersion改回去。
配置
bundle patch 里给了默认值(cordis.patch.yml),完整字段:
- insert:
- id: workbuddy-hub
name: 'dsh-workbuddy-hub'
config:
port: 8788 # 网关端口
host: '127.0.0.1'
lan: false # =true 时给 wb_proxy.py 加 --lan
apiKey: '' # 留空则自动从环境变量/网关 settings.json 取
python: '' # 指定解释器;留空按 便携包python/ -> .venv -> PATH 找
rootDir: '' # 默认 ~/.dsh/workbuddy-hub
installDir: '' # 已有网关目录:启动时自动接管(只读)
repo: ardeyouxipianyi/workbuddy2api-hub
autoStart: true # 插件加载时网关没跑就拉起
autoRestart: true # 守护:掉线自动拉起(10 分钟最多 3 次)
checkOnStart: true # 启动补查一次更新
checkIntervalHours: 24
startupCheckDelaySeconds: 30
migrateData: true # 升级时迁移账号数据
skipBundledPython: false # true 则不落 python/(省 29MB,用系统解释器)
keepVersions: 3 # 保留几个旧版本目录
superviseIntervalMs: 20000
数据布局
~/.dsh/workbuddy-hub/
├── state.json # 服役版本指针(activeVersion / mode / previousVersion)
├── update-state.json # 更新检测缓存(版本号、时间戳、发布页 URL,不含请求头/响应体)
├── versions/<x.y.z>/ # 各版本网关代码(便携版含 python/)
├── data/accounts/ # 托管实例的账号与 settings.json(升级不丢)
├── data/usage/
├── downloads/ # 归档缓存(校验通过后会删)
└── logs/gateway.log # 托管进程 stdout/stderr
浏览器半身
client.js 在输入框上方挂一条状态条:在线/离线、版本、账号数,发现新版显示 v1.9.2 → v2.1.2,点一下立刻查一次更新。它只读 /api/workbuddy-hub/summary(宿主侧限制回环地址可访问),不启停进程——启停和升级都在模型的显式工具调用里。
许可与来源
- 本插件:MIT。
- 网关本体:MIT,版权归 ardeyouxipianyi/workbuddy2api-hub 作者。
seed/目录是该仓库的源码快照(版本见seed/SOURCE.json),仅用于离线首装。 - 便携包内自带 Python 运行时,许可见 PSF。
No comments yet. Be the first to write one.