opencode-kimi-rotator 1.0.0 → 1.1.0
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 +432 -26
- package/bin/cli.js +340 -8
- package/dist/accounts.d.ts +7 -1
- package/dist/accounts.d.ts.map +1 -1
- package/dist/accounts.js +61 -7
- package/dist/accounts.js.map +1 -1
- package/dist/plugin.d.ts +1 -1
- package/dist/plugin.d.ts.map +1 -1
- package/dist/plugin.js +26 -10
- package/dist/plugin.js.map +1 -1
- package/dist/storage.d.ts.map +1 -1
- package/dist/storage.js +5 -5
- package/dist/storage.js.map +1 -1
- package/dist/types.d.ts +22 -0
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js +8 -0
- package/dist/types.js.map +1 -1
- package/package.json +16 -5
- package/src/plugin.ts +47 -24
package/dist/plugin.js
CHANGED
|
@@ -42,7 +42,9 @@ async function flushToastQueue() {
|
|
|
42
42
|
const toast = toastQueue.shift();
|
|
43
43
|
if (toast) {
|
|
44
44
|
try {
|
|
45
|
-
await openCodeClient.tui.showToast({
|
|
45
|
+
await openCodeClient.tui.showToast({
|
|
46
|
+
body: { message: toast.message, variant: toast.variant },
|
|
47
|
+
});
|
|
46
48
|
}
|
|
47
49
|
catch {
|
|
48
50
|
return;
|
|
@@ -63,6 +65,9 @@ export const KimiRotatorPlugin = async ({ client }) => {
|
|
|
63
65
|
globalThis.fetch = async (input, init) => {
|
|
64
66
|
const url = typeof input === 'string' ? input : input.toString();
|
|
65
67
|
if (url.includes('api.kimi.com')) {
|
|
68
|
+
if (!accountManager) {
|
|
69
|
+
throw new Error('Account manager not initialized');
|
|
70
|
+
}
|
|
66
71
|
const nextAccount = await accountManager.getNextAccount();
|
|
67
72
|
if (nextAccount) {
|
|
68
73
|
currentAccountIndex = nextAccount.index;
|
|
@@ -70,20 +75,26 @@ export const KimiRotatorPlugin = async ({ client }) => {
|
|
|
70
75
|
const position = nextAccount.index + 1;
|
|
71
76
|
const allKeysNow = await accountManager.listKeys();
|
|
72
77
|
const total = allKeysNow.length;
|
|
73
|
-
await showToast(`🔄 Using key: ${keyLabel} (${position}/${total})`, 'info');
|
|
78
|
+
await showToast(`🔄 Using key: ${keyLabel} (${String(position)}/${String(total)})`, 'info');
|
|
74
79
|
const headers = new Headers(init?.headers);
|
|
75
80
|
headers.set('x-api-key', nextAccount.account.key);
|
|
76
81
|
headers.delete('Authorization');
|
|
82
|
+
const requestStartTime = Date.now();
|
|
83
|
+
const today = new Date().toISOString().split('T')[0];
|
|
84
|
+
if (!originalFetch) {
|
|
85
|
+
throw new Error('Original fetch not available');
|
|
86
|
+
}
|
|
77
87
|
try {
|
|
78
88
|
const response = await originalFetch(input, { ...init, headers });
|
|
89
|
+
const responseTime = Date.now() - requestStartTime;
|
|
79
90
|
if (response.status === 429) {
|
|
80
91
|
const retryAfter = response.headers.get('retry-after');
|
|
81
92
|
const retryAfterMs = retryAfter ? parseInt(retryAfter, 10) * 1000 : 60000;
|
|
82
93
|
await accountManager.markAccountRateLimited(currentAccountIndex, retryAfterMs);
|
|
83
|
-
await showToast(`⚠️ Key ${position} rate limited`, 'warning');
|
|
94
|
+
await showToast(`⚠️ Key ${String(position)} rate limited`, 'warning');
|
|
84
95
|
}
|
|
85
96
|
else if (response.ok) {
|
|
86
|
-
await accountManager.markAccountSuccess(currentAccountIndex);
|
|
97
|
+
await accountManager.markAccountSuccess(currentAccountIndex, responseTime, today);
|
|
87
98
|
}
|
|
88
99
|
else if (response.status >= 500) {
|
|
89
100
|
await accountManager.markAccountFailure(currentAccountIndex);
|
|
@@ -96,21 +107,26 @@ export const KimiRotatorPlugin = async ({ client }) => {
|
|
|
96
107
|
}
|
|
97
108
|
}
|
|
98
109
|
}
|
|
110
|
+
if (!originalFetch) {
|
|
111
|
+
throw new Error('Original fetch not available');
|
|
112
|
+
}
|
|
99
113
|
return originalFetch(input, init);
|
|
100
114
|
};
|
|
101
115
|
const showInitialToast = async () => {
|
|
102
|
-
await new Promise(resolve => setTimeout(resolve, 500));
|
|
116
|
+
await new Promise((resolve) => setTimeout(resolve, 500));
|
|
103
117
|
await flushToastQueue();
|
|
104
|
-
await showToast(
|
|
118
|
+
await showToast('🎉 Kimi Rotator Plugin loaded!', 'info');
|
|
105
119
|
};
|
|
106
|
-
showInitialToast().catch(() =>
|
|
120
|
+
showInitialToast().catch(() => undefined);
|
|
107
121
|
const pluginReturn = {
|
|
108
122
|
auth: {
|
|
109
123
|
provider: 'kimi-rotator',
|
|
110
|
-
methods: [
|
|
124
|
+
methods: [
|
|
125
|
+
{
|
|
111
126
|
type: 'api',
|
|
112
127
|
label: 'Kimi API Key',
|
|
113
|
-
}
|
|
128
|
+
},
|
|
129
|
+
],
|
|
114
130
|
loader: async () => {
|
|
115
131
|
const auth = await getAuth();
|
|
116
132
|
if (!auth) {
|
|
@@ -122,7 +138,7 @@ export const KimiRotatorPlugin = async ({ client }) => {
|
|
|
122
138
|
baseURL: kimiBaseUrl,
|
|
123
139
|
async fetch(input, init) {
|
|
124
140
|
return globalThis.fetch(input, init);
|
|
125
|
-
}
|
|
141
|
+
},
|
|
126
142
|
};
|
|
127
143
|
},
|
|
128
144
|
},
|
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,mBAAmB,
|
|
1
|
+
{"version":3,"file":"plugin.js","sourceRoot":"","sources":["../src/plugin.ts"],"names":[],"mappings":"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"}
|
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;
|
|
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"}
|
package/dist/storage.js
CHANGED
|
@@ -68,14 +68,14 @@ export class KimiStorage {
|
|
|
68
68
|
}
|
|
69
69
|
async addAccount(key, name) {
|
|
70
70
|
const config = await this.loadConfig();
|
|
71
|
-
const existingIndex = config.accounts.findIndex(a => a.key === key);
|
|
71
|
+
const existingIndex = config.accounts.findIndex((a) => a.key === key);
|
|
72
72
|
if (existingIndex !== -1) {
|
|
73
73
|
throw new Error('This API key already exists');
|
|
74
74
|
}
|
|
75
75
|
const now = Date.now();
|
|
76
76
|
const newAccount = {
|
|
77
77
|
key,
|
|
78
|
-
name: name
|
|
78
|
+
name: name ?? `Account ${config.accounts.length + 1}`,
|
|
79
79
|
addedAt: now,
|
|
80
80
|
lastUsed: now,
|
|
81
81
|
...DEFAULT_ACCOUNT,
|
|
@@ -87,7 +87,7 @@ export class KimiStorage {
|
|
|
87
87
|
async removeAccount(index) {
|
|
88
88
|
const config = await this.loadConfig();
|
|
89
89
|
if (index < 0 || index >= config.accounts.length) {
|
|
90
|
-
throw new Error(`Invalid account index: ${index}`);
|
|
90
|
+
throw new Error(`Invalid account index: ${String(index)}`);
|
|
91
91
|
}
|
|
92
92
|
config.accounts.splice(index, 1);
|
|
93
93
|
if (config.activeIndex >= config.accounts.length) {
|
|
@@ -109,7 +109,7 @@ export class KimiStorage {
|
|
|
109
109
|
async setActiveIndex(index) {
|
|
110
110
|
const config = await this.loadConfig();
|
|
111
111
|
if (index < 0 || index >= config.accounts.length) {
|
|
112
|
-
throw new Error(`Invalid account index: ${index}`);
|
|
112
|
+
throw new Error(`Invalid account index: ${String(index)}`);
|
|
113
113
|
}
|
|
114
114
|
config.activeIndex = index;
|
|
115
115
|
await this.saveConfig(config);
|
|
@@ -117,7 +117,7 @@ export class KimiStorage {
|
|
|
117
117
|
async updateAccount(index, updates) {
|
|
118
118
|
const config = await this.loadConfig();
|
|
119
119
|
if (index < 0 || index >= config.accounts.length) {
|
|
120
|
-
throw new Error(`Invalid account index: ${index}`);
|
|
120
|
+
throw new Error(`Invalid account index: ${String(index)}`);
|
|
121
121
|
}
|
|
122
122
|
config.accounts[index] = { ...config.accounts[index], ...updates };
|
|
123
123
|
await this.saveConfig(config);
|
package/dist/storage.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"storage.js","sourceRoot":"","sources":["../src/storage.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,IAAI,EAAE,EAAE,MAAM,IAAI,CAAC;AACpC,OAAO,KAAK,IAAI,MAAM,MAAM,CAAC;AAC7B,OAAO,KAAK,EAAE,MAAM,IAAI,CAAC;AACzB,OAAO,QAAQ,MAAM,iBAAiB,CAAC;AACvC,OAAO,EAEL,wBAAwB,EAExB,cAAc,EACd,eAAe,GAChB,MAAM,YAAY,CAAC;AAEpB,MAAM,kBAAkB,GAAG,oBAAoB,CAAC;AAChD,MAAM,iBAAiB,GAAG,sCAAsC,CAAC;AACjE,MAAM,aAAa,GAAG,IAAI,CAAC;AAC3B,MAAM,YAAY,GAAG,CAAC,CAAC;AAEvB,MAAM,OAAO,WAAW;IACd,SAAS,CAAS;IAClB,gBAAgB,CAAS;IACzB,WAAW,GAAG;QACpB,KAAK,EAAE,aAAa;QACpB,OAAO,EAAE,YAAY;KACtB,CAAC;IAEF;QACE,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,UAAU,CAAC,CAAC;QAChE,IAAI,CAAC,gBAAgB,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,kBAAkB,CAAC,CAAC;IACxE,CAAC;IAED,KAAK,CAAC,IAAI;QACR,MAAM,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QAEpD,MAAM,aAAa,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,YAAY,CAAC,CAAC;QAC9D,IAAI,CAAC;YACH,MAAM,EAAE,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC;QACjC,CAAC;QAAC,MAAM,CAAC;YACP,MAAM,EAAE,CAAC,UAAU,CAAC,aAAa,EAAE,iBAAiB,EAAE,OAAO,CAAC,CAAC;QACjE,CAAC;QAED,IAAI,CAAC;YACH,MAAM,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC;QACzC,CAAC;QAAC,MAAM,CAAC;YACP,MAAM,IAAI,CAAC,UAAU,CAAC;gBACpB,GAAG,cAAc;gBACjB,QAAQ,EAAE,EAAE;aACb,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IAED,KAAK,CAAC,UAAU;QACd,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,WAAW,EAAE,CAAC;QACzC,IAAI,CAAC;YACH,MAAM,IAAI,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,gBAAgB,EAAE,OAAO,CAAC,CAAC;YAC/D,MAAM,MAAM,
|
|
1
|
+
{"version":3,"file":"storage.js","sourceRoot":"","sources":["../src/storage.ts"],"names":[],"mappings":"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"}
|
package/dist/types.d.ts
CHANGED
|
@@ -9,6 +9,8 @@ export declare const KimiAccountSchema: z.ZodObject<{
|
|
|
9
9
|
consecutiveFailures: z.ZodDefault<z.ZodNumber>;
|
|
10
10
|
totalRequests: z.ZodDefault<z.ZodNumber>;
|
|
11
11
|
successfulRequests: z.ZodDefault<z.ZodNumber>;
|
|
12
|
+
responseTimes: z.ZodDefault<z.ZodArray<z.ZodNumber, "many">>;
|
|
13
|
+
dailyRequests: z.ZodDefault<z.ZodRecord<z.ZodString, z.ZodNumber>>;
|
|
12
14
|
}, "strip", z.ZodTypeAny, {
|
|
13
15
|
key: string;
|
|
14
16
|
addedAt: number;
|
|
@@ -18,6 +20,8 @@ export declare const KimiAccountSchema: z.ZodObject<{
|
|
|
18
20
|
consecutiveFailures: number;
|
|
19
21
|
totalRequests: number;
|
|
20
22
|
successfulRequests: number;
|
|
23
|
+
responseTimes: number[];
|
|
24
|
+
dailyRequests: Record<string, number>;
|
|
21
25
|
name?: string | undefined;
|
|
22
26
|
}, {
|
|
23
27
|
key: string;
|
|
@@ -29,6 +33,8 @@ export declare const KimiAccountSchema: z.ZodObject<{
|
|
|
29
33
|
consecutiveFailures?: number | undefined;
|
|
30
34
|
totalRequests?: number | undefined;
|
|
31
35
|
successfulRequests?: number | undefined;
|
|
36
|
+
responseTimes?: number[] | undefined;
|
|
37
|
+
dailyRequests?: Record<string, number> | undefined;
|
|
32
38
|
}>;
|
|
33
39
|
export declare const KimiAccountsConfigSchema: z.ZodObject<{
|
|
34
40
|
version: z.ZodDefault<z.ZodNumber>;
|
|
@@ -42,6 +48,8 @@ export declare const KimiAccountsConfigSchema: z.ZodObject<{
|
|
|
42
48
|
consecutiveFailures: z.ZodDefault<z.ZodNumber>;
|
|
43
49
|
totalRequests: z.ZodDefault<z.ZodNumber>;
|
|
44
50
|
successfulRequests: z.ZodDefault<z.ZodNumber>;
|
|
51
|
+
responseTimes: z.ZodDefault<z.ZodArray<z.ZodNumber, "many">>;
|
|
52
|
+
dailyRequests: z.ZodDefault<z.ZodRecord<z.ZodString, z.ZodNumber>>;
|
|
45
53
|
}, "strip", z.ZodTypeAny, {
|
|
46
54
|
key: string;
|
|
47
55
|
addedAt: number;
|
|
@@ -51,6 +59,8 @@ export declare const KimiAccountsConfigSchema: z.ZodObject<{
|
|
|
51
59
|
consecutiveFailures: number;
|
|
52
60
|
totalRequests: number;
|
|
53
61
|
successfulRequests: number;
|
|
62
|
+
responseTimes: number[];
|
|
63
|
+
dailyRequests: Record<string, number>;
|
|
54
64
|
name?: string | undefined;
|
|
55
65
|
}, {
|
|
56
66
|
key: string;
|
|
@@ -62,9 +72,13 @@ export declare const KimiAccountsConfigSchema: z.ZodObject<{
|
|
|
62
72
|
consecutiveFailures?: number | undefined;
|
|
63
73
|
totalRequests?: number | undefined;
|
|
64
74
|
successfulRequests?: number | undefined;
|
|
75
|
+
responseTimes?: number[] | undefined;
|
|
76
|
+
dailyRequests?: Record<string, number> | undefined;
|
|
65
77
|
}>, "many">;
|
|
66
78
|
activeIndex: z.ZodDefault<z.ZodNumber>;
|
|
67
79
|
rotationStrategy: z.ZodDefault<z.ZodEnum<["round-robin", "health-based", "sticky"]>>;
|
|
80
|
+
autoRefreshHealth: z.ZodDefault<z.ZodBoolean>;
|
|
81
|
+
healthRefreshCooldownMinutes: z.ZodDefault<z.ZodNumber>;
|
|
68
82
|
}, "strip", z.ZodTypeAny, {
|
|
69
83
|
version: number;
|
|
70
84
|
accounts: {
|
|
@@ -76,10 +90,14 @@ export declare const KimiAccountsConfigSchema: z.ZodObject<{
|
|
|
76
90
|
consecutiveFailures: number;
|
|
77
91
|
totalRequests: number;
|
|
78
92
|
successfulRequests: number;
|
|
93
|
+
responseTimes: number[];
|
|
94
|
+
dailyRequests: Record<string, number>;
|
|
79
95
|
name?: string | undefined;
|
|
80
96
|
}[];
|
|
81
97
|
activeIndex: number;
|
|
82
98
|
rotationStrategy: "round-robin" | "health-based" | "sticky";
|
|
99
|
+
autoRefreshHealth: boolean;
|
|
100
|
+
healthRefreshCooldownMinutes: number;
|
|
83
101
|
}, {
|
|
84
102
|
accounts: {
|
|
85
103
|
key: string;
|
|
@@ -91,10 +109,14 @@ export declare const KimiAccountsConfigSchema: z.ZodObject<{
|
|
|
91
109
|
consecutiveFailures?: number | undefined;
|
|
92
110
|
totalRequests?: number | undefined;
|
|
93
111
|
successfulRequests?: number | undefined;
|
|
112
|
+
responseTimes?: number[] | undefined;
|
|
113
|
+
dailyRequests?: Record<string, number> | undefined;
|
|
94
114
|
}[];
|
|
95
115
|
version?: number | undefined;
|
|
96
116
|
activeIndex?: number | undefined;
|
|
97
117
|
rotationStrategy?: "round-robin" | "health-based" | "sticky" | undefined;
|
|
118
|
+
autoRefreshHealth?: boolean | undefined;
|
|
119
|
+
healthRefreshCooldownMinutes?: number | undefined;
|
|
98
120
|
}>;
|
|
99
121
|
export type KimiAccount = z.infer<typeof KimiAccountSchema>;
|
|
100
122
|
export type KimiAccountsConfig = z.infer<typeof KimiAccountsConfigSchema>;
|
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;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAY5B,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,CAQ7E,CAAC;AAEF,eAAO,MAAM,cAAc,EAAE,IAAI,CAAC,kBAAkB,EAAE,UAAU,CAM/D,CAAC"}
|
package/dist/types.js
CHANGED
|
@@ -9,12 +9,16 @@ export const KimiAccountSchema = z.object({
|
|
|
9
9
|
consecutiveFailures: z.number().default(0),
|
|
10
10
|
totalRequests: z.number().default(0),
|
|
11
11
|
successfulRequests: z.number().default(0),
|
|
12
|
+
responseTimes: z.array(z.number()).default([]),
|
|
13
|
+
dailyRequests: z.record(z.number()).default({}),
|
|
12
14
|
});
|
|
13
15
|
export const KimiAccountsConfigSchema = z.object({
|
|
14
16
|
version: z.number().default(1),
|
|
15
17
|
accounts: z.array(KimiAccountSchema),
|
|
16
18
|
activeIndex: z.number().default(0),
|
|
17
19
|
rotationStrategy: z.enum(['round-robin', 'health-based', 'sticky']).default('health-based'),
|
|
20
|
+
autoRefreshHealth: z.boolean().default(true),
|
|
21
|
+
healthRefreshCooldownMinutes: z.number().min(1).max(1440).default(30),
|
|
18
22
|
});
|
|
19
23
|
export const DEFAULT_ACCOUNT = {
|
|
20
24
|
rateLimitResetTime: 0,
|
|
@@ -22,10 +26,14 @@ export const DEFAULT_ACCOUNT = {
|
|
|
22
26
|
consecutiveFailures: 0,
|
|
23
27
|
totalRequests: 0,
|
|
24
28
|
successfulRequests: 0,
|
|
29
|
+
responseTimes: [],
|
|
30
|
+
dailyRequests: {},
|
|
25
31
|
};
|
|
26
32
|
export const DEFAULT_CONFIG = {
|
|
27
33
|
version: 1,
|
|
28
34
|
activeIndex: 0,
|
|
29
35
|
rotationStrategy: 'health-based',
|
|
36
|
+
autoRefreshHealth: true,
|
|
37
|
+
healthRefreshCooldownMinutes: 30,
|
|
30
38
|
};
|
|
31
39
|
//# sourceMappingURL=types.js.map
|
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,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;
|
|
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,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,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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "opencode-kimi-rotator",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.1.0",
|
|
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",
|
|
@@ -14,9 +14,15 @@
|
|
|
14
14
|
"bundle": "esbuild src/plugin.ts --bundle --platform=node --format=esm --outfile=dist/plugin.bundle.js --external:@opencode-ai/plugin --packages=bundle",
|
|
15
15
|
"dev": "tsc --watch",
|
|
16
16
|
"typecheck": "tsc --noEmit",
|
|
17
|
+
"lint": "eslint .",
|
|
18
|
+
"lint:fix": "eslint . --fix",
|
|
19
|
+
"format": "prettier --write .",
|
|
20
|
+
"format:check": "prettier --check .",
|
|
17
21
|
"clean": "rm -rf dist",
|
|
18
22
|
"install:plugin": "npm run bundle && mkdir -p ~/.config/opencode/plugins && cp dist/plugin.bundle.js ~/.config/opencode/plugins/kimi-rotator.js",
|
|
19
|
-
"
|
|
23
|
+
"postinstall": "npm run install:plugin && echo '\n✓ Kimi Rotator Plugin installed/updated!' && echo ' Location: ~/.config/opencode/plugins/kimi-rotator.js' && echo ' Restart OpenCode if currently running.'",
|
|
24
|
+
"prepublishOnly": "npm run build",
|
|
25
|
+
"ci": "npm run lint && npm run format:check && npm run typecheck"
|
|
20
26
|
},
|
|
21
27
|
"keywords": [
|
|
22
28
|
"opencode",
|
|
@@ -40,15 +46,20 @@
|
|
|
40
46
|
},
|
|
41
47
|
"homepage": "https://github.com/deyndev/opencode-kimi-rotator#readme",
|
|
42
48
|
"dependencies": {
|
|
43
|
-
"@opencode-ai/plugin": "^
|
|
49
|
+
"@opencode-ai/plugin": "^1.1.48",
|
|
44
50
|
"proper-lockfile": "^4.1.2",
|
|
45
51
|
"zod": "^3.22.4"
|
|
46
52
|
},
|
|
47
53
|
"devDependencies": {
|
|
54
|
+
"@eslint/js": "^9.19.0",
|
|
48
55
|
"@types/node": "^20.10.0",
|
|
49
56
|
"@types/proper-lockfile": "^4.1.4",
|
|
50
57
|
"esbuild": "^0.27.2",
|
|
51
|
-
"
|
|
58
|
+
"eslint": "^9.19.0",
|
|
59
|
+
"eslint-config-prettier": "^10.0.1",
|
|
60
|
+
"prettier": "^3.4.2",
|
|
61
|
+
"typescript": "^5.3.0",
|
|
62
|
+
"typescript-eslint": "^8.22.0"
|
|
52
63
|
},
|
|
53
64
|
"files": [
|
|
54
65
|
"dist",
|
|
@@ -63,4 +74,4 @@
|
|
|
63
74
|
"publishConfig": {
|
|
64
75
|
"access": "public"
|
|
65
76
|
}
|
|
66
|
-
}
|
|
77
|
+
}
|
package/src/plugin.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type { Plugin } from
|
|
1
|
+
import type { Plugin } from '@opencode-ai/plugin';
|
|
2
2
|
import { KimiAccountManager } from './accounts.js';
|
|
3
3
|
import type { KimiAccount } from './types.js';
|
|
4
4
|
|
|
@@ -8,7 +8,7 @@ interface OpenCodeAuth {
|
|
|
8
8
|
}
|
|
9
9
|
|
|
10
10
|
let accountManager: KimiAccountManager | null = null;
|
|
11
|
-
let currentAccountIndex
|
|
11
|
+
let currentAccountIndex = 0;
|
|
12
12
|
let originalFetch: typeof globalThis.fetch | null = null;
|
|
13
13
|
|
|
14
14
|
async function getAccountManager(): Promise<KimiAccountManager> {
|
|
@@ -37,11 +37,13 @@ async function getAuth(): Promise<OpenCodeAuth | null> {
|
|
|
37
37
|
|
|
38
38
|
let openCodeClient: {
|
|
39
39
|
tui?: {
|
|
40
|
-
showToast: (options: {
|
|
40
|
+
showToast: (options: {
|
|
41
|
+
body: { message: string; variant: 'info' | 'warning' | 'error' };
|
|
42
|
+
}) => Promise<unknown>;
|
|
41
43
|
};
|
|
42
44
|
} | null = null;
|
|
43
45
|
|
|
44
|
-
let toastQueue:
|
|
46
|
+
let toastQueue: { message: string; variant: 'info' | 'warning' | 'error' }[] = [];
|
|
45
47
|
|
|
46
48
|
async function showToast(message: string, variant: 'info' | 'warning' | 'error' = 'info') {
|
|
47
49
|
if (!openCodeClient?.tui?.showToast) {
|
|
@@ -61,7 +63,9 @@ async function flushToastQueue() {
|
|
|
61
63
|
const toast = toastQueue.shift();
|
|
62
64
|
if (toast) {
|
|
63
65
|
try {
|
|
64
|
-
await openCodeClient.tui.showToast({
|
|
66
|
+
await openCodeClient.tui.showToast({
|
|
67
|
+
body: { message: toast.message, variant: toast.variant },
|
|
68
|
+
});
|
|
65
69
|
} catch {
|
|
66
70
|
return;
|
|
67
71
|
}
|
|
@@ -83,64 +87,83 @@ export const KimiRotatorPlugin: Plugin = async ({ client }) => {
|
|
|
83
87
|
}
|
|
84
88
|
|
|
85
89
|
originalFetch = globalThis.fetch;
|
|
86
|
-
globalThis.fetch = async (
|
|
90
|
+
globalThis.fetch = async (
|
|
91
|
+
input: string | Request | URL,
|
|
92
|
+
init?: RequestInit
|
|
93
|
+
): Promise<Response> => {
|
|
87
94
|
const url = typeof input === 'string' ? input : input.toString();
|
|
88
95
|
|
|
89
96
|
if (url.includes('api.kimi.com')) {
|
|
90
|
-
|
|
97
|
+
if (!accountManager) {
|
|
98
|
+
throw new Error('Account manager not initialized');
|
|
99
|
+
}
|
|
100
|
+
const nextAccount = await accountManager.getNextAccount();
|
|
91
101
|
if (nextAccount) {
|
|
92
102
|
currentAccountIndex = nextAccount.index;
|
|
93
103
|
const keyLabel = nextAccount.account.key.substring(0, 18) + '...';
|
|
94
104
|
const position = nextAccount.index + 1;
|
|
95
|
-
const allKeysNow = await accountManager
|
|
105
|
+
const allKeysNow = await accountManager.listKeys();
|
|
96
106
|
const total = allKeysNow.length;
|
|
97
107
|
|
|
98
|
-
await showToast(`🔄 Using key: ${keyLabel} (${position}/${total})`, 'info');
|
|
108
|
+
await showToast(`🔄 Using key: ${keyLabel} (${String(position)}/${String(total)})`, 'info');
|
|
99
109
|
|
|
100
110
|
const headers = new Headers(init?.headers);
|
|
101
111
|
headers.set('x-api-key', nextAccount.account.key);
|
|
102
112
|
headers.delete('Authorization');
|
|
103
113
|
|
|
114
|
+
const requestStartTime = Date.now();
|
|
115
|
+
const today = new Date().toISOString().split('T')[0];
|
|
116
|
+
|
|
117
|
+
if (!originalFetch) {
|
|
118
|
+
throw new Error('Original fetch not available');
|
|
119
|
+
}
|
|
120
|
+
|
|
104
121
|
try {
|
|
105
|
-
const response = await originalFetch
|
|
122
|
+
const response = await originalFetch(input, { ...init, headers });
|
|
123
|
+
const responseTime = Date.now() - requestStartTime;
|
|
106
124
|
|
|
107
125
|
if (response.status === 429) {
|
|
108
126
|
const retryAfter = response.headers.get('retry-after');
|
|
109
127
|
const retryAfterMs = retryAfter ? parseInt(retryAfter, 10) * 1000 : 60000;
|
|
110
|
-
await accountManager
|
|
111
|
-
await showToast(`⚠️ Key ${position} rate limited`, 'warning');
|
|
128
|
+
await accountManager.markAccountRateLimited(currentAccountIndex, retryAfterMs);
|
|
129
|
+
await showToast(`⚠️ Key ${String(position)} rate limited`, 'warning');
|
|
112
130
|
} else if (response.ok) {
|
|
113
|
-
await accountManager
|
|
131
|
+
await accountManager.markAccountSuccess(currentAccountIndex, responseTime, today);
|
|
114
132
|
} else if (response.status >= 500) {
|
|
115
|
-
await accountManager
|
|
133
|
+
await accountManager.markAccountFailure(currentAccountIndex);
|
|
116
134
|
}
|
|
117
135
|
|
|
118
136
|
return response;
|
|
119
137
|
} catch (error: unknown) {
|
|
120
|
-
await accountManager
|
|
138
|
+
await accountManager.markAccountFailure(currentAccountIndex);
|
|
121
139
|
throw error;
|
|
122
140
|
}
|
|
123
141
|
}
|
|
124
142
|
}
|
|
125
143
|
|
|
126
|
-
|
|
144
|
+
if (!originalFetch) {
|
|
145
|
+
throw new Error('Original fetch not available');
|
|
146
|
+
}
|
|
147
|
+
return originalFetch(input, init);
|
|
127
148
|
};
|
|
128
149
|
|
|
129
150
|
const showInitialToast = async () => {
|
|
130
|
-
await new Promise(resolve => setTimeout(resolve, 500));
|
|
151
|
+
await new Promise((resolve) => setTimeout(resolve, 500));
|
|
131
152
|
await flushToastQueue();
|
|
132
|
-
await showToast(
|
|
153
|
+
await showToast('🎉 Kimi Rotator Plugin loaded!', 'info');
|
|
133
154
|
};
|
|
134
155
|
|
|
135
|
-
showInitialToast().catch(() =>
|
|
156
|
+
showInitialToast().catch(() => undefined);
|
|
136
157
|
|
|
137
158
|
const pluginReturn = {
|
|
138
159
|
auth: {
|
|
139
160
|
provider: 'kimi-rotator',
|
|
140
|
-
methods: [
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
161
|
+
methods: [
|
|
162
|
+
{
|
|
163
|
+
type: 'api' as const,
|
|
164
|
+
label: 'Kimi API Key',
|
|
165
|
+
},
|
|
166
|
+
],
|
|
144
167
|
loader: async () => {
|
|
145
168
|
const auth = await getAuth();
|
|
146
169
|
if (!auth) {
|
|
@@ -154,7 +177,7 @@ export const KimiRotatorPlugin: Plugin = async ({ client }) => {
|
|
|
154
177
|
baseURL: kimiBaseUrl,
|
|
155
178
|
async fetch(input: string | Request | URL, init?: RequestInit) {
|
|
156
179
|
return globalThis.fetch(input, init);
|
|
157
|
-
}
|
|
180
|
+
},
|
|
158
181
|
};
|
|
159
182
|
},
|
|
160
183
|
},
|