Skip to content

dsh-ecustcic-quota

Verified

dsh-ecustcic-quota · v1.3.0 · MIT · Web UI

CIC 剩余额度监控:在侧边栏底部显示 ai.ecustcic.com(ECUSTCIC / ModelGate)的账户级剩余配额,点开可看每档周期、重置时间与限速。

Install

dsh plugin add dsh-ecustcic-quota

Confirm the layer applied with dsh --profile default --dump-config — see the install guide.

Source

Published to npm without a public repository. Inspect the package contents before installing.

Tags

Readme

dsh-ecustcic-quota

在 DeepSeek Harness 侧边栏底部显示 ai.ecustcic.com(ECUSTCIC / ModelGate)账户级剩余额度,点开可看每一档周期(每小时 / 每日 / 每周 / 每月)的请求数与 Token 余量、重置时间与限速。

它长什么样

侧边栏底部一行:◔ CIC ▬▬▬▬ 83%。百分比是最紧张的那一档周期的剩余比例,条随占比变短;余量低于 25% 变琥珀色、低于 10% 变红色。侧边栏收起时退化为一个仪表图标 + 状态色圆点。

点一下弹出详情面板:

  • 大号剩余百分比 + 最紧档位与重置倒计时
  • 每档周期一组:周期名、剩余比例、进度条,以及该档所有生效限额(请求数、Token 数各一行,null 的维度不显示)
  • 账户累计用量、限速(RPM / QPS / TPM,不限 表示 rate 为 -1)
  • 上次更新时间与实际刷新间隔,右上角可手动刷新

数据按配置的间隔轮询(默认 10 分钟,对网关友好);页面隐藏时暂停,回到前台仅当数据明显过期才重取,手动刷新随时可用。

数据从哪来

网关接口:GET /api/user/quota(见 ModelGate API.md),认证用 Authorization: Bearer sk-gw-...。

关键点:请求在 Host 侧发出。原因有两条:

  1. 该接口不返回 CORS 头,浏览器页面无法跨源读取;
  2. API Key 不能下发到浏览器。

Host 半把结果通过 ctx.connection 的私有 RPC 通道(/ecustcic-quota)交给浏览器半,这条通道在 Web GUI 与桌面壳里都能用,浏览器永远看不到 Key。

安装

本插件同时发布到 npm 官方源和 CNB 制品库,两个源内容一致。装进任意 DSH 应用有两种方式。

方式一:插件市场(推荐)

  1. 打开 DSH,在侧边栏的面板列表里点「插件」(和「会话」「文件」并列的那一行)。

  2. 点「添加插件」→「安装第三方插件」。

  3. 「包名或地址」填:

    dsh-ecustcic-quota
    
  4. 「安装源」:

    • 默认安装源即可(包已发布到 npm 官方源);

    • 国内网络慢或连不上时,改选「自定义地址」,填:

      https://npm.cnb.cool/ecustcic/dsh-ecustcic-quota/-/packages/
      
  5. 点「安装」,装完按提示重启 DSH。

两点说明:

  • 两个源都公开只读,不需要登录、不需要令牌;
  • 安装界面只填包名和源地址,不要在这里填 sk-gw-... 之类的密钥——密钥由插件自动复用(见下方「配置凭据」)。

装不上时先核对包名和源地址是否和上面完全一致。若你的 DSH 版本面板列表里没有 「插件」,用下面的手动方式。

方式二:手动装进 profile

插件必须挂在 DSH profile 的 bundle 列表里。以 desktop profile 为例,编辑 ~/.dsh/profiles/desktop/package.json:

{
  "dsh": {
    "profile": {
      "bundles": ["@deepseek-ai/dsh-base", "@deepseek-ai/dsh-web-app", "dsh-ecustcic-quota"]
    }
  },
  "dependencies": {
    "dsh-ecustcic-quota": "^1.3.0"
  }
}

用 npm 官方源不需要额外配置;想走 CNB 源,在 profile 目录加一行 .npmrc:

registry=https://npm.cnb.cool/ecustcic/dsh-ecustcic-quota/-/packages/

然后在该目录执行 pnpm install,并重启 DSH(宿主半是 Node 侧代码,改完要重启,光刷新页面不够)。

如果重启后 DSH 起不来:把 dsh-ecustcic-quota 从 dsh.profile.bundles 里删掉即可恢复。

本地开发

# 1. clone 到个人插件目录
git clone https://cnb.cool/bestzyq/dsh-ecustcic-quota ~/.dsh/vendor/dsh-ecustcic-quota

# 2. 装进 profile(会自动 hardlink 到 profiles/<name>/node_modules)
dsh plugin --profile desktop add file:$HOME/.dsh/vendor/dsh-ecustcic-quota

# 3. 校验合成结果
dsh --profile desktop --dump-config | grep -A2 ecustcic

包内自带 cordis.patch.yml,作为 bundle 被引入时自动插入一行 loader entry(id: ecustcic-quota)。

凭据:直接用模型配置里的那把 Key

插件不保存也不单独配置 API Key。Host 半每次读取时都向 cordis loader 要合成后的 provider 表(bundle 层 + 你的 patch 层都已合并),按主机名 ai.ecustcic.com 找到那个 provider,用它自己声明的凭据名取 Key:

- id: llm-pi-ai
  config:
    providers:
      cic:
        apiKeyEnv: CIC_API_KEY          # ← 凭据名,叫什么都行,不限于 ECUSTCIC_API_KEY
        baseURL: https://ai.ecustcic.com/api/v1
  • 凭据名完全来自 provider:CIC_API_KEY、MY_RANDOM_KEY 都一样,插件不假设任何名字;
  • 取到后经 ctx.credentials.resolve() 现读:~/.dsh/.credentials.yaml 的 refs → 进程环境变量 → .env 回退,存的时候带不带 Bearer 前缀都行;
  • provider 若带内联 apiKey 也可直接用;同一台主机上有多个 provider 时优先选声明了凭据的那个;
  • 网关根地址取同一 baseURL 的 origin,baseURL/baseUrl 两种拼写都认;
  • 配置读取做了防御:fiber.config 与 options.config 都看(加载失败的行也暴露它的端点),loader 取不到就降级为「未发现」,绝不让插件激活失败。

所以只要 DSH 里能用指向 ai.ecustcic.com 的模型,卡片就能读配额;换 Key、换凭据名都只需改模型配置,下一次刷新即生效,不用重启。找不到时错误会列出它实际看到的 provider(如 deepseek (newapi.bestzyq.cn), cic (ai.ecustcic.com)),方便定位。

配置项(可选)

写在 cordis.patch.yml(或任意 patch 层):

配置项 默认值 说明
baseUrl https://ai.ecustcic.com 上游地址,只按主机名匹配
apiKeyEnv 空(自动发现) 凭据名覆盖。只接受 [A-Za-z_][A-Za-z0-9_]*,直接粘 sk-gw-… 会被忽略
refreshIntervalMs 600000 刷新间隔(默认 10 分钟),30000–3600000,越界自动收敛
requestTimeoutMs 15000 单次上游超时,1000–120000

浏览器侧的轮询周期跟随 refreshIntervalMs(面板底部会写实际值)。Key 本身不进浏览器:面板只在「更新于」的悬浮提示里显示来源(如 CIC_API_KEY · file)与打码片段。

结构

文件 作用
lib/index.js Host 半:从模型配置发现凭据、请求网关、15 秒缓存与并发去重、注册 /ecustcic-quota RPC 通道(state / refresh)
lib/client.js 浏览器半:sidebar.footer.action 里的 CIC 指示器 + 详情弹层
cordis.patch.yml bundle 补丁,插入 loader 行
locale/*.json 插件市场/插件列表用的标题与说明

Host 半只依赖 Node 内建模块(fetch 来自 Node 20+),不 import 任何 @deepseek-ai/* 包;浏览器半只 require 平台基线里的 react 与 react-dom。

已知取舍

  • 面板固定 296px 宽,max-height: min(100vh - 32px, 720px);周期太多时才会出现滚动条。
  • 轮询默认 10 分钟,可通过 refreshIntervalMs 调整(见上方配置项)。
  • Host 侧缓存跟随 refreshIntervalMs(上限 15 秒),手动刷新会强制穿透缓存。
  • 凭据在每次读取时重新解析,所以改模型 Key / 凭据名后下一次刷新即生效,不必重启。
  • 纯 Node 内建实现(fetch/URL),Windows / macOS / Linux 桌面端与 dsh web 通用,无平台分支。
  • 只在提供 connection + webServer 的组合(Web / 桌面)里加载;纯 headless profile 不需要这个插件。

发布渠道

渠道 地址 说明
npm 官方源 https://www.npmjs.com/package/dsh-ecustcic-quota latest
CNB 制品库 https://npm.cnb.cool/ecustcic/dsh-ecustcic-quota/-/packages/ 国内加速
源码 https://cnb.cool/bestzyq/dsh-ecustcic-quota MIT

License

MIT