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 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 the billing cycle usage limit ("You've reached your usage limit for this billing cycle"):
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');
@@ -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>;
@@ -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;IA2BtF,sBAAsB,CAAC,KAAK,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAW1E,yBAAyB,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAiBvD,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;YAsBlB,cAAc;YAoCd,mBAAmB;IAuDjC,OAAO,CAAC,qBAAqB;IAa7B,OAAO,CAAC,mBAAmB;IAS3B,OAAO,CAAC,wBAAwB;IAchC,OAAO,CAAC,aAAa;YAOP,UAAU;CAOzB"}
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 currentIndex = config.activeIndex;
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],
@@ -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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"}
@@ -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 currentIndex = config.activeIndex;
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
- currentAccountIndex = nextAccount.index;
6299
+ const requestAccountIndex = nextAccount.index;
6195
6300
  const keyLabel = nextAccount.account.key.substring(0, 18) + "...";
6196
- const position = nextAccount.index + 1;
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(currentAccountIndex, retryAfterMs);
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(currentAccountIndex, responseTime, today);
6322
+ await accountManager.markAccountSuccess(requestAccountIndex, responseTime, today);
6218
6323
  } else if (response.status >= 500) {
6219
- await accountManager.markAccountFailure(currentAccountIndex);
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
- if (bodyText.includes("You've reached your usage limit for this billing cycle")) {
6225
- await accountManager.markAccountBillingLimited(currentAccountIndex);
6226
- const resetTime = /* @__PURE__ */ new Date();
6227
- resetTime.setDate(resetTime.getDate() + 1);
6228
- resetTime.setHours(0, 0, 0, 0);
6229
- const hoursUntilReset = Math.ceil((resetTime.getTime() - Date.now()) / (1e3 * 60 * 60));
6230
- await showToast(
6231
- `\u{1F6AB} Key ${String(position)} billing limit reached - cooldown for ${String(hoursUntilReset)}h`,
6232
- "warning"
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(currentAccountIndex);
6382
+ await accountManager.markAccountFailure(requestAccountIndex);
6241
6383
  throw error;
6242
6384
  }
6243
6385
  }
@@ -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;AA2E9C,eAAO,MAAM,iBAAiB,EAAE,MA6I/B,CAAC;AAEF,eAAe,iBAAiB,CAAC;AACjC,YAAY,EAAE,WAAW,EAAE,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
- currentAccountIndex = nextAccount.index;
93
+ const requestAccountIndex = nextAccount.index;
77
94
  const keyLabel = nextAccount.account.key.substring(0, 18) + '...';
78
- const position = nextAccount.index + 1;
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(currentAccountIndex, retryAfterMs);
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(currentAccountIndex, responseTime, today);
117
+ await accountManager.markAccountSuccess(requestAccountIndex, responseTime, today);
101
118
  }
102
119
  else if (response.status >= 500) {
103
- await accountManager.markAccountFailure(currentAccountIndex);
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
- if (bodyText.includes("You've reached your usage limit for this billing cycle")) {
112
- await accountManager.markAccountBillingLimited(currentAccountIndex);
113
- const resetTime = new Date();
114
- resetTime.setDate(resetTime.getDate() + 1);
115
- resetTime.setHours(0, 0, 0, 0);
116
- const hoursUntilReset = Math.ceil((resetTime.getTime() - Date.now()) / (1000 * 60 * 60));
117
- await showToast(`🚫 Key ${String(position)} billing limit reached - cooldown for ${String(hoursUntilReset)}h`, 'warning');
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
- // Ignore errors reading response body
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(currentAccountIndex);
168
+ await accountManager.markAccountFailure(requestAccountIndex);
128
169
  throw error;
129
170
  }
130
171
  }
@@ -1 +1 @@
1
- {"version":3,"file":"plugin.js","sourceRoot":"","sources":["../src/plugin.ts"],"names":[],"mappings":"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"}
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
  }
@@ -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) {
@@ -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;
@@ -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;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAa5B,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,CAS7E,CAAC;AAEF,eAAO,MAAM,cAAc,EAAE,IAAI,CAAC,kBAAkB,EAAE,UAAU,CAM/D,CAAC"}
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",
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
- currentAccountIndex = nextAccount.index;
125
+ const requestAccountIndex = nextAccount.index;
106
126
  const keyLabel = nextAccount.account.key.substring(0, 18) + '...';
107
- const position = nextAccount.index + 1;
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(currentAccountIndex, retryAfterMs);
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(currentAccountIndex, responseTime, today);
154
+ await accountManager.markAccountSuccess(requestAccountIndex, responseTime, today);
135
155
  } else if (response.status >= 500) {
136
- await accountManager.markAccountFailure(currentAccountIndex);
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
- if (bodyText.includes("You've reached your usage limit for this billing cycle")) {
144
- await accountManager.markAccountBillingLimited(currentAccountIndex);
145
- const resetTime = new Date();
146
- resetTime.setDate(resetTime.getDate() + 1);
147
- resetTime.setHours(0, 0, 0, 0);
148
- const hoursUntilReset = Math.ceil((resetTime.getTime() - Date.now()) / (1000 * 60 * 60));
149
- await showToast(
150
- `🚫 Key ${String(position)} billing limit reached - cooldown for ${String(hoursUntilReset)}h`,
151
- 'warning'
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
- // Ignore errors reading response body
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(currentAccountIndex);
218
+ await accountManager.markAccountFailure(requestAccountIndex);
162
219
  throw error;
163
220
  }
164
221
  }