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

界面增强 reimu-create/uiopt

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

实时显示余额、上下文占用与缓存命中率

28.6/100
综合分
1
GitHub 星标
—
npm 周下载
—/5
用户评分

数据截至 2026/10/5 · 周下载取自 npm 全网(含 CI / 镜像),非本站安装数;综合分由星标、活跃度与兼容性检查合成。

安装命令 · 需先装 dsh CLI 引擎
dsh plugin --profile web add reimu-create/uiopt
该包不可直接 npm 安装,改从 GitHub 源安装(明细见下方安装检查)

状态速览

判定依据:实装验证 · 静态安装检查 · 自动扫描 · 仓库维护状态
信任档位:待复验
是什么
dsh 原生插件 · market
装得上吗
曾在 dsh 0.2.0-rc.2 下真实安装成功,但当前 dsh 已更新至 0.2.1-rc.5,本站尚未在新版下复验
L4 · 真实安装等级说明 →
安全吗
本站尚未对该插件做风险分级
暂未覆盖,不等同于无风险
还在维护吗
更新放缓:最近一次提交在 50 天前
档位由哪些信号合成

本站实装验证(真实安装 L4 覆盖全站;L5 为运行时冒烟或实机截图,覆盖范围小于 L4) · 验证所用 dsh 版本 · 静态安装检查 · 风险分级 · 仓库维护状态。 下方各区块是它的证据明细。

验证判据与等级说明 →
社区实装还没有人打卡 · 装过的第一个就是你
安全扫描自动 · 静态分析源码
v2.7.0
🔵 扫描:含敏感能力尚无人工评估
展开查看扫描说明与证据 ↓

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

读写/删除本地文件发起外部网络请求
查看扫描证据(共 69 处,展示前 36 条)
  • 读取本地文件
    lib/index.js:79
    return JSON.parse(readFileSync(BALANCE_STATE_PATH, 'utf8'))
  • 写入本地文件
    lib/index.js:87
    writeFileSync(BALANCE_STATE_PATH, JSON.stringify(state, null, 2))
  • 请求外部主机api.deepseek.com
    lib/index.js:268
    const resp = await fetch('https://api.deepseek.com/user/balance', {
  • 发起网络请求
    lib/index.js:268
    const resp = await fetch('https://api.deepseek.com/user/balance', {
  • 请求外部主机opencode.ai
    lib/index.js:292
    const resp = await fetch('https://opencode.ai/zen/go/v1/usage', {
  • 发起网络请求
    lib/index.js:292
    const resp = await fetch('https://opencode.ai/zen/go/v1/usage', {
  • 读取本地文件
    lib/index.js:421
    let c = readFileSync(patchFile, 'utf8')
  • 写入本地文件
    lib/index.js:424
    writeFileSync(patchFile, c.trimEnd() + '\n' + entry)
  • 读取本地文件
    lib/index.js:437
    if (existsSync(path.join(c, 'package.json'))) { jsYaml = c; break }
  • 读取本地文件
    lib/index.js:443
    require(jsYaml).load(readFileSync(patchFile, 'utf8'))
  • 写入本地文件
    lib/index.js:452
    mkdirSync(dest, { recursive: true })
  • 读取本地文件
    lib/index.js:453
    for (const entry of readdirSync(src, { withFileTypes: true })) {
  • 写入本地文件
    lib/index.js:458
    else if (entry.isFile()) copyFileSync(s, d)
  • 读取本地文件
    lib/index.js:465
    if (!existsSync(pkgPath)) return { error: '未在插件包中找到 package.json(请确认 zip 内含插件包清单)' }
  • 写入本地文件
    lib/index.js:630
    writeFileSync(UPDATE_STATE_PATH, JSON.stringify(state, null, 2), 'utf8')
  • 请求外部主机api.github.com
    lib/index.js:653
    const resp = await fetch(`https://api.github.com/repos/${GITHUB_REPO}/commits/master`, {
  • 发起网络请求
    lib/index.js:653
    const resp = await fetch(`https://api.github.com/repos/${GITHUB_REPO}/commits/master`, {
  • 写入本地文件
    lib/index.js:991
    writeFileSync(tmpZip, Buffer.from(dataBase64, 'base64'))
  • 删除本地文件递归
    lib/index.js:1036
    try { rmSync(tmpInstall, { recursive: true, force: true }) } catch { }
  • 删除本地文件递归
    lib/index.js:1043
    try { rmSync(resolvedDest, { recursive: true, force: true }) } catch { }
  • 删除本地文件递归
    lib/index.js:1050
    try { rmSync(resolvedDest, { recursive: true, force: true }) } catch { }
  • 删除本地文件递归
    lib/index.js:1058
    try { rmSync(resolvedDest, { recursive: true, force: true }) } catch { }
  • 删除本地文件递归
    lib/index.js:1064
    try { rmSync(resolvedDest, { recursive: true, force: true }) } catch { }
  • 删除本地文件
    lib/index.js:1074
    try { rmSync(tmpZip, { force: true }) } catch { }
  • 请求外部主机codeload.github.com
    lib/index.js:1127
    const resp = await fetch(`https://codeload.github.com/${GITHUB_REPO}/tar.gz/refs/heads/master`, {
  • 发起网络请求
    lib/index.js:1127
    const resp = await fetch(`https://codeload.github.com/${GITHUB_REPO}/tar.gz/refs/heads/master`, {
  • 发起网络请求
    lib/client.js:197
    fetch("/api/dsh-context?sessionId=" + encodeURIComponent(current) + pr + md).then((r) => r.json()).then((res) => {
  • 发起网络请求
    lib/client.js:210
    fetch("/api/dsh-balance?sessionId=" + encodeURIComponent(current) + pr).then((r) => r.json()).then((res) => {
  • 发起网络请求
    lib/client.js:467
    fetch("/api/dsh-vision/ui").then((r) => r.json()).then((res) => {
  • 发起网络请求
    lib/client.js:499
    fetch("/api/dsh-vision/ui", {
  • 发起网络请求
    lib/client.js:585
    fetch("/api/dsh-update-check").then((r) => r.json()).then((res) => {
  • 发起网络请求
    lib/client.js:592
    fetch("/api/dsh-update-apply", { method: "POST" }).then((r) => r.json()).then((res) => {
  • 读取本地文件
    patch-add.cjs:7
    let c = fs.readFileSync(path, 'utf8')
  • 写入本地文件
    patch-add.cjs:10
    fs.writeFileSync(path, c.trimEnd() + '\n' + entry)
  • 读取本地文件
    patch-remove.cjs:6
    let c = fs.readFileSync(path, 'utf8')
  • 写入本地文件
    patch-remove.cjs:9
    fs.writeFileSync(path, c.replace(re, '\n').trimEnd() + '\n')
扫描于 2026/11/4(0 天前) · 范围 入口闭包 + 发布文件清单 · 来源 GitHub 仓库
涉及外部主机:api.deepseek.com、opencode.ai、api.github.com、codeload.github.com

静态扫描只反映源码中出现的调用,不构成安全背书;人工评估与自动扫描相互独立、互不覆盖。

依赖的 DSH / Cordis 模块
@deepseek-ai/dsh-credentials
给这个插件打分还没有人投票↓
用户评分
还没有人投票,来当第一个

功能亮点

  • 实时显示余额
  • 上下文占用环
  • 缓存命中率

README

由 DeepSeek 最新模型翻译生成
显示优化 DSH(DeepSeek Harness)WebUI 常驻插件:余额实时查询小窗口 + 会话/每条消息消耗 + 提供商图标。 自包含插件包,含宿主半(同源路由代理)与客户端半(手写 ModuleLoader bundle),安装后不依赖任何额外运行时。 功能 | 功能 | 位置 | 说明 | | 账户余额 | 输入框下方常驻条 | deepseek-official 走官方 GET /user/balance(CNY);opencode-go 为订阅制,显示用量限制说明 | | 本会话已用 | 同上(加粗) | 余额真实扣费减法:起点余额 − 当前余额累计,持久化在 profiles/web/balance-state.json,充值不丢已消耗 | | 每条消息消耗 | 每条 assistant 消息统计行 | · 本条 ¥x.xxxx · 缓存 xx%,宿主逐条精确计价(按消息真实 provider/model),附缓存命中率 | | 提供商图标 | 模型选择器左侧 | DeepSeek 小鲸鱼(官方 favicon 路径,自绘内联 SVG)/ OpenCode Go 大写 G;订阅共享模型目录 store,切换即时更新 |
展开完整文档(README 剩余 1 节)
显示优化

DSH(DeepSeek Harness)WebUI 常驻插件:余额实时查询小窗口 + 会话/每条消息消耗 + 提供商图标。

自包含插件包,含宿主半(同源路由代理)与客户端半(手写 ModuleLoader bundle),安装后不依赖任何额外运行时。

功能

| 功能 | 位置 | 说明 |
| 账户余额 | 输入框下方常驻条 | deepseek-official 走官方 GET /user/balance(CNY);opencode-go 为订阅制,显示用量限制说明 |
| 本会话已用 | 同上(加粗) | 余额真实扣费减法:起点余额 − 当前余额累计,持久化在 profiles/web/balance-state.json,充值不丢已消耗 |
| 每条消息消耗 | 每条 assistant 消息统计行 | · 本条 ¥x.xxxx · 缓存 xx%,宿主逐条精确计价(按消息真实 provider/model),附缓存命中率 |
| 提供商图标 | 模型选择器左侧 | DeepSeek 小鲸鱼(官方 favicon 路径,自绘内联 SVG)/ OpenCode Go 大写 G;订阅共享模型目录 store,切换即时更新 |
| 自主添加插件标签页 | 设置 → 插件 | 第三个标签页(格式与前两个"插件配置/插件清单"一致),列出用户自主安装的非官方插件;数据源:宿主 /api/dsh-plugins(loader 过滤) |
| 导入插件 | 设置 → 插件 → 额外插件页顶部 | “导入插件”按钮 → 选择 .zip 插件包 → 上传到宿主 /api/dsh-plugin-import → 解压、校验包名、复制到 <profile>/node_modules/<name>/ 并追加 cordis.patch.yml 挂载条目(幂等,已存在则跳过);安装后需重启 dsh 生效 |

文件结构

显示优化/ ├── package.json # 包声明(name: uiopt)dsh.client 注入依赖 ├── lib/ │ ├── index.js # Host 半:GET /api/dsh-balance、/api/dsh-context、/api/dsh-plugins、POST /api/dsh-plugin-import(插件导入:解压+校验+安装+挂载) │ └── client.js # Client 半:手写 ModuleLoader bundle(5 个插槽注入,含额外插件页的“导入插件”按钮) └── README.md

客户端注入的插槽

- conversation.composer.dock — 余额卡(id: balance)
- conversation.chat.assistant-actions — 每条消息消耗 + 缓存命中率(id: balance-cost)
- conversation.input.right — 提供商图标(id: provider-icon)

安装 / 更新

官方方式(推荐,dsh plugin + pnpm link)

本包声明了 dsh.bundle manifest,是标准组合包(bundle)。安装到任意 profile:

dsh plugin --profile web add <本目录绝对路径>
或分发形式(tarball / GitHub / npm):
dsh plugin --profile web add ./uiopt-1.0.0.tgz
dsh plugin --profile web add github:you/uiopt#<sha>
dsh plugin --profile web add uiopt

pnpm 会把包 link 进 profile(不是拷贝),并在 package.json 的 dsh.profile.bundles 注册组合层;包自带的 cordis.patch.yml 负责挂载 uiopt 行。改代码直接生效,无需任何同步脚本。 卸载:dsh plugin --profile web remove uiopt。

依赖 pnpm(dsh plugin 在 profile 目录内转发给 pnpm)。dsh.bundle 声明见 package.json;打包分发:pnpm pack 生成 uiopt-<ver>.tgz。

兼容方式(无 pnpm 的老环境,拷贝 + patch)

一键脚本(幂等,重复执行安全;若检测到已用官方方式安装则直接跳过):

powershell -ExecutionPolicy Bypass -File install.ps1

脚本做的事:
1. 把 lib/ 与 package.json 拷贝到 <profile>\node_modules\uiopt\;
2. 若 cordis.patch.yml 缺少挂载条目,自动追加:

- insert:
- id: uiopt
name: uiopt
config: {}

手动安装(等价):
1. 拷贝本目录到 <profile>\node_modules\uiopt\;
2. 在 <profile>\cordis.patch.yml 追加上述条目;
3. 重启 dsh(Ctrl+C → dsh web)。

默认 profile 路径为 C:\Users\86191\.dsh\profiles\web,可用 -ProfilePath 参数覆盖。

卸载

powershell -ExecutionPolicy Bypass -File uninstall.ps1

脚本删除插件目录与 cordis.patch.yml 中的挂载条目(备份 patch 为 cordis.patch.yml.bak),并提示手动删除 balance-state.json(余额差值累计状态,删掉则重新从零累计)。重启 dsh 生效。

配置与凭据

- 无需插件配置;凭据复用 dsh 凭据服务:
- DEEPSEEK_API_KEY(deepseek-official 余额)
- OPENCODE_GO_API_KEY(opencode-go 订阅)
- API Key 只在宿主进程解析与使用,浏览器只访问无凭据的同源路由 /api/dsh-balance。

计价口径(重要)

- 会话消耗(余额卡):deepseek-official 按账户余额真实扣费(减法);opencode-go 没有余额接口,退化为按量估算(USD)。
- 每条消息消耗:按量估算(usage × 单价表),DeepSeek 官方峰谷价(CNY,北京时间 9-12 / 14-18 翻倍)与 OpenCode Go 网关价(USD,内置 16 模型)。所以「每条之和」与「本会话已用」是两个口径,不相等属正常。
- 缓存命中率:cacheReadTokens / (input + cacheRead + cacheWrite)。
- 单价表随官方价格变动需人工更新(PRICING 常量,host 与 client 各一份,需同步修改)。

已知限制

1. OpenCode Go 为订阅制,官方无公开余额接口,只能显示限制说明与控制台指引;
2. 余额减法反映账户整体扣费:其他会话/窗口共用同一 API Key 的消耗也会计入;
3. 动态注册/注销模型工具(如调试插件)会使 DeepSeek 前缀缓存整段失效,造成单次全量计费——与插件本身无关;
4. 客户端 bundle 为手写 window.__ModuleLoader__.load(...) 格式,修改时保持该结构。

开发注意事项(踩坑记录,改代码前必读)

1. 保存 JSON/JS 文件必须用 UTF-8 无 BOM:带 BOM 的 package.json 会让 dsh 的 JSON.parse 直接崩溃(插件树加载失败 → 服务异常/页面白屏)。PowerShell 的 Set-Content -Encoding UTF8 在 PS 5.1 下会写 BOM——如需用 PowerShell 写文件,改用 [System.IO.File]::WriteAllText($p, $c, (New-Object System.Text.UTF8Encoding($false))),或用 Node 脚本。
2. slot 冲突检测用 priority 字段,不是 order:order 只控制渲染顺序;同 id 注册覆盖官方条目时,官方 priority 为 0,覆盖方必须用 priority: -1,否则同 id 同 priority 冲突导致插件加载失败。当前 configurable 与 all 两个替换注册已带 priority: -1。
3. 子 slot 只能声明一次:插件注册时不要用 children 重复声明官方已声明的子 slot(如 settings.plugin.item),否则 "already declared" 冲突。替换官方标签页时,子 slot 由官方声明,插件只注册条目、不写 children。
4. 本目录(D:\dsh-plugins\uiopt\)是唯一源码;已用官方方式安装(dsh plugin add,pnpm link),改代码直接生效,无需任何同步脚本。若退回兼容方式(install.ps1 拷贝),才需要「改完工作区文件后跑 install.ps1、不要直接改 profile 文件」。
5. link 安装模式的三条约定(本机 dsh plugin add <本目录> 才会遇到;别人用 tgz/GitHub 安装由 pnpm 自动装依赖,不受影响):
- lib/client.js 里 window.__ModuleLoader__.load({ id: ... }) 的 id 必须等于插件名 uiopt,否则报 "Failed to load plugins"(模块注册不上)。
- 依赖用 npm install 装成实体目录(本项目 node_modules 已装好,@deepseek-ai/dsh-credentials 等 6 个包)。绝不要再建 junction——发生过事故:junction 指向 dsh 主包依赖,Remove-Item -Recurse 删除含 junction 的目录时跟随链接删掉了主包的 dsh-credentials,导致官方插件链断裂、服务起不来。
- 项目路径不要带空格:pnpm 会把 D:\dsh plugins\uiopt 按空格拆成两个错误依赖(link:D:/dsh + plugins\uiopt)。路径必须是 D:\dsh-plugins\uiopt 这种无空格形式。
- 卸载/清理一律用官方命令 dsh plugin --profile web remove uiopt;手工删目录时,junction 用 cmd /c rmdir <链接>(只删链接),普通目录才用 Remove-Item -Recurse。

版本历史

- 1.0.0 初始版:余额卡(多 provider)、会话消耗(余额减法)、每消息消耗+缓存命中率、提供商图标(官方鲸鱼路径)、README/安装脚本。
- 1.1.0 新增“导入插件”:设置 → 插件 → 额外插件页顶部的“导入插件”按钮,选择 .zip 插件包上传到宿主 POST /api/dsh-plugin-import,解压、严格校验包名、复制到 <profile>/node_modules/<name>/ 并追加挂载条目(幂等),安装后需重启 dsh 生效。
预览分享卡片长什么样 ↓reimu-create/uiopt
分享 · DeepSeek Harness Hub
reimu-create/uiopt

实时显示余额、上下文占用与缓存命中率

这是你的仓库?认领条目

回到顶部