dsh-web
zhu1090093659/dsh-webDeepSeek Harness(DSH)Web 插件聚合生态包 · 一切皆插件,创意工坊分发(dsh-market.com)
API3D(api3d.cn)站点专属的 DSH 桌宠挂件:右下角鲸鱼气泡显示站点余额 / 今日已用 / 每轮消耗,装好后只需填一次 API Key。

DSH(DeepSeek Harness)Web 界面右下角的常驻桌宠挂件:鲸鱼气泡 + API3D 站点余额 + 今日已用 + 每轮对话消耗,并且泡泡内容可以完全自定义(点击序列、模块化排版、并列加权出泡、随机语句 / 随机图片)。标准 DSH bundle 插件,dsh plugin 一键安装,无需任何会话令牌。
🐋 这是 API3D(api3d.cn)站点专属版:主气泡余额取自站点账单接口(
billing/subscription的balance+ 当日billing/usage的total_usage_usd),站点地址 / 凭据名 / 币种 / 接口与字段全部内置 —— 装好后只需填一次 API Key。已移除上游的官方 DeepSeek 余额链路、多厂商模板、Codex 本机会话统计与厂商额度接口。
📦 开源仓库:https://github.com/ptb-xiaou/dsh-api3d-pet | npm:https://www.npmjs.com/package/dsh-api3d-pet | 版本
0.6.10(Release)
# 推荐:npm 已发布版
dsh plugin --profile web add dsh-api3d-pet
# 或从本目录装(源码方式:改代码即时生效,但目录不能移动/改名)
dsh plugin --profile web add link:<本目录绝对路径>
装完重启 dsh web,浏览器按 Ctrl+F5。第一次点开桌宠菜单会被引导遮罩挡住:粘一次 API Key 保存即可(站点地址与接口字段都已内置,界面不需要再配别的)。
官方桌面客户端(Electron)读的是
desktopprofile,而dsh plugin按设计拒绝改它 —— 在桌面端会话里让 DSH 自己装,见下方「安装」一节的桌面端说明。
balance 与当日 total_usage_usd(金额即人民币,不折算);还没填 key 时主气泡如实报 NO_KEY,不会去请求任何官方接口¥ 0.000075、¥ 12345.67…),所以气泡三行字号比上游小约 20%,且超宽的行会自动等比缩小(最多缩到 55%),挂件被拖大/缩小或窗口尺寸变化后会按新的宽度重算 —— 不会再顶出泡泡边界;自定义模板块里的字号仍是各模块自己的设置scope=user 取该账号全部 key 当天的合计(标签「今日已用(账号)」,与站点余额同为用户口径);站点回显 scope=key 或老站点没这个字段时退回当前这把 key 当天扣费(标签「今日已用(本 key)」)。而「API3D 记账」面板 / 记录里的**「已观测消费」是账号余额下降额按观测累计出的估算(不需要任何令牌)。余额下降按观测累计为消费,余额上升**(充值 / 赠金)单独记录、不会冲掉已有消费;检测到余额增加会提示「待核对余额调整」,可在「API3D 记账 → 你配置的来源模型 → 设置 → 余额校正」按实际累计到账金额与非调用扣减校正 —— 「已观测消费」与「余额校正」都是该来源账户口径(由该来源的余额观测得出,不含其它厂商;「本机模型费用」才是所有模型的本地估算)(逐轮明细保留 90 天或最多 2 万条、逐日归档保留 365 天,超期数据归档到 .dshw-usage-archive.json);金额按 8 位小数记账、显示保留两位¥ 0.00(不是定价出错)dshwv-usage-model 带 overflow:hidden;text-overflow:ellipsis),长模型名只能看到前半截;现在名称左对齐、按需换行显示完整文本,金额固定右对齐、不换行、等宽数字(「更多消费记录」窗口里的占比图模型名同样改为换行显示),行高对齐方式也随之调整为顶部对齐installedDay),「API3D 记账」里的标题随可用天数显示「今日使用记录 / 近 N 天使用记录」(最多 7 天),不显示安装/启用之前的空日期 · ×1.00,「API3D 记账」面板顶部(0.6.10 起)与关于面板各有一行「计费倍率」—— 数值来自站点 billing/usage 的 effective_rate_multiplier(实测 = 实扣 ÷ 标准价),用来核对「配置里的倍率」是否真的生效(倍率调成 1 时这里就显示 1.00×)。站点没回传该字段(旧版站点,或统计区间内没有用量)时界面显示 —,不会臆测成 1;金额计算完全不受它影响{cost} 引用),入口:菜单 → 「音效与提示」→ 「全局设置」→ 展开「每轮消耗提示」→「编辑提示内容」deepseek-flash → DeepSeek-V4.1-Flash,旧名标注"同 V4.1 Flash")dsh-api3d-pet 进组合包详情页 → 页头操作区(就在「卸载」左边)出现 升级到 x.y.z → 点它变「确认升级到 x.y.z / 取消」→ 点确认才真的开始;这走的是官方 plugins.detail.actions 槽位(插件自己的客户端半区 lib/client.js 注册),不是改别人的 DOM;
② 「关于 / 自检」面板里也有同一行 升级,行为完全一致。
两者都:只在有新版时出现(没新版就什么都不显示)、只在这份是 npm 装进 profile 时可用(开发目录 / link: 安装显示说明不出按钮);宿主在 profile 目录里跑 pnpm add dsh-api3d-pet@<新版>(候选顺序:应用自带 pnpm → PATH 里的 pnpm,避免 ERR_PNPM_UNEXPECTED_STORE),装完校验版本号,升级前备份 package.json / pnpm-lock.yaml,失败或版本不符自动回滚;升级记录写在 $DSH_HOME/.dshw-update.log。详见下面「一键升级」一节默认音效组 · 100%、自动关 180s · 叮~),点一行才展开该区的设置项(可同时展开多个)。每个音效都有独立音量,每行带「试听」;音效行左侧的 [✓] 决定该音效响不响(不响 = 仍可冒泡)。底栏 取消 / 恢复默认 / 保存 —— 面板内的改动只落内存,点「保存」才生效,点「取消」完整还原(「恢复默认」之后点取消同样能撤销)...,0 = 不截断)
{balance_ds},老配置里的模块照旧显示,无需重配);赠金({bonus_ds})与充值余额({recharge_ds})是单独拆出来的两个模块,取不到数时显示 —(真的为 0 才显示 0.00)v0.3.19-beta){cost});开关、自动关闭秒数、提示音量、任务结束音效与内容编辑入口都在「音效与提示 → 全局设置」面板的「每轮消耗提示」区(主菜单不再单列这一行){session} 会替换成当前对话名(读不到就显示「当前对话」,超长自动截断为 12 字符 + ...)。同一个未回答的提问只响一次(刷新页面也不会重复响)assets/minecraft-exp-orb.wav)与 A(assets/task-end-a.wav),也可选任意片段或音效组[✓] 决定「响不响」(不响 = 仍会冒泡提示)跟随按压音量 N%);一旦你拖过那个滑块,就按你设的值播(摘要只显示百分比)。这样既能"一个总音量管全局",也能单独压低某类提示音。角色 1 · 泡泡图 2、音效组 3 · 片段 4),点一行才展开明细;「导入片段」在音频那一区里;收起/展开时会顺带停掉正在试听的那一段petpet、money1 两张图,也可上传 png/gif,供图片/随机图片模块使用🧭 本副本是 API3D 站点专属版:界面上只保留 API3D 这一样东西。上游的多厂商模板(OpenRouter / Kimi / 智谱 / OpenCode Go / OpenAI 兼容中转站 等 32 个)、Codex 本机会话统计、厂商订阅额度接口(
kind:'quota')、URL/字段手填的「自定义 HTTP」等与站点无关的适配都已移除。宿主内部仍保留一条内置 DeepSeek 记账锚点(只用于把
deepseek*模型名的会话花费归到本地价目表,不查任何余额接口、不联网),但它在「API3D 记账」列表里不再显示 —— 站点专属界面里没有这一行。因此界面上没有「添加模型 / 厂商模板」这套东西了:「API3D 记账」里的入口就是一个「API3D 站点设置」,渠道固定、币种固定人民币。
用户只需要配置一样东西:API Key。 站点地址、凭据名、币种、余额 / 用量接口与字段路径全部内置在插件里(https://api3d.cn + API3D_API_KEY + CNY + billing/subscription.balance + billing/usage.total_usage_usd),界面上不再提供这些输入框 —— 少一个可改字段,就少一类「配错了导致余额读不出来」的问题。
API3D_API_KEY,固定),配置文件里不含密钥。换 key 时粘贴新的覆盖即可,「删除密钥」按钮清除GET https://api3d.cn/dashboard/billing/subscription 读 balance(兼容 hard_limit_usd);点「测试连通性」可先验证 keyGET https://api3d.cn/dashboard/billing/usage?start_date={today}&end_date={today}&scope=user 读 total_usage_usd(精确值)—— 直接是站点当天的实际扣费,不再用「余额下降额」估算;scope=user 让站点按账号全部 key 合计统计(响应回显 scope,据此把标签写成「今日已用(账号)」或退回「今日已用(本 key)」)_usd 是 OpenAI 兼容口径的遗留命名,站点 owner 已确认口径为人民币),站点给多少就显示多少input + cacheRead + output,推理 token 已含在 output 内),也可手动填写;支持「不重置 / 每日 / 每月」{balance}、{today}、{quota}、{quota_used}、{quota_left}、{quota_total}、{quota_reset}🔧 这是本副本相对上游 MeteorNOX/DeepSeek-Balance-Whale-Widget v0.4.2 的主要功能改动,并已收窄为「API3D 站点专属」:上游的主气泡余额写死官方 DeepSeek 链路(
https://api.deepseek.com/user/balance+DEEPSEEK_API_KEY+ DSH 账号登录路),自定义模型只能额外多出一行「余额·<模型名>」模块。本改动①让主气泡直接显示站点余额(并可显示站点当日已用),②把官方余额逻辑整体移除 —— 不再请求任何官方余额接口、不再读DEEPSEEK_API_KEY、内置 DeepSeek 行也不再出数。
配置(一步,全在界面里点)
/dsh-whale/balance.json 轮询,默认 60s;也可点挂件手动刷新)即显示站点余额。🆕 还没配置 key 时,打开菜单(点右下角的鲸鱼 / 汉堡)就会被一层遮罩挡住:遮罩上的卡片是"首次配置"引导 —— 标题「配置 API3D API Key」、一句「菜单里的余额、记账和提醒都要用它,粘一下 key 就能继续」、只有一行 API Key 输入框,下面一行备注说明没 key 时余额与今日已用都读不到、也不会去请求任何官方接口,最后一行是
api3d.cn的注册 / 获取入口(点开新窗口,被浏览器拦截时自动复制链接)。卡片底部只有三颗按钮:测试连通性 / 保存 / 关闭(站点地址、接口字段这些细节都不出现 —— 首次配置只需要理解「粘 key + 保存」两件事)。几条硬规则:空 key 点「保存」会被拦下(状态行提示「请先粘贴 API Key 再保存」,不发请求、卡片不关,避免"假装配好了");「测试连通性」可以直接拿输入框里还没保存的 key 探测一次(只读,只对内置站点放行、不写凭据库,通过时会连余额与分组一起报出来);点弹窗以外的区域或按Esc都会关掉卡片,但没配 key 时菜单不会因此打开 —— 再点菜单按钮还是这张卡。保存成功 →「✓ 已保存:API3D 余额会显示在右下角」→ 确认后遮罩关掉、菜单恢复可用,并立即重取一次余额(不用等下一次 60s 轮询)。
它期望的接口(就是站点自己的 OpenAI 兼容账单接口,见站点仓库 docs/BILLING_QUERY_API.md):
| 请求 | 字段 | 含义 |
|---|---|---|
GET {base}/dashboard/billing/subscription | balance(兼容 hard_limit_usd) | 当前可用余额(人民币) |
GET {base}/dashboard/billing/usage?start_date={today}&end_date={today} | total_usage_usd(精确值) | 当日实际扣费(人民币) |
用量字段用
total_usage_usd而不是美分整数total_usage:站点按美分取整,一次几分钱的调用会被取整成 0,界面就永远显示 ¥0.00(要更细的精度就用*_usd)。该字段名沿用站点文档,数值口径是人民币。
{today} 由插件按 Asia/Shanghai 取当天日期填入(YYYY-MM-DD)。鉴权用 Authorization: Bearer <key>,key 是凭证:只从 DSH 凭据服务读、且只在目的地通过白名单校验后才会被发送。地址、鉴权头与 JSON 路径都写在模板 / 集中常量里(lib/index.js 的 API_TEMPLATES.api3d),站点若换了路径或字段名,改那一处即可,界面上不需要(也不提供)手填。
站点分组(显示层)
subscription 返回的 plan.title(以及 subscription.unlimited / expires_at)显示在两处 —— 模型面板的顶部说明行、以及挂件菜单里的「关于 / 自检」;「API3D 记账」列表里不再重复显示余额 / 今日已用 / 分组(那些数字主气泡与站点设置面板已有);currency、账本分本币种统一 CNY)。行为约定(改动后的语义)
displayAsBalance 由插件自己置位,用户不用勾);ok:false + code/error),控制台另有一条 [dsh-whale] 余额读取失败 <code> … |来源 <模型> @ <原因>;payload 里另带 balanceSourceFallback: {id, name, code, error}。还没填 key时是 code:'NO_KEY',界面提示去「API3D 站点设置」填 API Key;relay-<模型id>-<币种> 这本账里;usageSource:'api')—— 站点侧余额是账号口径(同一账号多把 key 共用),用量默认也走账号口径(请求带 scope=user,站点回显 scope 后标签写「今日已用(账号)」;老站点回显 key 或没有该字段时退回标签「今日已用(本 key)」);本地账本 / 余额观测口径不会再往主气泡上盖数字(面板标题「本机模型费用(本地估算)」才是本地口径);/dsh-whale/usage-records.json 的刷新只写面板,不参与主气泡。站点 usage 这次取不到时,payload 给 todayUsage:null + todayUsageUnavailable:true,前端沿用上一次显示的数字(标签加「· 取数失败」),绝不会换成另一个口径的数字;deepseek* 的计价 / 记账锚点(matchIds,不查余额接口、不联网);-relay(菜单底部与「关于 / 自检」可见),便于和上游发布版区分。验证:不连真站点也能跑通 —— 仓库外有一份假站点 + 假宿主的端到端用例(E:\DSH\DSH-Test\test\relay-balance.mjs,覆盖取数、当日已用(账号 / 本 key 两种口径)、分组、分本、站点单条、来源报错、401、缺 key、零配置保存等路径,共 72 条断言)。
DSH 的插件管理器没有更新功能(它的文案就是「插件安装后暂不支持自动更新。若需升级,请先卸载再安装新版」),所以本插件自带一条升级路径,并且把按钮放进了插件页本身:
入口 ①(0.6.0 起,推荐):左侧栏「插件」→「已安装」→ 点 dsh-api3d-pet 进组合包详情页 → 页头操作区(紧挨着「卸载」左边)就是 升级到 x.y.z → 点它变「确认升级到 x.y.z / 取消」→ 确认后才开始。这走的是官方 plugins.detail.actions 槽位:插件自己的客户端半区 lib/client.js 用 window.__ModuleLoader__.load({ id: 'dsh-api3d-pet', factory }) 注册一个条目,只对 subject.kind === 'bundle' && subject.pkg.name === 'dsh-api3d-pet' 渲染控件(其它组合包/行/官方插件页一律 null),不碰任何别人的 DOM。
入口 ②:「关于 / 自检」→ 顶部 检查更新 之后同一行 升级。
两个入口的行为完全一致:
pnpm add dsh-api3d-pet@<新版>,装完校验 node_modules 里的版本号;重启 DSH 后生效。几条边界(写进了实现,不是"约定"):
.git)与软链(link:)安装不出按钮(显示一行说明,提示 git pull / 更新本地仓库)—— 一键升级绝不会把源码 checkout 换成 npm 包。这个判定是纯文件系统判断、在响应路径上同步完成的(0.6.5 起):首次打开插件页/关于面板就已经是正确状态,不会先给你一个点下去必然失败的按钮(0.6.4 及更早在冷启动时会「乐观放行」,点了才拿到 LINK_INSTALL / NOT_MANAGED;「用哪个 pnpm」这类需要 spawn 的信息仍走后台预热,不影响按钮状态);<应用目录>/resources/app/node_modules/pnpm,实测 v11),失败就退到 PATH 上的 pnpm —— 实测 dev-home 的 profile 是 pnpm v10 从 .pnpm-store\v10 链的,应用自带 v11 直接跑会 ERR_PNPM_UNEXPECTED_STORE,退回 v10 才能装上;可用 DSHW_PNPM_BIN 覆盖(自建环境 / 测试用,多个路径用 ; 分隔,会按顺序尝试);package.json 与 pnpm-lock.yaml:pnpm 非零退出、或装完版本对不上,都会自动回滚并在结果里回 rolledBack:true;POST /dsh-whale/update.json 要求 confirm 等于目标版本,缺了直接拒(CONFIRM_REQUIRED);目标不比当前新也会被拒(ALREADY_LATEST);DSHW_TRUSTED_HOSTS),非本机请求被拒;$DSH_HOME/.dshw-update.log 追加记录,/dsh-whale/update-log.json 返回最近 40 行(排障用)。验证:node E:\DSH\DSH-Test\test\update-route.mjs —— 假 profile + 假 pnpm 跑完整升级路径(安装方式判定、成功升级、pnpm 失败回滚、版本不符回滚、store 不匹配时自动退到下一个 pnpm 候选、五条护栏、写栅栏、软链拒绝),共 50 条断言。
dsh-api3d-pet/
├── package.json # DSH bundle 插件元数据(dsh.bundle.patch 指向 cordis.patch.yml;顶层 icon 指向 icon.png)
├── icon.png # 插件列表图标(256×256 PNG,含透明;宿主读成 data URL 塞进 meta.icon,必须是正方形)
├── README.md # 本文件
├── cordis.patch.yml # 插件挂载声明
├── lib/
│ ├── index.js # 宿主侧插件本体(路由 + 记账 + 音效/图片/角色服务)
│ ├── client.js # 客户端半区(浏览器 bundle):把「升级到 x.y.z」按钮注册进插件页的组合包详情页(官方 plugins.detail.actions 槽位)
│ └── accounting.mjs # 记账内核(定点金额运算 + 余额观测/校正账本)
├── assets/
│ ├── whale-widget.js # 前端挂件本体(由宿主按 mtime 热读取)
│ ├── DSH2.png # README 顶部展示图
│ ├── DSniang1.png # 小鲸鱼本体(cut-out,气泡由代码绘制)
│ ├── DSniang02.png # 备用整图(兼容旧版手动安装路径)
│ ├── rua.gif # 随机台词/撒娇动图(可选)
│ ├── Ya1.mp3 / Ya2.mp3 # 预置音效「小黄鸭」按压 / 松开
│ ├── D1.mp3 / D2.mp3 # 预置音效「音效1」按压 / 松开
│ ├── minecraft-exp-orb.wav # 任务结束音内置默认音效(Minecraft·经验球)
│ ├── task-end-a.wav # 任务结束音内置预设(A)
│ ├── bubble-petpet.gif # 内置泡泡图:petpet
│ └── bubble-money1.gif # 内置泡泡图:money1(余额预警默认内容的配图)
└── whale-widget-prompt.md # 完整规格/维护提示词(面向二次开发)
运行时数据(都放在 $DSH_HOME,默认 ~/.dsh;用环境变量 DSH_HOME 可以改到别处):
| 文件 / 目录 | 用途 |
|---|---|
.dshw-size.json | 挂件外观与开关(缩放、音量、音效组、峰值样式、吸附相关等) |
.dshw-usage.json | 记账账本 + 按日余额观测/校正摘要 + 用量设置(任务结束音、余额预警、今日预算、每轮消耗提示内容,以及 events:按压 / 每轮消耗 / 提问 / 授权四个事件的音效选择、独立音量、冒泡配置;每轮消耗的自动关闭秒数存在 .dshw-size.json 的 turnCostCloseMs) |
.dshw-usage.json.before-recharge-fix.bak | 旧格式账本备份(0.3.1 首次写入旧账本前自动创建;已存在则不覆盖) |
.dshw-turn.json | 每轮消耗的 seq(避免热重载后前端把新轮次当旧轮次) |
.dshw-bubble.json | 自定义泡泡配置(点击序列 + 模块库 + 点按角色推进队列开关) |
.dshw-api.json | 站点配置注册表(API3D / 凭据名 / 接口字段 / 自定义单价 / 额度与用量累计;不含密钥) |
.dshw-usage-archive.json | 账本归档(超过保留期的逐轮明细与逐日汇总;明细 90 天/2 万条、逐日 365 天) |
whale-roles/ | 自定义角色图 + roles.json 索引 |
whale-audio/ | 音频片段 <id>.wav + audio.json 索引(音效组/片段) |
whale-bubble-imgs/ | 泡泡图库图片 + bubble-imgs.json 索引 |
桌面端读的不是 web profile。 官方桌面客户端用的是 desktop profile(%USERPROFILE%\.dsh\profiles\desktop),而 dsh plugin 命令行按设计拒绝碰它:
error: profile "desktop" is managed exclusively by the Electron application
所以下面「方式 A~D」里的 --profile web 命令对桌面端不适用 —— 按它装完,插件落在 web profile 里,而桌面窗口读的是 desktop profile,一个字也读不到。表现就是「右下角什么都没有(连 ☰ 也没有)、控制台也不报错」。
桌面端的正确装法:明确使用当前宿主内置的 plugin_manager。
在桌面客户端的会话里可直接说:
请使用当前桌面端内置的
plugin_manager安装dsh-api3d-pet。先核对当前 profile 和是否已有同名插件;已有安装时先报告来源与版本。按该工具支持的操作完成后,告诉我安装结果及是否需要重启。
plugin_manager 的作用域是当前 profile(桌面端为 desktop),由宿主使用其自带的包管理器完成安装与挂载登记。需要固定版本时,将安装规格改成 dsh-api3d-pet@<目标版本>。这条说明用于减少安装前后的无关探索(#194);不需要自行构造认证 cookie、调用底层 RPC 或改写宿主管理的 profile 文件。工具不可用或操作不受支持时,先说明缺少哪项宿主能力,不绕过桌面端限制改用 --profile web。
首次安装与升级的生效方式(#162):
"application":"applied",但这不保证当前窗口已显示挂件。若装完没有出现,完全退出客户端(含系统托盘)后重新打开,再按下方两条自检排查。"restart-required" 时完全退出并重开,随后重新核对实际版本。0.1.7-rc.2,页面没有升级入口,重新“添加”带版本的同名包也可能只返回“已安装”。先检查该宿主内置工具是否支持同来源更新;若工具也不支持,保留当前安装,按宿主支持的升级方案处理。只有明确需要卸载再安装或迁移来源时,才先保留原来源、精确版本和用户数据的恢复办法;不要把卸载、删除依赖目录/锁文件当作通用更新步骤。命令行侧的 dsh web 使用自己的 web profile:更新后重启宿主,再在浏览器按 Ctrl+F5。
装完怎么自检(两条分别对应宿主半区与客户端半区):
%USERPROFILE%\.dsh\.dshw-turn.json 存在,且 seq 随对话递增;%APPDATA%\@deepseek-ai\dsh-desktop\Local Storage\leveldb 里出现 dshw-pos / dshw-last-seq —— 这两个键只有挂件前端会写。桌面端界面里看不到插件版本号时,可以看 %USERPROFILE%\.dsh\profiles\desktop\package.json 的 dsh.profile.bundles 和同目录的 pnpm-lock.yaml。
下面方式 A~D 都是 Web(
dsh web) 的安装方式。
适用于别人直接发给你一个 zip,或你手上已有一份解压好的插件目录(目录里应有 package.json、cordis.patch.yml、lib/、assets/、README.md)。
# 1) 若是 zip:先解压到一个固定、以后不会移动或删除的目录(不要放临时目录/下载目录)
# 例:D:\Plugins\dsh-api3d-pet
# 要安装的是「包含 package.json 的那一层」,不要多套一层同名目录
# 2) 确认关键文件都在(缺 assets/ 会导致没图、没声)
Test-Path "D:\Plugins\dsh-api3d-pet\package.json",
"D:\Plugins\dsh-api3d-pet\lib\index.js",
"D:\Plugins\dsh-api3d-pet\assets\whale-widget.js"
# 3) 如果之前从 GitHub / npm 装过同名插件,先卸载避免版本冲突
dsh plugin --profile web remove dsh-api3d-pet
# 4) 用绝对路径安装(路径含空格要加引号)
dsh plugin --profile web add link:D:\Plugins\dsh-api3d-pet
说明:
link: 是软链安装:源目录里的文件改了立即生效;但安装后不能移动/重命名该目录,移动了要重新 add 一次dsh plugin --profile web add file:D:\Plugins\dsh-api3d-pet(此后源目录再改不会同步,需重新 add)assets/minecraft-exp-orb.wav、assets/task-end-a.wav 等内置资源;删掉 assets 里的文件会让对应功能静默降级(无图/无声)dsh web,再 F5 刷新浏览器无需本地克隆,一条命令安装:
dsh plugin --profile web add dsh-api3d-pet
说明:
$env:http_proxy="http://<ip>:<port>"; $env:https_proxy="http://<ip>:<port>"; $env:all_proxy="socks5://<ip>:<port>"; dsh plugin --profile web add dsh-api3d-pet
dsh web,再 F5 刷新浏览器在仓库根目录(package.json 所在目录)执行:
dsh plugin --profile web add link:.
说明:
dsh plugin 会把参数转发给 pnpm,并在成功后自动把 dsh-api3d-pet 加入 dsh.profile.bundleslink:. 表示链接当前目录(仓库根目录本身就是插件包)。如果仓库在别处,用绝对路径:
dsh plugin --profile web add link:D:\你的路径\dsh-api3d-pet
link:.\dsh-api3d-pet——仓库里没有 dsh-api3d-pet/ 子目录,这样会安装成普通依赖而非插件dsh web,再 F5 刷新浏览器add link:<新路径>;若提示冲突,先 dsh plugin --profile web remove dsh-api3d-pet 再 adddsh plugin --profile web add dsh-api3d-pet
plugin_manager 提示)请帮我安装插件 dsh-api3d-pet。来源:npm 上的 dsh-api3d-pet,或者我本地已经有这个插件的「完整资源包」。
先确认运行形态:如果当前是官方桌面客户端,请使用宿主内置 plugin_manager,
不要执行下面的 Web 命令,也不要自行构造认证/RPC或修改 desktop profile。
以下步骤仅用于 dsh web:
1. 确认 DSH 安装器使用的 pnpm 可用;若提示找不到 pnpm,先报告安装器所用路径和版本,
按该 DSH 版本的安装说明处理,不直接假定需要全局安装或重装插件。
2. 在 Web profile 安装(按我实际拿到的来源任选一种):
【来源一:从 npm 安装】
dsh plugin --profile web add dsh-api3d-pet
或从本地目录链接安装:
dsh plugin --profile web add link:<仓库绝对路径>
(注意:仓库根目录就是插件包,不要写成 link:.\dsh-api3d-pet 这种带子目录的路径)
【来源二:我本地已有完整资源包(zip 或已解压目录)】
先确认「完整资源包」长什么样:一个目录,里面应当有
package.json、cordis.patch.yml、lib/index.js、
assets/(含 whale-widget.js、DSniang1.png、Ya1.mp3、minecraft-exp-orb.wav、task-end-a.wav 等)、README.md
然后按下面做:
a) 如果给我的是 zip:先解压到一个**固定、以后不会移动或删除**的目录,例如
D:\Plugins\dsh-api3d-pet
不要解压到临时目录/下载目录/会被清理的位置;也不要多套一层——
要安装的是**包含 package.json 的那一层**,不是外面那个同名压缩包目录
b) 检查文件完整性(任意一条 False 就先告诉我,不要继续装):
Test-Path "<资源包目录>\package.json"
Test-Path "<资源包目录>\lib\index.js"
Test-Path "<资源包目录>\assets\whale-widget.js"
并确认 package.json 里 name 是 dsh-api3d-pet、带 dsh.bundle.patch 字段
c) 如果之前从 GitHub / npm 装过同名插件,先卸载避免版本冲突:
dsh plugin --profile web remove dsh-api3d-pet
d) 用**绝对路径**安装(路径含空格要加引号):
dsh plugin --profile web add link:<资源包目录>
link: 是软链安装:源目录改了立即生效,但安装后不能移动/重命名该目录;
移动后必须重新执行一次 add。若想按拷贝安装可用:
dsh plugin --profile web add file:<资源包目录>
(file: 以后源目录改动不会同步,需要重新 add)
3. 如果报 pnpm 阻止构建脚本(allowBuilds 相关),先确认被阻止的是哪个包。
本插件没有安装/编译脚本;不要因此放行所有依赖的构建脚本,按具体报错处理。
4. 重启 dsh web,然后 F5 刷新浏览器
安装后验证:
- dsh --profile web --dump-config 应该能看到 dsh-api3d-pet 在 bundles 里
- curl http://127.0.0.1:3080/dsh-whale/balance.json 应返回 200 JSON(填好 key 后含 `totalBalance`;还没填 key 时为 `{"ok":false,"code":"NO_KEY",…}`,仍 200)
- curl http://127.0.0.1:3080/dsh-whale/widget.js 应返回 200 JS
- curl "http://127.0.0.1:3080/dsh-whale/audio-fragment.wav?id=exp_orb" 应返回 200 audio/wav
- curl "http://127.0.0.1:3080/dsh-whale/audio-fragment.wav?id=end_a" 也应返回 200 audio/wav
(用来确认资源包里的内置音效已随包就位;若是 404 说明 assets/ 不完整)
另外请确认已在「API3D 站点设置」里填好 **API Key**(站点地址、凭据名、币种、接口与字段全部内置,不需要其它配置)。本副本**不使用** `DEEPSEEK_API_KEY`,也不依赖 DSH 账号登录态。
余额只有一种来源:你在站点设置里配置的接口。 本副本按需求整体移除了官方 DeepSeek 余额链路 —— 不再请求 api.deepseek.com、不再读 DEEPSEEK_API_KEY、不再使用 DSH 账号登录态(deepseekAccount)。
API3D_API_KEY(不进注册表文件);「删除密钥」清除https://api3d.cn + CNY + billing/subscription.balance + billing/usage.total_usage_usd),界面上没有这些输入框displayAsBalance 由插件置位),不需要「主气泡余额来源」勾选框;地址是内置可信端点,也不需要「允许把凭据发送到自定义地址」GET https://api3d.cn/dashboard/billing/subscription 的 balance(兼容 hard_limit_usd)= 当前余额;GET https://api3d.cn/dashboard/billing/usage?start_date={today}&end_date={today} 的 total_usage_usd = 当日已用({today} 按 Asia/Shanghai 取当天)。金额即人民币,不做汇率折算。balance.json 里附 balanceSourceFallback(来源 id/名称、错误码、原始文案)。relay-<模型id>-<币种>);主气泡的今日已用只认站点 usage 接口(usageSource:'api',请求带 scope=user 取账号级合计,站点回显 scope 决定标签写「账号」还是「本 key」);站点 usage 单独失败时给 todayUsage:null + todayUsageUnavailable:true(前端沿用上一次的数字),不会改用本地账本 / 余额下降差——站点余额/账号用量与本地账本口径不同,混用会让「今日已用」来回跳。不需要
DEEPSEEK_PLATFORM_TOKEN。早期版本的"实时·令牌"模式已下线,今日已用统一由API3D 记账(余额差 + 会话事件)计算,零令牌开箱即用。
插件会把凭据交给谁、以及谁能改这件事的规则:
{base} 指向你自己填的地址),插件默认不会把凭据发过去,而是返回一条明确提示。
https://api3d.cn 已作为模板内置可信端点(trustedOrigins),因此不需要这个开关;界面也不再提供改地址 / 改接口的入口。这条规则保留在宿主代码里,供将来接入别的地址时使用。127.0.0.1 / localhost / [::1],一律 403。
DSHW_ADMIN_HOSTS=192.0.2.10:3080,myhost.lan(逗号分隔,可带端口;默认空)。https://user:pass@host/),凭据名只