这是一个 DeepSeek Harnessdsh插件:把本机 WorkBuddy / CodeBuddy…
30.5/100
综合分
1
GitHub 星标
—
npm 周下载
—/5
用户评分
数据截至 2026/10/24 · 周下载取自 npm 全网(含 CI / 镜像),非本站安装数;综合分由星标、活跃度与兼容性检查合成。
自动兼容检查有告警:未发布到 npm registry,仅可从源码安装。
安装命令 · 需先装 dsh CLI 引擎
dsh plugin --profile web add Wei894348/dsh-wb2api该包不可直接 npm 安装,改从 GitHub 源安装(明细见下方安装检查)
状态速览
判定依据:实装验证 · 静态安装检查 · 自动扫描 · 仓库维护状态信任档位:仅索引
是什么
dsh 原生插件 · model
安全吗
本站尚未对该插件做风险分级
暂未覆盖,不等同于无风险
还在维护吗
活跃:最近一次提交在 11 天前
档位由哪些信号合成
本站实装验证(真实安装 L4 覆盖全站;L5 为运行时冒烟或实机截图,覆盖范围小于 L4) · 验证所用 dsh 版本 · 静态安装检查 · 风险分级 · 仓库维护状态。 下方各区块是它的证据明细。
社区实装还没有人打卡 · 装过的第一个就是你
安装兼容性检查⚠ 装前注意未发布到 npm registry,仅可从源码安装
展开查看检查明细 ↓
以下结论由程序自动检查 npm 包、engines 声明与入口文件得出,未做人工实机验证——能装不等于用着没问题。
✗npm 包dsh-plugin-wb2api-ui(未发布到 npm,仅可源码安装)
✓Node 引擎要求 >=22 · 基线 Node 22.19 满足
✓dsh CLI 依赖未声明 dsh 版本约束
✓入口文件main/exports/bin 已声明
验证方式:npm registry 存在性 + package.json 静态校验 · 最后检查 2026/10/10 21:29:55
安全扫描自动 · 静态分析源码v2.7.0🔵 扫描:含敏感能力尚无人工评估展开查看扫描说明与证据 ↓
安全扫描自动 · 静态分析源码
v2.7.0静态扫描发现插件具备触达本地系统的能力:执行外部命令、读写/删除本地文件、读取剪贴板或密钥类环境变量(至少其一)。这是能力清单,不是危险判定——具体能力项与证据见下方,安装前请自行判断是否需要。
可执行外部命令读写/删除本地文件发起外部网络请求
查看扫描证据(共 133 处,展示前 92 条)
- 读取本地文件lib/index.js:59
try { if (existsSync(candidate)) return candidate } catch { } - 读取本地文件lib/index.js:97
if (existsSync(bundled)) return bundled - 写入本地文件lib/index.js:119
mkdirSync(dir, { recursive: true }) - 写入本地文件lib/index.js:120
appendFileSync(join(dir, 'gw-debug.log'), `${new Date().toISOString()} ${message}\n`, 'utf8') - 读取本地文件lib/index.js:175
if (!existsSync(file)) return {} - 读取本地文件lib/index.js:177
const parsed = JSON.parse(readFileSync(file, 'utf8')) - 读取本地文件lib/index.js:213
if (!existsSync(dir)) mkdirSync(dir, { recursive: true }) - 写入本地文件lib/index.js:213
if (!existsSync(dir)) mkdirSync(dir, { recursive: true }) - 读取本地文件lib/index.js:237
if (!existsSync(dir)) return [] - 写入本地文件lib/index.js:370
writeFileSync(temp, `${JSON.stringify(document, null, 1)}\n`, { mode: 0o600 }) - 写入本地文件lib/index.js:371
renameSync(temp, file) - 写入本地文件lib/index.js:393
renameSync(file, target) - 发起网络请求lib/index.js:420
const response = await fetch(`${base}/admin/accounts/${encodeURIComponent(uid)}/${action}`, { - 发起网络请求lib/index.js:536
response = await fetch(url, { - 发起网络请求lib/index.js:618
const response = await fetch(`${base}/healthz`, { signal: AbortSignal.timeout(3000) }) - 发起网络请求lib/index.js:668
const response = await fetch(`${base}/status`, { - 发起网络请求lib/index.js:807
response = await fetch(url, { - 发起网络请求lib/index.js:879
const response = await fetch(`${host}/console/as/conversations/`, { - 删除本地文件lib/index.js:2318
rmSync(resolveAuthFile(body?.file), { force: true }) - 发起网络请求client/client.js:77
var response = await fetch(url, { headers: { accept: 'application/json' }, credentials: 'same-origin' }); - 发起网络请求client/client.js:86
var response = await fetch(url, { - 发起网络请求client/client.js:655
const response = await fetch('/dsh-wb2api/state', { headers: { accept: 'application/json' } }); - 发起网络请求client/client.js:685
const response = await fetch('/dsh-wb2api/restart', { - 发起网络请求client/client.js:706
const response = await fetch('/dsh-wb2api/tasks/status', { headers: { accept: 'application/json' } }); - 发起网络请求client/client.js:723
const response = await fetch('/dsh-wb2api/tasks/run', { - 写入本地文件lib/gw/index.js:43
mkdirSync(dir, { recursive: true }) - 写入本地文件lib/gw/index.js:48
appendFileSync(file, `${new Date().toISOString()} [gw] ${message}\n`, 'utf8') - 写入本地文件lib/gw/index.js:362
for (const step of accountStore.applySelection(selection.uids)) renameSync(step.from, step.to) - 发起网络请求lib/gw/index.js:431
const response = await fetch(`${gatewayOrigin(config.baseURL)}/status`, { - 读取本地文件engine/wb_up/store.mjs:37
if (!existsSync(AUTH_DIR)) return []; - 读取本地文件engine/wb_up/store.mjs:39
for (const name of readdirSync(AUTH_DIR)) { - 读取本地文件engine/wb_up/store.mjs:46
const auth = toAuth(JSON.parse(readFileSync(file, 'utf8')), file); - 写入本地文件engine/wb_up/store.mjs:73
writeFileSync(tmp, `${JSON.stringify(doc, null, 1)}\n`, { mode: 0o600 }); - 写入本地文件engine/wb_up/store.mjs:74
renameSync(tmp, file); - 读取本地文件engine/wb_up/run.mjs:32
const raw = JSON.parse(readFileSync(LOCK_FILE, 'utf8')); - 写入本地文件engine/wb_up/run.mjs:43
mkdirSync(dirname(LOCK_FILE), { recursive: true }); - 写入本地文件engine/wb_up/run.mjs:44
writeFileSync(LOCK_FILE, JSON.stringify({ at: Date.now(), pid: process.pid, what }), 'utf8'); - 删除本地文件engine/wb_up/run.mjs:49
try { rmSync(LOCK_FILE, { force: true }); } catch { } - 读取本地文件lib/gw/runtime.js:49
if (existsSync(join(runtime, 'config.json'))) return runtime - 读取本地文件lib/gw/runtime.js:70
const text = readFileSync(join(base, 'config.json'), 'utf8') - 写入本地文件lib/gw/runtime.js:95
mkdirSync(join(root, 'auths'), { recursive: true }) - 写入本地文件lib/gw/runtime.js:96
mkdirSync(join(root, 'data'), { recursive: true }) - 读取本地文件lib/gw/runtime.js:114
if (existsSync(target)) return { path: target, created: false } - 写入本地文件lib/gw/runtime.js:122
writeFileSync(target, JSON.stringify(payload, null, 2) + '\n', 'utf8') - 写入本地文件lib/gw/proc.js:27
mkdirSync(dir, { recursive: true }) - 写入本地文件lib/gw/proc.js:28
appendFileSync(join(dir, 'gw-debug.log'), `${new Date().toISOString()} ${message}\n`, 'utf8') - 读取本地文件lib/gw/proc.js:103
if (!existsSync(explicit)) throw new Error(`指定的网关程序不存在:${explicit}`) - 写入本地文件lib/gw/proc.js:135
mkdirSync(installDir, { recursive: true }) - 写入本地文件lib/gw/proc.js:143
try { renameSync(installed, `${target}.old`) } catch { } - 写入本地文件lib/gw/proc.js:146
copyFileSync(bundled, target) - 删除本地文件lib/gw/proc.js:147
try { unlinkSync(`${target}.old`) } catch { } - 读取本地文件lib/gw/proc.js:152
if (installed && !existsSync(installed)) { - 写入本地文件lib/gw/proc.js:153
try { renameSync(`${target}.old`, installed) } catch { } - 读取本地文件lib/gw/proc.js:162
const buf = readFileSync(p) - 读取本地文件lib/gw/proc.js:177
if (existsSync(candidate)) return candidate - 发起网络请求lib/gw/proc.js:202
const response = await fetch(`${this.origin}/healthz`, { signal: AbortSignal.timeout(3000) }) - 读取本地文件lib/gw/proc.js:337
const raw = readFileSync(join(defaultRuntimeDir(), 'sidecars.json'), 'utf8') - 读取本地文件lib/gw/proc.js:369
const command = existsSync(sc.command) ? sc.command : 'python' - 读取本地文件lib/gw/catalog.js:466
const parsed = JSON.parse(readFileSync(this.snapshotPath, 'utf8')) - 写入本地文件lib/gw/catalog.js:477
mkdirSync(dirname(this.snapshotPath), { recursive: true }) - 写入本地文件lib/gw/catalog.js:479
writeFileSync(tmp, JSON.stringify({ at: Date.now(), models }), 'utf8') - 写入本地文件lib/gw/catalog.js:480
renameSync(tmp, this.snapshotPath) - 写入本地文件lib/gw/authorize.js:259
await fs.mkdir(root, { recursive: true, mode: 0o700 }); - 写入本地文件lib/gw/authorize.js:261
await fs.writeFile(partial, JSON.stringify(doc, null, 1), { - 写入本地文件lib/gw/authorize.js:266
await fs.chmod(partial, 0o600); - 写入本地文件lib/gw/authorize.js:267
await fs.rename(partial, target); - 写入本地文件lib/gw/authorize.js:268
await fs.chmod(target, 0o600); - 删除本地文件lib/gw/authorize.js:271
await fs.unlink(partial).catch(() => undefined); - 读取本地文件lib/gw/binary.js:109
if (existsSync(p)) return p - 写入本地文件lib/gw/binary.js:208
mkdirSync(dirname(target), { recursive: true }) - 写入本地文件lib/gw/binary.js:211
writeFileSync(part, data) - 写入本地文件lib/gw/binary.js:212
if (platform() !== 'win32') chmodSync(part, 0o755) - 写入本地文件lib/gw/binary.js:213
renameSync(part, target) - 删除本地文件lib/gw/binary.js:215
try { unlinkSync(part) } catch { } - 发起网络请求engine/wb_up/events.mjs:343
const res = await fetch(`${baseOf(auth, 'chat')}/v2/chat/completions`, { - 发起网络请求engine/wb_up/events.mjs:369
const res = await fetch(`${baseOf(auth, 'chat')}/v2/chat/completions`, { - 发起网络请求engine/wb_up/core.mjs:170
const res = await fetch(url, { - 发起网络请求client/wbcompat-shim.js:69
var response = await fetch(url, { headers: { accept: 'application/json' }, credentials: 'same-origin' }); - 发起网络请求client/wbcompat-shim.js:78
var response = await fetch(url, { - 发起网络请求client/wbcompat-shim.js:647
const response = await fetch('/dsh-wb2api/state', { headers: { accept: 'application/json' } }); - 发起网络请求client/wbcompat-shim.js:677
const response = await fetch('/dsh-wb2api/restart', { - 发起网络请求client/wbcompat-shim.js:698
const response = await fetch('/dsh-wb2api/tasks/status', { headers: { accept: 'application/json' } }); - 发起网络请求client/wbcompat-shim.js:715
const response = await fetch('/dsh-wb2api/tasks/run', { - 读取本地文件lib/desktop-import.js:73
].filter((path) => path !== '' && existsSync(path)) - 读取本地文件lib/desktop-import.js:83
if (existsSync(dir)) dirs.push(dir) - 读取本地文件lib/desktop-import.js:96
if (existsSync(cacheFile)) { - 读取本地文件lib/desktop-import.js:98
const cached = readFileSync(cacheFile, 'utf8').trim() - 执行外部命令来自配置/变量lib/desktop-import.js:107
const out = execFileSync(exe, ['-e', script], { - 写入本地文件lib/desktop-import.js:116
mkdirSync(dirname(cacheFile), { recursive: true }) - 写入本地文件lib/desktop-import.js:117
writeFileSync(cacheFile, out, 'utf8') - 读取本地文件lib/desktop-import.js:137
for (const name of readdirSync(dir)) { - 读取本地文件lib/desktop-import.js:141
document = deepDecrypt(JSON.parse(readFileSync(join(dir, name), 'utf8')), key)
扫描于 2026/10/31(1 天前) · 范围 入口闭包 + 发布文件清单 · 来源 GitHub 仓库
静态扫描只反映源码中出现的调用,不构成安全背书;人工评估与自动扫描相互独立、互不覆盖。
依赖的 DSH / Cordis 模块
@deepseek-ai/cordis@deepseek-ai/dsh-commands@deepseek-ai/dsh-llm@deepseek-ai/dsh-subprocess@deepseek-ai/schemastery给这个插件打分还没有人投票↓
用户评分
还没有人投票,来当第一个
功能亮点
- 注册账号池为模型服务商
- OpenAI兼容接口
- 网页设置面板
自托管网关插件,给 DeepSeek Harness 把本地 WorkBuddy / CodeBuddy 账号池注册成 OpenAI 兼容的模型服务商,带网页设置面板和任务自动化引擎。
README
由 DeepSeek 最新模型翻译生成dsh-plugin-wb2api-ui
这是一个 DeepSeek Harness(dsh)插件:把本机 WorkBuddy / CodeBuddy 账号池变成一个本地模型网关,并注册为 dsh 的 LLM provider —— 装好后直接在 dsh 里选模型使用,附带一个设置面板管理账号与积分。
安装
任选其一。装完必须重启 dsh(宿主半侧只在启动时加载插件)。本插件未上架插件市场,直接用下面两种方式安装。
方式一:桌面端 UI
桌面端设置 → 插件 → 添加插件,输入:
https://github.com/Wei894348/dsh-wb2api
也可以填本地目录绝对路径或 npm pack 出来的 .tgz 压缩包路径。这是 desktop profile 唯一的安装方式(命令行碰不了桌面端)。
方式二:命令行
dsh plugin --profile web add github:Wei894348/dsh-wb2api
卸载
- 桌面端:设置 → 插件 → 找到本插件 → 卸载
- 命令行:dsh plugin --profile web remove dsh-plugin-wb2api-ui
卸完重启 dsh。运行目录 %USERPROFILE%\.dsh\wb2api\(账号池与配置)不随卸载删除,要彻底清掉需手动删这一层。
许可
MIT,见 LICENSE。
预览分享卡片长什么样 ↓
分享 · DeepSeek Harness Hub
Wei894348/dsh-wb2api
这是一个 DeepSeek Harnessdsh插件:把本机 WorkBuddy / CodeBuddy…
相关插件 · 模型接入
API 中继安全审计toby-bridges/api-relay-audit
面向 AI API 中转与 LLM 代理的本地安全审计。
★ 897已汉化DSH
69.4
免费搜索插件DDDMUC/dsh-free-search
DeepSeek Harness 免费搜索插件 —— 无需 API key,零成本,多引擎可切换。 一个给…
★ 761已汉化DSH
68.7
免费联网搜索liustack/modsearch
在官方 App 里模型能联网,切到 API 就不能了。ModSearch 把联网补回来:网页搜索、X…
★ 863已汉化DSH
68.5
OpenCode 免费模型FishBottle7/opencode2dsh
在 DSHDeepSeek Harness里原生使用 OpenCode Zen 的免费匿名模型。
★ 379已汉化DSH
67.8
AI 模型网关tingly-dev/tingly-box
Tingly Box Web UI 演示
★ 373已汉化DSH
67.4
WorkBuddy 账号池XDTrees/dsh-xdpool
把你能白嫖的模型额度接进 DSH 同一个池:WorkBuddy 多账号自动容错、十三家扫码登录、76…
★ 359已汉化DSH
67.1