🎁 福利专区全网大模型免费应用 + 新用户福利 + 注册活动入口,低成本玩转 AI

账号池模型网关 Wei894348/dsh-wb2api

DeepSeek Harness
Wei89434811 天前有提交已提供中文文档扫描:含敏感能力

这是一个 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
装得上吗
静态安装检查有提示项,装前建议看一眼 README
L4 · 真实安装等级说明 →
安全吗
本站尚未对该插件做风险分级
暂未覆盖,不等同于无风险
还在维护吗
活跃:最近一次提交在 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
🔵 扫描:含敏感能力尚无人工评估
展开查看扫描说明与证据 ↓

静态扫描发现插件具备触达本地系统的能力:执行外部命令、读写/删除本地文件、读取剪贴板或密钥类环境变量(至少其一)。这是能力清单,不是危险判定——具体能力项与证据见下方,安装前请自行判断是否需要。

可执行外部命令读写/删除本地文件发起外部网络请求
查看扫描证据(共 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。
预览分享卡片长什么样 ↓Wei894348/dsh-wb2api
分享 · DeepSeek Harness Hub
Wei894348/dsh-wb2api

这是一个 DeepSeek Harnessdsh插件:把本机 WorkBuddy / CodeBuddy…

回到顶部