opencode-kimi-rotator 1.2.4 → 1.2.6
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 +26 -1
- package/bin/cli.js +39 -0
- package/dist/accounts.d.ts +7 -0
- package/dist/accounts.d.ts.map +1 -1
- package/dist/accounts.js +51 -6
- package/dist/accounts.js.map +1 -1
- package/dist/plugin.bundle.js +129 -24
- package/dist/plugin.d.ts.map +1 -1
- package/dist/plugin.js +60 -19
- package/dist/plugin.js.map +1 -1
- package/dist/types.d.ts +8 -0
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js +2 -0
- package/dist/types.js.map +1 -1
- package/package.json +2 -2
- package/src/plugin.ts +80 -23
package/README.md
CHANGED
|
@@ -392,13 +392,23 @@ When a key is rate limited (HTTP 429):
|
|
|
392
392
|
|
|
393
393
|
### Billing Cycle Limit Handling
|
|
394
394
|
|
|
395
|
-
When a key hits
|
|
395
|
+
When a key hits a billing or usage limit, the plugin detects multiple error patterns:
|
|
396
|
+
|
|
397
|
+
- "You've reached your usage limit for this billing cycle"
|
|
398
|
+
- "billing limit"
|
|
399
|
+
- "usage limit exceeded"
|
|
400
|
+
- "quota exceeded"
|
|
401
|
+
- "insufficient credits"
|
|
402
|
+
- "payment required"
|
|
403
|
+
|
|
404
|
+
When any of these patterns are detected in HTTP 400/403 responses:
|
|
396
405
|
|
|
397
406
|
1. Health score decreases by 30 points
|
|
398
407
|
2. Key is put on a 24-hour cooldown (until midnight of the next day)
|
|
399
408
|
3. Next request automatically uses next available key
|
|
400
409
|
4. A toast notification shows how many hours until the key is available
|
|
401
410
|
5. The key won't be retried until the cooldown expires
|
|
411
|
+
6. Non-billing-limit HTTP 400/403 errors are marked as regular failures
|
|
402
412
|
|
|
403
413
|
### Data Storage
|
|
404
414
|
|
|
@@ -542,6 +552,21 @@ rm ~/.config/opencode/kimi-accounts.json
|
|
|
542
552
|
opencode-kimi add-key your-new-api-key
|
|
543
553
|
```
|
|
544
554
|
|
|
555
|
+
### Debug Mode
|
|
556
|
+
|
|
557
|
+
Enable debug logging to troubleshoot issues:
|
|
558
|
+
|
|
559
|
+
```bash
|
|
560
|
+
export KIMI_ROTATOR_DEBUG=true
|
|
561
|
+
opencode run "Hello" --model=anthropic/kimi-for-coding
|
|
562
|
+
```
|
|
563
|
+
|
|
564
|
+
Debug output includes:
|
|
565
|
+
|
|
566
|
+
- HTTP response body snippets for error responses
|
|
567
|
+
- Billing limit detection details
|
|
568
|
+
- Response parsing errors
|
|
569
|
+
|
|
545
570
|
---
|
|
546
571
|
|
|
547
572
|
## Plugin Compatibility
|
package/bin/cli.js
CHANGED
|
@@ -56,6 +56,9 @@ async function main() {
|
|
|
56
56
|
case 'import-keys':
|
|
57
57
|
await importKeys(manager, args.slice(1));
|
|
58
58
|
break;
|
|
59
|
+
case 'clear-limits':
|
|
60
|
+
await clearLimits(manager, args.slice(1));
|
|
61
|
+
break;
|
|
59
62
|
case 'help':
|
|
60
63
|
default:
|
|
61
64
|
showHelp();
|
|
@@ -545,6 +548,41 @@ async function promptPassword(prompt) {
|
|
|
545
548
|
});
|
|
546
549
|
}
|
|
547
550
|
|
|
551
|
+
async function clearLimits(manager, args) {
|
|
552
|
+
const target = (args[0] || '').trim();
|
|
553
|
+
const normalizedTarget = target.toLowerCase();
|
|
554
|
+
|
|
555
|
+
if (normalizedTarget === 'all') {
|
|
556
|
+
const accounts = await manager.listKeys();
|
|
557
|
+
let cleared = 0;
|
|
558
|
+
for (let i = 0; i < accounts.length; i++) {
|
|
559
|
+
await manager.clearAccountLimits(i);
|
|
560
|
+
cleared++;
|
|
561
|
+
}
|
|
562
|
+
console.log(`✓ Cleared limits for all ${cleared} key(s)`);
|
|
563
|
+
return;
|
|
564
|
+
}
|
|
565
|
+
|
|
566
|
+
const index = parseInt(target, 10);
|
|
567
|
+
|
|
568
|
+
if (isNaN(index)) {
|
|
569
|
+
console.error('Usage: opencode-kimi clear-limits <index>');
|
|
570
|
+
console.error('');
|
|
571
|
+
console.error('Clear billing and rate limits for a specific key.');
|
|
572
|
+
console.error('Use "all" to clear limits for all keys.');
|
|
573
|
+
process.exit(1);
|
|
574
|
+
}
|
|
575
|
+
|
|
576
|
+
const accounts = await manager.listKeys();
|
|
577
|
+
if (index < 0 || index >= accounts.length) {
|
|
578
|
+
console.error(`Invalid index. Valid range: 0-${accounts.length - 1}`);
|
|
579
|
+
process.exit(1);
|
|
580
|
+
}
|
|
581
|
+
|
|
582
|
+
await manager.clearAccountLimits(index);
|
|
583
|
+
console.log(`✓ Cleared limits for key: ${accounts[index].name} (index ${index})`);
|
|
584
|
+
}
|
|
585
|
+
|
|
548
586
|
function showHelp() {
|
|
549
587
|
console.log('Kimi API Key Rotator for OpenCode');
|
|
550
588
|
console.log('');
|
|
@@ -561,6 +599,7 @@ function showHelp() {
|
|
|
561
599
|
console.log(' refresh-health Manually refresh health scores');
|
|
562
600
|
console.log(' set-auto-refresh <true|false> Enable/disable auto-refresh');
|
|
563
601
|
console.log(' set-cooldown <minutes> Set health refresh cooldown');
|
|
602
|
+
console.log(' clear-limits <index|all> Clear billing/rate limits for key(s)');
|
|
564
603
|
console.log(' export-keys [file] Export keys to encrypted file');
|
|
565
604
|
console.log(' import-keys <file> Import keys from encrypted file');
|
|
566
605
|
console.log(' help Show this help message');
|
package/dist/accounts.d.ts
CHANGED
|
@@ -24,7 +24,13 @@ export declare class KimiAccountManager {
|
|
|
24
24
|
markAccountUsed(index: number): Promise<void>;
|
|
25
25
|
markAccountSuccess(index: number, responseTime?: number, date?: string): Promise<void>;
|
|
26
26
|
markAccountRateLimited(index: number, retryAfterMs: number): Promise<void>;
|
|
27
|
+
recordBillingLimitHit(index: number): Promise<{
|
|
28
|
+
isConfirmed: boolean;
|
|
29
|
+
hitsNeeded: number;
|
|
30
|
+
}>;
|
|
27
31
|
markAccountBillingLimited(index: number): Promise<void>;
|
|
32
|
+
resetBillingLimitHits(index: number): Promise<void>;
|
|
33
|
+
clearAccountLimits(index: number): Promise<void>;
|
|
28
34
|
markAccountFailure(index: number): Promise<void>;
|
|
29
35
|
getActiveKey(): Promise<string | null>;
|
|
30
36
|
setRotationStrategy(strategy: RotationStrategy): Promise<void>;
|
|
@@ -44,6 +50,7 @@ export declare class KimiAccountManager {
|
|
|
44
50
|
private healthBasedRotation;
|
|
45
51
|
private calculateAccountScore;
|
|
46
52
|
private getAvailableIndices;
|
|
53
|
+
private getRoundRobinIndices;
|
|
47
54
|
private getSoonestAvailableIndex;
|
|
48
55
|
private isRateLimited;
|
|
49
56
|
private getAccount;
|
package/dist/accounts.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"accounts.d.ts","sourceRoot":"","sources":["../src/accounts.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,WAAW,EAAsB,MAAM,YAAY,CAAC;AAE7D,KAAK,gBAAgB,GAAG,aAAa,GAAG,cAAc,GAAG,QAAQ,CAAC;AAElE,UAAU,cAAc;IACtB,OAAO,EAAE,WAAW,CAAC;IACrB,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,qBAAa,kBAAkB;IAC7B,OAAO,CAAC,OAAO,CAAc;IAC7B,OAAO,CAAC,cAAc,CAAM;IAC5B,OAAO,CAAC,WAAW,CAAM;;IAMnB,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAI3B;;;OAGG;IACG,iBAAiB,IAAI,OAAO,CAAC,cAAc,GAAG,IAAI,CAAC;IAiBzD;;;OAGG;IACG,cAAc,CAAC,aAAa,UAAQ,GAAG,OAAO,CAAC,cAAc,GAAG,IAAI,CAAC;IAwBrE,eAAe,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAO7C,kBAAkB,CAAC,KAAK,EAAE,MAAM,EAAE,YAAY,CAAC,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;
|
|
1
|
+
{"version":3,"file":"accounts.d.ts","sourceRoot":"","sources":["../src/accounts.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,WAAW,EAAsB,MAAM,YAAY,CAAC;AAE7D,KAAK,gBAAgB,GAAG,aAAa,GAAG,cAAc,GAAG,QAAQ,CAAC;AAElE,UAAU,cAAc;IACtB,OAAO,EAAE,WAAW,CAAC;IACrB,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,qBAAa,kBAAkB;IAC7B,OAAO,CAAC,OAAO,CAAc;IAC7B,OAAO,CAAC,cAAc,CAAM;IAC5B,OAAO,CAAC,WAAW,CAAM;;IAMnB,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAI3B;;;OAGG;IACG,iBAAiB,IAAI,OAAO,CAAC,cAAc,GAAG,IAAI,CAAC;IAiBzD;;;OAGG;IACG,cAAc,CAAC,aAAa,UAAQ,GAAG,OAAO,CAAC,cAAc,GAAG,IAAI,CAAC;IAwBrE,eAAe,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAO7C,kBAAkB,CAAC,KAAK,EAAE,MAAM,EAAE,YAAY,CAAC,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IA4BtF,sBAAsB,CAAC,KAAK,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAW1E,qBAAqB,CACzB,KAAK,EAAE,MAAM,GACZ,OAAO,CAAC;QAAE,WAAW,EAAE,OAAO,CAAC;QAAC,UAAU,EAAE,MAAM,CAAA;KAAE,CAAC;IA4BlD,yBAAyB,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAevD,qBAAqB,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAMnD,kBAAkB,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAShD,kBAAkB,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAUhD,YAAY,IAAI,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;IAKtC,mBAAmB,CAAC,QAAQ,EAAE,gBAAgB,GAAG,OAAO,CAAC,IAAI,CAAC;IAM9D,MAAM,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC;IAIxD,SAAS,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAIvC,QAAQ,IAAI,OAAO,CAAC,WAAW,EAAE,CAAC;IAIlC,YAAY,IAAI,OAAO,CAAC,cAAc,GAAG,IAAI,CAAC;IAI9C,cAAc,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAI5C,oBAAoB,CAAC,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC;IAMrD,wBAAwB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IASxD,mBAAmB,IAAI,OAAO,CAAC;QAAE,SAAS,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,EAAE,CAAA;KAAE,CAAC;YAgChE,kBAAkB;YAoBlB,cAAc;YAoCd,mBAAmB;IAuDjC,OAAO,CAAC,qBAAqB;IAa7B,OAAO,CAAC,mBAAmB;IAS3B,OAAO,CAAC,oBAAoB;IAO5B,OAAO,CAAC,wBAAwB;IAqBhC,OAAO,CAAC,aAAa;YAOP,UAAU;CAOzB"}
|
package/dist/accounts.js
CHANGED
|
@@ -63,6 +63,7 @@ export class KimiAccountManager {
|
|
|
63
63
|
healthScore: newHealthScore,
|
|
64
64
|
successfulRequests: account.successfulRequests + 1,
|
|
65
65
|
consecutiveFailures: 0,
|
|
66
|
+
consecutiveBillingLimitHits: 0,
|
|
66
67
|
};
|
|
67
68
|
if (responseTime !== undefined) {
|
|
68
69
|
const responseTimes = [...account.responseTimes, responseTime];
|
|
@@ -87,20 +88,56 @@ export class KimiAccountManager {
|
|
|
87
88
|
consecutiveFailures: account.consecutiveFailures + 1,
|
|
88
89
|
});
|
|
89
90
|
}
|
|
91
|
+
async recordBillingLimitHit(index) {
|
|
92
|
+
const account = await this.getAccount(index);
|
|
93
|
+
const newHits = (account.consecutiveBillingLimitHits || 0) + 1;
|
|
94
|
+
const REQUIRED_HITS = 2;
|
|
95
|
+
if (newHits >= REQUIRED_HITS) {
|
|
96
|
+
const newHealthScore = Math.max(0, account.healthScore - 30);
|
|
97
|
+
const now = new Date();
|
|
98
|
+
const endOfDay = new Date(now.getFullYear(), now.getMonth(), now.getDate() + 1, 0, 0, 0, 0);
|
|
99
|
+
const cooldownUntil = endOfDay.getTime();
|
|
100
|
+
await this.storage.updateAccount(index, {
|
|
101
|
+
healthScore: newHealthScore,
|
|
102
|
+
billingLimitResetTime: cooldownUntil,
|
|
103
|
+
consecutiveBillingLimitHits: newHits,
|
|
104
|
+
consecutiveFailures: account.consecutiveFailures + 1,
|
|
105
|
+
});
|
|
106
|
+
return { isConfirmed: true, hitsNeeded: 0 };
|
|
107
|
+
}
|
|
108
|
+
else {
|
|
109
|
+
await this.storage.updateAccount(index, {
|
|
110
|
+
consecutiveBillingLimitHits: newHits,
|
|
111
|
+
});
|
|
112
|
+
return { isConfirmed: false, hitsNeeded: REQUIRED_HITS - newHits };
|
|
113
|
+
}
|
|
114
|
+
}
|
|
90
115
|
async markAccountBillingLimited(index) {
|
|
91
116
|
const account = await this.getAccount(index);
|
|
92
117
|
const newHealthScore = Math.max(0, account.healthScore - 30);
|
|
93
|
-
// Set cooldown until end of current day (midnight) + 24 hours
|
|
94
|
-
// This ensures the key won't be tried again for at least 24 hours
|
|
95
118
|
const now = new Date();
|
|
96
119
|
const endOfDay = new Date(now.getFullYear(), now.getMonth(), now.getDate() + 1, 0, 0, 0, 0);
|
|
97
120
|
const cooldownUntil = endOfDay.getTime();
|
|
98
121
|
await this.storage.updateAccount(index, {
|
|
99
122
|
healthScore: newHealthScore,
|
|
100
123
|
billingLimitResetTime: cooldownUntil,
|
|
124
|
+
consecutiveBillingLimitHits: 2,
|
|
101
125
|
consecutiveFailures: account.consecutiveFailures + 1,
|
|
102
126
|
});
|
|
103
127
|
}
|
|
128
|
+
async resetBillingLimitHits(index) {
|
|
129
|
+
await this.storage.updateAccount(index, {
|
|
130
|
+
consecutiveBillingLimitHits: 0,
|
|
131
|
+
});
|
|
132
|
+
}
|
|
133
|
+
async clearAccountLimits(index) {
|
|
134
|
+
await this.storage.updateAccount(index, {
|
|
135
|
+
billingLimitResetTime: 0,
|
|
136
|
+
rateLimitResetTime: 0,
|
|
137
|
+
consecutiveFailures: 0,
|
|
138
|
+
consecutiveBillingLimitHits: 0,
|
|
139
|
+
});
|
|
140
|
+
}
|
|
104
141
|
async markAccountFailure(index) {
|
|
105
142
|
const account = await this.getAccount(index);
|
|
106
143
|
const newHealthScore = Math.max(0, account.healthScore - 20);
|
|
@@ -173,10 +210,11 @@ export class KimiAccountManager {
|
|
|
173
210
|
return { refreshed, details };
|
|
174
211
|
}
|
|
175
212
|
async roundRobinRotation(config) {
|
|
176
|
-
const availableIndices = this.
|
|
213
|
+
const availableIndices = this.getRoundRobinIndices(config);
|
|
177
214
|
if (availableIndices.length === 0) {
|
|
178
215
|
const soonestIndex = this.getSoonestAvailableIndex(config);
|
|
179
216
|
const account = config.accounts[soonestIndex];
|
|
217
|
+
await this.storage.setActiveIndex(soonestIndex);
|
|
180
218
|
return { account, index: soonestIndex, reason: 'all-rate-limited' };
|
|
181
219
|
}
|
|
182
220
|
const nextIndex = await this.storage.getAndIncrementActiveIndex(availableIndices);
|
|
@@ -267,12 +305,19 @@ export class KimiAccountManager {
|
|
|
267
305
|
.filter(({ account }) => !this.isRateLimited(account) && account.healthScore >= this.minHealthScore)
|
|
268
306
|
.map(({ index }) => index);
|
|
269
307
|
}
|
|
308
|
+
getRoundRobinIndices(config) {
|
|
309
|
+
return config.accounts
|
|
310
|
+
.map((account, index) => ({ account, index }))
|
|
311
|
+
.filter(({ account }) => !this.isRateLimited(account))
|
|
312
|
+
.map(({ index }) => index);
|
|
313
|
+
}
|
|
270
314
|
getSoonestAvailableIndex(config) {
|
|
271
315
|
let soonestIndex = 0;
|
|
272
|
-
let soonestTime = config.accounts[0].rateLimitResetTime;
|
|
316
|
+
let soonestTime = Math.max(config.accounts[0].rateLimitResetTime, config.accounts[0].billingLimitResetTime ?? 0);
|
|
273
317
|
for (let i = 1; i < config.accounts.length; i++) {
|
|
274
|
-
|
|
275
|
-
|
|
318
|
+
const accountReadyTime = Math.max(config.accounts[i].rateLimitResetTime, config.accounts[i].billingLimitResetTime ?? 0);
|
|
319
|
+
if (accountReadyTime < soonestTime) {
|
|
320
|
+
soonestTime = accountReadyTime;
|
|
276
321
|
soonestIndex = i;
|
|
277
322
|
}
|
|
278
323
|
}
|
package/dist/accounts.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"accounts.js","sourceRoot":"","sources":["../src/accounts.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"accounts.js","sourceRoot":"","sources":["../src/accounts.ts"],"names":[],"mappings":"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"}
|
package/dist/plugin.bundle.js
CHANGED
|
@@ -5668,6 +5668,7 @@ var KimiAccountSchema = external_exports.object({
|
|
|
5668
5668
|
billingLimitResetTime: external_exports.number().default(0),
|
|
5669
5669
|
healthScore: external_exports.number().min(0).max(100).default(100),
|
|
5670
5670
|
consecutiveFailures: external_exports.number().default(0),
|
|
5671
|
+
consecutiveBillingLimitHits: external_exports.number().default(0),
|
|
5671
5672
|
totalRequests: external_exports.number().default(0),
|
|
5672
5673
|
successfulRequests: external_exports.number().default(0),
|
|
5673
5674
|
responseTimes: external_exports.array(external_exports.number()).default([]),
|
|
@@ -5686,6 +5687,7 @@ var DEFAULT_ACCOUNT = {
|
|
|
5686
5687
|
billingLimitResetTime: 0,
|
|
5687
5688
|
healthScore: 100,
|
|
5688
5689
|
consecutiveFailures: 0,
|
|
5690
|
+
consecutiveBillingLimitHits: 0,
|
|
5689
5691
|
totalRequests: 0,
|
|
5690
5692
|
successfulRequests: 0,
|
|
5691
5693
|
responseTimes: [],
|
|
@@ -5944,7 +5946,8 @@ var KimiAccountManager = class {
|
|
|
5944
5946
|
const updates = {
|
|
5945
5947
|
healthScore: newHealthScore,
|
|
5946
5948
|
successfulRequests: account.successfulRequests + 1,
|
|
5947
|
-
consecutiveFailures: 0
|
|
5949
|
+
consecutiveFailures: 0,
|
|
5950
|
+
consecutiveBillingLimitHits: 0
|
|
5948
5951
|
};
|
|
5949
5952
|
if (responseTime !== void 0) {
|
|
5950
5953
|
const responseTimes = [...account.responseTimes, responseTime];
|
|
@@ -5969,6 +5972,29 @@ var KimiAccountManager = class {
|
|
|
5969
5972
|
consecutiveFailures: account.consecutiveFailures + 1
|
|
5970
5973
|
});
|
|
5971
5974
|
}
|
|
5975
|
+
async recordBillingLimitHit(index) {
|
|
5976
|
+
const account = await this.getAccount(index);
|
|
5977
|
+
const newHits = (account.consecutiveBillingLimitHits || 0) + 1;
|
|
5978
|
+
const REQUIRED_HITS = 2;
|
|
5979
|
+
if (newHits >= REQUIRED_HITS) {
|
|
5980
|
+
const newHealthScore = Math.max(0, account.healthScore - 30);
|
|
5981
|
+
const now = /* @__PURE__ */ new Date();
|
|
5982
|
+
const endOfDay = new Date(now.getFullYear(), now.getMonth(), now.getDate() + 1, 0, 0, 0, 0);
|
|
5983
|
+
const cooldownUntil = endOfDay.getTime();
|
|
5984
|
+
await this.storage.updateAccount(index, {
|
|
5985
|
+
healthScore: newHealthScore,
|
|
5986
|
+
billingLimitResetTime: cooldownUntil,
|
|
5987
|
+
consecutiveBillingLimitHits: newHits,
|
|
5988
|
+
consecutiveFailures: account.consecutiveFailures + 1
|
|
5989
|
+
});
|
|
5990
|
+
return { isConfirmed: true, hitsNeeded: 0 };
|
|
5991
|
+
} else {
|
|
5992
|
+
await this.storage.updateAccount(index, {
|
|
5993
|
+
consecutiveBillingLimitHits: newHits
|
|
5994
|
+
});
|
|
5995
|
+
return { isConfirmed: false, hitsNeeded: REQUIRED_HITS - newHits };
|
|
5996
|
+
}
|
|
5997
|
+
}
|
|
5972
5998
|
async markAccountBillingLimited(index) {
|
|
5973
5999
|
const account = await this.getAccount(index);
|
|
5974
6000
|
const newHealthScore = Math.max(0, account.healthScore - 30);
|
|
@@ -5978,9 +6004,23 @@ var KimiAccountManager = class {
|
|
|
5978
6004
|
await this.storage.updateAccount(index, {
|
|
5979
6005
|
healthScore: newHealthScore,
|
|
5980
6006
|
billingLimitResetTime: cooldownUntil,
|
|
6007
|
+
consecutiveBillingLimitHits: 2,
|
|
5981
6008
|
consecutiveFailures: account.consecutiveFailures + 1
|
|
5982
6009
|
});
|
|
5983
6010
|
}
|
|
6011
|
+
async resetBillingLimitHits(index) {
|
|
6012
|
+
await this.storage.updateAccount(index, {
|
|
6013
|
+
consecutiveBillingLimitHits: 0
|
|
6014
|
+
});
|
|
6015
|
+
}
|
|
6016
|
+
async clearAccountLimits(index) {
|
|
6017
|
+
await this.storage.updateAccount(index, {
|
|
6018
|
+
billingLimitResetTime: 0,
|
|
6019
|
+
rateLimitResetTime: 0,
|
|
6020
|
+
consecutiveFailures: 0,
|
|
6021
|
+
consecutiveBillingLimitHits: 0
|
|
6022
|
+
});
|
|
6023
|
+
}
|
|
5984
6024
|
async markAccountFailure(index) {
|
|
5985
6025
|
const account = await this.getAccount(index);
|
|
5986
6026
|
const newHealthScore = Math.max(0, account.healthScore - 20);
|
|
@@ -6050,10 +6090,11 @@ var KimiAccountManager = class {
|
|
|
6050
6090
|
return { refreshed, details };
|
|
6051
6091
|
}
|
|
6052
6092
|
async roundRobinRotation(config) {
|
|
6053
|
-
const availableIndices = this.
|
|
6093
|
+
const availableIndices = this.getRoundRobinIndices(config);
|
|
6054
6094
|
if (availableIndices.length === 0) {
|
|
6055
6095
|
const soonestIndex = this.getSoonestAvailableIndex(config);
|
|
6056
6096
|
const account = config.accounts[soonestIndex];
|
|
6097
|
+
await this.storage.setActiveIndex(soonestIndex);
|
|
6057
6098
|
return { account, index: soonestIndex, reason: "all-rate-limited" };
|
|
6058
6099
|
}
|
|
6059
6100
|
const nextIndex = await this.storage.getAndIncrementActiveIndex(availableIndices);
|
|
@@ -6144,12 +6185,22 @@ var KimiAccountManager = class {
|
|
|
6144
6185
|
({ account }) => !this.isRateLimited(account) && account.healthScore >= this.minHealthScore
|
|
6145
6186
|
).map(({ index }) => index);
|
|
6146
6187
|
}
|
|
6188
|
+
getRoundRobinIndices(config) {
|
|
6189
|
+
return config.accounts.map((account, index) => ({ account, index })).filter(({ account }) => !this.isRateLimited(account)).map(({ index }) => index);
|
|
6190
|
+
}
|
|
6147
6191
|
getSoonestAvailableIndex(config) {
|
|
6148
6192
|
let soonestIndex = 0;
|
|
6149
|
-
let soonestTime =
|
|
6193
|
+
let soonestTime = Math.max(
|
|
6194
|
+
config.accounts[0].rateLimitResetTime,
|
|
6195
|
+
config.accounts[0].billingLimitResetTime ?? 0
|
|
6196
|
+
);
|
|
6150
6197
|
for (let i = 1; i < config.accounts.length; i++) {
|
|
6151
|
-
|
|
6152
|
-
|
|
6198
|
+
const accountReadyTime = Math.max(
|
|
6199
|
+
config.accounts[i].rateLimitResetTime,
|
|
6200
|
+
config.accounts[i].billingLimitResetTime ?? 0
|
|
6201
|
+
);
|
|
6202
|
+
if (accountReadyTime < soonestTime) {
|
|
6203
|
+
soonestTime = accountReadyTime;
|
|
6153
6204
|
soonestIndex = i;
|
|
6154
6205
|
}
|
|
6155
6206
|
}
|
|
@@ -6171,9 +6222,27 @@ var KimiAccountManager = class {
|
|
|
6171
6222
|
};
|
|
6172
6223
|
|
|
6173
6224
|
// src/plugin.ts
|
|
6225
|
+
var BILLING_LIMIT_PATTERNS = [
|
|
6226
|
+
"you've reached your usage limit for this billing cycle",
|
|
6227
|
+
"billing limit",
|
|
6228
|
+
"usage limit exceeded",
|
|
6229
|
+
"quota exceeded",
|
|
6230
|
+
"insufficient credits",
|
|
6231
|
+
"payment required"
|
|
6232
|
+
];
|
|
6233
|
+
var HARD_BILLING_LIMIT_PATTERNS = [
|
|
6234
|
+
"you've reached your usage limit for this billing cycle",
|
|
6235
|
+
"your quota will be refreshed in the next cycle",
|
|
6236
|
+
"from=quota-upgrade"
|
|
6237
|
+
];
|
|
6238
|
+
var DEBUG_MODE = process.env.KIMI_ROTATOR_DEBUG === "true";
|
|
6174
6239
|
var accountManager = null;
|
|
6175
|
-
var currentAccountIndex = 0;
|
|
6176
6240
|
var originalFetch = null;
|
|
6241
|
+
function debugLog(message, data) {
|
|
6242
|
+
if (DEBUG_MODE) {
|
|
6243
|
+
console.log(`[KimiRotator Debug] ${message}`, data ?? "");
|
|
6244
|
+
}
|
|
6245
|
+
}
|
|
6177
6246
|
async function getAccountManager() {
|
|
6178
6247
|
if (!accountManager) {
|
|
6179
6248
|
accountManager = new KimiAccountManager();
|
|
@@ -6187,7 +6256,6 @@ async function getAuth() {
|
|
|
6187
6256
|
if (!result) {
|
|
6188
6257
|
return null;
|
|
6189
6258
|
}
|
|
6190
|
-
currentAccountIndex = result.index;
|
|
6191
6259
|
return {
|
|
6192
6260
|
type: "api",
|
|
6193
6261
|
key: result.account.key
|
|
@@ -6239,9 +6307,9 @@ var KimiRotatorPlugin = async ({ client }) => {
|
|
|
6239
6307
|
}
|
|
6240
6308
|
const nextAccount = await accountManager.getNextAccount();
|
|
6241
6309
|
if (nextAccount) {
|
|
6242
|
-
|
|
6310
|
+
const requestAccountIndex = nextAccount.index;
|
|
6243
6311
|
const keyLabel = nextAccount.account.key.substring(0, 18) + "...";
|
|
6244
|
-
const position =
|
|
6312
|
+
const position = requestAccountIndex + 1;
|
|
6245
6313
|
const allKeysNow = await accountManager.listKeys();
|
|
6246
6314
|
const total = allKeysNow.length;
|
|
6247
6315
|
await showToast(`\u{1F504} Using key: ${keyLabel} (${String(position)}/${String(total)})`, "info");
|
|
@@ -6259,33 +6327,70 @@ var KimiRotatorPlugin = async ({ client }) => {
|
|
|
6259
6327
|
if (response.status === 429) {
|
|
6260
6328
|
const retryAfter = response.headers.get("retry-after");
|
|
6261
6329
|
const retryAfterMs = retryAfter ? parseInt(retryAfter, 10) * 1e3 : 6e4;
|
|
6262
|
-
await accountManager.markAccountRateLimited(
|
|
6330
|
+
await accountManager.markAccountRateLimited(requestAccountIndex, retryAfterMs);
|
|
6263
6331
|
await showToast(`\u26A0\uFE0F Key ${String(position)} rate limited`, "warning");
|
|
6264
6332
|
} else if (response.ok) {
|
|
6265
|
-
await accountManager.markAccountSuccess(
|
|
6333
|
+
await accountManager.markAccountSuccess(requestAccountIndex, responseTime, today);
|
|
6266
6334
|
} else if (response.status >= 500) {
|
|
6267
|
-
await accountManager.markAccountFailure(
|
|
6335
|
+
await accountManager.markAccountFailure(requestAccountIndex);
|
|
6268
6336
|
} else if (response.status === 400 || response.status === 403) {
|
|
6269
6337
|
const clonedResponse = response.clone();
|
|
6270
6338
|
try {
|
|
6271
6339
|
const bodyText = await clonedResponse.text();
|
|
6272
|
-
|
|
6273
|
-
|
|
6274
|
-
|
|
6275
|
-
|
|
6276
|
-
|
|
6277
|
-
|
|
6278
|
-
|
|
6279
|
-
|
|
6280
|
-
|
|
6281
|
-
|
|
6340
|
+
const bodyLower = bodyText.toLowerCase();
|
|
6341
|
+
debugLog(`HTTP ${response.status} for key ${String(position)}`, {
|
|
6342
|
+
bodyPreview: bodyText.substring(0, 200).replace(/\s+/g, " ")
|
|
6343
|
+
});
|
|
6344
|
+
const isBillingLimit = BILLING_LIMIT_PATTERNS.some(
|
|
6345
|
+
(pattern) => bodyLower.includes(pattern)
|
|
6346
|
+
);
|
|
6347
|
+
const isHardBillingLimit = HARD_BILLING_LIMIT_PATTERNS.some(
|
|
6348
|
+
(pattern) => bodyLower.includes(pattern)
|
|
6349
|
+
);
|
|
6350
|
+
if (isBillingLimit && accountManager) {
|
|
6351
|
+
if (isHardBillingLimit) {
|
|
6352
|
+
await accountManager.markAccountBillingLimited(requestAccountIndex);
|
|
6353
|
+
const resetTime = /* @__PURE__ */ new Date();
|
|
6354
|
+
resetTime.setDate(resetTime.getDate() + 1);
|
|
6355
|
+
resetTime.setHours(0, 0, 0, 0);
|
|
6356
|
+
const hoursUntilReset = Math.ceil(
|
|
6357
|
+
(resetTime.getTime() - Date.now()) / (1e3 * 60 * 60)
|
|
6358
|
+
);
|
|
6359
|
+
await showToast(
|
|
6360
|
+
`\u{1F6AB} Key ${String(position)} billing limit reached - cooldown for ${String(hoursUntilReset)}h`,
|
|
6361
|
+
"warning"
|
|
6362
|
+
);
|
|
6363
|
+
} else {
|
|
6364
|
+
const result2 = await accountManager.recordBillingLimitHit(requestAccountIndex);
|
|
6365
|
+
if (result2.isConfirmed) {
|
|
6366
|
+
const resetTime = /* @__PURE__ */ new Date();
|
|
6367
|
+
resetTime.setDate(resetTime.getDate() + 1);
|
|
6368
|
+
resetTime.setHours(0, 0, 0, 0);
|
|
6369
|
+
const hoursUntilReset = Math.ceil(
|
|
6370
|
+
(resetTime.getTime() - Date.now()) / (1e3 * 60 * 60)
|
|
6371
|
+
);
|
|
6372
|
+
await showToast(
|
|
6373
|
+
`\u{1F6AB} Key ${String(position)} billing limit reached - cooldown for ${String(hoursUntilReset)}h`,
|
|
6374
|
+
"warning"
|
|
6375
|
+
);
|
|
6376
|
+
} else {
|
|
6377
|
+
debugLog(
|
|
6378
|
+
`Billing limit hit ${2 - result2.hitsNeeded}/2 for key ${String(position)} - not confirmed yet`
|
|
6379
|
+
);
|
|
6380
|
+
}
|
|
6381
|
+
}
|
|
6382
|
+
} else if (accountManager) {
|
|
6383
|
+
debugLog(`HTTP ${response.status} but not billing limit for key ${String(position)}`);
|
|
6384
|
+
await accountManager.resetBillingLimitHits(requestAccountIndex);
|
|
6385
|
+
await accountManager.markAccountFailure(requestAccountIndex);
|
|
6282
6386
|
}
|
|
6283
|
-
} catch {
|
|
6387
|
+
} catch (error) {
|
|
6388
|
+
debugLog("Error reading response body:", error);
|
|
6284
6389
|
}
|
|
6285
6390
|
}
|
|
6286
6391
|
return response;
|
|
6287
6392
|
} catch (error) {
|
|
6288
|
-
await accountManager.markAccountFailure(
|
|
6393
|
+
await accountManager.markAccountFailure(requestAccountIndex);
|
|
6289
6394
|
throw error;
|
|
6290
6395
|
}
|
|
6291
6396
|
}
|
package/dist/plugin.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"plugin.d.ts","sourceRoot":"","sources":["../src/plugin.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,qBAAqB,CAAC;AAElD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"plugin.d.ts","sourceRoot":"","sources":["../src/plugin.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,qBAAqB,CAAC;AAElD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AA+F9C,eAAO,MAAM,iBAAiB,EAAE,MAkL/B,CAAC;AAEF,eAAe,iBAAiB,CAAC;AACjC,YAAY,EAAE,WAAW,EAAE,CAAC"}
|
package/dist/plugin.js
CHANGED
|
@@ -1,7 +1,25 @@
|
|
|
1
1
|
import { KimiAccountManager } from './accounts.js';
|
|
2
|
+
const BILLING_LIMIT_PATTERNS = [
|
|
3
|
+
"you've reached your usage limit for this billing cycle",
|
|
4
|
+
'billing limit',
|
|
5
|
+
'usage limit exceeded',
|
|
6
|
+
'quota exceeded',
|
|
7
|
+
'insufficient credits',
|
|
8
|
+
'payment required',
|
|
9
|
+
];
|
|
10
|
+
const HARD_BILLING_LIMIT_PATTERNS = [
|
|
11
|
+
"you've reached your usage limit for this billing cycle",
|
|
12
|
+
'your quota will be refreshed in the next cycle',
|
|
13
|
+
'from=quota-upgrade',
|
|
14
|
+
];
|
|
15
|
+
const DEBUG_MODE = process.env.KIMI_ROTATOR_DEBUG === 'true';
|
|
2
16
|
let accountManager = null;
|
|
3
|
-
let currentAccountIndex = 0;
|
|
4
17
|
let originalFetch = null;
|
|
18
|
+
function debugLog(message, data) {
|
|
19
|
+
if (DEBUG_MODE) {
|
|
20
|
+
console.log(`[KimiRotator Debug] ${message}`, data ?? '');
|
|
21
|
+
}
|
|
22
|
+
}
|
|
5
23
|
async function getAccountManager() {
|
|
6
24
|
if (!accountManager) {
|
|
7
25
|
accountManager = new KimiAccountManager();
|
|
@@ -17,7 +35,6 @@ async function getAuth() {
|
|
|
17
35
|
if (!result) {
|
|
18
36
|
return null;
|
|
19
37
|
}
|
|
20
|
-
currentAccountIndex = result.index;
|
|
21
38
|
return {
|
|
22
39
|
type: 'api',
|
|
23
40
|
key: result.account.key,
|
|
@@ -73,9 +90,9 @@ export const KimiRotatorPlugin = async ({ client }) => {
|
|
|
73
90
|
}
|
|
74
91
|
const nextAccount = await accountManager.getNextAccount();
|
|
75
92
|
if (nextAccount) {
|
|
76
|
-
|
|
93
|
+
const requestAccountIndex = nextAccount.index;
|
|
77
94
|
const keyLabel = nextAccount.account.key.substring(0, 18) + '...';
|
|
78
|
-
const position =
|
|
95
|
+
const position = requestAccountIndex + 1;
|
|
79
96
|
const allKeysNow = await accountManager.listKeys();
|
|
80
97
|
const total = allKeysNow.length;
|
|
81
98
|
await showToast(`🔄 Using key: ${keyLabel} (${String(position)}/${String(total)})`, 'info');
|
|
@@ -93,38 +110,62 @@ export const KimiRotatorPlugin = async ({ client }) => {
|
|
|
93
110
|
if (response.status === 429) {
|
|
94
111
|
const retryAfter = response.headers.get('retry-after');
|
|
95
112
|
const retryAfterMs = retryAfter ? parseInt(retryAfter, 10) * 1000 : 60000;
|
|
96
|
-
await accountManager.markAccountRateLimited(
|
|
113
|
+
await accountManager.markAccountRateLimited(requestAccountIndex, retryAfterMs);
|
|
97
114
|
await showToast(`⚠️ Key ${String(position)} rate limited`, 'warning');
|
|
98
115
|
}
|
|
99
116
|
else if (response.ok) {
|
|
100
|
-
await accountManager.markAccountSuccess(
|
|
117
|
+
await accountManager.markAccountSuccess(requestAccountIndex, responseTime, today);
|
|
101
118
|
}
|
|
102
119
|
else if (response.status >= 500) {
|
|
103
|
-
await accountManager.markAccountFailure(
|
|
120
|
+
await accountManager.markAccountFailure(requestAccountIndex);
|
|
104
121
|
}
|
|
105
122
|
else if (response.status === 400 || response.status === 403) {
|
|
106
|
-
// Check for billing limit error in response body
|
|
107
|
-
// We need to clone the response to read the body without consuming it
|
|
108
123
|
const clonedResponse = response.clone();
|
|
109
124
|
try {
|
|
110
125
|
const bodyText = await clonedResponse.text();
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
126
|
+
const bodyLower = bodyText.toLowerCase();
|
|
127
|
+
debugLog(`HTTP ${response.status} for key ${String(position)}`, {
|
|
128
|
+
bodyPreview: bodyText.substring(0, 200).replace(/\s+/g, ' '),
|
|
129
|
+
});
|
|
130
|
+
const isBillingLimit = BILLING_LIMIT_PATTERNS.some((pattern) => bodyLower.includes(pattern));
|
|
131
|
+
const isHardBillingLimit = HARD_BILLING_LIMIT_PATTERNS.some((pattern) => bodyLower.includes(pattern));
|
|
132
|
+
if (isBillingLimit && accountManager) {
|
|
133
|
+
if (isHardBillingLimit) {
|
|
134
|
+
await accountManager.markAccountBillingLimited(requestAccountIndex);
|
|
135
|
+
const resetTime = new Date();
|
|
136
|
+
resetTime.setDate(resetTime.getDate() + 1);
|
|
137
|
+
resetTime.setHours(0, 0, 0, 0);
|
|
138
|
+
const hoursUntilReset = Math.ceil((resetTime.getTime() - Date.now()) / (1000 * 60 * 60));
|
|
139
|
+
await showToast(`🚫 Key ${String(position)} billing limit reached - cooldown for ${String(hoursUntilReset)}h`, 'warning');
|
|
140
|
+
}
|
|
141
|
+
else {
|
|
142
|
+
const result = await accountManager.recordBillingLimitHit(requestAccountIndex);
|
|
143
|
+
if (result.isConfirmed) {
|
|
144
|
+
const resetTime = new Date();
|
|
145
|
+
resetTime.setDate(resetTime.getDate() + 1);
|
|
146
|
+
resetTime.setHours(0, 0, 0, 0);
|
|
147
|
+
const hoursUntilReset = Math.ceil((resetTime.getTime() - Date.now()) / (1000 * 60 * 60));
|
|
148
|
+
await showToast(`🚫 Key ${String(position)} billing limit reached - cooldown for ${String(hoursUntilReset)}h`, 'warning');
|
|
149
|
+
}
|
|
150
|
+
else {
|
|
151
|
+
debugLog(`Billing limit hit ${2 - result.hitsNeeded}/2 for key ${String(position)} - not confirmed yet`);
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
else if (accountManager) {
|
|
156
|
+
debugLog(`HTTP ${response.status} but not billing limit for key ${String(position)}`);
|
|
157
|
+
await accountManager.resetBillingLimitHits(requestAccountIndex);
|
|
158
|
+
await accountManager.markAccountFailure(requestAccountIndex);
|
|
118
159
|
}
|
|
119
160
|
}
|
|
120
|
-
catch {
|
|
121
|
-
|
|
161
|
+
catch (error) {
|
|
162
|
+
debugLog('Error reading response body:', error);
|
|
122
163
|
}
|
|
123
164
|
}
|
|
124
165
|
return response;
|
|
125
166
|
}
|
|
126
167
|
catch (error) {
|
|
127
|
-
await accountManager.markAccountFailure(
|
|
168
|
+
await accountManager.markAccountFailure(requestAccountIndex);
|
|
128
169
|
throw error;
|
|
129
170
|
}
|
|
130
171
|
}
|
package/dist/plugin.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"plugin.js","sourceRoot":"","sources":["../src/plugin.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,kBAAkB,EAAE,MAAM,eAAe,CAAC;AAQnD,IAAI,cAAc,GAA8B,IAAI,CAAC;AACrD,IAAI,
|
|
1
|
+
{"version":3,"file":"plugin.js","sourceRoot":"","sources":["../src/plugin.ts"],"names":[],"mappings":"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"}
|
package/dist/types.d.ts
CHANGED
|
@@ -8,6 +8,7 @@ export declare const KimiAccountSchema: z.ZodObject<{
|
|
|
8
8
|
billingLimitResetTime: z.ZodDefault<z.ZodNumber>;
|
|
9
9
|
healthScore: z.ZodDefault<z.ZodNumber>;
|
|
10
10
|
consecutiveFailures: z.ZodDefault<z.ZodNumber>;
|
|
11
|
+
consecutiveBillingLimitHits: z.ZodDefault<z.ZodNumber>;
|
|
11
12
|
totalRequests: z.ZodDefault<z.ZodNumber>;
|
|
12
13
|
successfulRequests: z.ZodDefault<z.ZodNumber>;
|
|
13
14
|
responseTimes: z.ZodDefault<z.ZodArray<z.ZodNumber, "many">>;
|
|
@@ -20,6 +21,7 @@ export declare const KimiAccountSchema: z.ZodObject<{
|
|
|
20
21
|
billingLimitResetTime: number;
|
|
21
22
|
healthScore: number;
|
|
22
23
|
consecutiveFailures: number;
|
|
24
|
+
consecutiveBillingLimitHits: number;
|
|
23
25
|
totalRequests: number;
|
|
24
26
|
successfulRequests: number;
|
|
25
27
|
responseTimes: number[];
|
|
@@ -34,6 +36,7 @@ export declare const KimiAccountSchema: z.ZodObject<{
|
|
|
34
36
|
billingLimitResetTime?: number | undefined;
|
|
35
37
|
healthScore?: number | undefined;
|
|
36
38
|
consecutiveFailures?: number | undefined;
|
|
39
|
+
consecutiveBillingLimitHits?: number | undefined;
|
|
37
40
|
totalRequests?: number | undefined;
|
|
38
41
|
successfulRequests?: number | undefined;
|
|
39
42
|
responseTimes?: number[] | undefined;
|
|
@@ -50,6 +53,7 @@ export declare const KimiAccountsConfigSchema: z.ZodObject<{
|
|
|
50
53
|
billingLimitResetTime: z.ZodDefault<z.ZodNumber>;
|
|
51
54
|
healthScore: z.ZodDefault<z.ZodNumber>;
|
|
52
55
|
consecutiveFailures: z.ZodDefault<z.ZodNumber>;
|
|
56
|
+
consecutiveBillingLimitHits: z.ZodDefault<z.ZodNumber>;
|
|
53
57
|
totalRequests: z.ZodDefault<z.ZodNumber>;
|
|
54
58
|
successfulRequests: z.ZodDefault<z.ZodNumber>;
|
|
55
59
|
responseTimes: z.ZodDefault<z.ZodArray<z.ZodNumber, "many">>;
|
|
@@ -62,6 +66,7 @@ export declare const KimiAccountsConfigSchema: z.ZodObject<{
|
|
|
62
66
|
billingLimitResetTime: number;
|
|
63
67
|
healthScore: number;
|
|
64
68
|
consecutiveFailures: number;
|
|
69
|
+
consecutiveBillingLimitHits: number;
|
|
65
70
|
totalRequests: number;
|
|
66
71
|
successfulRequests: number;
|
|
67
72
|
responseTimes: number[];
|
|
@@ -76,6 +81,7 @@ export declare const KimiAccountsConfigSchema: z.ZodObject<{
|
|
|
76
81
|
billingLimitResetTime?: number | undefined;
|
|
77
82
|
healthScore?: number | undefined;
|
|
78
83
|
consecutiveFailures?: number | undefined;
|
|
84
|
+
consecutiveBillingLimitHits?: number | undefined;
|
|
79
85
|
totalRequests?: number | undefined;
|
|
80
86
|
successfulRequests?: number | undefined;
|
|
81
87
|
responseTimes?: number[] | undefined;
|
|
@@ -95,6 +101,7 @@ export declare const KimiAccountsConfigSchema: z.ZodObject<{
|
|
|
95
101
|
billingLimitResetTime: number;
|
|
96
102
|
healthScore: number;
|
|
97
103
|
consecutiveFailures: number;
|
|
104
|
+
consecutiveBillingLimitHits: number;
|
|
98
105
|
totalRequests: number;
|
|
99
106
|
successfulRequests: number;
|
|
100
107
|
responseTimes: number[];
|
|
@@ -115,6 +122,7 @@ export declare const KimiAccountsConfigSchema: z.ZodObject<{
|
|
|
115
122
|
billingLimitResetTime?: number | undefined;
|
|
116
123
|
healthScore?: number | undefined;
|
|
117
124
|
consecutiveFailures?: number | undefined;
|
|
125
|
+
consecutiveBillingLimitHits?: number | undefined;
|
|
118
126
|
totalRequests?: number | undefined;
|
|
119
127
|
successfulRequests?: number | undefined;
|
|
120
128
|
responseTimes?: number[] | undefined;
|
package/dist/types.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,eAAO,MAAM,iBAAiB
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,eAAO,MAAM,iBAAiB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAc5B,CAAC;AAEH,eAAO,MAAM,wBAAwB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAOnC,CAAC;AAEH,MAAM,MAAM,WAAW,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,iBAAiB,CAAC,CAAC;AAC5D,MAAM,MAAM,kBAAkB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,wBAAwB,CAAC,CAAC;AAE1E,eAAO,MAAM,eAAe,EAAE,IAAI,CAAC,WAAW,EAAE,KAAK,GAAG,SAAS,GAAG,UAAU,CAU7E,CAAC;AAEF,eAAO,MAAM,cAAc,EAAE,IAAI,CAAC,kBAAkB,EAAE,UAAU,CAM/D,CAAC"}
|
package/dist/types.js
CHANGED
|
@@ -8,6 +8,7 @@ export const KimiAccountSchema = z.object({
|
|
|
8
8
|
billingLimitResetTime: z.number().default(0),
|
|
9
9
|
healthScore: z.number().min(0).max(100).default(100),
|
|
10
10
|
consecutiveFailures: z.number().default(0),
|
|
11
|
+
consecutiveBillingLimitHits: z.number().default(0),
|
|
11
12
|
totalRequests: z.number().default(0),
|
|
12
13
|
successfulRequests: z.number().default(0),
|
|
13
14
|
responseTimes: z.array(z.number()).default([]),
|
|
@@ -26,6 +27,7 @@ export const DEFAULT_ACCOUNT = {
|
|
|
26
27
|
billingLimitResetTime: 0,
|
|
27
28
|
healthScore: 100,
|
|
28
29
|
consecutiveFailures: 0,
|
|
30
|
+
consecutiveBillingLimitHits: 0,
|
|
29
31
|
totalRequests: 0,
|
|
30
32
|
successfulRequests: 0,
|
|
31
33
|
responseTimes: [],
|
package/dist/types.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,MAAM,CAAC,MAAM,iBAAiB,GAAG,CAAC,CAAC,MAAM,CAAC;IACxC,GAAG,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;IACtB,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IAC3B,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE;IACnB,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE;IACpB,kBAAkB,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC;IACzC,qBAAqB,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC;IAC5C,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC;IACpD,mBAAmB,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC;IAC1C,aAAa,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC;IACpC,kBAAkB,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC;IACzC,aAAa,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC;IAC9C,aAAa,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC;CAChD,CAAC,CAAC;AAEH,MAAM,CAAC,MAAM,wBAAwB,GAAG,CAAC,CAAC,MAAM,CAAC;IAC/C,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC;IAC9B,QAAQ,EAAE,CAAC,CAAC,KAAK,CAAC,iBAAiB,CAAC;IACpC,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC;IAClC,gBAAgB,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,aAAa,EAAE,cAAc,EAAE,QAAQ,CAAC,CAAC,CAAC,OAAO,CAAC,cAAc,CAAC;IAC3F,iBAAiB,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC;IAC5C,4BAA4B,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC;CACtE,CAAC,CAAC;AAKH,MAAM,CAAC,MAAM,eAAe,GAAsD;IAChF,kBAAkB,EAAE,CAAC;IACrB,qBAAqB,EAAE,CAAC;IACxB,WAAW,EAAE,GAAG;IAChB,mBAAmB,EAAE,CAAC;IACtB,aAAa,EAAE,CAAC;IAChB,kBAAkB,EAAE,CAAC;IACrB,aAAa,EAAE,EAAE;IACjB,aAAa,EAAE,EAAE;CAClB,CAAC;AAEF,MAAM,CAAC,MAAM,cAAc,GAAyC;IAClE,OAAO,EAAE,CAAC;IACV,WAAW,EAAE,CAAC;IACd,gBAAgB,EAAE,cAAc;IAChC,iBAAiB,EAAE,IAAI;IACvB,4BAA4B,EAAE,EAAE;CACjC,CAAC"}
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,MAAM,CAAC,MAAM,iBAAiB,GAAG,CAAC,CAAC,MAAM,CAAC;IACxC,GAAG,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;IACtB,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IAC3B,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE;IACnB,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE;IACpB,kBAAkB,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC;IACzC,qBAAqB,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC;IAC5C,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC;IACpD,mBAAmB,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC;IAC1C,2BAA2B,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC;IAClD,aAAa,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC;IACpC,kBAAkB,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC;IACzC,aAAa,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC;IAC9C,aAAa,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC;CAChD,CAAC,CAAC;AAEH,MAAM,CAAC,MAAM,wBAAwB,GAAG,CAAC,CAAC,MAAM,CAAC;IAC/C,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC;IAC9B,QAAQ,EAAE,CAAC,CAAC,KAAK,CAAC,iBAAiB,CAAC;IACpC,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC;IAClC,gBAAgB,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,aAAa,EAAE,cAAc,EAAE,QAAQ,CAAC,CAAC,CAAC,OAAO,CAAC,cAAc,CAAC;IAC3F,iBAAiB,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC;IAC5C,4BAA4B,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC;CACtE,CAAC,CAAC;AAKH,MAAM,CAAC,MAAM,eAAe,GAAsD;IAChF,kBAAkB,EAAE,CAAC;IACrB,qBAAqB,EAAE,CAAC;IACxB,WAAW,EAAE,GAAG;IAChB,mBAAmB,EAAE,CAAC;IACtB,2BAA2B,EAAE,CAAC;IAC9B,aAAa,EAAE,CAAC;IAChB,kBAAkB,EAAE,CAAC;IACrB,aAAa,EAAE,EAAE;IACjB,aAAa,EAAE,EAAE;CAClB,CAAC;AAEF,MAAM,CAAC,MAAM,cAAc,GAAyC;IAClE,OAAO,EAAE,CAAC;IACV,WAAW,EAAE,CAAC;IACd,gBAAgB,EAAE,cAAc;IAChC,iBAAiB,EAAE,IAAI;IACvB,4BAA4B,EAAE,EAAE;CACjC,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "opencode-kimi-rotator",
|
|
3
|
-
"version": "1.2.
|
|
3
|
+
"version": "1.2.6",
|
|
4
4
|
"description": "Kimi API Key Rotator for OpenCode - Automatically rotate between multiple Kimi API keys to handle rate limits",
|
|
5
5
|
"main": "./dist/plugin.js",
|
|
6
6
|
"types": "dist/index.d.ts",
|
|
@@ -74,4 +74,4 @@
|
|
|
74
74
|
"publishConfig": {
|
|
75
75
|
"access": "public"
|
|
76
76
|
}
|
|
77
|
-
}
|
|
77
|
+
}
|
package/src/plugin.ts
CHANGED
|
@@ -7,10 +7,32 @@ interface OpenCodeAuth {
|
|
|
7
7
|
key: string;
|
|
8
8
|
}
|
|
9
9
|
|
|
10
|
+
const BILLING_LIMIT_PATTERNS = [
|
|
11
|
+
"you've reached your usage limit for this billing cycle",
|
|
12
|
+
'billing limit',
|
|
13
|
+
'usage limit exceeded',
|
|
14
|
+
'quota exceeded',
|
|
15
|
+
'insufficient credits',
|
|
16
|
+
'payment required',
|
|
17
|
+
];
|
|
18
|
+
|
|
19
|
+
const HARD_BILLING_LIMIT_PATTERNS = [
|
|
20
|
+
"you've reached your usage limit for this billing cycle",
|
|
21
|
+
'your quota will be refreshed in the next cycle',
|
|
22
|
+
'from=quota-upgrade',
|
|
23
|
+
];
|
|
24
|
+
|
|
25
|
+
const DEBUG_MODE = process.env.KIMI_ROTATOR_DEBUG === 'true';
|
|
26
|
+
|
|
10
27
|
let accountManager: KimiAccountManager | null = null;
|
|
11
|
-
let currentAccountIndex = 0;
|
|
12
28
|
let originalFetch: typeof globalThis.fetch | null = null;
|
|
13
29
|
|
|
30
|
+
function debugLog(message: string, data?: unknown) {
|
|
31
|
+
if (DEBUG_MODE) {
|
|
32
|
+
console.log(`[KimiRotator Debug] ${message}`, data ?? '');
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
|
|
14
36
|
async function getAccountManager(): Promise<KimiAccountManager> {
|
|
15
37
|
if (!accountManager) {
|
|
16
38
|
accountManager = new KimiAccountManager();
|
|
@@ -29,8 +51,6 @@ async function getAuth(): Promise<OpenCodeAuth | null> {
|
|
|
29
51
|
return null;
|
|
30
52
|
}
|
|
31
53
|
|
|
32
|
-
currentAccountIndex = result.index;
|
|
33
|
-
|
|
34
54
|
return {
|
|
35
55
|
type: 'api',
|
|
36
56
|
key: result.account.key,
|
|
@@ -102,9 +122,9 @@ export const KimiRotatorPlugin: Plugin = async ({ client }) => {
|
|
|
102
122
|
}
|
|
103
123
|
const nextAccount = await accountManager.getNextAccount();
|
|
104
124
|
if (nextAccount) {
|
|
105
|
-
|
|
125
|
+
const requestAccountIndex = nextAccount.index;
|
|
106
126
|
const keyLabel = nextAccount.account.key.substring(0, 18) + '...';
|
|
107
|
-
const position =
|
|
127
|
+
const position = requestAccountIndex + 1;
|
|
108
128
|
const allKeysNow = await accountManager.listKeys();
|
|
109
129
|
const total = allKeysNow.length;
|
|
110
130
|
|
|
@@ -128,37 +148,74 @@ export const KimiRotatorPlugin: Plugin = async ({ client }) => {
|
|
|
128
148
|
if (response.status === 429) {
|
|
129
149
|
const retryAfter = response.headers.get('retry-after');
|
|
130
150
|
const retryAfterMs = retryAfter ? parseInt(retryAfter, 10) * 1000 : 60000;
|
|
131
|
-
await accountManager.markAccountRateLimited(
|
|
151
|
+
await accountManager.markAccountRateLimited(requestAccountIndex, retryAfterMs);
|
|
132
152
|
await showToast(`⚠️ Key ${String(position)} rate limited`, 'warning');
|
|
133
153
|
} else if (response.ok) {
|
|
134
|
-
await accountManager.markAccountSuccess(
|
|
154
|
+
await accountManager.markAccountSuccess(requestAccountIndex, responseTime, today);
|
|
135
155
|
} else if (response.status >= 500) {
|
|
136
|
-
await accountManager.markAccountFailure(
|
|
156
|
+
await accountManager.markAccountFailure(requestAccountIndex);
|
|
137
157
|
} else if (response.status === 400 || response.status === 403) {
|
|
138
|
-
// Check for billing limit error in response body
|
|
139
|
-
// We need to clone the response to read the body without consuming it
|
|
140
158
|
const clonedResponse = response.clone();
|
|
141
159
|
try {
|
|
142
160
|
const bodyText = await clonedResponse.text();
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
161
|
+
const bodyLower = bodyText.toLowerCase();
|
|
162
|
+
|
|
163
|
+
debugLog(`HTTP ${response.status} for key ${String(position)}`, {
|
|
164
|
+
bodyPreview: bodyText.substring(0, 200).replace(/\s+/g, ' '),
|
|
165
|
+
});
|
|
166
|
+
|
|
167
|
+
const isBillingLimit = BILLING_LIMIT_PATTERNS.some((pattern) =>
|
|
168
|
+
bodyLower.includes(pattern)
|
|
169
|
+
);
|
|
170
|
+
const isHardBillingLimit = HARD_BILLING_LIMIT_PATTERNS.some((pattern) =>
|
|
171
|
+
bodyLower.includes(pattern)
|
|
172
|
+
);
|
|
173
|
+
|
|
174
|
+
if (isBillingLimit && accountManager) {
|
|
175
|
+
if (isHardBillingLimit) {
|
|
176
|
+
await accountManager.markAccountBillingLimited(requestAccountIndex);
|
|
177
|
+
const resetTime = new Date();
|
|
178
|
+
resetTime.setDate(resetTime.getDate() + 1);
|
|
179
|
+
resetTime.setHours(0, 0, 0, 0);
|
|
180
|
+
const hoursUntilReset = Math.ceil(
|
|
181
|
+
(resetTime.getTime() - Date.now()) / (1000 * 60 * 60)
|
|
182
|
+
);
|
|
183
|
+
await showToast(
|
|
184
|
+
`🚫 Key ${String(position)} billing limit reached - cooldown for ${String(hoursUntilReset)}h`,
|
|
185
|
+
'warning'
|
|
186
|
+
);
|
|
187
|
+
} else {
|
|
188
|
+
const result = await accountManager.recordBillingLimitHit(requestAccountIndex);
|
|
189
|
+
if (result.isConfirmed) {
|
|
190
|
+
const resetTime = new Date();
|
|
191
|
+
resetTime.setDate(resetTime.getDate() + 1);
|
|
192
|
+
resetTime.setHours(0, 0, 0, 0);
|
|
193
|
+
const hoursUntilReset = Math.ceil(
|
|
194
|
+
(resetTime.getTime() - Date.now()) / (1000 * 60 * 60)
|
|
195
|
+
);
|
|
196
|
+
await showToast(
|
|
197
|
+
`🚫 Key ${String(position)} billing limit reached - cooldown for ${String(hoursUntilReset)}h`,
|
|
198
|
+
'warning'
|
|
199
|
+
);
|
|
200
|
+
} else {
|
|
201
|
+
debugLog(
|
|
202
|
+
`Billing limit hit ${2 - result.hitsNeeded}/2 for key ${String(position)} - not confirmed yet`
|
|
203
|
+
);
|
|
204
|
+
}
|
|
205
|
+
}
|
|
206
|
+
} else if (accountManager) {
|
|
207
|
+
debugLog(`HTTP ${response.status} but not billing limit for key ${String(position)}`);
|
|
208
|
+
await accountManager.resetBillingLimitHits(requestAccountIndex);
|
|
209
|
+
await accountManager.markAccountFailure(requestAccountIndex);
|
|
153
210
|
}
|
|
154
|
-
} catch {
|
|
155
|
-
|
|
211
|
+
} catch (error) {
|
|
212
|
+
debugLog('Error reading response body:', error);
|
|
156
213
|
}
|
|
157
214
|
}
|
|
158
215
|
|
|
159
216
|
return response;
|
|
160
217
|
} catch (error: unknown) {
|
|
161
|
-
await accountManager.markAccountFailure(
|
|
218
|
+
await accountManager.markAccountFailure(requestAccountIndex);
|
|
162
219
|
throw error;
|
|
163
220
|
}
|
|
164
221
|
}
|