opencode-kimi-rotator 1.2.7 → 1.2.8

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.
@@ -6272,6 +6272,14 @@ function getRequestUrl(input) {
6272
6272
  }
6273
6273
  return input.url;
6274
6274
  }
6275
+ function buildRequestHeaders(input, init) {
6276
+ const headers = new Headers(input instanceof Request ? input.headers : void 0);
6277
+ const initHeaders = new Headers(init?.headers);
6278
+ initHeaders.forEach((value, key) => {
6279
+ headers.set(key, value);
6280
+ });
6281
+ return headers;
6282
+ }
6275
6283
  async function showToast(message, variant = "info") {
6276
6284
  if (!openCodeClient?.tui?.showToast) {
6277
6285
  toastQueue.push({ message, variant });
@@ -6314,34 +6322,46 @@ var KimiRotatorPlugin = async ({ client }) => {
6314
6322
  if (!accountManager) {
6315
6323
  throw new Error("Account manager not initialized");
6316
6324
  }
6317
- const nextAccount = await accountManager.getNextAccount();
6318
- if (nextAccount) {
6325
+ if (!originalFetch) {
6326
+ throw new Error("Original fetch not available");
6327
+ }
6328
+ const allKeysNow = await accountManager.listKeys();
6329
+ const total = allKeysNow.length;
6330
+ const maxAttempts = Math.max(1, total);
6331
+ let lastResponse = null;
6332
+ for (let attempt = 0; attempt < maxAttempts; attempt++) {
6333
+ const nextAccount = await accountManager.getNextAccount();
6334
+ if (!nextAccount) {
6335
+ break;
6336
+ }
6319
6337
  const requestAccountIndex = nextAccount.index;
6320
6338
  const keyLabel = nextAccount.account.key.substring(0, 18) + "...";
6321
6339
  const position = requestAccountIndex + 1;
6322
- const allKeysNow = await accountManager.listKeys();
6323
- const total = allKeysNow.length;
6324
- await showToast(`\u{1F504} Using key: ${keyLabel} (${String(position)}/${String(total)})`, "info");
6325
- const headers = new Headers(init?.headers);
6340
+ const headers = buildRequestHeaders(input, init);
6326
6341
  headers.set("x-api-key", nextAccount.account.key);
6327
6342
  headers.delete("Authorization");
6343
+ await showToast(`\u{1F504} Using key: ${keyLabel} (${String(position)}/${String(total)})`, "info");
6328
6344
  const requestStartTime = Date.now();
6329
6345
  const today = (/* @__PURE__ */ new Date()).toISOString().split("T")[0];
6330
- if (!originalFetch) {
6331
- throw new Error("Original fetch not available");
6332
- }
6333
6346
  try {
6334
- const response = await originalFetch(input, { ...init, headers });
6347
+ const attemptInput = input instanceof Request ? input.clone() : input;
6348
+ const response = await originalFetch(attemptInput, { ...init, headers });
6335
6349
  const responseTime = Date.now() - requestStartTime;
6336
6350
  if (response.status === 429) {
6337
6351
  const retryAfter = response.headers.get("retry-after");
6338
6352
  const retryAfterMs = retryAfter ? parseInt(retryAfter, 10) * 1e3 : 6e4;
6339
6353
  await accountManager.markAccountRateLimited(requestAccountIndex, retryAfterMs);
6340
6354
  await showToast(`\u26A0\uFE0F Key ${String(position)} rate limited`, "warning");
6355
+ if (attempt < maxAttempts - 1) {
6356
+ lastResponse = response;
6357
+ continue;
6358
+ }
6341
6359
  } else if (response.ok) {
6342
6360
  await accountManager.markAccountSuccess(requestAccountIndex, responseTime, today);
6361
+ return response;
6343
6362
  } else if (response.status >= 500) {
6344
6363
  await accountManager.markAccountFailure(requestAccountIndex);
6364
+ return response;
6345
6365
  } else if (response.status === 400 || response.status === 403) {
6346
6366
  const clonedResponse = response.clone();
6347
6367
  try {
@@ -6357,8 +6377,10 @@ var KimiRotatorPlugin = async ({ client }) => {
6357
6377
  (pattern) => bodyLower.includes(pattern)
6358
6378
  );
6359
6379
  if (isBillingLimit && accountManager) {
6380
+ let shouldRetry = false;
6360
6381
  if (isHardBillingLimit) {
6361
6382
  await accountManager.markAccountBillingLimited(requestAccountIndex);
6383
+ shouldRetry = true;
6362
6384
  const resetTime = /* @__PURE__ */ new Date();
6363
6385
  resetTime.setDate(resetTime.getDate() + 1);
6364
6386
  resetTime.setHours(0, 0, 0, 0);
@@ -6371,6 +6393,7 @@ var KimiRotatorPlugin = async ({ client }) => {
6371
6393
  );
6372
6394
  } else {
6373
6395
  const result2 = await accountManager.recordBillingLimitHit(requestAccountIndex);
6396
+ shouldRetry = result2.isConfirmed;
6374
6397
  if (result2.isConfirmed) {
6375
6398
  const resetTime = /* @__PURE__ */ new Date();
6376
6399
  resetTime.setDate(resetTime.getDate() + 1);
@@ -6388,14 +6411,24 @@ var KimiRotatorPlugin = async ({ client }) => {
6388
6411
  );
6389
6412
  }
6390
6413
  }
6391
- } else if (accountManager) {
6392
- debugLog(`HTTP ${response.status} but not billing limit for key ${String(position)}`);
6393
- await accountManager.resetBillingLimitHits(requestAccountIndex);
6394
- await accountManager.markAccountFailure(requestAccountIndex);
6414
+ if (shouldRetry && attempt < maxAttempts - 1) {
6415
+ await showToast("\u{1F501} Retrying with next key...", "info");
6416
+ lastResponse = response;
6417
+ continue;
6418
+ }
6419
+ return response;
6395
6420
  }
6421
+ debugLog(`HTTP ${response.status} but not billing limit for key ${String(position)}`);
6422
+ await accountManager.resetBillingLimitHits(requestAccountIndex);
6423
+ await accountManager.markAccountFailure(requestAccountIndex);
6424
+ return response;
6396
6425
  } catch (error) {
6397
6426
  debugLog("Error reading response body:", error);
6427
+ return response;
6398
6428
  }
6429
+ } else {
6430
+ await accountManager.markAccountFailure(requestAccountIndex);
6431
+ return response;
6399
6432
  }
6400
6433
  return response;
6401
6434
  } catch (error) {
@@ -6403,6 +6436,9 @@ var KimiRotatorPlugin = async ({ client }) => {
6403
6436
  throw error;
6404
6437
  }
6405
6438
  }
6439
+ if (lastResponse) {
6440
+ return lastResponse;
6441
+ }
6406
6442
  }
6407
6443
  if (!originalFetch) {
6408
6444
  throw new Error("Original fetch not available");
@@ -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;AA2G9C,eAAO,MAAM,iBAAiB,EAAE,MAkL/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;AAsH9C,eAAO,MAAM,iBAAiB,EAAE,MAsN/B,CAAC;AAEF,eAAe,iBAAiB,CAAC;AACjC,YAAY,EAAE,WAAW,EAAE,CAAC"}
package/dist/plugin.js CHANGED
@@ -51,6 +51,14 @@ function getRequestUrl(input) {
51
51
  }
52
52
  return input.url;
53
53
  }
54
+ function buildRequestHeaders(input, init) {
55
+ const headers = new Headers(input instanceof Request ? input.headers : undefined);
56
+ const initHeaders = new Headers(init?.headers);
57
+ initHeaders.forEach((value, key) => {
58
+ headers.set(key, value);
59
+ });
60
+ return headers;
61
+ }
54
62
  async function showToast(message, variant = 'info') {
55
63
  if (!openCodeClient?.tui?.showToast) {
56
64
  toastQueue.push({ message, variant });
@@ -97,36 +105,48 @@ export const KimiRotatorPlugin = async ({ client }) => {
97
105
  if (!accountManager) {
98
106
  throw new Error('Account manager not initialized');
99
107
  }
100
- const nextAccount = await accountManager.getNextAccount();
101
- if (nextAccount) {
108
+ if (!originalFetch) {
109
+ throw new Error('Original fetch not available');
110
+ }
111
+ const allKeysNow = await accountManager.listKeys();
112
+ const total = allKeysNow.length;
113
+ const maxAttempts = Math.max(1, total);
114
+ let lastResponse = null;
115
+ for (let attempt = 0; attempt < maxAttempts; attempt++) {
116
+ const nextAccount = await accountManager.getNextAccount();
117
+ if (!nextAccount) {
118
+ break;
119
+ }
102
120
  const requestAccountIndex = nextAccount.index;
103
121
  const keyLabel = nextAccount.account.key.substring(0, 18) + '...';
104
122
  const position = requestAccountIndex + 1;
105
- const allKeysNow = await accountManager.listKeys();
106
- const total = allKeysNow.length;
107
- await showToast(`🔄 Using key: ${keyLabel} (${String(position)}/${String(total)})`, 'info');
108
- const headers = new Headers(init?.headers);
123
+ const headers = buildRequestHeaders(input, init);
109
124
  headers.set('x-api-key', nextAccount.account.key);
110
125
  headers.delete('Authorization');
126
+ await showToast(`🔄 Using key: ${keyLabel} (${String(position)}/${String(total)})`, 'info');
111
127
  const requestStartTime = Date.now();
112
128
  const today = new Date().toISOString().split('T')[0];
113
- if (!originalFetch) {
114
- throw new Error('Original fetch not available');
115
- }
116
129
  try {
117
- const response = await originalFetch(input, { ...init, headers });
130
+ const attemptInput = input instanceof Request ? input.clone() : input;
131
+ const response = await originalFetch(attemptInput, { ...init, headers });
118
132
  const responseTime = Date.now() - requestStartTime;
119
133
  if (response.status === 429) {
120
134
  const retryAfter = response.headers.get('retry-after');
121
135
  const retryAfterMs = retryAfter ? parseInt(retryAfter, 10) * 1000 : 60000;
122
136
  await accountManager.markAccountRateLimited(requestAccountIndex, retryAfterMs);
123
137
  await showToast(`⚠️ Key ${String(position)} rate limited`, 'warning');
138
+ if (attempt < maxAttempts - 1) {
139
+ lastResponse = response;
140
+ continue;
141
+ }
124
142
  }
125
143
  else if (response.ok) {
126
144
  await accountManager.markAccountSuccess(requestAccountIndex, responseTime, today);
145
+ return response;
127
146
  }
128
147
  else if (response.status >= 500) {
129
148
  await accountManager.markAccountFailure(requestAccountIndex);
149
+ return response;
130
150
  }
131
151
  else if (response.status === 400 || response.status === 403) {
132
152
  const clonedResponse = response.clone();
@@ -139,8 +159,10 @@ export const KimiRotatorPlugin = async ({ client }) => {
139
159
  const isBillingLimit = BILLING_LIMIT_PATTERNS.some((pattern) => bodyLower.includes(pattern));
140
160
  const isHardBillingLimit = HARD_BILLING_LIMIT_PATTERNS.some((pattern) => bodyLower.includes(pattern));
141
161
  if (isBillingLimit && accountManager) {
162
+ let shouldRetry = false;
142
163
  if (isHardBillingLimit) {
143
164
  await accountManager.markAccountBillingLimited(requestAccountIndex);
165
+ shouldRetry = true;
144
166
  const resetTime = new Date();
145
167
  resetTime.setDate(resetTime.getDate() + 1);
146
168
  resetTime.setHours(0, 0, 0, 0);
@@ -149,6 +171,7 @@ export const KimiRotatorPlugin = async ({ client }) => {
149
171
  }
150
172
  else {
151
173
  const result = await accountManager.recordBillingLimitHit(requestAccountIndex);
174
+ shouldRetry = result.isConfirmed;
152
175
  if (result.isConfirmed) {
153
176
  const resetTime = new Date();
154
177
  resetTime.setDate(resetTime.getDate() + 1);
@@ -160,17 +183,27 @@ export const KimiRotatorPlugin = async ({ client }) => {
160
183
  debugLog(`Billing limit hit ${2 - result.hitsNeeded}/2 for key ${String(position)} - not confirmed yet`);
161
184
  }
162
185
  }
186
+ if (shouldRetry && attempt < maxAttempts - 1) {
187
+ await showToast('🔁 Retrying with next key...', 'info');
188
+ lastResponse = response;
189
+ continue;
190
+ }
191
+ return response;
163
192
  }
164
- else if (accountManager) {
165
- debugLog(`HTTP ${response.status} but not billing limit for key ${String(position)}`);
166
- await accountManager.resetBillingLimitHits(requestAccountIndex);
167
- await accountManager.markAccountFailure(requestAccountIndex);
168
- }
193
+ debugLog(`HTTP ${response.status} but not billing limit for key ${String(position)}`);
194
+ await accountManager.resetBillingLimitHits(requestAccountIndex);
195
+ await accountManager.markAccountFailure(requestAccountIndex);
196
+ return response;
169
197
  }
170
198
  catch (error) {
171
199
  debugLog('Error reading response body:', error);
200
+ return response;
172
201
  }
173
202
  }
203
+ else {
204
+ await accountManager.markAccountFailure(requestAccountIndex);
205
+ return response;
206
+ }
174
207
  return response;
175
208
  }
176
209
  catch (error) {
@@ -178,6 +211,9 @@ export const KimiRotatorPlugin = async ({ client }) => {
178
211
  throw error;
179
212
  }
180
213
  }
214
+ if (lastResponse) {
215
+ return lastResponse;
216
+ }
181
217
  }
182
218
  if (!originalFetch) {
183
219
  throw new Error('Original fetch not available');
@@ -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":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "opencode-kimi-rotator",
3
- "version": "1.2.7",
3
+ "version": "1.2.8",
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
@@ -79,6 +79,17 @@ function getRequestUrl(input: string | Request | URL): string {
79
79
  return input.url;
80
80
  }
81
81
 
82
+ function buildRequestHeaders(input: string | Request | URL, init?: RequestInit): Headers {
83
+ const headers = new Headers(input instanceof Request ? input.headers : undefined);
84
+ const initHeaders = new Headers(init?.headers);
85
+
86
+ initHeaders.forEach((value, key) => {
87
+ headers.set(key, value);
88
+ });
89
+
90
+ return headers;
91
+ }
92
+
82
93
  async function showToast(message: string, variant: 'info' | 'warning' | 'error' = 'info') {
83
94
  if (!openCodeClient?.tui?.showToast) {
84
95
  toastQueue.push({ message, variant });
@@ -132,29 +143,37 @@ export const KimiRotatorPlugin: Plugin = async ({ client }) => {
132
143
  if (!accountManager) {
133
144
  throw new Error('Account manager not initialized');
134
145
  }
135
- const nextAccount = await accountManager.getNextAccount();
136
- if (nextAccount) {
146
+
147
+ if (!originalFetch) {
148
+ throw new Error('Original fetch not available');
149
+ }
150
+
151
+ const allKeysNow = await accountManager.listKeys();
152
+ const total = allKeysNow.length;
153
+ const maxAttempts = Math.max(1, total);
154
+ let lastResponse: Response | null = null;
155
+
156
+ for (let attempt = 0; attempt < maxAttempts; attempt++) {
157
+ const nextAccount = await accountManager.getNextAccount();
158
+ if (!nextAccount) {
159
+ break;
160
+ }
161
+
137
162
  const requestAccountIndex = nextAccount.index;
138
163
  const keyLabel = nextAccount.account.key.substring(0, 18) + '...';
139
164
  const position = requestAccountIndex + 1;
140
- const allKeysNow = await accountManager.listKeys();
141
- const total = allKeysNow.length;
142
-
143
- await showToast(`🔄 Using key: ${keyLabel} (${String(position)}/${String(total)})`, 'info');
144
-
145
- const headers = new Headers(init?.headers);
165
+ const headers = buildRequestHeaders(input, init);
146
166
  headers.set('x-api-key', nextAccount.account.key);
147
167
  headers.delete('Authorization');
148
168
 
169
+ await showToast(`🔄 Using key: ${keyLabel} (${String(position)}/${String(total)})`, 'info');
170
+
149
171
  const requestStartTime = Date.now();
150
172
  const today = new Date().toISOString().split('T')[0];
151
173
 
152
- if (!originalFetch) {
153
- throw new Error('Original fetch not available');
154
- }
155
-
156
174
  try {
157
- const response = await originalFetch(input, { ...init, headers });
175
+ const attemptInput = input instanceof Request ? input.clone() : input;
176
+ const response = await originalFetch(attemptInput, { ...init, headers });
158
177
  const responseTime = Date.now() - requestStartTime;
159
178
 
160
179
  if (response.status === 429) {
@@ -162,10 +181,17 @@ export const KimiRotatorPlugin: Plugin = async ({ client }) => {
162
181
  const retryAfterMs = retryAfter ? parseInt(retryAfter, 10) * 1000 : 60000;
163
182
  await accountManager.markAccountRateLimited(requestAccountIndex, retryAfterMs);
164
183
  await showToast(`⚠️ Key ${String(position)} rate limited`, 'warning');
184
+
185
+ if (attempt < maxAttempts - 1) {
186
+ lastResponse = response;
187
+ continue;
188
+ }
165
189
  } else if (response.ok) {
166
190
  await accountManager.markAccountSuccess(requestAccountIndex, responseTime, today);
191
+ return response;
167
192
  } else if (response.status >= 500) {
168
193
  await accountManager.markAccountFailure(requestAccountIndex);
194
+ return response;
169
195
  } else if (response.status === 400 || response.status === 403) {
170
196
  const clonedResponse = response.clone();
171
197
  try {
@@ -184,8 +210,11 @@ export const KimiRotatorPlugin: Plugin = async ({ client }) => {
184
210
  );
185
211
 
186
212
  if (isBillingLimit && accountManager) {
213
+ let shouldRetry = false;
214
+
187
215
  if (isHardBillingLimit) {
188
216
  await accountManager.markAccountBillingLimited(requestAccountIndex);
217
+ shouldRetry = true;
189
218
  const resetTime = new Date();
190
219
  resetTime.setDate(resetTime.getDate() + 1);
191
220
  resetTime.setHours(0, 0, 0, 0);
@@ -198,6 +227,7 @@ export const KimiRotatorPlugin: Plugin = async ({ client }) => {
198
227
  );
199
228
  } else {
200
229
  const result = await accountManager.recordBillingLimitHit(requestAccountIndex);
230
+ shouldRetry = result.isConfirmed;
201
231
  if (result.isConfirmed) {
202
232
  const resetTime = new Date();
203
233
  resetTime.setDate(resetTime.getDate() + 1);
@@ -215,14 +245,27 @@ export const KimiRotatorPlugin: Plugin = async ({ client }) => {
215
245
  );
216
246
  }
217
247
  }
218
- } else if (accountManager) {
219
- debugLog(`HTTP ${response.status} but not billing limit for key ${String(position)}`);
220
- await accountManager.resetBillingLimitHits(requestAccountIndex);
221
- await accountManager.markAccountFailure(requestAccountIndex);
248
+
249
+ if (shouldRetry && attempt < maxAttempts - 1) {
250
+ await showToast('🔁 Retrying with next key...', 'info');
251
+ lastResponse = response;
252
+ continue;
253
+ }
254
+
255
+ return response;
222
256
  }
257
+
258
+ debugLog(`HTTP ${response.status} but not billing limit for key ${String(position)}`);
259
+ await accountManager.resetBillingLimitHits(requestAccountIndex);
260
+ await accountManager.markAccountFailure(requestAccountIndex);
261
+ return response;
223
262
  } catch (error) {
224
263
  debugLog('Error reading response body:', error);
264
+ return response;
225
265
  }
266
+ } else {
267
+ await accountManager.markAccountFailure(requestAccountIndex);
268
+ return response;
226
269
  }
227
270
 
228
271
  return response;
@@ -231,6 +274,10 @@ export const KimiRotatorPlugin: Plugin = async ({ client }) => {
231
274
  throw error;
232
275
  }
233
276
  }
277
+
278
+ if (lastResponse) {
279
+ return lastResponse;
280
+ }
234
281
  }
235
282
 
236
283
  if (!originalFetch) {