@aituber-onair/core 0.6.0 → 0.8.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 +639 -7
- package/dist/constants/gemini.d.ts +1 -1
- package/dist/constants/gemini.js +1 -1
- package/dist/constants/gemini.js.map +1 -1
- package/dist/core/AITuberOnAirCore.d.ts +32 -1
- package/dist/core/AITuberOnAirCore.js +37 -1
- package/dist/core/AITuberOnAirCore.js.map +1 -1
- package/dist/core/ChatProcessor.d.ts +9 -1
- package/dist/core/ChatProcessor.js +116 -51
- package/dist/core/ChatProcessor.js.map +1 -1
- package/dist/core/MemoryManager.js +10 -9
- package/dist/core/MemoryManager.js.map +1 -1
- package/dist/core/ToolExecutor.d.ts +9 -0
- package/dist/core/ToolExecutor.js +39 -0
- package/dist/core/ToolExecutor.js.map +1 -0
- package/dist/index.d.ts +1 -0
- package/dist/index.js +1 -0
- package/dist/index.js.map +1 -1
- package/dist/services/chat/ChatService.d.ts +13 -0
- package/dist/services/chat/providers/claude/ClaudeChatService.d.ts +45 -4
- package/dist/services/chat/providers/claude/ClaudeChatService.js +227 -180
- package/dist/services/chat/providers/claude/ClaudeChatService.js.map +1 -1
- package/dist/services/chat/providers/claude/ClaudeChatServiceProvider.js +1 -1
- package/dist/services/chat/providers/claude/ClaudeChatServiceProvider.js.map +1 -1
- package/dist/services/chat/providers/gemini/GeminiChatService.d.ts +19 -16
- package/dist/services/chat/providers/gemini/GeminiChatService.js +376 -157
- package/dist/services/chat/providers/gemini/GeminiChatService.js.map +1 -1
- package/dist/services/chat/providers/gemini/GeminiChatServiceProvider.js +1 -1
- package/dist/services/chat/providers/gemini/GeminiChatServiceProvider.js.map +1 -1
- package/dist/services/chat/providers/openai/OpenAIChatService.d.ts +21 -3
- package/dist/services/chat/providers/openai/OpenAIChatService.js +205 -114
- package/dist/services/chat/providers/openai/OpenAIChatService.js.map +1 -1
- package/dist/services/chat/providers/openai/OpenAIChatServiceProvider.js +3 -1
- package/dist/services/chat/providers/openai/OpenAIChatServiceProvider.js.map +1 -1
- package/dist/services/voice/VoiceEngineAdapter.js +1 -3
- package/dist/services/voice/VoiceEngineAdapter.js.map +1 -1
- package/dist/services/voice/VoiceService.d.ts +2 -2
- package/dist/services/voice/engines/VoiceEngineFactory.d.ts +2 -2
- package/dist/services/voice/engines/VoicePeakEngine.js +2 -0
- package/dist/services/voice/engines/VoicePeakEngine.js.map +1 -1
- package/dist/services/voice/messages.js +2 -0
- package/dist/services/voice/messages.js.map +1 -1
- package/dist/types/chat.d.ts +2 -2
- package/dist/types/index.d.ts +1 -0
- package/dist/types/index.js +2 -0
- package/dist/types/index.js.map +1 -1
- package/dist/types/toolChat.d.ts +46 -0
- package/dist/types/toolChat.js +2 -0
- package/dist/types/toolChat.js.map +1 -0
- package/dist/types/voice.d.ts +3 -3
- package/dist/types/voice.js +1 -1
- package/dist/types/voice.js.map +1 -1
- package/dist/types/voiceEngine.d.ts +1 -1
- package/package.json +1 -1
- package/dist/constants/api.d.ts +0 -4
- package/dist/constants/api.js +0 -13
- package/dist/constants/api.js.map +0 -1
- package/dist/constants/openaiApi.d.ts +0 -15
- package/dist/constants/openaiApi.js +0 -15
- package/dist/constants/openaiApi.js.map +0 -1
- package/dist/services/chat/ClaudeChatService.d.ts +0 -64
- package/dist/services/chat/ClaudeChatService.js +0 -237
- package/dist/services/chat/ClaudeChatService.js.map +0 -1
- package/dist/services/chat/GeminiChatService.d.ts +0 -63
- package/dist/services/chat/GeminiChatService.js +0 -314
- package/dist/services/chat/GeminiChatService.js.map +0 -1
- package/dist/services/chat/OpenAIChatService.d.ts +0 -39
- package/dist/services/chat/OpenAIChatService.js +0 -171
- package/dist/services/chat/OpenAIChatService.js.map +0 -1
- package/dist/services/chat/OpenAISummarizer.d.ts +0 -25
- package/dist/services/chat/OpenAISummarizer.js +0 -70
- package/dist/services/chat/OpenAISummarizer.js.map +0 -1
- package/dist/services/chat/providers/ClaudeChatServiceProvider.d.ts +0 -39
- package/dist/services/chat/providers/ClaudeChatServiceProvider.js +0 -57
- package/dist/services/chat/providers/ClaudeChatServiceProvider.js.map +0 -1
- package/dist/services/chat/providers/GeminiChatServiceProvider.d.ts +0 -39
- package/dist/services/chat/providers/GeminiChatServiceProvider.js +0 -57
- package/dist/services/chat/providers/GeminiChatServiceProvider.js.map +0 -1
- package/dist/services/chat/providers/OpenAIChatServiceProvider.d.ts +0 -39
- package/dist/services/chat/providers/OpenAIChatServiceProvider.js +0 -57
- package/dist/services/chat/providers/OpenAIChatServiceProvider.js.map +0 -1
|
@@ -1,314 +0,0 @@
|
|
|
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
|
-
this.visionModel = visionModel;
|
|
18
|
-
}
|
|
19
|
-
/**
|
|
20
|
-
* Get the current model name
|
|
21
|
-
* @returns Model name
|
|
22
|
-
*/
|
|
23
|
-
getModel() {
|
|
24
|
-
return this.model;
|
|
25
|
-
}
|
|
26
|
-
/**
|
|
27
|
-
* Process chat messages
|
|
28
|
-
* @param messages Array of messages to send
|
|
29
|
-
* @param onPartialResponse Callback to receive each part of streaming response
|
|
30
|
-
* @param onCompleteResponse Callback to execute when response is complete
|
|
31
|
-
*/
|
|
32
|
-
async processChat(messages, onPartialResponse, onCompleteResponse) {
|
|
33
|
-
try {
|
|
34
|
-
// Convert messages to Gemini format
|
|
35
|
-
const geminiMessages = this.convertMessagesToGeminiFormat(messages);
|
|
36
|
-
// Create the endpoint URL with API key
|
|
37
|
-
const apiUrl = `${ENDPOINT_GEMINI_API}/models/${this.model}:streamGenerateContent?key=${this.apiKey}`;
|
|
38
|
-
// Request to Gemini API
|
|
39
|
-
const response = await fetch(apiUrl, {
|
|
40
|
-
method: 'POST',
|
|
41
|
-
headers: {
|
|
42
|
-
'Content-Type': 'application/json',
|
|
43
|
-
},
|
|
44
|
-
body: JSON.stringify({
|
|
45
|
-
contents: geminiMessages,
|
|
46
|
-
generationConfig: {
|
|
47
|
-
temperature: 0.7,
|
|
48
|
-
topK: 40,
|
|
49
|
-
topP: 0.95,
|
|
50
|
-
maxOutputTokens: 1000,
|
|
51
|
-
},
|
|
52
|
-
}),
|
|
53
|
-
});
|
|
54
|
-
if (!response.ok) {
|
|
55
|
-
const errorData = await response.json();
|
|
56
|
-
throw new Error(`Gemini API error: ${errorData.error?.message || response.statusText}`);
|
|
57
|
-
}
|
|
58
|
-
// Process streaming response
|
|
59
|
-
const reader = response.body?.getReader();
|
|
60
|
-
const decoder = new TextDecoder('utf-8');
|
|
61
|
-
let fullText = '';
|
|
62
|
-
if (!reader) {
|
|
63
|
-
throw new Error('Failed to get response reader');
|
|
64
|
-
}
|
|
65
|
-
// get full response
|
|
66
|
-
let responseText = '';
|
|
67
|
-
while (true) {
|
|
68
|
-
const { done, value } = await reader.read();
|
|
69
|
-
if (done)
|
|
70
|
-
break;
|
|
71
|
-
const chunk = decoder.decode(value);
|
|
72
|
-
responseText += chunk;
|
|
73
|
-
}
|
|
74
|
-
// parse response
|
|
75
|
-
try {
|
|
76
|
-
const responseArray = JSON.parse(responseText);
|
|
77
|
-
// process each response
|
|
78
|
-
for (const item of responseArray) {
|
|
79
|
-
if (item.candidates && item.candidates.length > 0) {
|
|
80
|
-
const content = item.candidates[0].content;
|
|
81
|
-
if (content && content.parts && content.parts.length > 0) {
|
|
82
|
-
const text = content.parts[0].text || '';
|
|
83
|
-
if (text) {
|
|
84
|
-
fullText += text;
|
|
85
|
-
onPartialResponse(text);
|
|
86
|
-
}
|
|
87
|
-
}
|
|
88
|
-
}
|
|
89
|
-
}
|
|
90
|
-
}
|
|
91
|
-
catch (err) {
|
|
92
|
-
console.error('Error parsing Gemini response:', err);
|
|
93
|
-
throw new Error(`Failed to parse Gemini response: ${err.message}`);
|
|
94
|
-
}
|
|
95
|
-
// Complete response callback
|
|
96
|
-
await onCompleteResponse(fullText);
|
|
97
|
-
}
|
|
98
|
-
catch (error) {
|
|
99
|
-
console.error('Error in processChat:', error);
|
|
100
|
-
throw error;
|
|
101
|
-
}
|
|
102
|
-
}
|
|
103
|
-
/**
|
|
104
|
-
* Process chat messages with images
|
|
105
|
-
* @param messages Array of messages to send (including images)
|
|
106
|
-
* @param onPartialResponse Callback to receive each part of streaming response
|
|
107
|
-
* @param onCompleteResponse Callback to execute when response is complete
|
|
108
|
-
* @throws Error if the selected model doesn't support vision
|
|
109
|
-
*/
|
|
110
|
-
async processVisionChat(messages, onPartialResponse, onCompleteResponse) {
|
|
111
|
-
try {
|
|
112
|
-
// Check if the vision model supports vision capabilities
|
|
113
|
-
if (!GEMINI_VISION_SUPPORTED_MODELS.includes(this.visionModel)) {
|
|
114
|
-
throw new Error(`Model ${this.visionModel} does not support vision capabilities.`);
|
|
115
|
-
}
|
|
116
|
-
// Convert messages to Gemini vision format
|
|
117
|
-
const geminiMessages = await this.convertVisionMessagesToGeminiFormat(messages);
|
|
118
|
-
// Create the endpoint URL with API key
|
|
119
|
-
const apiUrl = `${ENDPOINT_GEMINI_API}/models/${this.visionModel}:streamGenerateContent?key=${this.apiKey}`;
|
|
120
|
-
// Request to Gemini API
|
|
121
|
-
const response = await fetch(apiUrl, {
|
|
122
|
-
method: 'POST',
|
|
123
|
-
headers: {
|
|
124
|
-
'Content-Type': 'application/json',
|
|
125
|
-
},
|
|
126
|
-
body: JSON.stringify({
|
|
127
|
-
contents: geminiMessages,
|
|
128
|
-
generationConfig: {
|
|
129
|
-
temperature: 0.7,
|
|
130
|
-
topK: 40,
|
|
131
|
-
topP: 0.95,
|
|
132
|
-
maxOutputTokens: 1000,
|
|
133
|
-
},
|
|
134
|
-
}),
|
|
135
|
-
});
|
|
136
|
-
if (!response.ok) {
|
|
137
|
-
const errorData = await response.json();
|
|
138
|
-
throw new Error(`Gemini API error: ${errorData.error?.message || response.statusText}`);
|
|
139
|
-
}
|
|
140
|
-
// Process streaming response
|
|
141
|
-
const reader = response.body?.getReader();
|
|
142
|
-
const decoder = new TextDecoder('utf-8');
|
|
143
|
-
let fullText = '';
|
|
144
|
-
if (!reader) {
|
|
145
|
-
throw new Error('Failed to get response reader');
|
|
146
|
-
}
|
|
147
|
-
// get full response
|
|
148
|
-
let responseText = '';
|
|
149
|
-
while (true) {
|
|
150
|
-
const { done, value } = await reader.read();
|
|
151
|
-
if (done)
|
|
152
|
-
break;
|
|
153
|
-
const chunk = decoder.decode(value);
|
|
154
|
-
responseText += chunk;
|
|
155
|
-
}
|
|
156
|
-
// parse response
|
|
157
|
-
try {
|
|
158
|
-
const responseArray = JSON.parse(responseText);
|
|
159
|
-
// process each response
|
|
160
|
-
for (const item of responseArray) {
|
|
161
|
-
if (item.candidates && item.candidates.length > 0) {
|
|
162
|
-
const content = item.candidates[0].content;
|
|
163
|
-
if (content && content.parts && content.parts.length > 0) {
|
|
164
|
-
const text = content.parts[0].text || '';
|
|
165
|
-
if (text) {
|
|
166
|
-
fullText += text;
|
|
167
|
-
onPartialResponse(text);
|
|
168
|
-
}
|
|
169
|
-
}
|
|
170
|
-
}
|
|
171
|
-
}
|
|
172
|
-
}
|
|
173
|
-
catch (err) {
|
|
174
|
-
console.error('Error parsing Gemini response:', err);
|
|
175
|
-
throw new Error(`Failed to parse Gemini response: ${err.message}`);
|
|
176
|
-
}
|
|
177
|
-
// Complete response callback
|
|
178
|
-
await onCompleteResponse(fullText);
|
|
179
|
-
}
|
|
180
|
-
catch (error) {
|
|
181
|
-
console.error('Error in processVisionChat:', error);
|
|
182
|
-
throw error;
|
|
183
|
-
}
|
|
184
|
-
}
|
|
185
|
-
/**
|
|
186
|
-
* Convert AITuber OnAir messages to Gemini format
|
|
187
|
-
* @param messages Array of messages
|
|
188
|
-
* @returns Gemini formatted messages
|
|
189
|
-
*/
|
|
190
|
-
convertMessagesToGeminiFormat(messages) {
|
|
191
|
-
const geminiMessages = [];
|
|
192
|
-
let currentRole = null;
|
|
193
|
-
let currentParts = [];
|
|
194
|
-
for (const msg of messages) {
|
|
195
|
-
// Map AITuber OnAir roles to Gemini roles
|
|
196
|
-
const role = this.mapRoleToGemini(msg.role);
|
|
197
|
-
// If role changes, start a new message
|
|
198
|
-
if (role !== currentRole && currentParts.length > 0) {
|
|
199
|
-
geminiMessages.push({
|
|
200
|
-
role: currentRole,
|
|
201
|
-
parts: [...currentParts],
|
|
202
|
-
});
|
|
203
|
-
currentParts = [];
|
|
204
|
-
}
|
|
205
|
-
currentRole = role;
|
|
206
|
-
currentParts.push({ text: msg.content });
|
|
207
|
-
}
|
|
208
|
-
// Add the last message
|
|
209
|
-
if (currentRole && currentParts.length > 0) {
|
|
210
|
-
geminiMessages.push({
|
|
211
|
-
role: currentRole,
|
|
212
|
-
parts: [...currentParts],
|
|
213
|
-
});
|
|
214
|
-
}
|
|
215
|
-
return geminiMessages;
|
|
216
|
-
}
|
|
217
|
-
/**
|
|
218
|
-
* Convert AITuber OnAir vision messages to Gemini format
|
|
219
|
-
* @param messages Array of vision messages
|
|
220
|
-
* @returns Gemini formatted vision messages
|
|
221
|
-
*/
|
|
222
|
-
async convertVisionMessagesToGeminiFormat(messages) {
|
|
223
|
-
const geminiMessages = [];
|
|
224
|
-
let currentRole = null;
|
|
225
|
-
let currentParts = [];
|
|
226
|
-
for (const msg of messages) {
|
|
227
|
-
// Map AITuber OnAir roles to Gemini roles
|
|
228
|
-
const role = this.mapRoleToGemini(msg.role);
|
|
229
|
-
// If role changes, start a new message
|
|
230
|
-
if (role !== currentRole && currentParts.length > 0) {
|
|
231
|
-
geminiMessages.push({
|
|
232
|
-
role: currentRole,
|
|
233
|
-
parts: [...currentParts],
|
|
234
|
-
});
|
|
235
|
-
currentParts = [];
|
|
236
|
-
}
|
|
237
|
-
currentRole = role;
|
|
238
|
-
// If the message has content blocks, process them
|
|
239
|
-
if (typeof msg.content === 'string') {
|
|
240
|
-
currentParts.push({ text: msg.content });
|
|
241
|
-
}
|
|
242
|
-
else if (Array.isArray(msg.content)) {
|
|
243
|
-
// Process each content block (text or image)
|
|
244
|
-
for (const block of msg.content) {
|
|
245
|
-
if (block.type === 'text') {
|
|
246
|
-
currentParts.push({ text: block.text });
|
|
247
|
-
}
|
|
248
|
-
else if (block.type === 'image_url') {
|
|
249
|
-
try {
|
|
250
|
-
// Fetch the image data from URL
|
|
251
|
-
const imageResponse = await fetch(block.image_url.url);
|
|
252
|
-
if (!imageResponse.ok) {
|
|
253
|
-
throw new Error(`Failed to fetch image: ${imageResponse.statusText}`);
|
|
254
|
-
}
|
|
255
|
-
// Convert image to blob and then to base64
|
|
256
|
-
const imageBlob = await imageResponse.blob();
|
|
257
|
-
const base64Data = await this.blobToBase64(imageBlob);
|
|
258
|
-
// Add image data in Gemini format
|
|
259
|
-
currentParts.push({
|
|
260
|
-
inlineData: {
|
|
261
|
-
mimeType: imageBlob.type || 'image/jpeg',
|
|
262
|
-
data: base64Data.split(',')[1] // Remove the "data:image/jpeg;base64," prefix
|
|
263
|
-
},
|
|
264
|
-
});
|
|
265
|
-
}
|
|
266
|
-
catch (error) {
|
|
267
|
-
console.error('Error processing image:', error);
|
|
268
|
-
throw new Error(`Failed to process image: ${error.message}`);
|
|
269
|
-
}
|
|
270
|
-
}
|
|
271
|
-
}
|
|
272
|
-
}
|
|
273
|
-
}
|
|
274
|
-
// Add the last message
|
|
275
|
-
if (currentRole && currentParts.length > 0) {
|
|
276
|
-
geminiMessages.push({
|
|
277
|
-
role: currentRole,
|
|
278
|
-
parts: [...currentParts],
|
|
279
|
-
});
|
|
280
|
-
}
|
|
281
|
-
return geminiMessages;
|
|
282
|
-
}
|
|
283
|
-
/**
|
|
284
|
-
* Convert Blob to Base64 string
|
|
285
|
-
* @param blob Image blob
|
|
286
|
-
* @returns Promise with base64 encoded string
|
|
287
|
-
*/
|
|
288
|
-
blobToBase64(blob) {
|
|
289
|
-
return new Promise((resolve, reject) => {
|
|
290
|
-
const reader = new FileReader();
|
|
291
|
-
reader.onloadend = () => resolve(reader.result);
|
|
292
|
-
reader.onerror = reject;
|
|
293
|
-
reader.readAsDataURL(blob);
|
|
294
|
-
});
|
|
295
|
-
}
|
|
296
|
-
/**
|
|
297
|
-
* Map AITuber OnAir roles to Gemini roles
|
|
298
|
-
* @param role AITuber OnAir role
|
|
299
|
-
* @returns Gemini role
|
|
300
|
-
*/
|
|
301
|
-
mapRoleToGemini(role) {
|
|
302
|
-
switch (role) {
|
|
303
|
-
case 'system':
|
|
304
|
-
return 'model'; // Gemini uses 'model' for system messages
|
|
305
|
-
case 'user':
|
|
306
|
-
return 'user';
|
|
307
|
-
case 'assistant':
|
|
308
|
-
return 'model';
|
|
309
|
-
default:
|
|
310
|
-
return 'user';
|
|
311
|
-
}
|
|
312
|
-
}
|
|
313
|
-
}
|
|
314
|
-
//# sourceMappingURL=GeminiChatService.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"GeminiChatService.js","sourceRoot":"","sources":["../../../src/services/chat/GeminiChatService.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,39 +0,0 @@
|
|
|
1
|
-
import { ChatService } from './ChatService';
|
|
2
|
-
import { Message, MessageWithVision } from '../../types';
|
|
3
|
-
/**
|
|
4
|
-
* OpenAI implementation of ChatService
|
|
5
|
-
*/
|
|
6
|
-
export declare class OpenAIChatService implements ChatService {
|
|
7
|
-
private apiKey;
|
|
8
|
-
private model;
|
|
9
|
-
private visionModel;
|
|
10
|
-
/** Provider name */
|
|
11
|
-
readonly provider: string;
|
|
12
|
-
/**
|
|
13
|
-
* Constructor
|
|
14
|
-
* @param apiKey OpenAI 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
|
-
* Process chat messages
|
|
26
|
-
* @param messages Array of messages to send
|
|
27
|
-
* @param onPartialResponse Callback to receive each part of streaming response
|
|
28
|
-
* @param onCompleteResponse Callback to execute when response is complete
|
|
29
|
-
*/
|
|
30
|
-
processChat(messages: Message[], onPartialResponse: (text: string) => void, onCompleteResponse: (text: string) => Promise<void>): Promise<void>;
|
|
31
|
-
/**
|
|
32
|
-
* Process chat messages with images
|
|
33
|
-
* @param messages Array of messages to send (including images)
|
|
34
|
-
* @param onPartialResponse Callback to receive each part of streaming response
|
|
35
|
-
* @param onCompleteResponse Callback to execute when response is complete
|
|
36
|
-
* @throws Error if the selected model doesn't support vision
|
|
37
|
-
*/
|
|
38
|
-
processVisionChat(messages: MessageWithVision[], onPartialResponse: (text: string) => void, onCompleteResponse: (text: string) => Promise<void>): Promise<void>;
|
|
39
|
-
}
|
|
@@ -1,171 +0,0 @@
|
|
|
1
|
-
import { ENDPOINT_OPENAI_CHAT_COMPLETIONS_API, MODEL_GPT_4O_MINI, VISION_SUPPORTED_MODELS } from '../../constants';
|
|
2
|
-
/**
|
|
3
|
-
* OpenAI implementation of ChatService
|
|
4
|
-
*/
|
|
5
|
-
export class OpenAIChatService {
|
|
6
|
-
/**
|
|
7
|
-
* Constructor
|
|
8
|
-
* @param apiKey OpenAI 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_GPT_4O_MINI, visionModel = MODEL_GPT_4O_MINI) {
|
|
13
|
-
/** Provider name */
|
|
14
|
-
this.provider = 'openai';
|
|
15
|
-
this.apiKey = apiKey;
|
|
16
|
-
this.model = model;
|
|
17
|
-
this.visionModel = visionModel;
|
|
18
|
-
}
|
|
19
|
-
/**
|
|
20
|
-
* Get the current model name
|
|
21
|
-
* @returns Model name
|
|
22
|
-
*/
|
|
23
|
-
getModel() {
|
|
24
|
-
return this.model;
|
|
25
|
-
}
|
|
26
|
-
/**
|
|
27
|
-
* Process chat messages
|
|
28
|
-
* @param messages Array of messages to send
|
|
29
|
-
* @param onPartialResponse Callback to receive each part of streaming response
|
|
30
|
-
* @param onCompleteResponse Callback to execute when response is complete
|
|
31
|
-
*/
|
|
32
|
-
async processChat(messages, onPartialResponse, onCompleteResponse) {
|
|
33
|
-
try {
|
|
34
|
-
// Convert messages to API request format
|
|
35
|
-
const apiMessages = messages.map((msg) => ({
|
|
36
|
-
role: msg.role,
|
|
37
|
-
content: msg.content,
|
|
38
|
-
}));
|
|
39
|
-
// Request to OpenAI API
|
|
40
|
-
const response = await fetch(ENDPOINT_OPENAI_CHAT_COMPLETIONS_API, {
|
|
41
|
-
method: 'POST',
|
|
42
|
-
headers: {
|
|
43
|
-
'Content-Type': 'application/json',
|
|
44
|
-
Authorization: `Bearer ${this.apiKey}`,
|
|
45
|
-
},
|
|
46
|
-
body: JSON.stringify({
|
|
47
|
-
model: this.model,
|
|
48
|
-
messages: apiMessages,
|
|
49
|
-
stream: true,
|
|
50
|
-
}),
|
|
51
|
-
});
|
|
52
|
-
if (!response.ok) {
|
|
53
|
-
const errorData = await response.json();
|
|
54
|
-
throw new Error(`OpenAI API error: ${errorData.error?.message || response.statusText}`);
|
|
55
|
-
}
|
|
56
|
-
// Process streaming response
|
|
57
|
-
const reader = response.body?.getReader();
|
|
58
|
-
const decoder = new TextDecoder('utf-8');
|
|
59
|
-
let fullText = '';
|
|
60
|
-
if (!reader) {
|
|
61
|
-
throw new Error('Failed to get response reader');
|
|
62
|
-
}
|
|
63
|
-
while (true) {
|
|
64
|
-
const { done, value } = await reader.read();
|
|
65
|
-
if (done)
|
|
66
|
-
break;
|
|
67
|
-
const chunk = decoder.decode(value);
|
|
68
|
-
const lines = chunk
|
|
69
|
-
.split('\n')
|
|
70
|
-
.filter((line) => line.trim() !== '' && line.trim() !== 'data: [DONE]');
|
|
71
|
-
for (const line of lines) {
|
|
72
|
-
try {
|
|
73
|
-
if (!line.startsWith('data: '))
|
|
74
|
-
continue;
|
|
75
|
-
const jsonStr = line.slice(6); // Remove 'data: ' prefix
|
|
76
|
-
if (jsonStr === '[DONE]')
|
|
77
|
-
continue;
|
|
78
|
-
const json = JSON.parse(jsonStr);
|
|
79
|
-
const content = json.choices[0]?.delta?.content || '';
|
|
80
|
-
if (content) {
|
|
81
|
-
fullText += content;
|
|
82
|
-
onPartialResponse(content);
|
|
83
|
-
}
|
|
84
|
-
}
|
|
85
|
-
catch (e) {
|
|
86
|
-
console.error('Error parsing stream:', e);
|
|
87
|
-
}
|
|
88
|
-
}
|
|
89
|
-
}
|
|
90
|
-
// Complete response callback
|
|
91
|
-
await onCompleteResponse(fullText);
|
|
92
|
-
}
|
|
93
|
-
catch (error) {
|
|
94
|
-
console.error('Error in processChat:', error);
|
|
95
|
-
throw error;
|
|
96
|
-
}
|
|
97
|
-
}
|
|
98
|
-
/**
|
|
99
|
-
* Process chat messages with images
|
|
100
|
-
* @param messages Array of messages to send (including images)
|
|
101
|
-
* @param onPartialResponse Callback to receive each part of streaming response
|
|
102
|
-
* @param onCompleteResponse Callback to execute when response is complete
|
|
103
|
-
* @throws Error if the selected model doesn't support vision
|
|
104
|
-
*/
|
|
105
|
-
async processVisionChat(messages, onPartialResponse, onCompleteResponse) {
|
|
106
|
-
try {
|
|
107
|
-
// Check if the vision model supports vision capabilities
|
|
108
|
-
if (!VISION_SUPPORTED_MODELS.includes(this.visionModel)) {
|
|
109
|
-
throw new Error(`Model ${this.visionModel} does not support vision capabilities.`);
|
|
110
|
-
}
|
|
111
|
-
const response = await fetch(ENDPOINT_OPENAI_CHAT_COMPLETIONS_API, {
|
|
112
|
-
method: 'POST',
|
|
113
|
-
headers: {
|
|
114
|
-
'Content-Type': 'application/json',
|
|
115
|
-
Authorization: `Bearer ${this.apiKey}`,
|
|
116
|
-
},
|
|
117
|
-
body: JSON.stringify({
|
|
118
|
-
model: this.visionModel,
|
|
119
|
-
messages: messages,
|
|
120
|
-
max_tokens: 1000,
|
|
121
|
-
stream: true,
|
|
122
|
-
}),
|
|
123
|
-
});
|
|
124
|
-
if (!response.ok) {
|
|
125
|
-
const errorData = await response.json();
|
|
126
|
-
throw new Error(`OpenAI API error: ${errorData.error?.message || response.statusText}`);
|
|
127
|
-
}
|
|
128
|
-
// Process streaming response
|
|
129
|
-
const reader = response.body?.getReader();
|
|
130
|
-
const decoder = new TextDecoder('utf-8');
|
|
131
|
-
let fullText = '';
|
|
132
|
-
if (!reader) {
|
|
133
|
-
throw new Error('Failed to get response reader');
|
|
134
|
-
}
|
|
135
|
-
while (true) {
|
|
136
|
-
const { done, value } = await reader.read();
|
|
137
|
-
if (done)
|
|
138
|
-
break;
|
|
139
|
-
const chunk = decoder.decode(value);
|
|
140
|
-
const lines = chunk
|
|
141
|
-
.split('\n')
|
|
142
|
-
.filter((line) => line.trim() !== '' && line.trim() !== 'data: [DONE]');
|
|
143
|
-
for (const line of lines) {
|
|
144
|
-
try {
|
|
145
|
-
if (!line.startsWith('data: '))
|
|
146
|
-
continue;
|
|
147
|
-
const jsonStr = line.slice(6); // Remove 'data: ' prefix
|
|
148
|
-
if (jsonStr === '[DONE]')
|
|
149
|
-
continue;
|
|
150
|
-
const json = JSON.parse(jsonStr);
|
|
151
|
-
const content = json.choices[0]?.delta?.content || '';
|
|
152
|
-
if (content) {
|
|
153
|
-
fullText += content;
|
|
154
|
-
onPartialResponse(content);
|
|
155
|
-
}
|
|
156
|
-
}
|
|
157
|
-
catch (e) {
|
|
158
|
-
console.error('Error parsing stream:', e);
|
|
159
|
-
}
|
|
160
|
-
}
|
|
161
|
-
}
|
|
162
|
-
// Complete response callback
|
|
163
|
-
await onCompleteResponse(fullText);
|
|
164
|
-
}
|
|
165
|
-
catch (error) {
|
|
166
|
-
console.error('Error in processVisionChat:', error);
|
|
167
|
-
throw error;
|
|
168
|
-
}
|
|
169
|
-
}
|
|
170
|
-
}
|
|
171
|
-
//# sourceMappingURL=OpenAIChatService.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"OpenAIChatService.js","sourceRoot":"","sources":["../../../src/services/chat/OpenAIChatService.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,25 +0,0 @@
|
|
|
1
|
-
import { Message } from '../../types';
|
|
2
|
-
import { Summarizer } from '../../core/MemoryManager';
|
|
3
|
-
/**
|
|
4
|
-
* Implementation of summarization functionality using OpenAI
|
|
5
|
-
*/
|
|
6
|
-
export declare class OpenAISummarizer implements Summarizer {
|
|
7
|
-
private apiKey;
|
|
8
|
-
private model;
|
|
9
|
-
private defaultPromptTemplate;
|
|
10
|
-
/**
|
|
11
|
-
* Constructor
|
|
12
|
-
* @param apiKey OpenAI 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
|
-
}
|
|
@@ -1,70 +0,0 @@
|
|
|
1
|
-
import { ENDPOINT_OPENAI_CHAT_COMPLETIONS_API, MODEL_GPT_4O_MINI, } from '../../constants';
|
|
2
|
-
import { DEFAULT_SUMMARY_PROMPT_TEMPLATE } from '../../constants/prompts';
|
|
3
|
-
/**
|
|
4
|
-
* Implementation of summarization functionality using OpenAI
|
|
5
|
-
*/
|
|
6
|
-
export class OpenAISummarizer {
|
|
7
|
-
/**
|
|
8
|
-
* Constructor
|
|
9
|
-
* @param apiKey OpenAI 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_GPT_4O_MINI, 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
|
-
// API request
|
|
35
|
-
const response = await fetch(ENDPOINT_OPENAI_CHAT_COMPLETIONS_API, {
|
|
36
|
-
method: 'POST',
|
|
37
|
-
headers: {
|
|
38
|
-
'Content-Type': 'application/json',
|
|
39
|
-
Authorization: `Bearer ${this.apiKey}`,
|
|
40
|
-
},
|
|
41
|
-
body: JSON.stringify({
|
|
42
|
-
model: this.model,
|
|
43
|
-
messages: [
|
|
44
|
-
{
|
|
45
|
-
role: 'system',
|
|
46
|
-
content: systemPrompt,
|
|
47
|
-
},
|
|
48
|
-
{
|
|
49
|
-
role: 'user',
|
|
50
|
-
content: conversationText,
|
|
51
|
-
},
|
|
52
|
-
],
|
|
53
|
-
max_tokens: maxLength,
|
|
54
|
-
}),
|
|
55
|
-
});
|
|
56
|
-
if (!response.ok) {
|
|
57
|
-
const errorData = await response.json();
|
|
58
|
-
throw new Error(`OpenAI API error: ${errorData.error?.message || response.statusText}`);
|
|
59
|
-
}
|
|
60
|
-
const data = await response.json();
|
|
61
|
-
return data.choices[0]?.message?.content || '';
|
|
62
|
-
}
|
|
63
|
-
catch (error) {
|
|
64
|
-
console.error('Error in summarize:', error);
|
|
65
|
-
// Error fallback - simple summary
|
|
66
|
-
return `${messages.length} messages. Latest topic: ${messages[messages.length - 1]?.content.substring(0, 50) || 'none'}...`;
|
|
67
|
-
}
|
|
68
|
-
}
|
|
69
|
-
}
|
|
70
|
-
//# sourceMappingURL=OpenAISummarizer.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"OpenAISummarizer.js","sourceRoot":"","sources":["../../../src/services/chat/OpenAISummarizer.ts"],"names":[],"mappings":"AAEA,OAAO,EACL,oCAAoC,EACpC,iBAAiB,GAClB,MAAM,iBAAiB,CAAC;AACzB,OAAO,EAAE,+BAA+B,EAAE,MAAM,yBAAyB,CAAC;AAE1E;;GAEG;AACH,MAAM,OAAO,gBAAgB;IAK3B;;;;;OAKG;IACH,YACE,MAAc,EACd,QAAgB,iBAAiB,EACjC,wBAAgC,+BAA+B;QAE/D,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;QACrB,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;QACnB,IAAI,CAAC,qBAAqB,GAAG,qBAAqB,CAAC;IACrD,CAAC;IAED;;;;;;OAMG;IACH,KAAK,CAAC,SAAS,CACb,QAAmB,EACnB,YAAoB,GAAG,EACvB,YAAqB;QAErB,IAAI,CAAC;YACH,uBAAuB;YACvB,MAAM,cAAc,GAAG,YAAY,IAAI,IAAI,CAAC,qBAAqB,CAAC;YAClE,MAAM,YAAY,GAAG,cAAc,CAAC,OAAO,CACzC,aAAa,EACb,SAAS,CAAC,QAAQ,EAAE,CACrB,CAAC;YAEF,uBAAuB;YACvB,MAAM,gBAAgB,GAAG,QAAQ;iBAC9B,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,GAAG,CAAC,IAAI,KAAK,GAAG,CAAC,OAAO,EAAE,CAAC;iBAC3C,IAAI,CAAC,IAAI,CAAC,CAAC;YAEd,cAAc;YACd,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,oCAAoC,EAAE;gBACjE,MAAM,EAAE,MAAM;gBACd,OAAO,EAAE;oBACP,cAAc,EAAE,kBAAkB;oBAClC,aAAa,EAAE,UAAU,IAAI,CAAC,MAAM,EAAE;iBACvC;gBACD,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC;oBACnB,KAAK,EAAE,IAAI,CAAC,KAAK;oBACjB,QAAQ,EAAE;wBACR;4BACE,IAAI,EAAE,QAAQ;4BACd,OAAO,EAAE,YAAY;yBACtB;wBACD;4BACE,IAAI,EAAE,MAAM;4BACZ,OAAO,EAAE,gBAAgB;yBAC1B;qBACF;oBACD,UAAU,EAAE,SAAS;iBACtB,CAAC;aACH,CAAC,CAAC;YAEH,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;gBACjB,MAAM,SAAS,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;gBACxC,MAAM,IAAI,KAAK,CACb,qBAAqB,SAAS,CAAC,KAAK,EAAE,OAAO,IAAI,QAAQ,CAAC,UAAU,EAAE,CACvE,CAAC;YACJ,CAAC;YAED,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;YACnC,OAAO,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,OAAO,IAAI,EAAE,CAAC;QACjD,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,CAAC,KAAK,CAAC,qBAAqB,EAAE,KAAK,CAAC,CAAC;YAC5C,kCAAkC;YAClC,OAAO,GAAG,QAAQ,CAAC,MAAM,4BACvB,QAAQ,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC,EAAE,OAAO,CAAC,SAAS,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,MAC7D,KAAK,CAAC;QACR,CAAC;IACH,CAAC;CACF"}
|