dsh-key-usage 0.0.0-stage → 0.1.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +210 -2
- package/client/client.js +2280 -0
- package/client/client.js.map +1 -0
- package/cordis.patch.yml +4 -0
- package/docs/images/usage-daily.png +0 -0
- package/docs/images/usage-overview.png +0 -0
- package/docs/images/usage-quota.png +0 -0
- package/lib/collect.js +237 -0
- package/lib/index.js +42 -0
- package/lib/ledger.js +163 -0
- package/lib/live-quota.js +225 -0
- package/lib/merge.js +156 -0
- package/lib/routes.js +351 -0
- package/lib/session-usage.js +235 -0
- package/lib/sessions.js +289 -0
- package/package.json +78 -4
package/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 xyl886
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
package/README.md
CHANGED
|
@@ -1,3 +1,211 @@
|
|
|
1
|
-
|
|
1
|
+
<div align="center">
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
# 使用情况 · dsh-key-usage
|
|
4
|
+
|
|
5
|
+
**DeepSeek Harness 的侧边栏用量面板** —— 按通道看 Token、缓存命中率、成本,以及余额与订阅窗口。
|
|
6
|
+
|
|
7
|
+
[](https://www.npmjs.com/package/dsh-key-usage)
|
|
8
|
+
[](./LICENSE)
|
|
9
|
+
[](#兼容与运行要求)
|
|
10
|
+
[](#兼容与运行要求)
|
|
11
|
+
[](https://github.com/topics/dsh-plugin)
|
|
12
|
+
|
|
13
|
+
[安装](#安装) · [功能](#功能) · [界面预览](#界面预览) · [权限与数据来源](#权限与数据来源) · [常见问题](#常见问题) · [开发](#开发)
|
|
14
|
+
|
|
15
|
+
</div>
|
|
16
|
+
|
|
17
|
+
---
|
|
18
|
+
|
|
19
|
+
装上之后,左侧边栏会多一项「使用情况」,点开就是整页的用量面板:**Key 清单 + 活跃热力图、使用明细、项目用量、会话用量、余额与配额**。全部数据来自你自己的机器,默认不联网。
|
|
20
|
+
|
|
21
|
+
它和同类插件的两个区别:
|
|
22
|
+
|
|
23
|
+
- **台账 × 会话事件双源合并** —— 宿主台账停更时(很常见),台账没有记录的日期会自动回退到本地会话事件折叠补齐,**按天取舍、不相加**,并在界面上标明来源;
|
|
24
|
+
- **余额与订阅窗口是真·实时** —— 直接查各通道官方接口(opencode-go 的 rolling / weekly / monthly、DeepSeek 的 `/user/balance`),查不到才回落本机快照,并把失败原因写在卡片上。
|
|
25
|
+
|
|
26
|
+
## 安装
|
|
27
|
+
|
|
28
|
+
```bash
|
|
29
|
+
dsh plugin --profile web add dsh-key-usage
|
|
30
|
+
```
|
|
31
|
+
|
|
32
|
+
装完三步:
|
|
33
|
+
|
|
34
|
+
1. **退出并重新打开 DSH** —— 插件树在宿主启动时组合,服务端代码没有热重载;
|
|
35
|
+
2. 刷新页面(客户端改动只需刷新);
|
|
36
|
+
3. 左侧边栏出现「使用情况」图标(在「上下文洞察」下方)。
|
|
37
|
+
|
|
38
|
+
> **桌面端**:`--profile desktop` 由 Electron 应用独占,CLI 会拒绝,请在应用内的 **Plugin Hub → 安装插件** 里填 `dsh-key-usage`。
|
|
39
|
+
|
|
40
|
+
<details>
|
|
41
|
+
<summary>其他安装方式</summary>
|
|
42
|
+
|
|
43
|
+
```bash
|
|
44
|
+
# 从 GitHub 装(等价,包内含构建产物,不需要本地编译)
|
|
45
|
+
dsh plugin --profile web add github:xyl886/dsh-key-usage
|
|
46
|
+
|
|
47
|
+
# 本地开发:软链到本仓库,改文件即时生效
|
|
48
|
+
dsh plugin --profile web add link:/path/to/dsh-key-usage
|
|
49
|
+
|
|
50
|
+
# 卸载
|
|
51
|
+
dsh plugin --profile web remove dsh-key-usage
|
|
52
|
+
```
|
|
53
|
+
|
|
54
|
+
</details>
|
|
55
|
+
|
|
56
|
+
### 验证安装
|
|
57
|
+
|
|
58
|
+
```bash
|
|
59
|
+
curl -s http://127.0.0.1:19387/dsh-key-usage/channels # 返回 { channels: [...] } 即已挂载
|
|
60
|
+
```
|
|
61
|
+
|
|
62
|
+
7 个端点全部只读 GET,且只接受 `127.0.0.1` / `::1` 回环请求,非回环一律 403。
|
|
63
|
+
|
|
64
|
+
## 功能
|
|
65
|
+
|
|
66
|
+
**总览**
|
|
67
|
+
|
|
68
|
+
- **Key 清单** —— 每个通道一行:类型(按量计费 / 免费额度 / 本地端点 / 订阅制)、今日与近 30 天的调用量、余额或订阅窗口占用、30 天成本;
|
|
69
|
+
- **活跃热力图** —— 近 9 个月的按日 Tokens 热力图,格子按可见区间的**活跃日三分位**分档(少 / 中 / 高),悬停看当日各模型的 Token 与占比。
|
|
70
|
+
|
|
71
|
+
**使用明细**
|
|
72
|
+
|
|
73
|
+
- **范围与筛选** —— 今日 / 周 / 月 / 总计 / 自定义,按通道筛选,全页联动;
|
|
74
|
+
- **三张统计卡** —— 调用次数、Tokens(含缓存命中率)、成本;
|
|
75
|
+
- **通道占比条** —— 一个横条看各通道占比,悬停出明细;
|
|
76
|
+
- **按天 / 按小时图表** —— 堆叠柱状图,横轴铺满所选范围;单日范围自动切成 24 小时视图;
|
|
77
|
+
- **每日细目** —— 每天一行,可展开到模型级别(调用 / 输入 / 输出 / 缓存读 / 命中率 / 成本)。
|
|
78
|
+
|
|
79
|
+
**项目用量**
|
|
80
|
+
|
|
81
|
+
- 按工作目录聚合的调用数、Tokens、占比、成本与最近活跃时间,支持搜索、按通道筛选、按列排序。
|
|
82
|
+
|
|
83
|
+
**会话用量**
|
|
84
|
+
|
|
85
|
+
- 按会话列出时间、时长、Tokens、命中率与成本,按日期分组,同样支持搜索 / 筛选 / 排序。
|
|
86
|
+
|
|
87
|
+
**余额与配额**
|
|
88
|
+
|
|
89
|
+
- 每个通道一张卡片:官方余额(DeepSeek 的总余额 / 赠送 / 充值)或订阅窗口占用(opencode-go 的 5 小时 / 本周 / 本月窗口 + 重置时间);
|
|
90
|
+
- 实时查询成功的卡片带绿色「实时」标签与查询时间;失败的写明原因(未配置 Key / 网络不可达 / 401 / 超时)并回落快照。
|
|
91
|
+
|
|
92
|
+
## 界面预览
|
|
93
|
+
|
|
94
|
+
> 演示数据,由设计稿原型渲染([`docs/prototype/`](./docs/prototype/))。
|
|
95
|
+
|
|
96
|
+
<p align="center">
|
|
97
|
+
<img src="./docs/images/usage-overview.png" alt="总览:Key 清单与活跃热力图" width="820" />
|
|
98
|
+
</p>
|
|
99
|
+
|
|
100
|
+
<p align="center">
|
|
101
|
+
<img src="./docs/images/usage-daily.png" alt="使用明细:统计卡、通道占比、按天图表与每日细目" width="820" />
|
|
102
|
+
</p>
|
|
103
|
+
|
|
104
|
+
<p align="center">
|
|
105
|
+
<img src="./docs/images/usage-quota.png" alt="余额与配额:官方余额与订阅窗口" width="820" />
|
|
106
|
+
</p>
|
|
107
|
+
|
|
108
|
+
## 权限与数据来源
|
|
109
|
+
|
|
110
|
+
| 读取对象 | 用途 | 说明 |
|
|
111
|
+
| --- | --- | --- |
|
|
112
|
+
| `$DSH_HOME/dsh-usage/usage-ledger.json` | 用量台账 | 按天 × 通道 × 模型,含官方成本 |
|
|
113
|
+
| `$DSH_HOME/dsh-usage/provider-snapshots.json` | 余额 / 窗口**回落值** | 仅在实时查询失败时使用 |
|
|
114
|
+
| `$DSH_HOME/profiles/<profile>/cordis.yml` | 通道清单 | 只做文本提取,**不执行**其中的 `!!js` 表达式;取不到时回退 `cordis.patch.yml` |
|
|
115
|
+
| 宿主 `sessionPersistence` 服务 | 项目 / 会话 / 按小时 | 只开只读句柄(`open("read") → read(0) → close`),不自行解压会话文件 |
|
|
116
|
+
| 宿主 `credentials` 服务 / 进程环境变量 | 查余额时的 API Key | 只用于拼 `Authorization` 请求头 |
|
|
117
|
+
|
|
118
|
+
**会联网的唯一路径**:打开「余额与配额」时按通道请求官方接口,结果缓存 60 秒(点「刷新」强制重查):
|
|
119
|
+
|
|
120
|
+
| 通道 | 接口 |
|
|
121
|
+
| --- | --- |
|
|
122
|
+
| `opencode-go` | `GET https://opencode.ai/zen/go/v1/usage`(rolling / weekly / monthly) |
|
|
123
|
+
| `deepseek-official` | `GET {baseURL}/user/balance` |
|
|
124
|
+
| `openrouter` / `moonshotai` / `zai` | 各自的官方余额接口 |
|
|
125
|
+
|
|
126
|
+
请求 6 秒超时、响应上限 64 KiB、只发 `Authorization` 与 `Accept` 两个头;任何失败都回落本机快照并在卡片上说明原因。
|
|
127
|
+
|
|
128
|
+
- **不读凭据文件**:从不打开 `.credentials.yaml`;密钥不落盘、不进日志、不返回给前端;界面只显示 `apiKeyEnv` 这类**变量名**。
|
|
129
|
+
- **不写文件**:不改宿主配置,不写任何数据文件。
|
|
130
|
+
- **仅回环**:所有端点只监听本机回环,非回环 403。
|
|
131
|
+
|
|
132
|
+
## 兼容与运行要求
|
|
133
|
+
|
|
134
|
+
| 项 | 要求 |
|
|
135
|
+
| --- | --- |
|
|
136
|
+
| DeepSeek Harness | 桌面端 0.2.x(客户端 slot:`sidebar.panellist` + `main`);web profile 同样支持 |
|
|
137
|
+
| Node.js | ≥ 22(宿主内置) |
|
|
138
|
+
| 运行时依赖 | 无。`react` / `react/jsx-runtime` 由宿主注入,服务端只用 Node 内置模块 |
|
|
139
|
+
| 必需服务 | 无 |
|
|
140
|
+
| 可选服务 | `sessionPersistence`(缺失时项目 / 会话 / 按小时降级为空态)、`credentials`(缺失时余额只能读快照) |
|
|
141
|
+
|
|
142
|
+
## 常见问题
|
|
143
|
+
|
|
144
|
+
<details>
|
|
145
|
+
<summary><b>「今日」列是空的 / 数据比官方少</b></summary>
|
|
146
|
+
|
|
147
|
+
数据优先取宿主用量台账;台账长期不更新时,没有记录的日期会回退到本地会话事件折叠补齐(页脚口径说明会显示当前有多少天是会话补位的)。两套来源**按天取舍、不相加**,所以不会重复计数,但会话补位的那几天没有官方成本。
|
|
148
|
+
</details>
|
|
149
|
+
|
|
150
|
+
<details>
|
|
151
|
+
<summary><b>余额卡片显示「该通道未配置 API Key」</b></summary>
|
|
152
|
+
|
|
153
|
+
需要宿主 `credentials` 能解析该通道的 `apiKeyEnv`(如 `OPENCODE_GO_API_KEY`),或该变量存在于宿主进程环境里。解析不到时插件不会去读凭据文件,而是直接回落快照。
|
|
154
|
+
</details>
|
|
155
|
+
|
|
156
|
+
<details>
|
|
157
|
+
<summary><b>热力图的颜色深浅怎么定</b></summary>
|
|
158
|
+
|
|
159
|
+
按可见区间内**活跃日的三分位**分档(p33 / p67),不是固定阈值 —— 这样低用量和高用量都能看出层次。
|
|
160
|
+
</details>
|
|
161
|
+
|
|
162
|
+
<details>
|
|
163
|
+
<summary><b>成本显示为 0 / 「无计费」</b></summary>
|
|
164
|
+
|
|
165
|
+
免费额度、本地端点没有成本概念;由会话事件补位的日期也没有官方成本。项目 / 会话 / 按小时视图统一不计成本(页脚口径里有说明)。
|
|
166
|
+
</details>
|
|
167
|
+
|
|
168
|
+
<details>
|
|
169
|
+
<summary><b>卸载后侧边栏还有图标</b></summary>
|
|
170
|
+
|
|
171
|
+
客户端资源需要刷新页面,服务端需要退出重开 DSH。桌面端的卸载同样在 Plugin Hub 里操作。
|
|
172
|
+
</details>
|
|
173
|
+
|
|
174
|
+
## 开发
|
|
175
|
+
|
|
176
|
+
```bash
|
|
177
|
+
node node_modules/tsdown/dist/run.mjs && node scripts/normalize-client-banner.mjs # 构建客户端 → client/client.js
|
|
178
|
+
node node_modules/typescript/bin/tsc -p tsconfig.server.json # 构建服务端 → lib/
|
|
179
|
+
node node_modules/typescript/bin/tsc -p tsconfig.json --noEmit # 类型检查
|
|
180
|
+
node test/ledger.test.mjs # 其余:collect / channels / session-usage / sessions / merge / live-quota / routes
|
|
181
|
+
```
|
|
182
|
+
|
|
183
|
+
**改动生效条件**(最容易踩的坑):
|
|
184
|
+
|
|
185
|
+
| 改动 | 生效方式 |
|
|
186
|
+
| --- | --- |
|
|
187
|
+
| `src/client/**` | 重新构建 → **刷新页面** |
|
|
188
|
+
| `src/server/**` | 重新编译 `lib/` → **退出重开 DSH**(无热重载) |
|
|
189
|
+
|
|
190
|
+
另外两个坑:`tsc --noEmit` **不会**更新 `lib/`,而测试读的是 `lib/*.js`;`cordis.yml` 是应用重写的组合产物,插件集变化期间会短暂变成空模板,因此通道提取会回退到 `cordis.patch.yml`。
|
|
191
|
+
|
|
192
|
+
**目录结构**
|
|
193
|
+
|
|
194
|
+
```
|
|
195
|
+
src/client/ index.tsx(slot 注册)· UsagePage / UsageIcon · KeyUsageSection(Tab 外壳)
|
|
196
|
+
tabs/(5 个页面)· components/ · styles/(CSS Module,basename 全局唯一)
|
|
197
|
+
src/server/ index.ts(cordis apply)· routes.ts(7 个只读端点)
|
|
198
|
+
ledger.ts(台账)· collect.ts(通道判定)· merge.ts(台账 × 会话按天合并)
|
|
199
|
+
live-quota.ts(官方余额实时查询 + 缓存)· sessions.ts / session-usage.ts(会话折叠)
|
|
200
|
+
lib/ client/ 构建产物(发布必须带,git 与 npm 都提交)
|
|
201
|
+
```
|
|
202
|
+
|
|
203
|
+
客户端注册的是 `sidebar.panellist`(导航项)+ `main`(主区域整页),与官方 `dsh-context`「上下文洞察」同一套写法。
|
|
204
|
+
|
|
205
|
+
**延伸文档**:[架构与数据契约](./docs/01-架构与数据契约.md) · [原型差异清单](./docs/02-原型差异与优化清单.md) · [按 Tab 重构方案](./docs/03-按Tab拆分重构方案.md) · [会话归档的影响](./docs/04-归档会话的影响与对策.md) · [AGENTS.md](./AGENTS.md)
|
|
206
|
+
|
|
207
|
+
## 许可证
|
|
208
|
+
|
|
209
|
+
[MIT](./LICENSE) © 2026 xyl886
|
|
210
|
+
|
|
211
|
+
非官方社区插件,与 DeepSeek 无隶属关系。
|