opencode-gemini-business 1.0.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/CHANGELOG.md +58 -0
- package/LICENSE +21 -0
- package/README.md +305 -0
- package/README.ru.md +311 -0
- package/bin/cli.js +18 -0
- package/dist/index.d.ts +69 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +306 -0
- package/dist/index.js.map +1 -0
- package/dist/src/account-manager.d.ts +58 -0
- package/dist/src/account-manager.d.ts.map +1 -0
- package/dist/src/account-manager.js +190 -0
- package/dist/src/account-manager.js.map +1 -0
- package/dist/src/gemini-business-api.d.ts +67 -0
- package/dist/src/gemini-business-api.d.ts.map +1 -0
- package/dist/src/gemini-business-api.js +302 -0
- package/dist/src/gemini-business-api.js.map +1 -0
- package/dist/src/types.d.ts +104 -0
- package/dist/src/types.d.ts.map +1 -0
- package/dist/src/types.js +5 -0
- package/dist/src/types.js.map +1 -0
- package/package.json +66 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"account-manager.js","sourceRoot":"","sources":["../../src/account-manager.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Gemini Business API Client - handles direct API communication with Gemini Business
|
|
3
|
+
*
|
|
4
|
+
* Uses correct endpoints:
|
|
5
|
+
* - https://business.gemini.google/auth/getoxsrf (XSRF token)
|
|
6
|
+
* - https://biz-discoveryengine.googleapis.com/v1alpha/locations/global/widgetCreateSession (session)
|
|
7
|
+
* - https://biz-discoveryengine.googleapis.com/v1alpha/locations/global/widgetStreamAssist (chat)
|
|
8
|
+
*/
|
|
9
|
+
import { GeminiBusinessAccount, ChatCompletionRequest, ChatCompletionResponse } from './types.js';
|
|
10
|
+
export declare class GeminiBusinessAPI {
|
|
11
|
+
private account;
|
|
12
|
+
constructor(account: GeminiBusinessAccount);
|
|
13
|
+
/**
|
|
14
|
+
* Get XSRF token from business.gemini.google
|
|
15
|
+
* Tokens are cached for 55 minutes
|
|
16
|
+
*/
|
|
17
|
+
private getXSRFToken;
|
|
18
|
+
/**
|
|
19
|
+
* Create session with widgetCreateSession
|
|
20
|
+
* Sessions are cached for 50 minutes
|
|
21
|
+
*/
|
|
22
|
+
private createSession;
|
|
23
|
+
/**
|
|
24
|
+
* Send chat completion request to widgetStreamAssist
|
|
25
|
+
*/
|
|
26
|
+
chatCompletion(request: ChatCompletionRequest): Promise<ChatCompletionResponse | AsyncIterable<ChatCompletionResponse>>;
|
|
27
|
+
/**
|
|
28
|
+
* Build cookie header string
|
|
29
|
+
*/
|
|
30
|
+
private buildCookieHeader;
|
|
31
|
+
/**
|
|
32
|
+
* Get user agent string
|
|
33
|
+
*/
|
|
34
|
+
private getUserAgent;
|
|
35
|
+
/**
|
|
36
|
+
* Convert OpenAI format to Gemini Business format
|
|
37
|
+
*/
|
|
38
|
+
private convertToGeminiFormat;
|
|
39
|
+
/**
|
|
40
|
+
* Build prompt string from OpenAI messages array
|
|
41
|
+
*/
|
|
42
|
+
private buildPromptFromMessages;
|
|
43
|
+
/**
|
|
44
|
+
* Convert Gemini Business format to OpenAI format
|
|
45
|
+
*/
|
|
46
|
+
private convertToOpenAIFormat;
|
|
47
|
+
/**
|
|
48
|
+
* Handle streaming SSE response
|
|
49
|
+
*/
|
|
50
|
+
private handleStreamResponse;
|
|
51
|
+
/**
|
|
52
|
+
* Test account credentials and connectivity
|
|
53
|
+
*/
|
|
54
|
+
testAccount(): Promise<{
|
|
55
|
+
success: boolean;
|
|
56
|
+
error?: string;
|
|
57
|
+
}>;
|
|
58
|
+
/**
|
|
59
|
+
* Check if session needs refresh
|
|
60
|
+
*/
|
|
61
|
+
needsSessionRefresh(): boolean;
|
|
62
|
+
/**
|
|
63
|
+
* Force refresh session
|
|
64
|
+
*/
|
|
65
|
+
refreshSession(): Promise<void>;
|
|
66
|
+
}
|
|
67
|
+
//# sourceMappingURL=gemini-business-api.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"gemini-business-api.d.ts","sourceRoot":"","sources":["../../src/gemini-business-api.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAGH,OAAO,EACL,qBAAqB,EACrB,qBAAqB,EACrB,sBAAsB,EAEvB,MAAM,YAAY,CAAC;AAQpB,qBAAa,iBAAiB;IAC5B,OAAO,CAAC,OAAO,CAAwB;gBAE3B,OAAO,EAAE,qBAAqB;IAI1C;;;OAGG;YACW,YAAY;IAoC1B;;;OAGG;YACW,aAAa;IA2C3B;;OAEG;IACG,cAAc,CAClB,OAAO,EAAE,qBAAqB,GAC7B,OAAO,CAAC,sBAAsB,GAAG,aAAa,CAAC,sBAAsB,CAAC,CAAC;IAsC1E;;OAEG;IACH,OAAO,CAAC,iBAAiB;IAIzB;;OAEG;IACH,OAAO,CAAC,YAAY;IAOpB;;OAEG;IACH,OAAO,CAAC,qBAAqB;IAkB7B;;OAEG;IACH,OAAO,CAAC,uBAAuB;IAmB/B;;OAEG;IACH,OAAO,CAAC,qBAAqB;IA2B7B;;OAEG;YACY,oBAAoB;IAsDnC;;OAEG;IACG,WAAW,IAAI,OAAO,CAAC;QAAE,OAAO,EAAE,OAAO,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IAiBlE;;OAEG;IACH,mBAAmB,IAAI,OAAO;IAY9B;;OAEG;IACG,cAAc,IAAI,OAAO,CAAC,IAAI,CAAC;CAQtC"}
|
|
@@ -0,0 +1,302 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Gemini Business API Client - handles direct API communication with Gemini Business
|
|
3
|
+
*
|
|
4
|
+
* Uses correct endpoints:
|
|
5
|
+
* - https://business.gemini.google/auth/getoxsrf (XSRF token)
|
|
6
|
+
* - https://biz-discoveryengine.googleapis.com/v1alpha/locations/global/widgetCreateSession (session)
|
|
7
|
+
* - https://biz-discoveryengine.googleapis.com/v1alpha/locations/global/widgetStreamAssist (chat)
|
|
8
|
+
*/
|
|
9
|
+
import fetch from 'node-fetch';
|
|
10
|
+
// Gemini Business API Endpoints
|
|
11
|
+
const BASE_URL = 'https://biz-discoveryengine.googleapis.com/v1alpha/locations/global';
|
|
12
|
+
const CREATE_SESSION_URL = `${BASE_URL}/widgetCreateSession`;
|
|
13
|
+
const STREAM_ASSIST_URL = `${BASE_URL}/widgetStreamAssist`;
|
|
14
|
+
const GETOXSRF_URL = 'https://business.gemini.google/auth/getoxsrf';
|
|
15
|
+
export class GeminiBusinessAPI {
|
|
16
|
+
account;
|
|
17
|
+
constructor(account) {
|
|
18
|
+
this.account = account;
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* Get XSRF token from business.gemini.google
|
|
22
|
+
* Tokens are cached for 55 minutes
|
|
23
|
+
*/
|
|
24
|
+
async getXSRFToken() {
|
|
25
|
+
// Check if cached token is still valid
|
|
26
|
+
if (this.account.xsrf_token && this.account.xsrf_expires) {
|
|
27
|
+
if (Date.now() < this.account.xsrf_expires) {
|
|
28
|
+
return this.account.xsrf_token;
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
try {
|
|
32
|
+
const response = await fetch(GETOXSRF_URL, {
|
|
33
|
+
method: 'POST',
|
|
34
|
+
headers: {
|
|
35
|
+
'Cookie': this.buildCookieHeader(),
|
|
36
|
+
'User-Agent': this.getUserAgent(),
|
|
37
|
+
'Content-Type': 'application/json',
|
|
38
|
+
},
|
|
39
|
+
body: JSON.stringify({}),
|
|
40
|
+
});
|
|
41
|
+
if (!response.ok) {
|
|
42
|
+
const errorText = await response.text();
|
|
43
|
+
throw new Error(`Failed to get XSRF token: ${response.status} ${response.statusText}\n${errorText}`);
|
|
44
|
+
}
|
|
45
|
+
const data = await response.json();
|
|
46
|
+
// Cache token for 55 minutes
|
|
47
|
+
this.account.xsrf_token = data.token;
|
|
48
|
+
this.account.xsrf_expires = Date.now() + (55 * 60 * 1000);
|
|
49
|
+
return data.token;
|
|
50
|
+
}
|
|
51
|
+
catch (error) {
|
|
52
|
+
throw new Error(`XSRF token retrieval failed: ${error}`);
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
/**
|
|
56
|
+
* Create session with widgetCreateSession
|
|
57
|
+
* Sessions are cached for 50 minutes
|
|
58
|
+
*/
|
|
59
|
+
async createSession() {
|
|
60
|
+
// Check if cached session is still valid
|
|
61
|
+
if (this.account.session_id && this.account.session_expires) {
|
|
62
|
+
if (Date.now() < this.account.session_expires) {
|
|
63
|
+
return this.account.session_id;
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
try {
|
|
67
|
+
const xsrfToken = await this.getXSRFToken();
|
|
68
|
+
const response = await fetch(CREATE_SESSION_URL, {
|
|
69
|
+
method: 'POST',
|
|
70
|
+
headers: {
|
|
71
|
+
'Content-Type': 'application/json',
|
|
72
|
+
'Cookie': this.buildCookieHeader(),
|
|
73
|
+
'X-Goog-Team-Id': this.account.team_id,
|
|
74
|
+
'X-XSRF-Token': xsrfToken,
|
|
75
|
+
'User-Agent': this.getUserAgent(),
|
|
76
|
+
},
|
|
77
|
+
body: JSON.stringify({
|
|
78
|
+
team_id: this.account.team_id,
|
|
79
|
+
csesidx: this.account.csesidx,
|
|
80
|
+
}),
|
|
81
|
+
});
|
|
82
|
+
if (!response.ok) {
|
|
83
|
+
const errorText = await response.text();
|
|
84
|
+
throw new Error(`Failed to create session: ${response.status} ${response.statusText}\n${errorText}`);
|
|
85
|
+
}
|
|
86
|
+
const data = await response.json();
|
|
87
|
+
// Cache session for 50 minutes
|
|
88
|
+
this.account.session_id = data.session_id;
|
|
89
|
+
this.account.session_expires = Date.now() + (50 * 60 * 1000);
|
|
90
|
+
return data.session_id;
|
|
91
|
+
}
|
|
92
|
+
catch (error) {
|
|
93
|
+
throw new Error(`Session creation failed: ${error}`);
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
/**
|
|
97
|
+
* Send chat completion request to widgetStreamAssist
|
|
98
|
+
*/
|
|
99
|
+
async chatCompletion(request) {
|
|
100
|
+
try {
|
|
101
|
+
const sessionId = await this.createSession();
|
|
102
|
+
const xsrfToken = await this.getXSRFToken();
|
|
103
|
+
// Convert OpenAI format to Gemini Business format
|
|
104
|
+
const geminiRequest = this.convertToGeminiFormat(request, sessionId);
|
|
105
|
+
const response = await fetch(STREAM_ASSIST_URL, {
|
|
106
|
+
method: 'POST',
|
|
107
|
+
headers: {
|
|
108
|
+
'Content-Type': 'application/json',
|
|
109
|
+
'Cookie': this.buildCookieHeader(),
|
|
110
|
+
'X-Goog-Team-Id': this.account.team_id,
|
|
111
|
+
'X-XSRF-Token': xsrfToken,
|
|
112
|
+
'User-Agent': this.getUserAgent(),
|
|
113
|
+
},
|
|
114
|
+
body: JSON.stringify(geminiRequest),
|
|
115
|
+
});
|
|
116
|
+
if (!response.ok) {
|
|
117
|
+
const errorText = await response.text();
|
|
118
|
+
throw new Error(`Chat completion failed: ${response.status} ${response.statusText}\n${errorText}`);
|
|
119
|
+
}
|
|
120
|
+
// Handle streaming response
|
|
121
|
+
if (request.stream) {
|
|
122
|
+
return this.handleStreamResponse(response, request.model);
|
|
123
|
+
}
|
|
124
|
+
// Handle non-streaming response
|
|
125
|
+
const data = await response.json();
|
|
126
|
+
return this.convertToOpenAIFormat(data, request.model);
|
|
127
|
+
}
|
|
128
|
+
catch (error) {
|
|
129
|
+
throw new Error(`Chat completion request failed: ${error}`);
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
/**
|
|
133
|
+
* Build cookie header string
|
|
134
|
+
*/
|
|
135
|
+
buildCookieHeader() {
|
|
136
|
+
return `__Secure-c_ses=${this.account.cookies.secure_c_ses}; __Host-c_oses=${this.account.cookies.host_c_oses}`;
|
|
137
|
+
}
|
|
138
|
+
/**
|
|
139
|
+
* Get user agent string
|
|
140
|
+
*/
|
|
141
|
+
getUserAgent() {
|
|
142
|
+
return (this.account.user_agent ||
|
|
143
|
+
'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36');
|
|
144
|
+
}
|
|
145
|
+
/**
|
|
146
|
+
* Convert OpenAI format to Gemini Business format
|
|
147
|
+
*/
|
|
148
|
+
convertToGeminiFormat(request, sessionId) {
|
|
149
|
+
// Build prompt from messages
|
|
150
|
+
const prompt = this.buildPromptFromMessages(request.messages);
|
|
151
|
+
return {
|
|
152
|
+
session_id: sessionId,
|
|
153
|
+
prompt,
|
|
154
|
+
model: request.model || 'gemini-2.5-pro',
|
|
155
|
+
stream: request.stream || false,
|
|
156
|
+
temperature: request.temperature,
|
|
157
|
+
max_tokens: request.max_tokens,
|
|
158
|
+
top_p: request.top_p,
|
|
159
|
+
};
|
|
160
|
+
}
|
|
161
|
+
/**
|
|
162
|
+
* Build prompt string from OpenAI messages array
|
|
163
|
+
*/
|
|
164
|
+
buildPromptFromMessages(messages) {
|
|
165
|
+
return messages
|
|
166
|
+
.map((msg) => {
|
|
167
|
+
const role = msg.role === 'assistant' ? 'Assistant' : msg.role === 'system' ? 'System' : 'User';
|
|
168
|
+
if (typeof msg.content === 'string') {
|
|
169
|
+
return `${role}: ${msg.content}`;
|
|
170
|
+
}
|
|
171
|
+
else {
|
|
172
|
+
// Handle multimodal content (text + images)
|
|
173
|
+
const textParts = msg.content
|
|
174
|
+
.filter((part) => part.type === 'text' && part.text)
|
|
175
|
+
.map((part) => part.text)
|
|
176
|
+
.join(' ');
|
|
177
|
+
return `${role}: ${textParts}`;
|
|
178
|
+
}
|
|
179
|
+
})
|
|
180
|
+
.join('\n\n');
|
|
181
|
+
}
|
|
182
|
+
/**
|
|
183
|
+
* Convert Gemini Business format to OpenAI format
|
|
184
|
+
*/
|
|
185
|
+
convertToOpenAIFormat(data, model) {
|
|
186
|
+
const content = data.text || data.content || '';
|
|
187
|
+
const finishReason = data.finish_reason || 'stop';
|
|
188
|
+
return {
|
|
189
|
+
id: `chatcmpl-${Date.now()}-${Math.random().toString(36).substr(2, 9)}`,
|
|
190
|
+
object: 'chat.completion',
|
|
191
|
+
created: Math.floor(Date.now() / 1000),
|
|
192
|
+
model,
|
|
193
|
+
choices: [
|
|
194
|
+
{
|
|
195
|
+
index: 0,
|
|
196
|
+
message: {
|
|
197
|
+
role: 'assistant',
|
|
198
|
+
content,
|
|
199
|
+
},
|
|
200
|
+
finish_reason: finishReason,
|
|
201
|
+
},
|
|
202
|
+
],
|
|
203
|
+
usage: {
|
|
204
|
+
prompt_tokens: 0, // Gemini Business doesn't provide token counts
|
|
205
|
+
completion_tokens: 0,
|
|
206
|
+
total_tokens: 0,
|
|
207
|
+
},
|
|
208
|
+
};
|
|
209
|
+
}
|
|
210
|
+
/**
|
|
211
|
+
* Handle streaming SSE response
|
|
212
|
+
*/
|
|
213
|
+
async *handleStreamResponse(response, model) {
|
|
214
|
+
const reader = response.body;
|
|
215
|
+
let buffer = '';
|
|
216
|
+
try {
|
|
217
|
+
for await (const chunk of reader) {
|
|
218
|
+
buffer += chunk.toString();
|
|
219
|
+
const lines = buffer.split('\n');
|
|
220
|
+
buffer = lines.pop() || '';
|
|
221
|
+
for (const line of lines) {
|
|
222
|
+
const trimmed = line.trim();
|
|
223
|
+
// Skip empty lines and [DONE] marker
|
|
224
|
+
if (!trimmed || trimmed === 'data: [DONE]')
|
|
225
|
+
continue;
|
|
226
|
+
// Parse SSE data
|
|
227
|
+
if (trimmed.startsWith('data: ')) {
|
|
228
|
+
try {
|
|
229
|
+
const jsonStr = trimmed.slice(6);
|
|
230
|
+
const data = JSON.parse(jsonStr);
|
|
231
|
+
// Convert to OpenAI streaming format
|
|
232
|
+
yield {
|
|
233
|
+
id: `chatcmpl-${Date.now()}`,
|
|
234
|
+
object: 'chat.completion.chunk',
|
|
235
|
+
created: Math.floor(Date.now() / 1000),
|
|
236
|
+
model,
|
|
237
|
+
choices: [
|
|
238
|
+
{
|
|
239
|
+
index: 0,
|
|
240
|
+
delta: {
|
|
241
|
+
role: 'assistant',
|
|
242
|
+
content: data.text || data.content || '',
|
|
243
|
+
},
|
|
244
|
+
finish_reason: data.finish_reason || null,
|
|
245
|
+
},
|
|
246
|
+
],
|
|
247
|
+
};
|
|
248
|
+
}
|
|
249
|
+
catch (error) {
|
|
250
|
+
console.error('Failed to parse SSE data:', error);
|
|
251
|
+
}
|
|
252
|
+
}
|
|
253
|
+
}
|
|
254
|
+
}
|
|
255
|
+
}
|
|
256
|
+
catch (error) {
|
|
257
|
+
console.error('Stream reading error:', error);
|
|
258
|
+
throw error;
|
|
259
|
+
}
|
|
260
|
+
}
|
|
261
|
+
/**
|
|
262
|
+
* Test account credentials and connectivity
|
|
263
|
+
*/
|
|
264
|
+
async testAccount() {
|
|
265
|
+
try {
|
|
266
|
+
// Test 1: Get XSRF token
|
|
267
|
+
await this.getXSRFToken();
|
|
268
|
+
// Test 2: Create session
|
|
269
|
+
await this.createSession();
|
|
270
|
+
return { success: true };
|
|
271
|
+
}
|
|
272
|
+
catch (error) {
|
|
273
|
+
return {
|
|
274
|
+
success: false,
|
|
275
|
+
error: error instanceof Error ? error.message : String(error),
|
|
276
|
+
};
|
|
277
|
+
}
|
|
278
|
+
}
|
|
279
|
+
/**
|
|
280
|
+
* Check if session needs refresh
|
|
281
|
+
*/
|
|
282
|
+
needsSessionRefresh() {
|
|
283
|
+
if (!this.account.session_id || !this.account.session_expires) {
|
|
284
|
+
return true;
|
|
285
|
+
}
|
|
286
|
+
const now = Date.now();
|
|
287
|
+
const expiresIn = this.account.session_expires - now;
|
|
288
|
+
// Refresh if less than 5 minutes remaining
|
|
289
|
+
return expiresIn < (5 * 60 * 1000);
|
|
290
|
+
}
|
|
291
|
+
/**
|
|
292
|
+
* Force refresh session
|
|
293
|
+
*/
|
|
294
|
+
async refreshSession() {
|
|
295
|
+
// Clear cached session
|
|
296
|
+
this.account.session_id = undefined;
|
|
297
|
+
this.account.session_expires = undefined;
|
|
298
|
+
// Create new session
|
|
299
|
+
await this.createSession();
|
|
300
|
+
}
|
|
301
|
+
}
|
|
302
|
+
//# sourceMappingURL=gemini-business-api.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"gemini-business-api.js","sourceRoot":"","sources":["../../src/gemini-business-api.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,104 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Types for Gemini Business Pool
|
|
3
|
+
*/
|
|
4
|
+
export interface GeminiBusinessAccount {
|
|
5
|
+
id: string;
|
|
6
|
+
name: string;
|
|
7
|
+
team_id: string;
|
|
8
|
+
cookies: {
|
|
9
|
+
secure_c_ses: string;
|
|
10
|
+
host_c_oses: string;
|
|
11
|
+
};
|
|
12
|
+
csesidx: string;
|
|
13
|
+
user_agent?: string;
|
|
14
|
+
xsrf_token?: string;
|
|
15
|
+
xsrf_expires?: number;
|
|
16
|
+
session_id?: string;
|
|
17
|
+
session_expires?: number;
|
|
18
|
+
enabled: boolean;
|
|
19
|
+
last_used?: number;
|
|
20
|
+
error_count?: number;
|
|
21
|
+
last_error?: string;
|
|
22
|
+
}
|
|
23
|
+
export interface PoolConfig {
|
|
24
|
+
accounts: GeminiBusinessAccount[];
|
|
25
|
+
rotation_strategy: 'round-robin' | 'least-used' | 'random';
|
|
26
|
+
max_retries: number;
|
|
27
|
+
retry_delay: number;
|
|
28
|
+
session_refresh_threshold: number;
|
|
29
|
+
error_threshold: number;
|
|
30
|
+
}
|
|
31
|
+
export interface GeminiBusinessSession {
|
|
32
|
+
session_id: string;
|
|
33
|
+
expires_at: number;
|
|
34
|
+
}
|
|
35
|
+
export interface XSRFTokenResponse {
|
|
36
|
+
token: string;
|
|
37
|
+
expires: number;
|
|
38
|
+
}
|
|
39
|
+
export interface WidgetCreateSessionRequest {
|
|
40
|
+
team_id: string;
|
|
41
|
+
csesidx: string;
|
|
42
|
+
}
|
|
43
|
+
export interface WidgetStreamAssistRequest {
|
|
44
|
+
session_id: string;
|
|
45
|
+
prompt: string;
|
|
46
|
+
model: string;
|
|
47
|
+
stream: boolean;
|
|
48
|
+
temperature?: number;
|
|
49
|
+
max_tokens?: number;
|
|
50
|
+
}
|
|
51
|
+
export interface WidgetStreamAssistResponse {
|
|
52
|
+
text?: string;
|
|
53
|
+
content?: string;
|
|
54
|
+
model: string;
|
|
55
|
+
finish_reason?: string;
|
|
56
|
+
}
|
|
57
|
+
export interface ChatMessage {
|
|
58
|
+
role: 'system' | 'user' | 'assistant';
|
|
59
|
+
content: string | Array<{
|
|
60
|
+
type: 'text' | 'image_url';
|
|
61
|
+
text?: string;
|
|
62
|
+
image_url?: {
|
|
63
|
+
url: string;
|
|
64
|
+
};
|
|
65
|
+
}>;
|
|
66
|
+
}
|
|
67
|
+
export interface ChatCompletionRequest {
|
|
68
|
+
model: string;
|
|
69
|
+
messages: ChatMessage[];
|
|
70
|
+
stream?: boolean;
|
|
71
|
+
temperature?: number;
|
|
72
|
+
max_tokens?: number;
|
|
73
|
+
top_p?: number;
|
|
74
|
+
}
|
|
75
|
+
export interface ChatCompletionResponse {
|
|
76
|
+
id: string;
|
|
77
|
+
object: 'chat.completion' | 'chat.completion.chunk';
|
|
78
|
+
created: number;
|
|
79
|
+
model: string;
|
|
80
|
+
choices: Array<{
|
|
81
|
+
index: number;
|
|
82
|
+
message?: {
|
|
83
|
+
role: string;
|
|
84
|
+
content: string;
|
|
85
|
+
};
|
|
86
|
+
delta?: {
|
|
87
|
+
role?: string;
|
|
88
|
+
content?: string;
|
|
89
|
+
};
|
|
90
|
+
finish_reason: string | null;
|
|
91
|
+
}>;
|
|
92
|
+
usage?: {
|
|
93
|
+
prompt_tokens: number;
|
|
94
|
+
completion_tokens: number;
|
|
95
|
+
total_tokens: number;
|
|
96
|
+
};
|
|
97
|
+
}
|
|
98
|
+
export interface ModelInfo {
|
|
99
|
+
id: string;
|
|
100
|
+
object: 'model';
|
|
101
|
+
created: number;
|
|
102
|
+
owned_by: string;
|
|
103
|
+
}
|
|
104
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/types.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/types.ts"],"names":[],"mappings":"AAAA;;GAEG"}
|
package/package.json
ADDED
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "opencode-gemini-business",
|
|
3
|
+
"version": "1.0.0",
|
|
4
|
+
"description": "OpenCode plugin for multi-account Gemini Business pool with automatic rotation",
|
|
5
|
+
"main": "./dist/index.js",
|
|
6
|
+
"types": "./dist/index.d.ts",
|
|
7
|
+
"type": "module",
|
|
8
|
+
"bin": {
|
|
9
|
+
"opencode-gemini-business": "./bin/cli.js"
|
|
10
|
+
},
|
|
11
|
+
"scripts": {
|
|
12
|
+
"build": "tsc",
|
|
13
|
+
"build:watch": "tsc --watch",
|
|
14
|
+
"test": "vitest run",
|
|
15
|
+
"test:watch": "vitest",
|
|
16
|
+
"test:coverage": "vitest run --coverage",
|
|
17
|
+
"lint": "tsc --noEmit",
|
|
18
|
+
"prepublishOnly": "npm run build",
|
|
19
|
+
"semantic-release": "semantic-release"
|
|
20
|
+
},
|
|
21
|
+
"keywords": [
|
|
22
|
+
"opencode",
|
|
23
|
+
"gemini",
|
|
24
|
+
"business",
|
|
25
|
+
"multi-account",
|
|
26
|
+
"pool",
|
|
27
|
+
"ai",
|
|
28
|
+
"google",
|
|
29
|
+
"gemini-api",
|
|
30
|
+
"rotation",
|
|
31
|
+
"failover",
|
|
32
|
+
"plugin"
|
|
33
|
+
],
|
|
34
|
+
"repository": {
|
|
35
|
+
"type": "git",
|
|
36
|
+
"url": "https://github.com/izzzzzi/opencode-gemini-business.git"
|
|
37
|
+
},
|
|
38
|
+
"bugs": {
|
|
39
|
+
"url": "https://github.com/izzzzzi/opencode-gemini-business/issues"
|
|
40
|
+
},
|
|
41
|
+
"homepage": "https://github.com/izzzzzi/opencode-gemini-business#readme",
|
|
42
|
+
"author": "",
|
|
43
|
+
"license": "MIT",
|
|
44
|
+
"dependencies": {
|
|
45
|
+
"@ai-sdk/google": "^1.0.0",
|
|
46
|
+
"node-fetch": "^3.3.2"
|
|
47
|
+
},
|
|
48
|
+
"devDependencies": {
|
|
49
|
+
"@semantic-release/changelog": "^6.0.3",
|
|
50
|
+
"@semantic-release/git": "^10.0.1",
|
|
51
|
+
"@types/node": "^20.0.0",
|
|
52
|
+
"semantic-release": "^23.0.0",
|
|
53
|
+
"typescript": "^5.3.0",
|
|
54
|
+
"vitest": "^1.0.0"
|
|
55
|
+
},
|
|
56
|
+
"engines": {
|
|
57
|
+
"node": ">=18.0.0"
|
|
58
|
+
},
|
|
59
|
+
"files": [
|
|
60
|
+
"dist/",
|
|
61
|
+
"bin/",
|
|
62
|
+
"README.md",
|
|
63
|
+
"LICENSE",
|
|
64
|
+
"CHANGELOG.md"
|
|
65
|
+
]
|
|
66
|
+
}
|