@aituber-onair/core 0.2.0 → 0.4.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 +95 -8
- package/dist/constants/chat.d.ts +13 -0
- package/dist/constants/chat.js +14 -0
- package/dist/constants/chat.js.map +1 -0
- package/dist/constants/claude.d.ts +6 -0
- package/dist/constants/claude.js +13 -0
- package/dist/constants/claude.js.map +1 -0
- package/dist/constants/gemini.d.ts +7 -0
- package/dist/constants/gemini.js +17 -0
- package/dist/constants/gemini.js.map +1 -0
- package/dist/constants/index.d.ts +7 -28
- package/dist/constants/index.js +7 -41
- package/dist/constants/index.js.map +1 -1
- package/dist/constants/openai.d.ts +8 -0
- package/dist/constants/openai.js +17 -0
- package/dist/constants/openai.js.map +1 -0
- package/dist/constants/voiceEngine.d.ts +5 -0
- package/dist/constants/voiceEngine.js +6 -0
- package/dist/constants/voiceEngine.js.map +1 -0
- package/dist/constants/youtube.d.ts +1 -0
- package/dist/constants/youtube.js +2 -0
- package/dist/constants/youtube.js.map +1 -0
- package/dist/core/AITuberOnAirCore.js +10 -3
- package/dist/core/AITuberOnAirCore.js.map +1 -1
- package/dist/core/ChatProcessor.js +1 -1
- package/dist/core/ChatProcessor.js.map +1 -1
- package/dist/index.d.ts +6 -4
- package/dist/index.js +6 -4
- package/dist/index.js.map +1 -1
- package/dist/services/chat/ChatService.d.ts +10 -0
- package/dist/services/chat/ChatServiceFactory.js +5 -2
- package/dist/services/chat/ChatServiceFactory.js.map +1 -1
- package/dist/services/chat/providers/claude/ClaudeChatService.d.ts +68 -0
- package/dist/services/chat/providers/claude/ClaudeChatService.js +337 -0
- package/dist/services/chat/providers/claude/ClaudeChatService.js.map +1 -0
- package/dist/services/chat/providers/claude/ClaudeChatServiceProvider.d.ts +39 -0
- package/dist/services/chat/providers/claude/ClaudeChatServiceProvider.js +62 -0
- package/dist/services/chat/providers/claude/ClaudeChatServiceProvider.js.map +1 -0
- package/dist/services/chat/providers/claude/ClaudeSummarizer.d.ts +25 -0
- package/dist/services/chat/providers/claude/ClaudeSummarizer.js +68 -0
- package/dist/services/chat/providers/claude/ClaudeSummarizer.js.map +1 -0
- package/dist/services/chat/providers/gemini/GeminiChatService.d.ts +68 -0
- package/dist/services/chat/providers/gemini/GeminiChatService.js +325 -0
- package/dist/services/chat/providers/gemini/GeminiChatService.js.map +1 -0
- package/dist/services/chat/providers/gemini/GeminiChatServiceProvider.d.ts +39 -0
- package/dist/services/chat/providers/gemini/GeminiChatServiceProvider.js +61 -0
- package/dist/services/chat/providers/gemini/GeminiChatServiceProvider.js.map +1 -0
- package/dist/services/chat/providers/gemini/GeminiSummarizer.d.ts +25 -0
- package/dist/services/chat/providers/gemini/GeminiSummarizer.js +86 -0
- package/dist/services/chat/providers/gemini/GeminiSummarizer.js.map +1 -0
- package/dist/services/chat/providers/openai/OpenAIChatService.d.ts +44 -0
- package/dist/services/chat/providers/openai/OpenAIChatService.js +182 -0
- package/dist/services/chat/providers/openai/OpenAIChatService.js.map +1 -0
- package/dist/services/chat/providers/openai/OpenAIChatServiceProvider.d.ts +39 -0
- package/dist/services/chat/providers/openai/OpenAIChatServiceProvider.js +57 -0
- package/dist/services/chat/providers/openai/OpenAIChatServiceProvider.js.map +1 -0
- package/dist/services/chat/providers/openai/OpenAISummarizer.d.ts +25 -0
- package/dist/services/chat/providers/openai/OpenAISummarizer.js +70 -0
- package/dist/services/chat/providers/openai/OpenAISummarizer.js.map +1 -0
- package/dist/services/voice/VoiceEngineAdapter.js +21 -0
- package/dist/services/voice/VoiceEngineAdapter.js.map +1 -1
- package/dist/services/voice/VoiceService.d.ts +6 -0
- package/dist/services/voice/engines/AivisSpeechEngine.d.ts +6 -0
- package/dist/services/voice/engines/AivisSpeechEngine.js +12 -2
- package/dist/services/voice/engines/AivisSpeechEngine.js.map +1 -1
- package/dist/services/voice/engines/OpenAiEngine.js +2 -1
- package/dist/services/voice/engines/OpenAiEngine.js.map +1 -1
- package/dist/services/voice/engines/VoiceEngine.d.ts +5 -0
- package/dist/services/voice/engines/VoicePeakEngine.d.ts +6 -0
- package/dist/services/voice/engines/VoicePeakEngine.js +12 -2
- package/dist/services/voice/engines/VoicePeakEngine.js.map +1 -1
- package/dist/services/voice/engines/VoiceVoxEngine.d.ts +6 -0
- package/dist/services/voice/engines/VoiceVoxEngine.js +12 -2
- package/dist/services/voice/engines/VoiceVoxEngine.js.map +1 -1
- package/dist/types/index.d.ts +2 -2
- package/dist/types/index.js +1 -1
- package/dist/types/index.js.map +1 -1
- package/dist/types/voice.js +7 -1
- package/dist/types/voice.js.map +1 -1
- package/package.json +4 -3
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
import { ChatService } from '../../ChatService';
|
|
2
|
+
import { Message, MessageWithVision } from '../../../../types';
|
|
3
|
+
/**
|
|
4
|
+
* Gemini implementation of ChatService
|
|
5
|
+
*/
|
|
6
|
+
export declare class GeminiChatService implements ChatService {
|
|
7
|
+
private apiKey;
|
|
8
|
+
private model;
|
|
9
|
+
private visionModel;
|
|
10
|
+
/** Provider name */
|
|
11
|
+
readonly provider: string;
|
|
12
|
+
/**
|
|
13
|
+
* Constructor
|
|
14
|
+
* @param apiKey Google API key
|
|
15
|
+
* @param model Name of the model to use
|
|
16
|
+
* @param visionModel Name of the vision model
|
|
17
|
+
*/
|
|
18
|
+
constructor(apiKey: string, model?: string, visionModel?: string);
|
|
19
|
+
/**
|
|
20
|
+
* Get the current model name
|
|
21
|
+
* @returns Model name
|
|
22
|
+
*/
|
|
23
|
+
getModel(): string;
|
|
24
|
+
/**
|
|
25
|
+
* Get the current vision model name
|
|
26
|
+
* @returns Vision model name
|
|
27
|
+
*/
|
|
28
|
+
getVisionModel(): string;
|
|
29
|
+
/**
|
|
30
|
+
* Process chat messages
|
|
31
|
+
* @param messages Array of messages to send
|
|
32
|
+
* @param onPartialResponse Callback to receive each part of streaming response
|
|
33
|
+
* @param onCompleteResponse Callback to execute when response is complete
|
|
34
|
+
*/
|
|
35
|
+
processChat(messages: Message[], onPartialResponse: (text: string) => void, onCompleteResponse: (text: string) => Promise<void>): Promise<void>;
|
|
36
|
+
/**
|
|
37
|
+
* Process chat messages with images
|
|
38
|
+
* @param messages Array of messages to send (including images)
|
|
39
|
+
* @param onPartialResponse Callback to receive each part of streaming response
|
|
40
|
+
* @param onCompleteResponse Callback to execute when response is complete
|
|
41
|
+
* @throws Error if the selected model doesn't support vision
|
|
42
|
+
*/
|
|
43
|
+
processVisionChat(messages: MessageWithVision[], onPartialResponse: (text: string) => void, onCompleteResponse: (text: string) => Promise<void>): Promise<void>;
|
|
44
|
+
/**
|
|
45
|
+
* Convert AITuber OnAir messages to Gemini format
|
|
46
|
+
* @param messages Array of messages
|
|
47
|
+
* @returns Gemini formatted messages
|
|
48
|
+
*/
|
|
49
|
+
private convertMessagesToGeminiFormat;
|
|
50
|
+
/**
|
|
51
|
+
* Convert AITuber OnAir vision messages to Gemini format
|
|
52
|
+
* @param messages Array of vision messages
|
|
53
|
+
* @returns Gemini formatted vision messages
|
|
54
|
+
*/
|
|
55
|
+
private convertVisionMessagesToGeminiFormat;
|
|
56
|
+
/**
|
|
57
|
+
* Convert Blob to Base64 string
|
|
58
|
+
* @param blob Image blob
|
|
59
|
+
* @returns Promise with base64 encoded string
|
|
60
|
+
*/
|
|
61
|
+
private blobToBase64;
|
|
62
|
+
/**
|
|
63
|
+
* Map AITuber OnAir roles to Gemini roles
|
|
64
|
+
* @param role AITuber OnAir role
|
|
65
|
+
* @returns Gemini role
|
|
66
|
+
*/
|
|
67
|
+
private mapRoleToGemini;
|
|
68
|
+
}
|
|
@@ -0,0 +1,325 @@
|
|
|
1
|
+
import { ENDPOINT_GEMINI_API, MODEL_GEMINI_2_0_FLASH_LITE, GEMINI_VISION_SUPPORTED_MODELS, } from '../../../../constants';
|
|
2
|
+
/**
|
|
3
|
+
* Gemini implementation of ChatService
|
|
4
|
+
*/
|
|
5
|
+
export class GeminiChatService {
|
|
6
|
+
/**
|
|
7
|
+
* Constructor
|
|
8
|
+
* @param apiKey Google API key
|
|
9
|
+
* @param model Name of the model to use
|
|
10
|
+
* @param visionModel Name of the vision model
|
|
11
|
+
*/
|
|
12
|
+
constructor(apiKey, model = MODEL_GEMINI_2_0_FLASH_LITE, visionModel = MODEL_GEMINI_2_0_FLASH_LITE) {
|
|
13
|
+
/** Provider name */
|
|
14
|
+
this.provider = 'gemini';
|
|
15
|
+
this.apiKey = apiKey;
|
|
16
|
+
this.model = model;
|
|
17
|
+
// check if the vision model is supported
|
|
18
|
+
if (!GEMINI_VISION_SUPPORTED_MODELS.includes(visionModel)) {
|
|
19
|
+
throw new Error(`Model ${visionModel} does not support vision capabilities.`);
|
|
20
|
+
}
|
|
21
|
+
this.visionModel = visionModel;
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* Get the current model name
|
|
25
|
+
* @returns Model name
|
|
26
|
+
*/
|
|
27
|
+
getModel() {
|
|
28
|
+
return this.model;
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* Get the current vision model name
|
|
32
|
+
* @returns Vision model name
|
|
33
|
+
*/
|
|
34
|
+
getVisionModel() {
|
|
35
|
+
return this.visionModel;
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* Process chat messages
|
|
39
|
+
* @param messages Array of messages to send
|
|
40
|
+
* @param onPartialResponse Callback to receive each part of streaming response
|
|
41
|
+
* @param onCompleteResponse Callback to execute when response is complete
|
|
42
|
+
*/
|
|
43
|
+
async processChat(messages, onPartialResponse, onCompleteResponse) {
|
|
44
|
+
try {
|
|
45
|
+
// Convert messages to Gemini format
|
|
46
|
+
const geminiMessages = this.convertMessagesToGeminiFormat(messages);
|
|
47
|
+
// Create the endpoint URL with API key
|
|
48
|
+
const apiUrl = `${ENDPOINT_GEMINI_API}/models/${this.model}:streamGenerateContent?key=${this.apiKey}`;
|
|
49
|
+
// Request to Gemini API
|
|
50
|
+
const response = await fetch(apiUrl, {
|
|
51
|
+
method: 'POST',
|
|
52
|
+
headers: {
|
|
53
|
+
'Content-Type': 'application/json',
|
|
54
|
+
},
|
|
55
|
+
body: JSON.stringify({
|
|
56
|
+
contents: geminiMessages,
|
|
57
|
+
generationConfig: {
|
|
58
|
+
temperature: 0.7,
|
|
59
|
+
topK: 40,
|
|
60
|
+
topP: 0.95,
|
|
61
|
+
maxOutputTokens: 1000,
|
|
62
|
+
},
|
|
63
|
+
}),
|
|
64
|
+
});
|
|
65
|
+
if (!response.ok) {
|
|
66
|
+
const errorData = await response.json();
|
|
67
|
+
throw new Error(`Gemini API error: ${errorData.error?.message || response.statusText}`);
|
|
68
|
+
}
|
|
69
|
+
// Process streaming response
|
|
70
|
+
const reader = response.body?.getReader();
|
|
71
|
+
const decoder = new TextDecoder('utf-8');
|
|
72
|
+
let fullText = '';
|
|
73
|
+
if (!reader) {
|
|
74
|
+
throw new Error('Failed to get response reader');
|
|
75
|
+
}
|
|
76
|
+
// get full response
|
|
77
|
+
let responseText = '';
|
|
78
|
+
while (true) {
|
|
79
|
+
const { done, value } = await reader.read();
|
|
80
|
+
if (done)
|
|
81
|
+
break;
|
|
82
|
+
const chunk = decoder.decode(value);
|
|
83
|
+
responseText += chunk;
|
|
84
|
+
}
|
|
85
|
+
// parse response
|
|
86
|
+
try {
|
|
87
|
+
const responseArray = JSON.parse(responseText);
|
|
88
|
+
// process each response
|
|
89
|
+
for (const item of responseArray) {
|
|
90
|
+
if (item.candidates && item.candidates.length > 0) {
|
|
91
|
+
const content = item.candidates[0].content;
|
|
92
|
+
if (content && content.parts && content.parts.length > 0) {
|
|
93
|
+
const text = content.parts[0].text || '';
|
|
94
|
+
if (text) {
|
|
95
|
+
fullText += text;
|
|
96
|
+
onPartialResponse(text);
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
catch (err) {
|
|
103
|
+
console.error('Error parsing Gemini response:', err);
|
|
104
|
+
throw new Error(`Failed to parse Gemini response: ${err.message}`);
|
|
105
|
+
}
|
|
106
|
+
// Complete response callback
|
|
107
|
+
await onCompleteResponse(fullText);
|
|
108
|
+
}
|
|
109
|
+
catch (error) {
|
|
110
|
+
console.error('Error in processChat:', error);
|
|
111
|
+
throw error;
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
/**
|
|
115
|
+
* Process chat messages with images
|
|
116
|
+
* @param messages Array of messages to send (including images)
|
|
117
|
+
* @param onPartialResponse Callback to receive each part of streaming response
|
|
118
|
+
* @param onCompleteResponse Callback to execute when response is complete
|
|
119
|
+
* @throws Error if the selected model doesn't support vision
|
|
120
|
+
*/
|
|
121
|
+
async processVisionChat(messages, onPartialResponse, onCompleteResponse) {
|
|
122
|
+
try {
|
|
123
|
+
// Check if the vision model supports vision capabilities
|
|
124
|
+
if (!GEMINI_VISION_SUPPORTED_MODELS.includes(this.visionModel)) {
|
|
125
|
+
throw new Error(`Model ${this.visionModel} does not support vision capabilities.`);
|
|
126
|
+
}
|
|
127
|
+
// Convert messages to Gemini vision format
|
|
128
|
+
const geminiMessages = await this.convertVisionMessagesToGeminiFormat(messages);
|
|
129
|
+
// Create the endpoint URL with API key
|
|
130
|
+
const apiUrl = `${ENDPOINT_GEMINI_API}/models/${this.visionModel}:streamGenerateContent?key=${this.apiKey}`;
|
|
131
|
+
// Request to Gemini API
|
|
132
|
+
const response = await fetch(apiUrl, {
|
|
133
|
+
method: 'POST',
|
|
134
|
+
headers: {
|
|
135
|
+
'Content-Type': 'application/json',
|
|
136
|
+
},
|
|
137
|
+
body: JSON.stringify({
|
|
138
|
+
contents: geminiMessages,
|
|
139
|
+
generationConfig: {
|
|
140
|
+
temperature: 0.7,
|
|
141
|
+
topK: 40,
|
|
142
|
+
topP: 0.95,
|
|
143
|
+
maxOutputTokens: 1000,
|
|
144
|
+
},
|
|
145
|
+
}),
|
|
146
|
+
});
|
|
147
|
+
if (!response.ok) {
|
|
148
|
+
const errorData = await response.json();
|
|
149
|
+
throw new Error(`Gemini API error: ${errorData.error?.message || response.statusText}`);
|
|
150
|
+
}
|
|
151
|
+
// Process streaming response
|
|
152
|
+
const reader = response.body?.getReader();
|
|
153
|
+
const decoder = new TextDecoder('utf-8');
|
|
154
|
+
let fullText = '';
|
|
155
|
+
if (!reader) {
|
|
156
|
+
throw new Error('Failed to get response reader');
|
|
157
|
+
}
|
|
158
|
+
// get full response
|
|
159
|
+
let responseText = '';
|
|
160
|
+
while (true) {
|
|
161
|
+
const { done, value } = await reader.read();
|
|
162
|
+
if (done)
|
|
163
|
+
break;
|
|
164
|
+
const chunk = decoder.decode(value);
|
|
165
|
+
responseText += chunk;
|
|
166
|
+
}
|
|
167
|
+
// parse response
|
|
168
|
+
try {
|
|
169
|
+
const responseArray = JSON.parse(responseText);
|
|
170
|
+
// process each response
|
|
171
|
+
for (const item of responseArray) {
|
|
172
|
+
if (item.candidates && item.candidates.length > 0) {
|
|
173
|
+
const content = item.candidates[0].content;
|
|
174
|
+
if (content && content.parts && content.parts.length > 0) {
|
|
175
|
+
const text = content.parts[0].text || '';
|
|
176
|
+
if (text) {
|
|
177
|
+
fullText += text;
|
|
178
|
+
onPartialResponse(text);
|
|
179
|
+
}
|
|
180
|
+
}
|
|
181
|
+
}
|
|
182
|
+
}
|
|
183
|
+
}
|
|
184
|
+
catch (err) {
|
|
185
|
+
console.error('Error parsing Gemini response:', err);
|
|
186
|
+
throw new Error(`Failed to parse Gemini response: ${err.message}`);
|
|
187
|
+
}
|
|
188
|
+
// Complete response callback
|
|
189
|
+
await onCompleteResponse(fullText);
|
|
190
|
+
}
|
|
191
|
+
catch (error) {
|
|
192
|
+
console.error('Error in processVisionChat:', error);
|
|
193
|
+
throw error;
|
|
194
|
+
}
|
|
195
|
+
}
|
|
196
|
+
/**
|
|
197
|
+
* Convert AITuber OnAir messages to Gemini format
|
|
198
|
+
* @param messages Array of messages
|
|
199
|
+
* @returns Gemini formatted messages
|
|
200
|
+
*/
|
|
201
|
+
convertMessagesToGeminiFormat(messages) {
|
|
202
|
+
const geminiMessages = [];
|
|
203
|
+
let currentRole = null;
|
|
204
|
+
let currentParts = [];
|
|
205
|
+
for (const msg of messages) {
|
|
206
|
+
// Map AITuber OnAir roles to Gemini roles
|
|
207
|
+
const role = this.mapRoleToGemini(msg.role);
|
|
208
|
+
// If role changes, start a new message
|
|
209
|
+
if (role !== currentRole && currentParts.length > 0) {
|
|
210
|
+
geminiMessages.push({
|
|
211
|
+
role: currentRole,
|
|
212
|
+
parts: [...currentParts],
|
|
213
|
+
});
|
|
214
|
+
currentParts = [];
|
|
215
|
+
}
|
|
216
|
+
currentRole = role;
|
|
217
|
+
currentParts.push({ text: msg.content });
|
|
218
|
+
}
|
|
219
|
+
// Add the last message
|
|
220
|
+
if (currentRole && currentParts.length > 0) {
|
|
221
|
+
geminiMessages.push({
|
|
222
|
+
role: currentRole,
|
|
223
|
+
parts: [...currentParts],
|
|
224
|
+
});
|
|
225
|
+
}
|
|
226
|
+
return geminiMessages;
|
|
227
|
+
}
|
|
228
|
+
/**
|
|
229
|
+
* Convert AITuber OnAir vision messages to Gemini format
|
|
230
|
+
* @param messages Array of vision messages
|
|
231
|
+
* @returns Gemini formatted vision messages
|
|
232
|
+
*/
|
|
233
|
+
async convertVisionMessagesToGeminiFormat(messages) {
|
|
234
|
+
const geminiMessages = [];
|
|
235
|
+
let currentRole = null;
|
|
236
|
+
let currentParts = [];
|
|
237
|
+
for (const msg of messages) {
|
|
238
|
+
// Map AITuber OnAir roles to Gemini roles
|
|
239
|
+
const role = this.mapRoleToGemini(msg.role);
|
|
240
|
+
// If role changes, start a new message
|
|
241
|
+
if (role !== currentRole && currentParts.length > 0) {
|
|
242
|
+
geminiMessages.push({
|
|
243
|
+
role: currentRole,
|
|
244
|
+
parts: [...currentParts],
|
|
245
|
+
});
|
|
246
|
+
currentParts = [];
|
|
247
|
+
}
|
|
248
|
+
currentRole = role;
|
|
249
|
+
// If the message has content blocks, process them
|
|
250
|
+
if (typeof msg.content === 'string') {
|
|
251
|
+
currentParts.push({ text: msg.content });
|
|
252
|
+
}
|
|
253
|
+
else if (Array.isArray(msg.content)) {
|
|
254
|
+
// Process each content block (text or image)
|
|
255
|
+
for (const block of msg.content) {
|
|
256
|
+
if (block.type === 'text') {
|
|
257
|
+
currentParts.push({ text: block.text });
|
|
258
|
+
}
|
|
259
|
+
else if (block.type === 'image_url') {
|
|
260
|
+
try {
|
|
261
|
+
// Fetch the image data from URL
|
|
262
|
+
const imageResponse = await fetch(block.image_url.url);
|
|
263
|
+
if (!imageResponse.ok) {
|
|
264
|
+
throw new Error(`Failed to fetch image: ${imageResponse.statusText}`);
|
|
265
|
+
}
|
|
266
|
+
// Convert image to blob and then to base64
|
|
267
|
+
const imageBlob = await imageResponse.blob();
|
|
268
|
+
const base64Data = await this.blobToBase64(imageBlob);
|
|
269
|
+
// Add image data in Gemini format
|
|
270
|
+
currentParts.push({
|
|
271
|
+
inlineData: {
|
|
272
|
+
mimeType: imageBlob.type || 'image/jpeg',
|
|
273
|
+
data: base64Data.split(',')[1], // Remove the "data:image/jpeg;base64," prefix
|
|
274
|
+
},
|
|
275
|
+
});
|
|
276
|
+
}
|
|
277
|
+
catch (error) {
|
|
278
|
+
console.error('Error processing image:', error);
|
|
279
|
+
throw new Error(`Failed to process image: ${error.message}`);
|
|
280
|
+
}
|
|
281
|
+
}
|
|
282
|
+
}
|
|
283
|
+
}
|
|
284
|
+
}
|
|
285
|
+
// Add the last message
|
|
286
|
+
if (currentRole && currentParts.length > 0) {
|
|
287
|
+
geminiMessages.push({
|
|
288
|
+
role: currentRole,
|
|
289
|
+
parts: [...currentParts],
|
|
290
|
+
});
|
|
291
|
+
}
|
|
292
|
+
return geminiMessages;
|
|
293
|
+
}
|
|
294
|
+
/**
|
|
295
|
+
* Convert Blob to Base64 string
|
|
296
|
+
* @param blob Image blob
|
|
297
|
+
* @returns Promise with base64 encoded string
|
|
298
|
+
*/
|
|
299
|
+
blobToBase64(blob) {
|
|
300
|
+
return new Promise((resolve, reject) => {
|
|
301
|
+
const reader = new FileReader();
|
|
302
|
+
reader.onloadend = () => resolve(reader.result);
|
|
303
|
+
reader.onerror = reject;
|
|
304
|
+
reader.readAsDataURL(blob);
|
|
305
|
+
});
|
|
306
|
+
}
|
|
307
|
+
/**
|
|
308
|
+
* Map AITuber OnAir roles to Gemini roles
|
|
309
|
+
* @param role AITuber OnAir role
|
|
310
|
+
* @returns Gemini role
|
|
311
|
+
*/
|
|
312
|
+
mapRoleToGemini(role) {
|
|
313
|
+
switch (role) {
|
|
314
|
+
case 'system':
|
|
315
|
+
return 'model'; // Gemini uses 'model' for system messages
|
|
316
|
+
case 'user':
|
|
317
|
+
return 'user';
|
|
318
|
+
case 'assistant':
|
|
319
|
+
return 'model';
|
|
320
|
+
default:
|
|
321
|
+
return 'user';
|
|
322
|
+
}
|
|
323
|
+
}
|
|
324
|
+
}
|
|
325
|
+
//# sourceMappingURL=GeminiChatService.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"GeminiChatService.js","sourceRoot":"","sources":["../../../../../src/services/chat/providers/gemini/GeminiChatService.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import { ChatService } from '../../ChatService';
|
|
2
|
+
import { ChatServiceOptions, ChatServiceProvider } from '../ChatServiceProvider';
|
|
3
|
+
/**
|
|
4
|
+
* Gemini API provider implementation
|
|
5
|
+
*/
|
|
6
|
+
export declare class GeminiChatServiceProvider implements ChatServiceProvider {
|
|
7
|
+
/**
|
|
8
|
+
* Create a chat service instance
|
|
9
|
+
* @param options Service options
|
|
10
|
+
* @returns GeminiChatService instance
|
|
11
|
+
*/
|
|
12
|
+
createChatService(options: ChatServiceOptions): ChatService;
|
|
13
|
+
/**
|
|
14
|
+
* Get the provider name
|
|
15
|
+
* @returns Provider name ('gemini')
|
|
16
|
+
*/
|
|
17
|
+
getProviderName(): string;
|
|
18
|
+
/**
|
|
19
|
+
* Get the list of supported models
|
|
20
|
+
* @returns Array of supported model names
|
|
21
|
+
*/
|
|
22
|
+
getSupportedModels(): string[];
|
|
23
|
+
/**
|
|
24
|
+
* Get the default model
|
|
25
|
+
* @returns Default model name
|
|
26
|
+
*/
|
|
27
|
+
getDefaultModel(): string;
|
|
28
|
+
/**
|
|
29
|
+
* Check if this provider supports vision (image processing)
|
|
30
|
+
* @returns Vision support status (true)
|
|
31
|
+
*/
|
|
32
|
+
supportsVision(): boolean;
|
|
33
|
+
/**
|
|
34
|
+
* Check if a specific model supports vision capabilities
|
|
35
|
+
* @param model The model name to check
|
|
36
|
+
* @returns True if the model supports vision, false otherwise
|
|
37
|
+
*/
|
|
38
|
+
supportsVisionForModel(model: string): boolean;
|
|
39
|
+
}
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
import { MODEL_GEMINI_2_0_FLASH, MODEL_GEMINI_2_0_FLASH_LITE, MODEL_GEMINI_1_5_FLASH, GEMINI_VISION_SUPPORTED_MODELS, } from '../../../../constants';
|
|
2
|
+
import { GeminiChatService } from './GeminiChatService';
|
|
3
|
+
/**
|
|
4
|
+
* Gemini API provider implementation
|
|
5
|
+
*/
|
|
6
|
+
export class GeminiChatServiceProvider {
|
|
7
|
+
/**
|
|
8
|
+
* Create a chat service instance
|
|
9
|
+
* @param options Service options
|
|
10
|
+
* @returns GeminiChatService instance
|
|
11
|
+
*/
|
|
12
|
+
createChatService(options) {
|
|
13
|
+
// Use the visionModel if provided, otherwise use the model that supports vision
|
|
14
|
+
const visionModel = options.visionModel ||
|
|
15
|
+
(this.supportsVisionForModel(options.model || this.getDefaultModel())
|
|
16
|
+
? options.model
|
|
17
|
+
: this.getDefaultModel());
|
|
18
|
+
return new GeminiChatService(options.apiKey, options.model || this.getDefaultModel(), visionModel);
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* Get the provider name
|
|
22
|
+
* @returns Provider name ('gemini')
|
|
23
|
+
*/
|
|
24
|
+
getProviderName() {
|
|
25
|
+
return 'gemini';
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* Get the list of supported models
|
|
29
|
+
* @returns Array of supported model names
|
|
30
|
+
*/
|
|
31
|
+
getSupportedModels() {
|
|
32
|
+
return [
|
|
33
|
+
MODEL_GEMINI_2_0_FLASH,
|
|
34
|
+
MODEL_GEMINI_2_0_FLASH_LITE,
|
|
35
|
+
MODEL_GEMINI_1_5_FLASH,
|
|
36
|
+
];
|
|
37
|
+
}
|
|
38
|
+
/**
|
|
39
|
+
* Get the default model
|
|
40
|
+
* @returns Default model name
|
|
41
|
+
*/
|
|
42
|
+
getDefaultModel() {
|
|
43
|
+
return MODEL_GEMINI_2_0_FLASH_LITE;
|
|
44
|
+
}
|
|
45
|
+
/**
|
|
46
|
+
* Check if this provider supports vision (image processing)
|
|
47
|
+
* @returns Vision support status (true)
|
|
48
|
+
*/
|
|
49
|
+
supportsVision() {
|
|
50
|
+
return true;
|
|
51
|
+
}
|
|
52
|
+
/**
|
|
53
|
+
* Check if a specific model supports vision capabilities
|
|
54
|
+
* @param model The model name to check
|
|
55
|
+
* @returns True if the model supports vision, false otherwise
|
|
56
|
+
*/
|
|
57
|
+
supportsVisionForModel(model) {
|
|
58
|
+
return GEMINI_VISION_SUPPORTED_MODELS.includes(model);
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
//# sourceMappingURL=GeminiChatServiceProvider.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"GeminiChatServiceProvider.js","sourceRoot":"","sources":["../../../../../src/services/chat/providers/gemini/GeminiChatServiceProvider.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,sBAAsB,EACtB,2BAA2B,EAC3B,sBAAsB,EACtB,8BAA8B,GAC/B,MAAM,uBAAuB,CAAC;AAE/B,OAAO,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AAMxD;;GAEG;AACH,MAAM,OAAO,yBAAyB;IACpC;;;;OAIG;IACH,iBAAiB,CAAC,OAA2B;QAC3C,gFAAgF;QAChF,MAAM,WAAW,GACf,OAAO,CAAC,WAAW;YACnB,CAAC,IAAI,CAAC,sBAAsB,CAAC,OAAO,CAAC,KAAK,IAAI,IAAI,CAAC,eAAe,EAAE,CAAC;gBACnE,CAAC,CAAC,OAAO,CAAC,KAAK;gBACf,CAAC,CAAC,IAAI,CAAC,eAAe,EAAE,CAAC,CAAC;QAE9B,OAAO,IAAI,iBAAiB,CAC1B,OAAO,CAAC,MAAM,EACd,OAAO,CAAC,KAAK,IAAI,IAAI,CAAC,eAAe,EAAE,EACvC,WAAW,CACZ,CAAC;IACJ,CAAC;IAED;;;OAGG;IACH,eAAe;QACb,OAAO,QAAQ,CAAC;IAClB,CAAC;IAED;;;OAGG;IACH,kBAAkB;QAChB,OAAO;YACL,sBAAsB;YACtB,2BAA2B;YAC3B,sBAAsB;SACvB,CAAC;IACJ,CAAC;IAED;;;OAGG;IACH,eAAe;QACb,OAAO,2BAA2B,CAAC;IACrC,CAAC;IAED;;;OAGG;IACH,cAAc;QACZ,OAAO,IAAI,CAAC;IACd,CAAC;IAED;;;;OAIG;IACH,sBAAsB,CAAC,KAAa;QAClC,OAAO,8BAA8B,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;IACxD,CAAC;CACF"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import { Message } from '../../../../types';
|
|
2
|
+
import { Summarizer } from '../../../../core/MemoryManager';
|
|
3
|
+
/**
|
|
4
|
+
* Implementation of summarization functionality using Gemini
|
|
5
|
+
*/
|
|
6
|
+
export declare class GeminiSummarizer implements Summarizer {
|
|
7
|
+
private apiKey;
|
|
8
|
+
private model;
|
|
9
|
+
private defaultPromptTemplate;
|
|
10
|
+
/**
|
|
11
|
+
* Constructor
|
|
12
|
+
* @param apiKey Google API key
|
|
13
|
+
* @param model Name of the model to use
|
|
14
|
+
* @param defaultPromptTemplate Default prompt template for summarization
|
|
15
|
+
*/
|
|
16
|
+
constructor(apiKey: string, model?: string, defaultPromptTemplate?: string);
|
|
17
|
+
/**
|
|
18
|
+
* Summarize chat messages
|
|
19
|
+
* @param messages Array of messages to summarize
|
|
20
|
+
* @param maxLength Maximum number of characters (default 256)
|
|
21
|
+
* @param customPrompt Custom prompt template for summarization (optional)
|
|
22
|
+
* @returns Summarized text
|
|
23
|
+
*/
|
|
24
|
+
summarize(messages: Message[], maxLength?: number, customPrompt?: string): Promise<string>;
|
|
25
|
+
}
|
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
import { ENDPOINT_GEMINI_API, MODEL_GEMINI_2_0_FLASH_LITE, } from '../../../../constants';
|
|
2
|
+
import { DEFAULT_SUMMARY_PROMPT_TEMPLATE } from '../../../../constants';
|
|
3
|
+
/**
|
|
4
|
+
* Implementation of summarization functionality using Gemini
|
|
5
|
+
*/
|
|
6
|
+
export class GeminiSummarizer {
|
|
7
|
+
/**
|
|
8
|
+
* Constructor
|
|
9
|
+
* @param apiKey Google API key
|
|
10
|
+
* @param model Name of the model to use
|
|
11
|
+
* @param defaultPromptTemplate Default prompt template for summarization
|
|
12
|
+
*/
|
|
13
|
+
constructor(apiKey, model = MODEL_GEMINI_2_0_FLASH_LITE, defaultPromptTemplate = DEFAULT_SUMMARY_PROMPT_TEMPLATE) {
|
|
14
|
+
this.apiKey = apiKey;
|
|
15
|
+
this.model = model;
|
|
16
|
+
this.defaultPromptTemplate = defaultPromptTemplate;
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* Summarize chat messages
|
|
20
|
+
* @param messages Array of messages to summarize
|
|
21
|
+
* @param maxLength Maximum number of characters (default 256)
|
|
22
|
+
* @param customPrompt Custom prompt template for summarization (optional)
|
|
23
|
+
* @returns Summarized text
|
|
24
|
+
*/
|
|
25
|
+
async summarize(messages, maxLength = 256, customPrompt) {
|
|
26
|
+
try {
|
|
27
|
+
// Create system prompt
|
|
28
|
+
const promptTemplate = customPrompt || this.defaultPromptTemplate;
|
|
29
|
+
const systemPrompt = promptTemplate.replace('{maxLength}', maxLength.toString());
|
|
30
|
+
// Join message content
|
|
31
|
+
const conversationText = messages
|
|
32
|
+
.map((msg) => `${msg.role}: ${msg.content}`)
|
|
33
|
+
.join('\n');
|
|
34
|
+
// Create the endpoint URL with API key
|
|
35
|
+
const apiUrl = `${ENDPOINT_GEMINI_API}/models/${this.model}:generateContent?key=${this.apiKey}`;
|
|
36
|
+
// API request
|
|
37
|
+
const response = await fetch(apiUrl, {
|
|
38
|
+
method: 'POST',
|
|
39
|
+
headers: {
|
|
40
|
+
'Content-Type': 'application/json',
|
|
41
|
+
},
|
|
42
|
+
body: JSON.stringify({
|
|
43
|
+
contents: [
|
|
44
|
+
{
|
|
45
|
+
role: 'user',
|
|
46
|
+
parts: [
|
|
47
|
+
{
|
|
48
|
+
text: systemPrompt,
|
|
49
|
+
},
|
|
50
|
+
{
|
|
51
|
+
text: conversationText,
|
|
52
|
+
},
|
|
53
|
+
],
|
|
54
|
+
},
|
|
55
|
+
],
|
|
56
|
+
generationConfig: {
|
|
57
|
+
temperature: 0.2,
|
|
58
|
+
topK: 40,
|
|
59
|
+
topP: 0.95,
|
|
60
|
+
maxOutputTokens: maxLength,
|
|
61
|
+
},
|
|
62
|
+
}),
|
|
63
|
+
});
|
|
64
|
+
if (!response.ok) {
|
|
65
|
+
const errorData = await response.json();
|
|
66
|
+
throw new Error(`Gemini API error: ${errorData.error?.message || response.statusText}`);
|
|
67
|
+
}
|
|
68
|
+
const data = await response.json();
|
|
69
|
+
// Extract response text from Gemini's response format
|
|
70
|
+
if (data.candidates &&
|
|
71
|
+
data.candidates.length > 0 &&
|
|
72
|
+
data.candidates[0].content &&
|
|
73
|
+
data.candidates[0].content.parts &&
|
|
74
|
+
data.candidates[0].content.parts.length > 0) {
|
|
75
|
+
return data.candidates[0].content.parts[0].text || '';
|
|
76
|
+
}
|
|
77
|
+
return '';
|
|
78
|
+
}
|
|
79
|
+
catch (error) {
|
|
80
|
+
console.error('Error in summarize:', error);
|
|
81
|
+
// Error fallback - simple summary
|
|
82
|
+
return `${messages.length} messages. Latest topic: ${messages[messages.length - 1]?.content.substring(0, 50) || 'none'}...`;
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
//# sourceMappingURL=GeminiSummarizer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"GeminiSummarizer.js","sourceRoot":"","sources":["../../../../../src/services/chat/providers/gemini/GeminiSummarizer.ts"],"names":[],"mappings":"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"}
|