@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.
Files changed (80) hide show
  1. package/README.md +95 -8
  2. package/dist/constants/chat.d.ts +13 -0
  3. package/dist/constants/chat.js +14 -0
  4. package/dist/constants/chat.js.map +1 -0
  5. package/dist/constants/claude.d.ts +6 -0
  6. package/dist/constants/claude.js +13 -0
  7. package/dist/constants/claude.js.map +1 -0
  8. package/dist/constants/gemini.d.ts +7 -0
  9. package/dist/constants/gemini.js +17 -0
  10. package/dist/constants/gemini.js.map +1 -0
  11. package/dist/constants/index.d.ts +7 -28
  12. package/dist/constants/index.js +7 -41
  13. package/dist/constants/index.js.map +1 -1
  14. package/dist/constants/openai.d.ts +8 -0
  15. package/dist/constants/openai.js +17 -0
  16. package/dist/constants/openai.js.map +1 -0
  17. package/dist/constants/voiceEngine.d.ts +5 -0
  18. package/dist/constants/voiceEngine.js +6 -0
  19. package/dist/constants/voiceEngine.js.map +1 -0
  20. package/dist/constants/youtube.d.ts +1 -0
  21. package/dist/constants/youtube.js +2 -0
  22. package/dist/constants/youtube.js.map +1 -0
  23. package/dist/core/AITuberOnAirCore.js +10 -3
  24. package/dist/core/AITuberOnAirCore.js.map +1 -1
  25. package/dist/core/ChatProcessor.js +1 -1
  26. package/dist/core/ChatProcessor.js.map +1 -1
  27. package/dist/index.d.ts +6 -4
  28. package/dist/index.js +6 -4
  29. package/dist/index.js.map +1 -1
  30. package/dist/services/chat/ChatService.d.ts +10 -0
  31. package/dist/services/chat/ChatServiceFactory.js +5 -2
  32. package/dist/services/chat/ChatServiceFactory.js.map +1 -1
  33. package/dist/services/chat/providers/claude/ClaudeChatService.d.ts +68 -0
  34. package/dist/services/chat/providers/claude/ClaudeChatService.js +337 -0
  35. package/dist/services/chat/providers/claude/ClaudeChatService.js.map +1 -0
  36. package/dist/services/chat/providers/claude/ClaudeChatServiceProvider.d.ts +39 -0
  37. package/dist/services/chat/providers/claude/ClaudeChatServiceProvider.js +62 -0
  38. package/dist/services/chat/providers/claude/ClaudeChatServiceProvider.js.map +1 -0
  39. package/dist/services/chat/providers/claude/ClaudeSummarizer.d.ts +25 -0
  40. package/dist/services/chat/providers/claude/ClaudeSummarizer.js +68 -0
  41. package/dist/services/chat/providers/claude/ClaudeSummarizer.js.map +1 -0
  42. package/dist/services/chat/providers/gemini/GeminiChatService.d.ts +68 -0
  43. package/dist/services/chat/providers/gemini/GeminiChatService.js +325 -0
  44. package/dist/services/chat/providers/gemini/GeminiChatService.js.map +1 -0
  45. package/dist/services/chat/providers/gemini/GeminiChatServiceProvider.d.ts +39 -0
  46. package/dist/services/chat/providers/gemini/GeminiChatServiceProvider.js +61 -0
  47. package/dist/services/chat/providers/gemini/GeminiChatServiceProvider.js.map +1 -0
  48. package/dist/services/chat/providers/gemini/GeminiSummarizer.d.ts +25 -0
  49. package/dist/services/chat/providers/gemini/GeminiSummarizer.js +86 -0
  50. package/dist/services/chat/providers/gemini/GeminiSummarizer.js.map +1 -0
  51. package/dist/services/chat/providers/openai/OpenAIChatService.d.ts +44 -0
  52. package/dist/services/chat/providers/openai/OpenAIChatService.js +182 -0
  53. package/dist/services/chat/providers/openai/OpenAIChatService.js.map +1 -0
  54. package/dist/services/chat/providers/openai/OpenAIChatServiceProvider.d.ts +39 -0
  55. package/dist/services/chat/providers/openai/OpenAIChatServiceProvider.js +57 -0
  56. package/dist/services/chat/providers/openai/OpenAIChatServiceProvider.js.map +1 -0
  57. package/dist/services/chat/providers/openai/OpenAISummarizer.d.ts +25 -0
  58. package/dist/services/chat/providers/openai/OpenAISummarizer.js +70 -0
  59. package/dist/services/chat/providers/openai/OpenAISummarizer.js.map +1 -0
  60. package/dist/services/voice/VoiceEngineAdapter.js +21 -0
  61. package/dist/services/voice/VoiceEngineAdapter.js.map +1 -1
  62. package/dist/services/voice/VoiceService.d.ts +6 -0
  63. package/dist/services/voice/engines/AivisSpeechEngine.d.ts +6 -0
  64. package/dist/services/voice/engines/AivisSpeechEngine.js +12 -2
  65. package/dist/services/voice/engines/AivisSpeechEngine.js.map +1 -1
  66. package/dist/services/voice/engines/OpenAiEngine.js +2 -1
  67. package/dist/services/voice/engines/OpenAiEngine.js.map +1 -1
  68. package/dist/services/voice/engines/VoiceEngine.d.ts +5 -0
  69. package/dist/services/voice/engines/VoicePeakEngine.d.ts +6 -0
  70. package/dist/services/voice/engines/VoicePeakEngine.js +12 -2
  71. package/dist/services/voice/engines/VoicePeakEngine.js.map +1 -1
  72. package/dist/services/voice/engines/VoiceVoxEngine.d.ts +6 -0
  73. package/dist/services/voice/engines/VoiceVoxEngine.js +12 -2
  74. package/dist/services/voice/engines/VoiceVoxEngine.js.map +1 -1
  75. package/dist/types/index.d.ts +2 -2
  76. package/dist/types/index.js +1 -1
  77. package/dist/types/index.js.map +1 -1
  78. package/dist/types/voice.js +7 -1
  79. package/dist/types/voice.js.map +1 -1
  80. 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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"}