opencode-kimi-rotator 1.2.3 → 1.2.5
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 +59 -1
- package/bin/cli.js +36 -0
- package/dist/accounts.d.ts +6 -0
- package/dist/accounts.d.ts.map +1 -1
- package/dist/accounts.js +40 -5
- package/dist/accounts.js.map +1 -1
- package/dist/plugin.bundle.js +165 -23
- package/dist/plugin.d.ts.map +1 -1
- package/dist/plugin.js +60 -19
- package/dist/plugin.js.map +1 -1
- package/dist/storage.d.ts +15 -0
- package/dist/storage.d.ts.map +1 -1
- package/dist/storage.js +52 -0
- package/dist/storage.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 +1 -1
- 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
|
|
@@ -779,6 +804,39 @@ async setActiveIndex(index: number): Promise<void>
|
|
|
779
804
|
- **index** — Account index to set as active
|
|
780
805
|
- **Throws** — Error if index is invalid
|
|
781
806
|
|
|
807
|
+
##### `getActiveIndex()`
|
|
808
|
+
|
|
809
|
+
Returns the current active account index.
|
|
810
|
+
|
|
811
|
+
```typescript
|
|
812
|
+
async getActiveIndex(): Promise<number>
|
|
813
|
+
```
|
|
814
|
+
|
|
815
|
+
- **Returns** — The current active index from the configuration
|
|
816
|
+
|
|
817
|
+
##### `getAndIncrementActiveIndex(availableIndices)`
|
|
818
|
+
|
|
819
|
+
Atomically gets the current active index and sets the next one for round-robin rotation. This ensures proper serialization of rotation operations.
|
|
820
|
+
|
|
821
|
+
```typescript
|
|
822
|
+
async getAndIncrementActiveIndex(availableIndices: number[]): Promise<number>
|
|
823
|
+
```
|
|
824
|
+
|
|
825
|
+
- **availableIndices** — Array of available account indices to rotate through
|
|
826
|
+
- **Returns** — The selected next index (guaranteed to be unique per call)
|
|
827
|
+
- **Throws** — Error if no available indices are provided
|
|
828
|
+
|
|
829
|
+
##### `atomicSetActiveIndex(preferredIndex)`
|
|
830
|
+
|
|
831
|
+
Atomically sets the active index to a specific value. Use this for sticky and health-based rotation to claim an account.
|
|
832
|
+
|
|
833
|
+
```typescript
|
|
834
|
+
async atomicSetActiveIndex(preferredIndex: number): Promise<number>
|
|
835
|
+
```
|
|
836
|
+
|
|
837
|
+
- **preferredIndex** — The desired index to set
|
|
838
|
+
- **Returns** — The actual index that was set (may differ if validation fails)
|
|
839
|
+
|
|
782
840
|
##### `updateAccount(index, updates)`
|
|
783
841
|
|
|
784
842
|
Updates specific fields of an account.
|
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,38 @@ async function promptPassword(prompt) {
|
|
|
545
548
|
});
|
|
546
549
|
}
|
|
547
550
|
|
|
551
|
+
async function clearLimits(manager, args) {
|
|
552
|
+
const index = parseInt(args[0], 10);
|
|
553
|
+
|
|
554
|
+
if (isNaN(index)) {
|
|
555
|
+
console.error('Usage: opencode-kimi clear-limits <index>');
|
|
556
|
+
console.error('');
|
|
557
|
+
console.error('Clear billing and rate limits for a specific key.');
|
|
558
|
+
console.error('Use "all" to clear limits for all keys.');
|
|
559
|
+
process.exit(1);
|
|
560
|
+
}
|
|
561
|
+
|
|
562
|
+
if (args[0] === 'all') {
|
|
563
|
+
const accounts = await manager.listKeys();
|
|
564
|
+
let cleared = 0;
|
|
565
|
+
for (let i = 0; i < accounts.length; i++) {
|
|
566
|
+
await manager.clearAccountLimits(i);
|
|
567
|
+
cleared++;
|
|
568
|
+
}
|
|
569
|
+
console.log(`✓ Cleared limits for all ${cleared} key(s)`);
|
|
570
|
+
return;
|
|
571
|
+
}
|
|
572
|
+
|
|
573
|
+
const accounts = await manager.listKeys();
|
|
574
|
+
if (index < 0 || index >= accounts.length) {
|
|
575
|
+
console.error(`Invalid index. Valid range: 0-${accounts.length - 1}`);
|
|
576
|
+
process.exit(1);
|
|
577
|
+
}
|
|
578
|
+
|
|
579
|
+
await manager.clearAccountLimits(index);
|
|
580
|
+
console.log(`✓ Cleared limits for key: ${accounts[index].name} (index ${index})`);
|
|
581
|
+
}
|
|
582
|
+
|
|
548
583
|
function showHelp() {
|
|
549
584
|
console.log('Kimi API Key Rotator for OpenCode');
|
|
550
585
|
console.log('');
|
|
@@ -561,6 +596,7 @@ function showHelp() {
|
|
|
561
596
|
console.log(' refresh-health Manually refresh health scores');
|
|
562
597
|
console.log(' set-auto-refresh <true|false> Enable/disable auto-refresh');
|
|
563
598
|
console.log(' set-cooldown <minutes> Set health refresh cooldown');
|
|
599
|
+
console.log(' clear-limits <index|all> Clear billing/rate limits for key(s)');
|
|
564
600
|
console.log(' export-keys [file] Export keys to encrypted file');
|
|
565
601
|
console.log(' import-keys <file> Import keys from encrypted file');
|
|
566
602
|
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>;
|
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;YAmBlB,cAAc;YAoCd,mBAAmB;IAuDjC,OAAO,CAAC,qBAAqB;IAa7B,OAAO,CAAC,mBAAmB;IAS3B,OAAO,CAAC,wBAAwB;IAchC,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);
|
|
@@ -179,9 +216,7 @@ export class KimiAccountManager {
|
|
|
179
216
|
const account = config.accounts[soonestIndex];
|
|
180
217
|
return { account, index: soonestIndex, reason: 'all-rate-limited' };
|
|
181
218
|
}
|
|
182
|
-
const
|
|
183
|
-
const nextIndex = availableIndices.find((idx) => idx > currentIndex) ?? availableIndices[0];
|
|
184
|
-
await this.storage.setActiveIndex(nextIndex);
|
|
219
|
+
const nextIndex = await this.storage.getAndIncrementActiveIndex(availableIndices);
|
|
185
220
|
await this.markAccountUsed(nextIndex);
|
|
186
221
|
return {
|
|
187
222
|
account: config.accounts[nextIndex],
|
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: [],
|
|
@@ -5806,6 +5808,56 @@ var KimiStorage = class {
|
|
|
5806
5808
|
config.activeIndex = index;
|
|
5807
5809
|
await this.saveConfig(config);
|
|
5808
5810
|
}
|
|
5811
|
+
async getActiveIndex() {
|
|
5812
|
+
const config = await this.loadConfig();
|
|
5813
|
+
return config.activeIndex;
|
|
5814
|
+
}
|
|
5815
|
+
/**
|
|
5816
|
+
* Atomically get the current active index and set the next one.
|
|
5817
|
+
* This ensures proper serialization of rotation operations.
|
|
5818
|
+
* @param availableIndices - Array of available account indices to rotate through
|
|
5819
|
+
* @returns The selected next index (guaranteed to be unique per call)
|
|
5820
|
+
*/
|
|
5821
|
+
async getAndIncrementActiveIndex(availableIndices) {
|
|
5822
|
+
if (availableIndices.length === 0) {
|
|
5823
|
+
throw new Error("No available indices to rotate through");
|
|
5824
|
+
}
|
|
5825
|
+
const release = await this.acquireLock();
|
|
5826
|
+
try {
|
|
5827
|
+
const data = await fs.readFile(this.accountsFilePath, "utf-8");
|
|
5828
|
+
const parsed = JSON.parse(data);
|
|
5829
|
+
const config = KimiAccountsConfigSchema.parse(parsed);
|
|
5830
|
+
const currentIndex = config.activeIndex;
|
|
5831
|
+
const nextIndex = availableIndices.find((idx) => idx > currentIndex) ?? availableIndices[0];
|
|
5832
|
+
config.activeIndex = nextIndex;
|
|
5833
|
+
const validated = KimiAccountsConfigSchema.parse(config);
|
|
5834
|
+
await fs.writeFile(this.accountsFilePath, JSON.stringify(validated, null, 2), "utf-8");
|
|
5835
|
+
return nextIndex;
|
|
5836
|
+
} finally {
|
|
5837
|
+
await release();
|
|
5838
|
+
}
|
|
5839
|
+
}
|
|
5840
|
+
/**
|
|
5841
|
+
* Atomically set the active index to a specific value.
|
|
5842
|
+
* Use this for sticky and health-based rotation to claim an account.
|
|
5843
|
+
* @param preferredIndex - The desired index to set
|
|
5844
|
+
* @returns The actual index that was set (may differ if validation fails)
|
|
5845
|
+
*/
|
|
5846
|
+
async atomicSetActiveIndex(preferredIndex) {
|
|
5847
|
+
const release = await this.acquireLock();
|
|
5848
|
+
try {
|
|
5849
|
+
const data = await fs.readFile(this.accountsFilePath, "utf-8");
|
|
5850
|
+
const parsed = JSON.parse(data);
|
|
5851
|
+
const config = KimiAccountsConfigSchema.parse(parsed);
|
|
5852
|
+
const validatedIndex = Math.max(0, Math.min(preferredIndex, config.accounts.length - 1));
|
|
5853
|
+
config.activeIndex = validatedIndex;
|
|
5854
|
+
const validated = KimiAccountsConfigSchema.parse(config);
|
|
5855
|
+
await fs.writeFile(this.accountsFilePath, JSON.stringify(validated, null, 2), "utf-8");
|
|
5856
|
+
return validatedIndex;
|
|
5857
|
+
} finally {
|
|
5858
|
+
await release();
|
|
5859
|
+
}
|
|
5860
|
+
}
|
|
5809
5861
|
async updateAccount(index, updates) {
|
|
5810
5862
|
const config = await this.loadConfig();
|
|
5811
5863
|
if (index < 0 || index >= config.accounts.length) {
|
|
@@ -5894,7 +5946,8 @@ var KimiAccountManager = class {
|
|
|
5894
5946
|
const updates = {
|
|
5895
5947
|
healthScore: newHealthScore,
|
|
5896
5948
|
successfulRequests: account.successfulRequests + 1,
|
|
5897
|
-
consecutiveFailures: 0
|
|
5949
|
+
consecutiveFailures: 0,
|
|
5950
|
+
consecutiveBillingLimitHits: 0
|
|
5898
5951
|
};
|
|
5899
5952
|
if (responseTime !== void 0) {
|
|
5900
5953
|
const responseTimes = [...account.responseTimes, responseTime];
|
|
@@ -5919,6 +5972,29 @@ var KimiAccountManager = class {
|
|
|
5919
5972
|
consecutiveFailures: account.consecutiveFailures + 1
|
|
5920
5973
|
});
|
|
5921
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
|
+
}
|
|
5922
5998
|
async markAccountBillingLimited(index) {
|
|
5923
5999
|
const account = await this.getAccount(index);
|
|
5924
6000
|
const newHealthScore = Math.max(0, account.healthScore - 30);
|
|
@@ -5928,9 +6004,23 @@ var KimiAccountManager = class {
|
|
|
5928
6004
|
await this.storage.updateAccount(index, {
|
|
5929
6005
|
healthScore: newHealthScore,
|
|
5930
6006
|
billingLimitResetTime: cooldownUntil,
|
|
6007
|
+
consecutiveBillingLimitHits: 2,
|
|
5931
6008
|
consecutiveFailures: account.consecutiveFailures + 1
|
|
5932
6009
|
});
|
|
5933
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
|
+
}
|
|
5934
6024
|
async markAccountFailure(index) {
|
|
5935
6025
|
const account = await this.getAccount(index);
|
|
5936
6026
|
const newHealthScore = Math.max(0, account.healthScore - 20);
|
|
@@ -6006,9 +6096,7 @@ var KimiAccountManager = class {
|
|
|
6006
6096
|
const account = config.accounts[soonestIndex];
|
|
6007
6097
|
return { account, index: soonestIndex, reason: "all-rate-limited" };
|
|
6008
6098
|
}
|
|
6009
|
-
const
|
|
6010
|
-
const nextIndex = availableIndices.find((idx) => idx > currentIndex) ?? availableIndices[0];
|
|
6011
|
-
await this.storage.setActiveIndex(nextIndex);
|
|
6099
|
+
const nextIndex = await this.storage.getAndIncrementActiveIndex(availableIndices);
|
|
6012
6100
|
await this.markAccountUsed(nextIndex);
|
|
6013
6101
|
return {
|
|
6014
6102
|
account: config.accounts[nextIndex],
|
|
@@ -6123,9 +6211,27 @@ var KimiAccountManager = class {
|
|
|
6123
6211
|
};
|
|
6124
6212
|
|
|
6125
6213
|
// src/plugin.ts
|
|
6214
|
+
var BILLING_LIMIT_PATTERNS = [
|
|
6215
|
+
"you've reached your usage limit for this billing cycle",
|
|
6216
|
+
"billing limit",
|
|
6217
|
+
"usage limit exceeded",
|
|
6218
|
+
"quota exceeded",
|
|
6219
|
+
"insufficient credits",
|
|
6220
|
+
"payment required"
|
|
6221
|
+
];
|
|
6222
|
+
var HARD_BILLING_LIMIT_PATTERNS = [
|
|
6223
|
+
"you've reached your usage limit for this billing cycle",
|
|
6224
|
+
"your quota will be refreshed in the next cycle",
|
|
6225
|
+
"from=quota-upgrade"
|
|
6226
|
+
];
|
|
6227
|
+
var DEBUG_MODE = process.env.KIMI_ROTATOR_DEBUG === "true";
|
|
6126
6228
|
var accountManager = null;
|
|
6127
|
-
var currentAccountIndex = 0;
|
|
6128
6229
|
var originalFetch = null;
|
|
6230
|
+
function debugLog(message, data) {
|
|
6231
|
+
if (DEBUG_MODE) {
|
|
6232
|
+
console.log(`[KimiRotator Debug] ${message}`, data ?? "");
|
|
6233
|
+
}
|
|
6234
|
+
}
|
|
6129
6235
|
async function getAccountManager() {
|
|
6130
6236
|
if (!accountManager) {
|
|
6131
6237
|
accountManager = new KimiAccountManager();
|
|
@@ -6139,7 +6245,6 @@ async function getAuth() {
|
|
|
6139
6245
|
if (!result) {
|
|
6140
6246
|
return null;
|
|
6141
6247
|
}
|
|
6142
|
-
currentAccountIndex = result.index;
|
|
6143
6248
|
return {
|
|
6144
6249
|
type: "api",
|
|
6145
6250
|
key: result.account.key
|
|
@@ -6191,9 +6296,9 @@ var KimiRotatorPlugin = async ({ client }) => {
|
|
|
6191
6296
|
}
|
|
6192
6297
|
const nextAccount = await accountManager.getNextAccount();
|
|
6193
6298
|
if (nextAccount) {
|
|
6194
|
-
|
|
6299
|
+
const requestAccountIndex = nextAccount.index;
|
|
6195
6300
|
const keyLabel = nextAccount.account.key.substring(0, 18) + "...";
|
|
6196
|
-
const position =
|
|
6301
|
+
const position = requestAccountIndex + 1;
|
|
6197
6302
|
const allKeysNow = await accountManager.listKeys();
|
|
6198
6303
|
const total = allKeysNow.length;
|
|
6199
6304
|
await showToast(`\u{1F504} Using key: ${keyLabel} (${String(position)}/${String(total)})`, "info");
|
|
@@ -6211,33 +6316,70 @@ var KimiRotatorPlugin = async ({ client }) => {
|
|
|
6211
6316
|
if (response.status === 429) {
|
|
6212
6317
|
const retryAfter = response.headers.get("retry-after");
|
|
6213
6318
|
const retryAfterMs = retryAfter ? parseInt(retryAfter, 10) * 1e3 : 6e4;
|
|
6214
|
-
await accountManager.markAccountRateLimited(
|
|
6319
|
+
await accountManager.markAccountRateLimited(requestAccountIndex, retryAfterMs);
|
|
6215
6320
|
await showToast(`\u26A0\uFE0F Key ${String(position)} rate limited`, "warning");
|
|
6216
6321
|
} else if (response.ok) {
|
|
6217
|
-
await accountManager.markAccountSuccess(
|
|
6322
|
+
await accountManager.markAccountSuccess(requestAccountIndex, responseTime, today);
|
|
6218
6323
|
} else if (response.status >= 500) {
|
|
6219
|
-
await accountManager.markAccountFailure(
|
|
6324
|
+
await accountManager.markAccountFailure(requestAccountIndex);
|
|
6220
6325
|
} else if (response.status === 400 || response.status === 403) {
|
|
6221
6326
|
const clonedResponse = response.clone();
|
|
6222
6327
|
try {
|
|
6223
6328
|
const bodyText = await clonedResponse.text();
|
|
6224
|
-
|
|
6225
|
-
|
|
6226
|
-
|
|
6227
|
-
|
|
6228
|
-
|
|
6229
|
-
|
|
6230
|
-
|
|
6231
|
-
|
|
6232
|
-
|
|
6233
|
-
|
|
6329
|
+
const bodyLower = bodyText.toLowerCase();
|
|
6330
|
+
debugLog(`HTTP ${response.status} for key ${String(position)}`, {
|
|
6331
|
+
bodyPreview: bodyText.substring(0, 200).replace(/\s+/g, " ")
|
|
6332
|
+
});
|
|
6333
|
+
const isBillingLimit = BILLING_LIMIT_PATTERNS.some(
|
|
6334
|
+
(pattern) => bodyLower.includes(pattern)
|
|
6335
|
+
);
|
|
6336
|
+
const isHardBillingLimit = HARD_BILLING_LIMIT_PATTERNS.some(
|
|
6337
|
+
(pattern) => bodyLower.includes(pattern)
|
|
6338
|
+
);
|
|
6339
|
+
if (isBillingLimit && accountManager) {
|
|
6340
|
+
if (isHardBillingLimit) {
|
|
6341
|
+
await accountManager.markAccountBillingLimited(requestAccountIndex);
|
|
6342
|
+
const resetTime = /* @__PURE__ */ new Date();
|
|
6343
|
+
resetTime.setDate(resetTime.getDate() + 1);
|
|
6344
|
+
resetTime.setHours(0, 0, 0, 0);
|
|
6345
|
+
const hoursUntilReset = Math.ceil(
|
|
6346
|
+
(resetTime.getTime() - Date.now()) / (1e3 * 60 * 60)
|
|
6347
|
+
);
|
|
6348
|
+
await showToast(
|
|
6349
|
+
`\u{1F6AB} Key ${String(position)} billing limit reached - cooldown for ${String(hoursUntilReset)}h`,
|
|
6350
|
+
"warning"
|
|
6351
|
+
);
|
|
6352
|
+
} else {
|
|
6353
|
+
const result2 = await accountManager.recordBillingLimitHit(requestAccountIndex);
|
|
6354
|
+
if (result2.isConfirmed) {
|
|
6355
|
+
const resetTime = /* @__PURE__ */ new Date();
|
|
6356
|
+
resetTime.setDate(resetTime.getDate() + 1);
|
|
6357
|
+
resetTime.setHours(0, 0, 0, 0);
|
|
6358
|
+
const hoursUntilReset = Math.ceil(
|
|
6359
|
+
(resetTime.getTime() - Date.now()) / (1e3 * 60 * 60)
|
|
6360
|
+
);
|
|
6361
|
+
await showToast(
|
|
6362
|
+
`\u{1F6AB} Key ${String(position)} billing limit reached - cooldown for ${String(hoursUntilReset)}h`,
|
|
6363
|
+
"warning"
|
|
6364
|
+
);
|
|
6365
|
+
} else {
|
|
6366
|
+
debugLog(
|
|
6367
|
+
`Billing limit hit ${2 - result2.hitsNeeded}/2 for key ${String(position)} - not confirmed yet`
|
|
6368
|
+
);
|
|
6369
|
+
}
|
|
6370
|
+
}
|
|
6371
|
+
} else if (accountManager) {
|
|
6372
|
+
debugLog(`HTTP ${response.status} but not billing limit for key ${String(position)}`);
|
|
6373
|
+
await accountManager.resetBillingLimitHits(requestAccountIndex);
|
|
6374
|
+
await accountManager.markAccountFailure(requestAccountIndex);
|
|
6234
6375
|
}
|
|
6235
|
-
} catch {
|
|
6376
|
+
} catch (error) {
|
|
6377
|
+
debugLog("Error reading response body:", error);
|
|
6236
6378
|
}
|
|
6237
6379
|
}
|
|
6238
6380
|
return response;
|
|
6239
6381
|
} catch (error) {
|
|
6240
|
-
await accountManager.markAccountFailure(
|
|
6382
|
+
await accountManager.markAccountFailure(requestAccountIndex);
|
|
6241
6383
|
throw error;
|
|
6242
6384
|
}
|
|
6243
6385
|
}
|
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":"AACA,OAAO,EAAE,kBAAkB,EAAE,MAAM,eAAe,CAAC;AAQnD,MAAM,sBAAsB,GAAG;IAC7B,wDAAwD;IACxD,eAAe;IACf,sBAAsB;IACtB,gBAAgB;IAChB,sBAAsB;IACtB,kBAAkB;CACnB,CAAC;AAEF,MAAM,2BAA2B,GAAG;IAClC,wDAAwD;IACxD,gDAAgD;IAChD,oBAAoB;CACrB,CAAC;AAEF,MAAM,UAAU,GAAG,OAAO,CAAC,GAAG,CAAC,kBAAkB,KAAK,MAAM,CAAC;AAE7D,IAAI,cAAc,GAA8B,IAAI,CAAC;AACrD,IAAI,aAAa,GAAmC,IAAI,CAAC;AAEzD,SAAS,QAAQ,CAAC,OAAe,EAAE,IAAc;IAC/C,IAAI,UAAU,EAAE,CAAC;QACf,OAAO,CAAC,GAAG,CAAC,uBAAuB,OAAO,EAAE,EAAE,IAAI,IAAI,EAAE,CAAC,CAAC;IAC5D,CAAC;AACH,CAAC;AAED,KAAK,UAAU,iBAAiB;IAC9B,IAAI,CAAC,cAAc,EAAE,CAAC;QACpB,cAAc,GAAG,IAAI,kBAAkB,EAAE,CAAC;QAC1C,MAAM,cAAc,CAAC,IAAI,EAAE,CAAC;IAC9B,CAAC;IACD,OAAO,cAAc,CAAC;AACxB,CAAC;AAED,KAAK,UAAU,OAAO;IACpB,MAAM,OAAO,GAAG,MAAM,iBAAiB,EAAE,CAAC;IAC1C,+DAA+D;IAC/D,qEAAqE;IACrE,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,iBAAiB,EAAE,CAAC;IAEjD,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,OAAO,IAAI,CAAC;IACd,CAAC;IAED,OAAO;QACL,IAAI,EAAE,KAAK;QACX,GAAG,EAAE,MAAM,CAAC,OAAO,CAAC,GAAG;KACxB,CAAC;AACJ,CAAC;AAED,IAAI,cAAc,GAMP,IAAI,CAAC;AAEhB,IAAI,UAAU,GAAiE,EAAE,CAAC;AAElF,KAAK,UAAU,SAAS,CAAC,OAAe,EAAE,UAAwC,MAAM;IACtF,IAAI,CAAC,cAAc,EAAE,GAAG,EAAE,SAAS,EAAE,CAAC;QACpC,UAAU,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,OAAO,EAAE,CAAC,CAAC;QACtC,OAAO;IACT,CAAC;IACD,IAAI,CAAC;QACH,MAAM,cAAc,CAAC,GAAG,CAAC,SAAS,CAAC,EAAE,IAAI,EAAE,EAAE,OAAO,EAAE,OAAO,EAAE,EAAE,CAAC,CAAC;IACrE,CAAC;IAAC,MAAM,CAAC;QACP,OAAO;IACT,CAAC;AACH,CAAC;AAED,KAAK,UAAU,eAAe;IAC5B,IAAI,CAAC,cAAc,EAAE,GAAG,EAAE,SAAS;QAAE,OAAO;IAC5C,OAAO,UAAU,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC7B,MAAM,KAAK,GAAG,UAAU,CAAC,KAAK,EAAE,CAAC;QACjC,IAAI,KAAK,EAAE,CAAC;YACV,IAAI,CAAC;gBACH,MAAM,cAAc,CAAC,GAAG,CAAC,SAAS,CAAC;oBACjC,IAAI,EAAE,EAAE,OAAO,EAAE,KAAK,CAAC,OAAO,EAAE,OAAO,EAAE,KAAK,CAAC,OAAO,EAAE;iBACzD,CAAC,CAAC;YACL,CAAC;YAAC,MAAM,CAAC;gBACP,OAAO;YACT,CAAC;QACH,CAAC;IACH,CAAC;AACH,CAAC;AAED,MAAM,CAAC,MAAM,iBAAiB,GAAW,KAAK,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE;IAC5D,cAAc,GAAG,MAAM,CAAC;IAExB,cAAc,GAAG,MAAM,iBAAiB,EAAE,CAAC;IAE3C,+DAA+D;IAC/D,MAAM,MAAM,GAAG,MAAM,cAAc,CAAC,iBAAiB,EAAE,CAAC;IAExD,IAAI,MAAM,EAAE,CAAC;QACX,MAAM,WAAW,GAAG,gCAAgC,CAAC;QACrD,OAAO,CAAC,GAAG,CAAC,kBAAkB,GAAG,WAAW,CAAC;QAC7C,OAAO,CAAC,GAAG,CAAC,iBAAiB,GAAG,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC;IACrD,CAAC;IAED,aAAa,GAAG,UAAU,CAAC,KAAK,CAAC;IACjC,UAAU,CAAC,KAAK,GAAG,KAAK,EACtB,KAA6B,EAC7B,IAAkB,EACC,EAAE;QACrB,MAAM,GAAG,GAAG,OAAO,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,QAAQ,EAAE,CAAC;QAEjE,IAAI,GAAG,CAAC,QAAQ,CAAC,cAAc,CAAC,EAAE,CAAC;YACjC,IAAI,CAAC,cAAc,EAAE,CAAC;gBACpB,MAAM,IAAI,KAAK,CAAC,iCAAiC,CAAC,CAAC;YACrD,CAAC;YACD,MAAM,WAAW,GAAG,MAAM,cAAc,CAAC,cAAc,EAAE,CAAC;YAC1D,IAAI,WAAW,EAAE,CAAC;gBAChB,MAAM,mBAAmB,GAAG,WAAW,CAAC,KAAK,CAAC;gBAC9C,MAAM,QAAQ,GAAG,WAAW,CAAC,OAAO,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,KAAK,CAAC;gBAClE,MAAM,QAAQ,GAAG,mBAAmB,GAAG,CAAC,CAAC;gBACzC,MAAM,UAAU,GAAG,MAAM,cAAc,CAAC,QAAQ,EAAE,CAAC;gBACnD,MAAM,KAAK,GAAG,UAAU,CAAC,MAAM,CAAC;gBAEhC,MAAM,SAAS,CAAC,iBAAiB,QAAQ,KAAK,MAAM,CAAC,QAAQ,CAAC,IAAI,MAAM,CAAC,KAAK,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC;gBAE5F,MAAM,OAAO,GAAG,IAAI,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;gBAC3C,OAAO,CAAC,GAAG,CAAC,WAAW,EAAE,WAAW,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;gBAClD,OAAO,CAAC,MAAM,CAAC,eAAe,CAAC,CAAC;gBAEhC,MAAM,gBAAgB,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;gBACpC,MAAM,KAAK,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;gBAErD,IAAI,CAAC,aAAa,EAAE,CAAC;oBACnB,MAAM,IAAI,KAAK,CAAC,8BAA8B,CAAC,CAAC;gBAClD,CAAC;gBAED,IAAI,CAAC;oBACH,MAAM,QAAQ,GAAG,MAAM,aAAa,CAAC,KAAK,EAAE,EAAE,GAAG,IAAI,EAAE,OAAO,EAAE,CAAC,CAAC;oBAClE,MAAM,YAAY,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,gBAAgB,CAAC;oBAEnD,IAAI,QAAQ,CAAC,MAAM,KAAK,GAAG,EAAE,CAAC;wBAC5B,MAAM,UAAU,GAAG,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC;wBACvD,MAAM,YAAY,GAAG,UAAU,CAAC,CAAC,CAAC,QAAQ,CAAC,UAAU,EAAE,EAAE,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC;wBAC1E,MAAM,cAAc,CAAC,sBAAsB,CAAC,mBAAmB,EAAE,YAAY,CAAC,CAAC;wBAC/E,MAAM,SAAS,CAAC,UAAU,MAAM,CAAC,QAAQ,CAAC,eAAe,EAAE,SAAS,CAAC,CAAC;oBACxE,CAAC;yBAAM,IAAI,QAAQ,CAAC,EAAE,EAAE,CAAC;wBACvB,MAAM,cAAc,CAAC,kBAAkB,CAAC,mBAAmB,EAAE,YAAY,EAAE,KAAK,CAAC,CAAC;oBACpF,CAAC;yBAAM,IAAI,QAAQ,CAAC,MAAM,IAAI,GAAG,EAAE,CAAC;wBAClC,MAAM,cAAc,CAAC,kBAAkB,CAAC,mBAAmB,CAAC,CAAC;oBAC/D,CAAC;yBAAM,IAAI,QAAQ,CAAC,MAAM,KAAK,GAAG,IAAI,QAAQ,CAAC,MAAM,KAAK,GAAG,EAAE,CAAC;wBAC9D,MAAM,cAAc,GAAG,QAAQ,CAAC,KAAK,EAAE,CAAC;wBACxC,IAAI,CAAC;4BACH,MAAM,QAAQ,GAAG,MAAM,cAAc,CAAC,IAAI,EAAE,CAAC;4BAC7C,MAAM,SAAS,GAAG,QAAQ,CAAC,WAAW,EAAE,CAAC;4BAEzC,QAAQ,CAAC,QAAQ,QAAQ,CAAC,MAAM,YAAY,MAAM,CAAC,QAAQ,CAAC,EAAE,EAAE;gCAC9D,WAAW,EAAE,QAAQ,CAAC,SAAS,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,OAAO,CAAC,MAAM,EAAE,GAAG,CAAC;6BAC7D,CAAC,CAAC;4BAEH,MAAM,cAAc,GAAG,sBAAsB,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,EAAE,CAC7D,SAAS,CAAC,QAAQ,CAAC,OAAO,CAAC,CAC5B,CAAC;4BACF,MAAM,kBAAkB,GAAG,2BAA2B,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,EAAE,CACtE,SAAS,CAAC,QAAQ,CAAC,OAAO,CAAC,CAC5B,CAAC;4BAEF,IAAI,cAAc,IAAI,cAAc,EAAE,CAAC;gCACrC,IAAI,kBAAkB,EAAE,CAAC;oCACvB,MAAM,cAAc,CAAC,yBAAyB,CAAC,mBAAmB,CAAC,CAAC;oCACpE,MAAM,SAAS,GAAG,IAAI,IAAI,EAAE,CAAC;oCAC7B,SAAS,CAAC,OAAO,CAAC,SAAS,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC,CAAC;oCAC3C,SAAS,CAAC,QAAQ,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;oCAC/B,MAAM,eAAe,GAAG,IAAI,CAAC,IAAI,CAC/B,CAAC,SAAS,CAAC,OAAO,EAAE,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,IAAI,GAAG,EAAE,GAAG,EAAE,CAAC,CACtD,CAAC;oCACF,MAAM,SAAS,CACb,UAAU,MAAM,CAAC,QAAQ,CAAC,yCAAyC,MAAM,CAAC,eAAe,CAAC,GAAG,EAC7F,SAAS,CACV,CAAC;gCACJ,CAAC;qCAAM,CAAC;oCACN,MAAM,MAAM,GAAG,MAAM,cAAc,CAAC,qBAAqB,CAAC,mBAAmB,CAAC,CAAC;oCAC/E,IAAI,MAAM,CAAC,WAAW,EAAE,CAAC;wCACvB,MAAM,SAAS,GAAG,IAAI,IAAI,EAAE,CAAC;wCAC7B,SAAS,CAAC,OAAO,CAAC,SAAS,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC,CAAC;wCAC3C,SAAS,CAAC,QAAQ,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;wCAC/B,MAAM,eAAe,GAAG,IAAI,CAAC,IAAI,CAC/B,CAAC,SAAS,CAAC,OAAO,EAAE,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,IAAI,GAAG,EAAE,GAAG,EAAE,CAAC,CACtD,CAAC;wCACF,MAAM,SAAS,CACb,UAAU,MAAM,CAAC,QAAQ,CAAC,yCAAyC,MAAM,CAAC,eAAe,CAAC,GAAG,EAC7F,SAAS,CACV,CAAC;oCACJ,CAAC;yCAAM,CAAC;wCACN,QAAQ,CACN,qBAAqB,CAAC,GAAG,MAAM,CAAC,UAAU,cAAc,MAAM,CAAC,QAAQ,CAAC,sBAAsB,CAC/F,CAAC;oCACJ,CAAC;gCACH,CAAC;4BACH,CAAC;iCAAM,IAAI,cAAc,EAAE,CAAC;gCAC1B,QAAQ,CAAC,QAAQ,QAAQ,CAAC,MAAM,kCAAkC,MAAM,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;gCACtF,MAAM,cAAc,CAAC,qBAAqB,CAAC,mBAAmB,CAAC,CAAC;gCAChE,MAAM,cAAc,CAAC,kBAAkB,CAAC,mBAAmB,CAAC,CAAC;4BAC/D,CAAC;wBACH,CAAC;wBAAC,OAAO,KAAK,EAAE,CAAC;4BACf,QAAQ,CAAC,8BAA8B,EAAE,KAAK,CAAC,CAAC;wBAClD,CAAC;oBACH,CAAC;oBAED,OAAO,QAAQ,CAAC;gBAClB,CAAC;gBAAC,OAAO,KAAc,EAAE,CAAC;oBACxB,MAAM,cAAc,CAAC,kBAAkB,CAAC,mBAAmB,CAAC,CAAC;oBAC7D,MAAM,KAAK,CAAC;gBACd,CAAC;YACH,CAAC;QACH,CAAC;QAED,IAAI,CAAC,aAAa,EAAE,CAAC;YACnB,MAAM,IAAI,KAAK,CAAC,8BAA8B,CAAC,CAAC;QAClD,CAAC;QACD,OAAO,aAAa,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;IACpC,CAAC,CAAC;IAEF,MAAM,gBAAgB,GAAG,KAAK,IAAI,EAAE;QAClC,MAAM,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC,CAAC;QACzD,MAAM,eAAe,EAAE,CAAC;QACxB,MAAM,SAAS,CAAC,gCAAgC,EAAE,MAAM,CAAC,CAAC;IAC5D,CAAC,CAAC;IAEF,gBAAgB,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,CAAC;IAE1C,MAAM,YAAY,GAAG;QACnB,IAAI,EAAE;YACJ,QAAQ,EAAE,cAAc;YACxB,OAAO,EAAE;gBACP;oBACE,IAAI,EAAE,KAAc;oBACpB,KAAK,EAAE,cAAc;iBACtB;aACF;YACD,MAAM,EAAE,KAAK,IAAI,EAAE;gBACjB,MAAM,IAAI,GAAG,MAAM,OAAO,EAAE,CAAC;gBAC7B,IAAI,CAAC,IAAI,EAAE,CAAC;oBACV,MAAM,IAAI,KAAK,CAAC,yDAAyD,CAAC,CAAC;gBAC7E,CAAC;gBAED,MAAM,WAAW,GAAG,gCAAgC,CAAC;gBAErD,OAAO;oBACL,MAAM,EAAE,IAAI,CAAC,GAAG;oBAChB,OAAO,EAAE,WAAW;oBACpB,KAAK,CAAC,KAAK,CAAC,KAA6B,EAAE,IAAkB;wBAC3D,OAAO,UAAU,CAAC,KAAK,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;oBACvC,CAAC;iBACF,CAAC;YACJ,CAAC;SACF;QACD,OAAO,EAAE,GAAG,EAAE;YACZ,IAAI,aAAa,EAAE,CAAC;gBAClB,UAAU,CAAC,KAAK,GAAG,aAAa,CAAC;gBACjC,aAAa,GAAG,IAAI,CAAC;YACvB,CAAC;YACD,cAAc,GAAG,IAAI,CAAC;YACtB,cAAc,GAAG,IAAI,CAAC;YACtB,UAAU,GAAG,EAAE,CAAC;QAClB,CAAC;KACF,CAAC;IAEF,OAAO,YAAY,CAAC;AACtB,CAAC,CAAC;AAEF,eAAe,iBAAiB,CAAC"}
|
package/dist/storage.d.ts
CHANGED
|
@@ -12,6 +12,21 @@ export declare class KimiStorage {
|
|
|
12
12
|
listAccounts(): Promise<KimiAccount[]>;
|
|
13
13
|
getActiveAccount(): Promise<KimiAccount | null>;
|
|
14
14
|
setActiveIndex(index: number): Promise<void>;
|
|
15
|
+
getActiveIndex(): Promise<number>;
|
|
16
|
+
/**
|
|
17
|
+
* Atomically get the current active index and set the next one.
|
|
18
|
+
* This ensures proper serialization of rotation operations.
|
|
19
|
+
* @param availableIndices - Array of available account indices to rotate through
|
|
20
|
+
* @returns The selected next index (guaranteed to be unique per call)
|
|
21
|
+
*/
|
|
22
|
+
getAndIncrementActiveIndex(availableIndices: number[]): Promise<number>;
|
|
23
|
+
/**
|
|
24
|
+
* Atomically set the active index to a specific value.
|
|
25
|
+
* Use this for sticky and health-based rotation to claim an account.
|
|
26
|
+
* @param preferredIndex - The desired index to set
|
|
27
|
+
* @returns The actual index that was set (may differ if validation fails)
|
|
28
|
+
*/
|
|
29
|
+
atomicSetActiveIndex(preferredIndex: number): Promise<number>;
|
|
15
30
|
updateAccount(index: number, updates: Partial<KimiAccount>): Promise<void>;
|
|
16
31
|
private acquireLock;
|
|
17
32
|
}
|
package/dist/storage.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"storage.d.ts","sourceRoot":"","sources":["../src/storage.ts"],"names":[],"mappings":"AAIA,OAAO,EACL,kBAAkB,EAElB,WAAW,EAGZ,MAAM,YAAY,CAAC;AAOpB,qBAAa,WAAW;IACtB,OAAO,CAAC,SAAS,CAAS;IAC1B,OAAO,CAAC,gBAAgB,CAAS;IACjC,OAAO,CAAC,WAAW,CAGjB;;IAOI,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAoBrB,UAAU,IAAI,OAAO,CAAC,kBAAkB,CAAC;IAkBzC,UAAU,CAAC,MAAM,EAAE,kBAAkB,GAAG,OAAO,CAAC,IAAI,CAAC;IAUrD,UAAU,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC;IAuB5D,aAAa,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAgB3C,YAAY,IAAI,OAAO,CAAC,WAAW,EAAE,CAAC;IAKtC,gBAAgB,IAAI,OAAO,CAAC,WAAW,GAAG,IAAI,CAAC;IAQ/C,cAAc,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAW5C,aAAa,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,CAAC,WAAW,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC;YAWlE,WAAW;CAgB1B"}
|
|
1
|
+
{"version":3,"file":"storage.d.ts","sourceRoot":"","sources":["../src/storage.ts"],"names":[],"mappings":"AAIA,OAAO,EACL,kBAAkB,EAElB,WAAW,EAGZ,MAAM,YAAY,CAAC;AAOpB,qBAAa,WAAW;IACtB,OAAO,CAAC,SAAS,CAAS;IAC1B,OAAO,CAAC,gBAAgB,CAAS;IACjC,OAAO,CAAC,WAAW,CAGjB;;IAOI,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAoBrB,UAAU,IAAI,OAAO,CAAC,kBAAkB,CAAC;IAkBzC,UAAU,CAAC,MAAM,EAAE,kBAAkB,GAAG,OAAO,CAAC,IAAI,CAAC;IAUrD,UAAU,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC;IAuB5D,aAAa,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAgB3C,YAAY,IAAI,OAAO,CAAC,WAAW,EAAE,CAAC;IAKtC,gBAAgB,IAAI,OAAO,CAAC,WAAW,GAAG,IAAI,CAAC;IAQ/C,cAAc,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAW5C,cAAc,IAAI,OAAO,CAAC,MAAM,CAAC;IAKvC;;;;;OAKG;IACG,0BAA0B,CAAC,gBAAgB,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC;IAwB7E;;;;;OAKG;IACG,oBAAoB,CAAC,cAAc,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAmB7D,aAAa,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,CAAC,WAAW,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC;YAWlE,WAAW;CAgB1B"}
|
package/dist/storage.js
CHANGED
|
@@ -114,6 +114,58 @@ export class KimiStorage {
|
|
|
114
114
|
config.activeIndex = index;
|
|
115
115
|
await this.saveConfig(config);
|
|
116
116
|
}
|
|
117
|
+
async getActiveIndex() {
|
|
118
|
+
const config = await this.loadConfig();
|
|
119
|
+
return config.activeIndex;
|
|
120
|
+
}
|
|
121
|
+
/**
|
|
122
|
+
* Atomically get the current active index and set the next one.
|
|
123
|
+
* This ensures proper serialization of rotation operations.
|
|
124
|
+
* @param availableIndices - Array of available account indices to rotate through
|
|
125
|
+
* @returns The selected next index (guaranteed to be unique per call)
|
|
126
|
+
*/
|
|
127
|
+
async getAndIncrementActiveIndex(availableIndices) {
|
|
128
|
+
if (availableIndices.length === 0) {
|
|
129
|
+
throw new Error('No available indices to rotate through');
|
|
130
|
+
}
|
|
131
|
+
const release = await this.acquireLock();
|
|
132
|
+
try {
|
|
133
|
+
const data = await fs.readFile(this.accountsFilePath, 'utf-8');
|
|
134
|
+
const parsed = JSON.parse(data);
|
|
135
|
+
const config = KimiAccountsConfigSchema.parse(parsed);
|
|
136
|
+
const currentIndex = config.activeIndex;
|
|
137
|
+
const nextIndex = availableIndices.find((idx) => idx > currentIndex) ?? availableIndices[0];
|
|
138
|
+
config.activeIndex = nextIndex;
|
|
139
|
+
const validated = KimiAccountsConfigSchema.parse(config);
|
|
140
|
+
await fs.writeFile(this.accountsFilePath, JSON.stringify(validated, null, 2), 'utf-8');
|
|
141
|
+
return nextIndex;
|
|
142
|
+
}
|
|
143
|
+
finally {
|
|
144
|
+
await release();
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
/**
|
|
148
|
+
* Atomically set the active index to a specific value.
|
|
149
|
+
* Use this for sticky and health-based rotation to claim an account.
|
|
150
|
+
* @param preferredIndex - The desired index to set
|
|
151
|
+
* @returns The actual index that was set (may differ if validation fails)
|
|
152
|
+
*/
|
|
153
|
+
async atomicSetActiveIndex(preferredIndex) {
|
|
154
|
+
const release = await this.acquireLock();
|
|
155
|
+
try {
|
|
156
|
+
const data = await fs.readFile(this.accountsFilePath, 'utf-8');
|
|
157
|
+
const parsed = JSON.parse(data);
|
|
158
|
+
const config = KimiAccountsConfigSchema.parse(parsed);
|
|
159
|
+
const validatedIndex = Math.max(0, Math.min(preferredIndex, config.accounts.length - 1));
|
|
160
|
+
config.activeIndex = validatedIndex;
|
|
161
|
+
const validated = KimiAccountsConfigSchema.parse(config);
|
|
162
|
+
await fs.writeFile(this.accountsFilePath, JSON.stringify(validated, null, 2), 'utf-8');
|
|
163
|
+
return validatedIndex;
|
|
164
|
+
}
|
|
165
|
+
finally {
|
|
166
|
+
await release();
|
|
167
|
+
}
|
|
168
|
+
}
|
|
117
169
|
async updateAccount(index, updates) {
|
|
118
170
|
const config = await this.loadConfig();
|
|
119
171
|
if (index < 0 || index >= config.accounts.length) {
|
package/dist/storage.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"storage.js","sourceRoot":"","sources":["../src/storage.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"storage.js","sourceRoot":"","sources":["../src/storage.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.5",
|
|
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",
|
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
|
}
|