Bundle
dsh-ecnu-quota
ECNU (chat.ecnu.edu.cn) quota display for the DSH web GUI: a read-only host route that proxies the ECNU quota API, plus a sidebar card and a detail panel.
- Source
- Taulee
- License
- MIT
- Updated
- Updated 8 days ago
Readme
# dsh-ecnu-quota
把 **华东师范大学 Open API(chat.ecnu.edu.cn)的额度**显示在 [DeepSeek Harness](https://github.com/deepseek-ai/deepseek-harness)(DSH)界面里:侧边栏底部一张常驻卡片,点开是额度明细面板。只读、不消耗额度、不上传任何数据。


## 能做什么
- **侧边栏底部常驻卡片**:一行周额度,给出剩余量、总量与剩余百分比;侧边栏折叠时收成一个圆环按钮,悬停显示同样信息。
- **额度明细面板**:点卡片打开,给出剩余额度、占本轮总额度的百分比、本轮已用百分比与进度条、距离重置的倒计时,以及密钥来源与刷新状态。
- **自动刷新**:每 5 分钟拉一次;窗口重新获得焦点时若数据超过 1 分钟就顺手更新。面板上的「刷新」按钮跳过缓存立即取一次。
- **异常有话说**:密钥没配、被拒绝、限流、超时、网络不通、上游异常各自一句明确提示,不会只显示一个空白卡片。
## 安装
需要 DSH 桌面版、一个终端,以及一枚 ECNU Open API 密钥(见下一节)。
1. 直接用源码安装:
```sh
dsh plugin --profile desktop add github:Taulee/dsh-ecnu-quota
```
命令会把包装进 `~/.dsh/profiles/desktop`,并把 `dsh-ecnu-quota` 登记进 profile 的 `bundles`;要装到别的 profile 就把 `--profile` 换成 `web` 或 `tui`。
2. **完全退出并重新启动 DeepSeek Harness**(改 `bundles` 必须重启,见〈注意事项〉)。
3. 侧边栏底部出现 ECNU Chat 卡片即安装成功。没出现就看〈故障排查〉。
源码与反馈:[github.com/Taulee/dsh-ecnu-quota](https://github.com/Taulee/dsh-ecnu-quota)。
## 需要什么密钥
插件读 `ECNUCHAT_API_KEY`,也就是 `ecnuchat` 模型路由用的那把 ECNU Open API 密钥。按下面的顺序找,用第一个找到的:
1. 启动 DeepSeek Harness 时的环境变量 `ECNUCHAT_API_KEY`;
2. DSH 的凭据存储(面板底部「密钥来源」会显示实际命中的是哪一层);
3. 项目目录下的 `.env`;
4. DSH 主目录下的 `.env`。
在**用量控制台**([aiconsole.ecnu.edu.cn](https://aiconsole.ecnu.edu.cn))生成密钥。面板上只会显示密钥来源和末 4 位(如 `尾号 1a2b`),完整密钥既不写入日志也不出现在任何响应里。来源那一栏原样给出命中位置(`env` 是环境变量、`file` 是凭据文件),对不上就说明找错了地方。
你没配过这把密钥的话,卡片会显示「未配置 ECNU 密钥」,配好后自动恢复。
## 界面说明
**折叠时的圆环按钮**:侧边栏收起后卡片变成一个小圆环,环上亮起的比例就是剩余额度。鼠标悬停能看到「周额度 17,193.59 / 20,000 credits (86% 剩余) · 已用 2,806.41 credits · 更新于 22:54」这样一行摘要,点它打开面板。
**侧边栏卡片**(侧边栏展开时):每个额度窗口一行,给出窗口名(如「每周额度」)、剩余 / 总量、剩余百分比和一条进度条。额度低于 20% 时进度条转为警示色,剩余量为 0 时仍会留一丝细条而不是彻底空掉。
**额度明细面板**:自上而下是
- **剩余** `17,193.59 / 20,000 credits`
- **占本轮总额度** `85.97%(17,193.59 / 20,000)`
- **本轮已用** `14.03%`,下面跟一条进度条
- **重置** · `6 天后重置`(不足一天会换成小时、分钟)
- 一行小字:`chatecnu · 密钥来源 env · 尾号 1a2b · 每 5 分钟自动刷新 · 缓存`
右上角有「用量控制台」(新标签页打开 ECNU 控制台)、「更新于 22:54」、「刷新」和关闭按钮。
侧边栏展开状态会被 DSH 记住:上次收起的话,刷新页面后看到的仍是圆环按钮,点一下侧边栏的展开按钮即可看到完整卡片。
## 配置
默认值一般不用改。需要改就在 profile 的 `cordis.patch.yml` 里给 `ecnu-quota` 那一行加 `config`,全部可省略:
```yaml
- id: ecnu-quota
config:
apiKeyEnv: ECNUCHAT_API_KEY # 凭据引用名
quotaUrl: https://chat.ecnu.edu.cn/open/api/v1/quota
consoleUrl: https://aiconsole.ecnu.edu.cn # 面板上「用量控制台」的链接
providerLabel: ECNU Chat # 卡片与面板上的显示名
route: /plugins/dsh-ecnu-quota/quota # 同源只读路由
cacheMs: 15000 # 上游结果缓存时长
timeoutMs: 15000 # 上游请求超时
```
| 配置项 | 默认值 | 说明 |
| --- | --- | --- |
| `apiKeyEnv` | `ECNUCHAT_API_KEY` | 读取哪一条凭据。必须是合法的环境变量名(字母或下划线开头)。 |
| `quotaUrl` | `https://chat.ecnu.edu.cn/open/api/v1/quota` | 额度接口地址。 |
| `consoleUrl` | `https://aiconsole.ecnu.edu.cn` | 控制台链接;上游响应里带 `ops_console_url` 时以响应为准。 |
| `providerLabel` | `ECNU Chat` | 界面上的显示名,只影响观感。 |
| `route` | `/plugins/dsh-ecnu-quota/quota` | 浏览器读取额度用的同源路由,以 `/` 开头。 |
| `cacheMs` | `15000` | 缓存时长。多开标签页时靠它避免重复请求上游。 |
| `timeoutMs` | `15000` | 单次上游请求的截止时间。 |
客户端每 5 分钟刷新一次是固定值,不受 `cacheMs` 影响。
## 注意事项
- **改 `bundles` 必须重启应用。** DSH 的包解析不允许在运行中的进程里替换插件,只热更新是无效的;一定要完全退出再启动。装好之后,`lib/` 下的改动才是刷新页面就能生效。
- **额度数据不是实时值。** 客户端 5 分钟拉一次,宿主侧另有 15 秒缓存(`cacheMs`),面板上的「缓存」字样表示这次显示的是缓存结果。要立刻取最新值就点「刷新」。
- **本插件只读。** 它只发一个带密钥的 GET 请求并展示结果,不会签到、不会领取、不会消耗任何额度。
- **只覆盖 `ECNUCHAT_API_KEY`。** `chatecnu` / `CHATECNU_API_KEY` 属于另一套凭据,不在本插件范围内。
- **ECNU 目前只有一个每周窗口。** 上游只返回一个 `fixed_168h` 窗口且资源包列表为空,所以界面按「一个窗口、无资源包」呈现;上游将来吐出多个窗口时,卡片会逐行列出。
- **密钥只在本机流转。** 请求从 DSH 宿主进程直连 ECNU 接口,浏览器只读同源路由;完整密钥不写日志、不进响应,面板上最多露出末 4 位。
- **界面语言跟随 DSH**,提供简体中文与英文两套文案。
## 故障排查
卡片或面板上出现提示时,对照下表:
| 提示 | 含义 | 怎么办 |
| --- | --- | --- |
| 未配置 ECNU 密钥 | 上面四个位置都没有找到密钥 | 配好 `ECNUCHAT_API_KEY`,点「刷新」 |
| 密钥被拒绝 | 上游返回 401 / 403 | 到控制台确认密钥仍然有效,或在 DSH 里更新它 |
| 请求过于频繁 | 上游返回 429 | 稍等几分钟再点「刷新」 |
| 请求超时 | 上游在 `timeoutMs` 内没回应 | 检查网络或代理,必要时调大 `timeoutMs` |
| 网络不可用 | 连不上上游 | 检查网络;校园网之外可能需要代理 |
| 上游服务异常 | 上游返回 5xx 或响应异常 | 多半是上游临时故障,稍后重试 |
| 响应无法解析 | 上游返回的内容不是预期格式 | 上游可能改了接口,需要等本插件跟进 |
| 读取密钥失败 | 凭据存储读取报错 | 检查 DSH 的凭据配置 |
| 该密钥暂无可用的额度窗口 | 密钥有效,但上游没给任何窗口 | 到控制台确认这个账号是否已开通额度 |
整个插件都没出现(侧边栏没有卡片、`/plugins/dsh-ecnu-quota/quota` 返回 404)——逐项确认:`~/.dsh/profiles/desktop/package.json` 的 `dependencies` 和 `bundles` 里都有 `dsh-ecnu-quota`、`~/.dsh/profiles/desktop/node_modules/dsh-ecnu-quota` 真的存在(`ls -l` 看是不是断掉的软链接)、改完是否**完全重启**过应用。缺 `bundles` 条目和断链都是常见死因:前者让 loader 根本不加载插件,后者让运行中的应用启动时加载不到宿主插件——两种情况下路由都返回 404。
## 出处与许可
界面与交互设计对齐社区插件 **[dsh-qoder-connect](https://github.com/masknull/dsh-qoder-connect)**(作者 corrinehu,MIT 许可),沿用它的卡片与面板布局、配色令牌与文案风格;本插件与 Qoder 官方无关,只是把同一套展示方式用在 ECNU 的额度接口上。
本项目按 [MIT](./LICENSE) 许可发布,第三方出处与许可见 [NOTICE.md](./NOTICE.md)。
## 免责声明
- 本插件是社区实现,与华东师范大学、Qoder、DeepSeek 官方均无关联。
- 额度接口来自 ECNU Open API,上游随时可能改动、限流或调整策略,届时本插件可能部分或全部失效,不保证兼容窗口。
- 显示结果仅供参考,请以官方用量控制台为准。
Install
dsh plugin --profile web add github:Taulee/dsh-ecnu-quota
Profile: web
With the hub plugin installed, ask your agent to install it by name — it resolves the same plan shown here.
dsh plugin --profile web add github:stvlynn/dsh.fish#path:packages/dsh-plugin-hub
install dsh-ecnu-quota from the hub
- This source has no pinned commit, so a later push upstream changes what installs. Prefer pinning a commit.