minimax-status 1.1.14 → 1.2.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/README.md +46 -45
- package/cli/api.js +18 -14
- package/cli/index.js +34 -33
- package/cli/model-context-sizes.js +52 -0
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -11,9 +11,8 @@ MiniMax Token-Plan 使用状态监控工具,支持 CLI 命令和 Claude Code
|
|
|
11
11
|
|
|
12
12
|
| 插件 | 版本 | 安装方式 |
|
|
13
13
|
|------|------|----------|
|
|
14
|
-
| **CLI** | 1.
|
|
15
|
-
| **VSCode** | 1.2
|
|
16
|
-
| **OpenClaw** | - | 参考 `openclaw/minimax-usage/` 目录 |
|
|
14
|
+
| **CLI** | 1.2.0 | `npm install -g minimax-status` |
|
|
15
|
+
| **VSCode** | 1.3.2 | [VSCode Marketplace](https://marketplace.visualstudio.com/items?itemName=JochenYang.minimax-status-vscode) 或 [下载 VSIX](https://github.com/JochenYang/minimax-status/releases) |
|
|
17
16
|
|
|
18
17
|
## 特性
|
|
19
18
|
|
|
@@ -134,14 +133,14 @@ npm run package
|
|
|
134
133
|
集成成功后,底部状态栏将显示:
|
|
135
134
|
|
|
136
135
|
```
|
|
137
|
-
|
|
136
|
+
cli ❯ main * ❯ MiniMax-M* ❯ 205K ❯ 0% (4500/4500) · W ∞ ❯ 4h59m ❯ 剩336天
|
|
138
137
|
```
|
|
139
138
|
|
|
140
|
-
显示格式:`目录
|
|
139
|
+
显示格式:`目录 ❯ 分支 ❯ 模型 ❯ 上下文 ❯ 百分比(已用/总量) · 周限额 ❯ 倒计时 ❯ 到期天数`
|
|
141
140
|
|
|
142
141
|
**颜色说明**:
|
|
143
142
|
|
|
144
|
-
-
|
|
143
|
+
- **使用量**: ≥85%红色 | 60-85%黄色 | <60%绿色
|
|
145
144
|
- **到期时间**: ≤3天红色 | ≤7天黄色 | >7天绿色
|
|
146
145
|
|
|
147
146
|
### Git 分支显示说明
|
|
@@ -219,18 +218,10 @@ my-app │ main * │ ...
|
|
|
219
218
|
集成成功后,底部状态栏将显示:
|
|
220
219
|
|
|
221
220
|
```
|
|
222
|
-
|
|
221
|
+
cli ❯ main * ❯ MiniMax-M* ❯ 205K ❯ 0% (4500/4500) · W ∞ ❯ 4h59m ❯ 剩336天
|
|
223
222
|
```
|
|
224
223
|
|
|
225
|
-
显示格式:`目录
|
|
226
|
-
|
|
227
|
-
### 进度条风格
|
|
228
|
-
|
|
229
|
-
使用 `█` 和 `░` 字符显示进度条:
|
|
230
|
-
|
|
231
|
-
- `█░░░░░░░░` - 10% 使用量
|
|
232
|
-
- `█████░░░░` - 50% 使用量
|
|
233
|
-
- `██████████` - 100% 使用量
|
|
224
|
+
显示格式:`目录 ❯ 分支 ❯ 模型 ❯ 上下文 ❯ 百分比(已用/总量) · 周限额 ❯ 倒计时 ❯ 到期天数`
|
|
234
225
|
|
|
235
226
|
**颜色说明**:
|
|
236
227
|
|
|
@@ -242,30 +233,38 @@ minimax-status │ main * │ Usage █░░░░░░░░ 10% (4047/4500)
|
|
|
242
233
|
### 详细模式
|
|
243
234
|
|
|
244
235
|
```
|
|
245
|
-
|
|
236
|
+
┌──────────────────────────────────────────────────────┐
|
|
246
237
|
│ MiniMax Claude Code 使用状态 │
|
|
247
|
-
│
|
|
248
|
-
│ 当前模型: MiniMax-
|
|
249
|
-
│ 时间窗口:
|
|
250
|
-
│ 剩余时间:
|
|
251
|
-
│
|
|
252
|
-
│ 已用额度:
|
|
253
|
-
│ 剩余:
|
|
254
|
-
│
|
|
255
|
-
│
|
|
256
|
-
│
|
|
257
|
-
│
|
|
258
|
-
│
|
|
259
|
-
│
|
|
260
|
-
│
|
|
238
|
+
│ │
|
|
239
|
+
│ 当前模型: MiniMax-M* │
|
|
240
|
+
│ 时间窗口: 05:00-10:00(UTC+8) │
|
|
241
|
+
│ 剩余时间: 6 分钟后重置 │
|
|
242
|
+
│ │
|
|
243
|
+
│ 已用额度: █░░░░░░░░░░░░░░░░░░░░░░░░░░ 7% │
|
|
244
|
+
│ 剩余: 4172/4500 次调用 │
|
|
245
|
+
│ │
|
|
246
|
+
│ 周限额: 不受限制 │
|
|
247
|
+
│ 套餐到期: 03/19/2027 (还剩 336 天) │
|
|
248
|
+
│ │
|
|
249
|
+
│ 📊 Token 消耗统计 │
|
|
250
|
+
│ 昨日消耗: 5380.6万 │
|
|
251
|
+
│ 近7天消耗: 4.8亿 │
|
|
252
|
+
│ 当月消耗: 15亿 │
|
|
253
|
+
│ │
|
|
254
|
+
│ 📋 所有模型额度 │
|
|
255
|
+
│ MiniMax-M* 7% 328/4500 ✓ │
|
|
256
|
+
│ speech-hd 0% 0/19000 ✓ │
|
|
257
|
+
│ Hailuo 0% 0/3 ✓ │
|
|
258
|
+
│ ... │
|
|
259
|
+
│ │
|
|
261
260
|
│ 状态: ✓ 正常使用 │
|
|
262
|
-
|
|
261
|
+
└──────────────────────────────────────────────────────┘
|
|
263
262
|
```
|
|
264
263
|
|
|
265
264
|
### 紧凑模式
|
|
266
265
|
|
|
267
266
|
```
|
|
268
|
-
● MiniMax-
|
|
267
|
+
● MiniMax-M* 0% (4498/4500) • 4 小时 59 分钟后重置 • ✓ 正常使用 • 剩余: 336天
|
|
269
268
|
```
|
|
270
269
|
|
|
271
270
|
### 持续状态栏模式
|
|
@@ -277,6 +276,16 @@ minimax-status │ main * │ Usage █░░░░░░░░ 10% (4047/4500)
|
|
|
277
276
|
[● MiniMax-M2 27% • 3307/4500 • 1h26m ⚡
|
|
278
277
|
```
|
|
279
278
|
|
|
279
|
+
## 截图演示
|
|
280
|
+
|
|
281
|
+
### Claude Code 集成
|
|
282
|
+
|
|
283
|
+

|
|
284
|
+
|
|
285
|
+
### Droid 集成
|
|
286
|
+
|
|
287
|
+

|
|
288
|
+
|
|
280
289
|
## 命令说明
|
|
281
290
|
|
|
282
291
|
| 命令 | 描述 | 示例 |
|
|
@@ -294,21 +303,14 @@ minimax-status │ main * │ Usage █░░░░░░░░ 10% (4047/4500)
|
|
|
294
303
|
| 元素 | 说明 |
|
|
295
304
|
| ------ | ---------------------------------- |
|
|
296
305
|
| 目录 | 当前工作目录 |
|
|
297
|
-
| 分支 | Git
|
|
306
|
+
| 分支 | Git 分支名称(含未提交状态) |
|
|
298
307
|
| 模型 | MiniMax 模型名称 |
|
|
299
|
-
| 上下文 |
|
|
300
|
-
| Usage |
|
|
308
|
+
| 上下文 | 上下文窗口使用 tokens |
|
|
309
|
+
| Usage | 使用量百分比(已用/总量) |
|
|
310
|
+
| 周限额 | 周配额使用情况,∞ 表示无限制 |
|
|
301
311
|
| ⏱ | 额度重置倒计时 |
|
|
302
312
|
| 到期 | 订阅到期时间(颜色动态变化) |
|
|
303
313
|
|
|
304
|
-
### 进度条
|
|
305
|
-
|
|
306
|
-
使用 `█` 和 `░` 字符显示进度条:
|
|
307
|
-
|
|
308
|
-
- `█░░░░░░░░` - 10% 使用量
|
|
309
|
-
- `█████░░░░░` - 50% 使用量
|
|
310
|
-
- `██████████` - 100% 使用量
|
|
311
|
-
|
|
312
314
|
### 颜色规则
|
|
313
315
|
|
|
314
316
|
| 场景 | 颜色 | 说明 |
|
|
@@ -413,7 +415,6 @@ MIT License - 详见 [LICENSE](LICENSE) 文件
|
|
|
413
415
|
|--------|------|------|
|
|
414
416
|
| **CLI** | [`cli/`](cli/) | 命令行工具,npm 全局包 |
|
|
415
417
|
| **VSCode** | [`vscode-extension/`](vscode-extension/) | VSCode 状态栏集成 |
|
|
416
|
-
| **OpenClaw** | [`openclaw/`](openclaw/) | OpenClaw 集成 |
|
|
417
418
|
|
|
418
419
|
---
|
|
419
420
|
|
package/cli/api.js
CHANGED
|
@@ -3,6 +3,7 @@ const https = require("https");
|
|
|
3
3
|
const fs = require("fs");
|
|
4
4
|
const path = require("path");
|
|
5
5
|
const chalk = require("chalk").default;
|
|
6
|
+
const { getContextWindowSize, getDefaultContextWindowSize } = require('./model-context-sizes');
|
|
6
7
|
|
|
7
8
|
// 创建 HTTPS Agent 配置
|
|
8
9
|
const httpsAgent = new https.Agent({
|
|
@@ -80,7 +81,7 @@ class MinimaxAPI {
|
|
|
80
81
|
|
|
81
82
|
try {
|
|
82
83
|
const response = await axios.get(
|
|
83
|
-
`https://www.minimaxi.com/v1/
|
|
84
|
+
`https://www.minimaxi.com/v1/token_plan/remains`,
|
|
84
85
|
{
|
|
85
86
|
headers: {
|
|
86
87
|
Authorization: `Bearer ${this.token}`,
|
|
@@ -295,9 +296,9 @@ class MinimaxAPI {
|
|
|
295
296
|
const endTime = new Date(modelData.end_time);
|
|
296
297
|
|
|
297
298
|
// Calculate counts
|
|
298
|
-
//
|
|
299
|
-
const
|
|
300
|
-
const
|
|
299
|
+
// 新接口 usage_count 是已使用次数(正确值)
|
|
300
|
+
const usedCount = modelData.current_interval_usage_count;
|
|
301
|
+
const remainingCount = modelData.current_interval_total_count - usedCount;
|
|
301
302
|
|
|
302
303
|
// Calculate percentage - 基于已使用次数的百分比
|
|
303
304
|
const usedPercentage = Math.round(
|
|
@@ -310,7 +311,7 @@ class MinimaxAPI {
|
|
|
310
311
|
const minutes = Math.floor((remainingMs % (1000 * 60 * 60)) / (1000 * 60));
|
|
311
312
|
|
|
312
313
|
// Calculate weekly usage data
|
|
313
|
-
const weeklyUsed = modelData.
|
|
314
|
+
const weeklyUsed = modelData.current_weekly_usage_count;
|
|
314
315
|
const weeklyTotal = modelData.current_weekly_total_count;
|
|
315
316
|
const weeklyPercentage = weeklyTotal > 0 ? Math.floor((weeklyUsed / weeklyTotal) * 100) : 0;
|
|
316
317
|
const weeklyRemainingMs = modelData.weekly_remains_time;
|
|
@@ -346,10 +347,11 @@ class MinimaxAPI {
|
|
|
346
347
|
}
|
|
347
348
|
|
|
348
349
|
// 上下文窗口信息
|
|
349
|
-
//
|
|
350
|
-
const
|
|
350
|
+
// 根据模型名称获取上下文窗口大小,回退到默认值
|
|
351
|
+
const contextWindowSize =
|
|
352
|
+
getContextWindowSize(modelData.model_name) || getDefaultContextWindowSize();
|
|
351
353
|
const contextWindow = {
|
|
352
|
-
total:
|
|
354
|
+
total: contextWindowSize,
|
|
353
355
|
used: 0,
|
|
354
356
|
percentage: 0,
|
|
355
357
|
totalFormatted: "200K",
|
|
@@ -382,8 +384,8 @@ class MinimaxAPI {
|
|
|
382
384
|
: `${minutes} 分钟后重置`,
|
|
383
385
|
},
|
|
384
386
|
usage: {
|
|
385
|
-
used: usedCount,
|
|
386
|
-
remaining: remainingCount,
|
|
387
|
+
used: usedCount,
|
|
388
|
+
remaining: remainingCount,
|
|
387
389
|
total: modelData.current_interval_total_count,
|
|
388
390
|
percentage: usedPercentage,
|
|
389
391
|
},
|
|
@@ -415,13 +417,15 @@ class MinimaxAPI {
|
|
|
415
417
|
|
|
416
418
|
return apiData.model_remains.map(modelData => {
|
|
417
419
|
const totalCount = modelData.current_interval_total_count;
|
|
418
|
-
|
|
419
|
-
const usedCount =
|
|
420
|
+
// 新接口 usage_count 是已使用次数(正确值)
|
|
421
|
+
const usedCount = modelData.current_interval_usage_count;
|
|
422
|
+
const remainingCount = totalCount - usedCount;
|
|
420
423
|
const usedPercentage = totalCount > 0 ? Math.round((usedCount / totalCount) * 100) : 0;
|
|
421
424
|
|
|
422
425
|
// Weekly data
|
|
423
426
|
const weeklyTotal = modelData.current_weekly_total_count || 0;
|
|
424
|
-
const weeklyUsed =
|
|
427
|
+
const weeklyUsed = modelData.current_weekly_usage_count || 0;
|
|
428
|
+
const weeklyRemainingCount = weeklyTotal - weeklyUsed;
|
|
425
429
|
const weeklyPercentage = weeklyTotal > 0 ? Math.floor((weeklyUsed / weeklyTotal) * 100) : 0;
|
|
426
430
|
|
|
427
431
|
return {
|
|
@@ -433,7 +437,7 @@ class MinimaxAPI {
|
|
|
433
437
|
unlimited: weeklyTotal === 0,
|
|
434
438
|
weeklyPercentage,
|
|
435
439
|
weeklyTotal,
|
|
436
|
-
weeklyRemainingCount
|
|
440
|
+
weeklyRemainingCount,
|
|
437
441
|
};
|
|
438
442
|
});
|
|
439
443
|
}
|
package/cli/index.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
#!/usr/bin/env node
|
|
1
|
+
#!/usr/bin/env node
|
|
2
2
|
|
|
3
3
|
// Force color output even in non-TTY environments (e.g., Claude Code statusline)
|
|
4
4
|
process.env.FORCE_COLOR = "1";
|
|
@@ -12,6 +12,7 @@ const TranscriptParser = require("./transcript-parser");
|
|
|
12
12
|
const ConfigCounter = require("./config-counter");
|
|
13
13
|
const Renderer = require("./renderer");
|
|
14
14
|
const packageJson = require("../package.json");
|
|
15
|
+
const { getContextWindowSize, getDefaultContextWindowSize } = require('./model-context-sizes');
|
|
15
16
|
|
|
16
17
|
const program = new Command();
|
|
17
18
|
const api = new MinimaxAPI();
|
|
@@ -238,7 +239,7 @@ program
|
|
|
238
239
|
let displayModel = modelName;
|
|
239
240
|
let currentDir = null;
|
|
240
241
|
let modelId = null;
|
|
241
|
-
let contextSize =
|
|
242
|
+
let contextSize = getContextWindowSize(modelName) || getDefaultContextWindowSize();
|
|
242
243
|
|
|
243
244
|
if (stdinData) {
|
|
244
245
|
if (stdinData.model && stdinData.model.display_name) {
|
|
@@ -257,8 +258,8 @@ program
|
|
|
257
258
|
}
|
|
258
259
|
|
|
259
260
|
if (modelId) {
|
|
260
|
-
// MiniMax
|
|
261
|
-
contextSize =
|
|
261
|
+
// MiniMax 模型使用映射表获取 context window
|
|
262
|
+
contextSize = getContextWindowSize(modelId) || getContextWindowSize(modelName) || getDefaultContextWindowSize();
|
|
262
263
|
}
|
|
263
264
|
|
|
264
265
|
let contextUsageTokens = null;
|
|
@@ -601,7 +602,7 @@ program
|
|
|
601
602
|
// 计算上下文使用量(从 session 实时 token)
|
|
602
603
|
// 使用实时 contextTokens 计算百分比
|
|
603
604
|
const contextUsageValue = contextTokens;
|
|
604
|
-
const contextSizeValue =
|
|
605
|
+
const contextSizeValue = getContextWindowSize(modelName) || getDefaultContextWindowSize();
|
|
605
606
|
|
|
606
607
|
// 获取 Droid 全局配置统计(不是当前工作目录)
|
|
607
608
|
const droidConfigDir = path.join(process.env.HOME || process.env.USERPROFILE, ".factory");
|
|
@@ -688,34 +689,34 @@ program
|
|
|
688
689
|
blocks.push({ text: ` 剩${expiry.daysRemaining}天 `, bg: bg });
|
|
689
690
|
}
|
|
690
691
|
|
|
691
|
-
let out = '';
|
|
692
|
-
const leftArrow = useNerdFonts ? '\uE0B0' : '>';
|
|
693
|
-
|
|
694
|
-
for (let i = 0; i < blocks.length; i++) {
|
|
695
|
-
const b = blocks[i];
|
|
696
|
-
|
|
697
|
-
// 磁贴开启:顺行式起点,利用黑色箭头实现内凹镂空感
|
|
698
|
-
if (i === 0) {
|
|
699
|
-
out += '\u001b[0m' + chalk.bgHex(b.bg).black(leftArrow);
|
|
700
|
-
}
|
|
701
|
-
|
|
702
|
-
// 磁贴文字内容
|
|
703
|
-
out += '\u001b[0m' + chalk.bgHex(b.bg).bold.whiteBright(b.text);
|
|
704
|
-
|
|
705
|
-
if (i < blocks.length - 1) {
|
|
706
|
-
const nextB = blocks[i + 1];
|
|
707
|
-
if (useNerdFonts) {
|
|
708
|
-
// 衔接尖部
|
|
709
|
-
out += '\u001b[0m' + chalk.bgHex(nextB.bg).hex(b.bg)(arrow);
|
|
710
|
-
} else {
|
|
711
|
-
out += '\u001b[0m' + chalk.bgHex(b.bg).bold.whiteBright(arrow);
|
|
712
|
-
}
|
|
713
|
-
} else {
|
|
714
|
-
// 最后一块磁贴:顺行式终点
|
|
715
|
-
out += '\u001b[0m' + chalk.hex(b.bg)(arrow);
|
|
716
|
-
}
|
|
717
|
-
}
|
|
718
|
-
|
|
692
|
+
let out = '';
|
|
693
|
+
const leftArrow = useNerdFonts ? '\uE0B0' : '>';
|
|
694
|
+
|
|
695
|
+
for (let i = 0; i < blocks.length; i++) {
|
|
696
|
+
const b = blocks[i];
|
|
697
|
+
|
|
698
|
+
// 磁贴开启:顺行式起点,利用黑色箭头实现内凹镂空感
|
|
699
|
+
if (i === 0) {
|
|
700
|
+
out += '\u001b[0m' + chalk.bgHex(b.bg).black(leftArrow);
|
|
701
|
+
}
|
|
702
|
+
|
|
703
|
+
// 磁贴文字内容
|
|
704
|
+
out += '\u001b[0m' + chalk.bgHex(b.bg).bold.whiteBright(b.text);
|
|
705
|
+
|
|
706
|
+
if (i < blocks.length - 1) {
|
|
707
|
+
const nextB = blocks[i + 1];
|
|
708
|
+
if (useNerdFonts) {
|
|
709
|
+
// 衔接尖部
|
|
710
|
+
out += '\u001b[0m' + chalk.bgHex(nextB.bg).hex(b.bg)(arrow);
|
|
711
|
+
} else {
|
|
712
|
+
out += '\u001b[0m' + chalk.bgHex(b.bg).bold.whiteBright(arrow);
|
|
713
|
+
}
|
|
714
|
+
} else {
|
|
715
|
+
// 最后一块磁贴:顺行式终点
|
|
716
|
+
out += '\u001b[0m' + chalk.hex(b.bg)(arrow);
|
|
717
|
+
}
|
|
718
|
+
}
|
|
719
|
+
|
|
719
720
|
console.log(out);
|
|
720
721
|
});
|
|
721
722
|
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* MiniMax 模型 context window 大小映射表
|
|
3
|
+
* 单位: tokens
|
|
4
|
+
*
|
|
5
|
+
* 来源: https://platform.minimax.io/docs/api-reference/text-openai-api
|
|
6
|
+
*/
|
|
7
|
+
|
|
8
|
+
const MODEL_CONTEXT_SIZES = {
|
|
9
|
+
// MiniMax M 系列 - 统一 200K context window
|
|
10
|
+
'MiniMax-M2': 204800,
|
|
11
|
+
'MiniMax-M2.1': 204800,
|
|
12
|
+
'MiniMax-M2.1-highspeed': 204800,
|
|
13
|
+
'MiniMax-M2.5': 204800,
|
|
14
|
+
'MiniMax-M2.5-highspeed': 204800,
|
|
15
|
+
'MiniMax-M2.7': 204800,
|
|
16
|
+
'MiniMax-M2.7-highspeed': 204800,
|
|
17
|
+
};
|
|
18
|
+
|
|
19
|
+
/**
|
|
20
|
+
* 根据模型名称获取 context window 大小
|
|
21
|
+
* @param {string} modelName - 模型名称
|
|
22
|
+
* @returns {number|null} context window 大小,如果未找到返回 null
|
|
23
|
+
*/
|
|
24
|
+
function getContextWindowSize(modelName) {
|
|
25
|
+
if (!modelName) return null;
|
|
26
|
+
|
|
27
|
+
// 精确匹配
|
|
28
|
+
if (MODEL_CONTEXT_SIZES[modelName] !== undefined) {
|
|
29
|
+
return MODEL_CONTEXT_SIZES[modelName];
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
// MiniMax M 系列模糊匹配(兼容未知的 MiniMax-M 系列新型号)
|
|
33
|
+
if (modelName.includes('MiniMax-M')) {
|
|
34
|
+
return 204800;
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
return null;
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
/**
|
|
41
|
+
* 获取默认 context window 大小
|
|
42
|
+
* @returns {number} 默认值 200000
|
|
43
|
+
*/
|
|
44
|
+
function getDefaultContextWindowSize() {
|
|
45
|
+
return 200000;
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
module.exports = {
|
|
49
|
+
MODEL_CONTEXT_SIZES,
|
|
50
|
+
getContextWindowSize,
|
|
51
|
+
getDefaultContextWindowSize,
|
|
52
|
+
};
|