@aituber-onair/core 0.16.1 → 0.17.1
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 +0 -2
- package/dist/constants/index.d.ts +0 -5
- package/dist/constants/index.js +0 -5
- package/dist/constants/index.js.map +1 -1
- package/dist/core/AITuberOnAirCore.d.ts +3 -3
- package/dist/core/AITuberOnAirCore.js +8 -4
- package/dist/core/AITuberOnAirCore.js.map +1 -1
- package/dist/core/ChatProcessor.d.ts +1 -4
- package/dist/core/ChatProcessor.js +1 -3
- package/dist/core/ChatProcessor.js.map +1 -1
- package/dist/core/MemoryManager.d.ts +2 -1
- package/dist/core/MemoryManager.js.map +1 -1
- package/dist/core/ToolExecutor.d.ts +28 -2
- package/dist/core/ToolExecutor.js +88 -0
- package/dist/core/ToolExecutor.js.map +1 -1
- package/dist/index.d.ts +5 -12
- package/dist/index.js +21 -8
- package/dist/index.js.map +1 -1
- package/dist/services/chat/providers/claude/ClaudeSummarizer.d.ts +1 -1
- package/dist/services/chat/providers/claude/ClaudeSummarizer.js +1 -2
- package/dist/services/chat/providers/claude/ClaudeSummarizer.js.map +1 -1
- package/dist/services/chat/providers/gemini/GeminiSummarizer.d.ts +1 -1
- package/dist/services/chat/providers/gemini/GeminiSummarizer.js +1 -2
- package/dist/services/chat/providers/gemini/GeminiSummarizer.js.map +1 -1
- package/dist/services/chat/providers/openai/OpenAISummarizer.d.ts +1 -1
- package/dist/services/chat/providers/openai/OpenAISummarizer.js +2 -3
- package/dist/services/chat/providers/openai/OpenAISummarizer.js.map +1 -1
- package/dist/types/index.d.ts +0 -3
- package/dist/types/index.js +0 -4
- package/dist/types/index.js.map +1 -1
- package/dist/utils/index.d.ts +1 -4
- package/dist/utils/index.js +2 -4
- package/dist/utils/index.js.map +1 -1
- package/package.json +2 -1
- package/dist/constants/chat.d.ts +0 -17
- package/dist/constants/chat.js +0 -18
- package/dist/constants/chat.js.map +0 -1
- package/dist/constants/claude.d.ts +0 -8
- package/dist/constants/claude.js +0 -17
- package/dist/constants/claude.js.map +0 -1
- package/dist/constants/gemini.d.ts +0 -10
- package/dist/constants/gemini.js +0 -23
- package/dist/constants/gemini.js.map +0 -1
- package/dist/constants/openai.d.ts +0 -12
- package/dist/constants/openai.js +0 -25
- package/dist/constants/openai.js.map +0 -1
- package/dist/constants/prompts.d.ts +0 -2
- package/dist/constants/prompts.js +0 -13
- package/dist/constants/prompts.js.map +0 -1
- package/dist/services/chat/ChatService.d.ts +0 -50
- package/dist/services/chat/ChatService.js +0 -2
- package/dist/services/chat/ChatService.js.map +0 -1
- package/dist/services/chat/ChatServiceFactory.d.ts +0 -38
- package/dist/services/chat/ChatServiceFactory.js +0 -61
- package/dist/services/chat/ChatServiceFactory.js.map +0 -1
- package/dist/services/chat/providers/ChatServiceProvider.d.ts +0 -48
- package/dist/services/chat/providers/ChatServiceProvider.js +0 -2
- package/dist/services/chat/providers/ChatServiceProvider.js.map +0 -1
- package/dist/services/chat/providers/claude/ClaudeChatService.d.ts +0 -139
- package/dist/services/chat/providers/claude/ClaudeChatService.js +0 -493
- package/dist/services/chat/providers/claude/ClaudeChatService.js.map +0 -1
- package/dist/services/chat/providers/claude/ClaudeChatServiceProvider.d.ts +0 -39
- package/dist/services/chat/providers/claude/ClaudeChatServiceProvider.js +0 -62
- package/dist/services/chat/providers/claude/ClaudeChatServiceProvider.js.map +0 -1
- package/dist/services/chat/providers/gemini/GeminiChatService.d.ts +0 -71
- package/dist/services/chat/providers/gemini/GeminiChatService.js +0 -537
- package/dist/services/chat/providers/gemini/GeminiChatService.js.map +0 -1
- package/dist/services/chat/providers/gemini/GeminiChatServiceProvider.d.ts +0 -39
- package/dist/services/chat/providers/gemini/GeminiChatServiceProvider.js +0 -61
- package/dist/services/chat/providers/gemini/GeminiChatServiceProvider.js.map +0 -1
- package/dist/services/chat/providers/openai/OpenAIChatService.d.ts +0 -107
- package/dist/services/chat/providers/openai/OpenAIChatService.js +0 -530
- package/dist/services/chat/providers/openai/OpenAIChatService.js.map +0 -1
- package/dist/services/chat/providers/openai/OpenAIChatServiceProvider.d.ts +0 -39
- package/dist/services/chat/providers/openai/OpenAIChatServiceProvider.js +0 -66
- package/dist/services/chat/providers/openai/OpenAIChatServiceProvider.js.map +0 -1
- package/dist/types/chat.d.ts +0 -54
- package/dist/types/chat.js +0 -5
- package/dist/types/chat.js.map +0 -1
- package/dist/types/mcp.d.ts +0 -36
- package/dist/types/mcp.js +0 -5
- package/dist/types/mcp.js.map +0 -1
- package/dist/types/toolChat.d.ts +0 -41
- package/dist/types/toolChat.js +0 -2
- package/dist/types/toolChat.js.map +0 -1
- package/dist/utils/chatServiceHttpClient.d.ts +0 -46
- package/dist/utils/chatServiceHttpClient.js +0 -126
- package/dist/utils/chatServiceHttpClient.js.map +0 -1
- package/dist/utils/emotionParser.d.ts +0 -45
- package/dist/utils/emotionParser.js +0 -55
- package/dist/utils/emotionParser.js.map +0 -1
- package/dist/utils/screenplay.d.ts +0 -19
- package/dist/utils/screenplay.js +0 -36
- package/dist/utils/screenplay.js.map +0 -1
- package/dist/utils/streamTextAccumulator.d.ts +0 -24
- package/dist/utils/streamTextAccumulator.js +0 -43
- package/dist/utils/streamTextAccumulator.js.map +0 -1
|
@@ -1,71 +0,0 @@
|
|
|
1
|
-
import { ChatService } from '../../ChatService';
|
|
2
|
-
import { Message, MessageWithVision, ToolChatCompletion, ToolDefinition } from '../../../../types';
|
|
3
|
-
/**
|
|
4
|
-
* Gemini implementation of ChatService
|
|
5
|
-
*/
|
|
6
|
-
export declare class GeminiChatService implements ChatService {
|
|
7
|
-
/** Provider name */
|
|
8
|
-
readonly provider: string;
|
|
9
|
-
private apiKey;
|
|
10
|
-
private model;
|
|
11
|
-
private visionModel;
|
|
12
|
-
private tools;
|
|
13
|
-
/** id(OpenAI) → name(Gemini) mapping */
|
|
14
|
-
private callIdMap;
|
|
15
|
-
private safeJsonParse;
|
|
16
|
-
private normalizeToolResult;
|
|
17
|
-
/**
|
|
18
|
-
* camelCase → snake_case conversion (v1beta)
|
|
19
|
-
*/
|
|
20
|
-
private adaptKeysForApi;
|
|
21
|
-
/**
|
|
22
|
-
* Constructor
|
|
23
|
-
* @param apiKey Google API key
|
|
24
|
-
* @param model Name of the model to use
|
|
25
|
-
* @param visionModel Name of the vision model
|
|
26
|
-
*/
|
|
27
|
-
constructor(apiKey: string, model?: string, visionModel?: string, tools?: ToolDefinition[]);
|
|
28
|
-
/**
|
|
29
|
-
* Get the current model name
|
|
30
|
-
* @returns Model name
|
|
31
|
-
*/
|
|
32
|
-
getModel(): string;
|
|
33
|
-
/**
|
|
34
|
-
* Get the current vision model name
|
|
35
|
-
* @returns Vision model name
|
|
36
|
-
*/
|
|
37
|
-
getVisionModel(): string;
|
|
38
|
-
/**
|
|
39
|
-
* Process chat messages
|
|
40
|
-
* @param messages Array of messages to send
|
|
41
|
-
* @param onPartialResponse Callback to receive each part of streaming response
|
|
42
|
-
* @param onCompleteResponse Callback to execute when response is complete
|
|
43
|
-
*/
|
|
44
|
-
processChat(messages: Message[], onPartialResponse: (text: string) => void, onCompleteResponse: (text: string) => Promise<void>): Promise<void>;
|
|
45
|
-
processVisionChat(messages: MessageWithVision[], onPartialResponse: (text: string) => void, onCompleteResponse: (text: string) => Promise<void>): Promise<void>;
|
|
46
|
-
private convertMessagesToGeminiFormat;
|
|
47
|
-
private callGemini;
|
|
48
|
-
/**
|
|
49
|
-
* Convert AITuber OnAir vision messages to Gemini format
|
|
50
|
-
* @param messages Array of vision messages
|
|
51
|
-
* @returns Gemini formatted vision messages
|
|
52
|
-
*/
|
|
53
|
-
private convertVisionMessagesToGeminiFormat;
|
|
54
|
-
/**
|
|
55
|
-
* Convert Blob to Base64 string
|
|
56
|
-
* @param blob Image blob
|
|
57
|
-
* @returns Promise with base64 encoded string
|
|
58
|
-
*/
|
|
59
|
-
private blobToBase64;
|
|
60
|
-
/**
|
|
61
|
-
* Map AITuber OnAir roles to Gemini roles
|
|
62
|
-
* @param role AITuber OnAir role
|
|
63
|
-
* @returns Gemini role
|
|
64
|
-
*/
|
|
65
|
-
private mapRoleToGemini;
|
|
66
|
-
private parseStream;
|
|
67
|
-
private parseOneShot;
|
|
68
|
-
chatOnce(messages: Message[], stream?: boolean, onPartialResponse?: (t: string) => void, maxTokens?: number): Promise<ToolChatCompletion>;
|
|
69
|
-
visionChatOnce(messages: MessageWithVision[], stream?: boolean, onPartialResponse?: (t: string) => void, maxTokens?: number): Promise<ToolChatCompletion>;
|
|
70
|
-
private genUUID;
|
|
71
|
-
}
|
|
@@ -1,537 +0,0 @@
|
|
|
1
|
-
import { ENDPOINT_GEMINI_API, MODEL_GEMINI_2_0_FLASH_LITE, GEMINI_VISION_SUPPORTED_MODELS, DEFAULT_MAX_TOKENS, } from '../../../../constants';
|
|
2
|
-
import { StreamTextAccumulator } from '../../../../utils/streamTextAccumulator';
|
|
3
|
-
import { ChatServiceHttpClient } from '../../../../utils/chatServiceHttpClient';
|
|
4
|
-
/**
|
|
5
|
-
* Gemini implementation of ChatService
|
|
6
|
-
*/
|
|
7
|
-
export class GeminiChatService {
|
|
8
|
-
/* ────────────────────────────────── */
|
|
9
|
-
/* Utilities */
|
|
10
|
-
/* ────────────────────────────────── */
|
|
11
|
-
safeJsonParse(str) {
|
|
12
|
-
try {
|
|
13
|
-
return JSON.parse(str);
|
|
14
|
-
}
|
|
15
|
-
catch {
|
|
16
|
-
return str; // keep as string
|
|
17
|
-
}
|
|
18
|
-
}
|
|
19
|
-
normalizeToolResult(val) {
|
|
20
|
-
if (val === null)
|
|
21
|
-
return { content: null };
|
|
22
|
-
if (typeof val === 'object')
|
|
23
|
-
return val;
|
|
24
|
-
return { content: val }; // wrap primitive
|
|
25
|
-
}
|
|
26
|
-
/**
|
|
27
|
-
* camelCase → snake_case conversion (v1beta)
|
|
28
|
-
*/
|
|
29
|
-
adaptKeysForApi(obj) {
|
|
30
|
-
const map = {
|
|
31
|
-
toolConfig: 'tool_config',
|
|
32
|
-
functionCallingConfig: 'function_calling_config',
|
|
33
|
-
functionDeclarations: 'function_declarations',
|
|
34
|
-
functionCall: 'function_call',
|
|
35
|
-
functionResponse: 'function_response',
|
|
36
|
-
};
|
|
37
|
-
if (Array.isArray(obj))
|
|
38
|
-
return obj.map((v) => this.adaptKeysForApi(v));
|
|
39
|
-
if (obj && typeof obj === 'object') {
|
|
40
|
-
return Object.fromEntries(Object.entries(obj).map(([k, v]) => [
|
|
41
|
-
map[k] ?? k,
|
|
42
|
-
this.adaptKeysForApi(v),
|
|
43
|
-
]));
|
|
44
|
-
}
|
|
45
|
-
return obj;
|
|
46
|
-
}
|
|
47
|
-
/**
|
|
48
|
-
* Constructor
|
|
49
|
-
* @param apiKey Google API key
|
|
50
|
-
* @param model Name of the model to use
|
|
51
|
-
* @param visionModel Name of the vision model
|
|
52
|
-
*/
|
|
53
|
-
constructor(apiKey, model = MODEL_GEMINI_2_0_FLASH_LITE, visionModel = MODEL_GEMINI_2_0_FLASH_LITE, tools = []) {
|
|
54
|
-
/** Provider name */
|
|
55
|
-
this.provider = 'gemini';
|
|
56
|
-
/** id(OpenAI) → name(Gemini) mapping */
|
|
57
|
-
this.callIdMap = new Map();
|
|
58
|
-
this.apiKey = apiKey;
|
|
59
|
-
this.model = model;
|
|
60
|
-
// check if the vision model is supported
|
|
61
|
-
if (!GEMINI_VISION_SUPPORTED_MODELS.includes(visionModel)) {
|
|
62
|
-
throw new Error(`Model ${visionModel} does not support vision capabilities.`);
|
|
63
|
-
}
|
|
64
|
-
this.visionModel = visionModel;
|
|
65
|
-
this.tools = tools;
|
|
66
|
-
}
|
|
67
|
-
/**
|
|
68
|
-
* Get the current model name
|
|
69
|
-
* @returns Model name
|
|
70
|
-
*/
|
|
71
|
-
getModel() {
|
|
72
|
-
return this.model;
|
|
73
|
-
}
|
|
74
|
-
/**
|
|
75
|
-
* Get the current vision model name
|
|
76
|
-
* @returns Vision model name
|
|
77
|
-
*/
|
|
78
|
-
getVisionModel() {
|
|
79
|
-
return this.visionModel;
|
|
80
|
-
}
|
|
81
|
-
/**
|
|
82
|
-
* Process chat messages
|
|
83
|
-
* @param messages Array of messages to send
|
|
84
|
-
* @param onPartialResponse Callback to receive each part of streaming response
|
|
85
|
-
* @param onCompleteResponse Callback to execute when response is complete
|
|
86
|
-
*/
|
|
87
|
-
async processChat(messages, onPartialResponse, onCompleteResponse) {
|
|
88
|
-
try {
|
|
89
|
-
// not use tools
|
|
90
|
-
if (this.tools.length === 0) {
|
|
91
|
-
const res = await this.callGemini(messages, this.model, true);
|
|
92
|
-
const { blocks } = await this.parseStream(res, onPartialResponse);
|
|
93
|
-
const full = blocks
|
|
94
|
-
.filter((b) => b.type === 'text')
|
|
95
|
-
.map((b) => b.text)
|
|
96
|
-
.join('');
|
|
97
|
-
await onCompleteResponse(full);
|
|
98
|
-
return;
|
|
99
|
-
}
|
|
100
|
-
/* with tools (1 turn) */
|
|
101
|
-
const { blocks, stop_reason } = await this.chatOnce(messages, true, onPartialResponse);
|
|
102
|
-
if (stop_reason === 'end') {
|
|
103
|
-
const full = blocks
|
|
104
|
-
.filter((b) => b.type === 'text')
|
|
105
|
-
.map((b) => b.text)
|
|
106
|
-
.join('');
|
|
107
|
-
await onCompleteResponse(full);
|
|
108
|
-
return;
|
|
109
|
-
}
|
|
110
|
-
throw new Error('Received functionCall. Use chatOnce() loop when tools are enabled.');
|
|
111
|
-
}
|
|
112
|
-
catch (err) {
|
|
113
|
-
console.error('Error in processChat:', err);
|
|
114
|
-
throw err;
|
|
115
|
-
}
|
|
116
|
-
}
|
|
117
|
-
async processVisionChat(messages, onPartialResponse, onCompleteResponse) {
|
|
118
|
-
try {
|
|
119
|
-
if (this.tools.length === 0) {
|
|
120
|
-
const res = await this.callGemini(messages, this.visionModel, true);
|
|
121
|
-
const { blocks } = await this.parseStream(res, onPartialResponse);
|
|
122
|
-
const full = blocks
|
|
123
|
-
.filter((b) => b.type === 'text')
|
|
124
|
-
.map((b) => b.text)
|
|
125
|
-
.join('');
|
|
126
|
-
await onCompleteResponse(full);
|
|
127
|
-
return;
|
|
128
|
-
}
|
|
129
|
-
const { blocks, stop_reason } = await this.visionChatOnce(messages);
|
|
130
|
-
blocks
|
|
131
|
-
.filter((b) => b.type === 'text')
|
|
132
|
-
.forEach((b) => onPartialResponse(b.text));
|
|
133
|
-
if (stop_reason === 'end') {
|
|
134
|
-
const full = blocks
|
|
135
|
-
.filter((b) => b.type === 'text')
|
|
136
|
-
.map((b) => b.text)
|
|
137
|
-
.join('');
|
|
138
|
-
await onCompleteResponse(full);
|
|
139
|
-
return;
|
|
140
|
-
}
|
|
141
|
-
throw new Error('Received functionCall. Use visionChatOnce() loop when tools are enabled.');
|
|
142
|
-
}
|
|
143
|
-
catch (err) {
|
|
144
|
-
console.error('Error in processVisionChat:', err);
|
|
145
|
-
throw err;
|
|
146
|
-
}
|
|
147
|
-
}
|
|
148
|
-
/* ────────────────────────────────── */
|
|
149
|
-
/* OpenAI → Gemini conversion */
|
|
150
|
-
/* ────────────────────────────────── */
|
|
151
|
-
convertMessagesToGeminiFormat(messages) {
|
|
152
|
-
const gemini = [];
|
|
153
|
-
let currentRole = null;
|
|
154
|
-
let currentParts = [];
|
|
155
|
-
const pushCurrent = () => {
|
|
156
|
-
if (currentRole && currentParts.length) {
|
|
157
|
-
gemini.push({ role: currentRole, parts: [...currentParts] });
|
|
158
|
-
currentParts = [];
|
|
159
|
-
}
|
|
160
|
-
};
|
|
161
|
-
for (const msg of messages) {
|
|
162
|
-
const role = this.mapRoleToGemini(msg.role);
|
|
163
|
-
/* assistant: tool_calls -> functionCall */
|
|
164
|
-
if (msg.tool_calls) {
|
|
165
|
-
pushCurrent();
|
|
166
|
-
for (const call of msg.tool_calls) {
|
|
167
|
-
this.callIdMap.set(call.id, call.function.name);
|
|
168
|
-
gemini.push({
|
|
169
|
-
role: 'model',
|
|
170
|
-
parts: [
|
|
171
|
-
{
|
|
172
|
-
functionCall: {
|
|
173
|
-
name: call.function.name,
|
|
174
|
-
args: JSON.parse(call.function.arguments || '{}'),
|
|
175
|
-
},
|
|
176
|
-
},
|
|
177
|
-
],
|
|
178
|
-
});
|
|
179
|
-
}
|
|
180
|
-
continue;
|
|
181
|
-
}
|
|
182
|
-
/* tool → functionResponse */
|
|
183
|
-
if (msg.role === 'tool') {
|
|
184
|
-
pushCurrent();
|
|
185
|
-
const funcName = msg.name ??
|
|
186
|
-
this.callIdMap.get(msg.tool_call_id) ??
|
|
187
|
-
'result';
|
|
188
|
-
gemini.push({
|
|
189
|
-
role: 'user',
|
|
190
|
-
parts: [
|
|
191
|
-
{
|
|
192
|
-
functionResponse: {
|
|
193
|
-
name: funcName,
|
|
194
|
-
response: this.normalizeToolResult(this.safeJsonParse(msg.content)),
|
|
195
|
-
},
|
|
196
|
-
},
|
|
197
|
-
],
|
|
198
|
-
});
|
|
199
|
-
continue;
|
|
200
|
-
}
|
|
201
|
-
/* normal text */
|
|
202
|
-
if (role !== currentRole)
|
|
203
|
-
pushCurrent();
|
|
204
|
-
currentRole = role;
|
|
205
|
-
currentParts.push({ text: msg.content });
|
|
206
|
-
}
|
|
207
|
-
pushCurrent();
|
|
208
|
-
return gemini;
|
|
209
|
-
}
|
|
210
|
-
/* ────────────────────────────────── */
|
|
211
|
-
/* HTTP call */
|
|
212
|
-
/* ────────────────────────────────── */
|
|
213
|
-
async callGemini(messages, model, stream = false, maxTokens) {
|
|
214
|
-
const hasVision = messages.some((m) => Array.isArray(m.content) &&
|
|
215
|
-
m.content.some((b) => b?.type === 'image_url' || b?.inlineData));
|
|
216
|
-
const contents = hasVision
|
|
217
|
-
? await this.convertVisionMessagesToGeminiFormat(messages)
|
|
218
|
-
: this.convertMessagesToGeminiFormat(messages);
|
|
219
|
-
const body = {
|
|
220
|
-
contents,
|
|
221
|
-
generationConfig: {
|
|
222
|
-
maxOutputTokens: maxTokens !== undefined ? maxTokens : DEFAULT_MAX_TOKENS,
|
|
223
|
-
},
|
|
224
|
-
};
|
|
225
|
-
if (this.tools.length) {
|
|
226
|
-
body.tools = [
|
|
227
|
-
{
|
|
228
|
-
functionDeclarations: this.tools.map((t) => ({
|
|
229
|
-
name: t.name,
|
|
230
|
-
description: t.description,
|
|
231
|
-
parameters: t.parameters,
|
|
232
|
-
})),
|
|
233
|
-
},
|
|
234
|
-
];
|
|
235
|
-
body.toolConfig = { functionCallingConfig: { mode: 'AUTO' } };
|
|
236
|
-
}
|
|
237
|
-
const fetchOnce = async (ver, payload) => {
|
|
238
|
-
const fn = stream ? 'streamGenerateContent' : 'generateContent';
|
|
239
|
-
const alt = stream ? '?alt=sse' : '';
|
|
240
|
-
const url = `${ENDPOINT_GEMINI_API}/${ver}/models/${model}:${fn}${alt}${alt ? '&' : '?'}key=${this.apiKey}`;
|
|
241
|
-
return ChatServiceHttpClient.post(url, payload);
|
|
242
|
-
};
|
|
243
|
-
const isLite = /flash[-_]lite/.test(model);
|
|
244
|
-
const isGemini25 = /gemini-2\.5/.test(model);
|
|
245
|
-
const firstVer = isLite || isGemini25 ? 'v1beta' : 'v1';
|
|
246
|
-
const tryApi = async () => {
|
|
247
|
-
try {
|
|
248
|
-
const payload = firstVer === 'v1' ? body : this.adaptKeysForApi(body); // snake_case conversion
|
|
249
|
-
return await fetchOnce(firstVer, payload);
|
|
250
|
-
}
|
|
251
|
-
catch (e) {
|
|
252
|
-
// Only retry v1beta if camel/snake case mismatch error occurs in models that don't require v1beta
|
|
253
|
-
if (!(isLite || isGemini25) &&
|
|
254
|
-
/Unknown name|Cannot find field|404/.test(e.message)) {
|
|
255
|
-
return await fetchOnce('v1beta', this.adaptKeysForApi(body));
|
|
256
|
-
}
|
|
257
|
-
throw e; // otherwise, throw to upper layer
|
|
258
|
-
}
|
|
259
|
-
};
|
|
260
|
-
const res = await tryApi();
|
|
261
|
-
if (!res.ok)
|
|
262
|
-
throw new Error(`Gemini HTTP ${res.status}`);
|
|
263
|
-
return res;
|
|
264
|
-
}
|
|
265
|
-
/**
|
|
266
|
-
* Convert AITuber OnAir vision messages to Gemini format
|
|
267
|
-
* @param messages Array of vision messages
|
|
268
|
-
* @returns Gemini formatted vision messages
|
|
269
|
-
*/
|
|
270
|
-
async convertVisionMessagesToGeminiFormat(messages) {
|
|
271
|
-
const geminiMessages = [];
|
|
272
|
-
let currentRole = null;
|
|
273
|
-
let currentParts = [];
|
|
274
|
-
for (const msg of messages) {
|
|
275
|
-
// Map AITuber OnAir roles to Gemini roles
|
|
276
|
-
const role = this.mapRoleToGemini(msg.role);
|
|
277
|
-
/* ----------- OpenAI compatible tool metadata ----------- */
|
|
278
|
-
// assistant: { tool_calls:[{id,name,function:{arguments}}] }
|
|
279
|
-
if (msg.tool_calls) {
|
|
280
|
-
for (const call of msg.tool_calls) {
|
|
281
|
-
// Gemini does not need id. Insert functionCall into parts
|
|
282
|
-
geminiMessages.push({
|
|
283
|
-
role: 'model',
|
|
284
|
-
parts: [
|
|
285
|
-
{
|
|
286
|
-
functionCall: {
|
|
287
|
-
name: call.function.name,
|
|
288
|
-
args: JSON.parse(call.function.arguments || '{}'),
|
|
289
|
-
},
|
|
290
|
-
},
|
|
291
|
-
],
|
|
292
|
-
});
|
|
293
|
-
}
|
|
294
|
-
continue;
|
|
295
|
-
}
|
|
296
|
-
// tool role → user role + functionResponse
|
|
297
|
-
if (msg.role === 'tool') {
|
|
298
|
-
const funcName = msg.name ??
|
|
299
|
-
this.callIdMap.get(msg.tool_call_id) ??
|
|
300
|
-
'result';
|
|
301
|
-
geminiMessages.push({
|
|
302
|
-
role: 'user',
|
|
303
|
-
parts: [
|
|
304
|
-
{
|
|
305
|
-
functionResponse: {
|
|
306
|
-
name: funcName,
|
|
307
|
-
response: this.normalizeToolResult(this.safeJsonParse(msg.content)),
|
|
308
|
-
},
|
|
309
|
-
},
|
|
310
|
-
],
|
|
311
|
-
});
|
|
312
|
-
continue;
|
|
313
|
-
}
|
|
314
|
-
// If role changes, start a new message
|
|
315
|
-
if (role !== currentRole && currentParts.length > 0) {
|
|
316
|
-
geminiMessages.push({
|
|
317
|
-
role: currentRole,
|
|
318
|
-
parts: [...currentParts],
|
|
319
|
-
});
|
|
320
|
-
currentParts = [];
|
|
321
|
-
}
|
|
322
|
-
currentRole = role;
|
|
323
|
-
// If the message has content blocks, process them
|
|
324
|
-
if (typeof msg.content === 'string') {
|
|
325
|
-
currentParts.push({ text: msg.content });
|
|
326
|
-
}
|
|
327
|
-
else if (Array.isArray(msg.content)) {
|
|
328
|
-
// Process each content block (text or image)
|
|
329
|
-
for (const block of msg.content) {
|
|
330
|
-
if (block.type === 'text') {
|
|
331
|
-
currentParts.push({ text: block.text });
|
|
332
|
-
}
|
|
333
|
-
else if (block.type === 'image_url') {
|
|
334
|
-
try {
|
|
335
|
-
// Fetch the image data from URL
|
|
336
|
-
const imageResponse = await ChatServiceHttpClient.get(block.image_url.url);
|
|
337
|
-
// Convert image to blob and then to base64
|
|
338
|
-
const imageBlob = await imageResponse.blob();
|
|
339
|
-
const base64Data = await this.blobToBase64(imageBlob);
|
|
340
|
-
// Add image data in Gemini format
|
|
341
|
-
currentParts.push({
|
|
342
|
-
inlineData: {
|
|
343
|
-
mimeType: imageBlob.type || 'image/jpeg',
|
|
344
|
-
data: base64Data.split(',')[1], // Remove the "data:image/jpeg;base64," prefix
|
|
345
|
-
},
|
|
346
|
-
});
|
|
347
|
-
}
|
|
348
|
-
catch (error) {
|
|
349
|
-
console.error('Error processing image:', error);
|
|
350
|
-
throw new Error(`Failed to process image: ${error.message}`);
|
|
351
|
-
}
|
|
352
|
-
}
|
|
353
|
-
}
|
|
354
|
-
}
|
|
355
|
-
}
|
|
356
|
-
// Add the last message
|
|
357
|
-
if (currentRole && currentParts.length > 0) {
|
|
358
|
-
geminiMessages.push({
|
|
359
|
-
role: currentRole,
|
|
360
|
-
parts: [...currentParts],
|
|
361
|
-
});
|
|
362
|
-
}
|
|
363
|
-
return geminiMessages;
|
|
364
|
-
}
|
|
365
|
-
/**
|
|
366
|
-
* Convert Blob to Base64 string
|
|
367
|
-
* @param blob Image blob
|
|
368
|
-
* @returns Promise with base64 encoded string
|
|
369
|
-
*/
|
|
370
|
-
blobToBase64(blob) {
|
|
371
|
-
return new Promise((resolve, reject) => {
|
|
372
|
-
const reader = new FileReader();
|
|
373
|
-
reader.onloadend = () => resolve(reader.result);
|
|
374
|
-
reader.onerror = reject;
|
|
375
|
-
reader.readAsDataURL(blob);
|
|
376
|
-
});
|
|
377
|
-
}
|
|
378
|
-
/**
|
|
379
|
-
* Map AITuber OnAir roles to Gemini roles
|
|
380
|
-
* @param role AITuber OnAir role
|
|
381
|
-
* @returns Gemini role
|
|
382
|
-
*/
|
|
383
|
-
mapRoleToGemini(role) {
|
|
384
|
-
switch (role) {
|
|
385
|
-
case 'system':
|
|
386
|
-
return 'model'; // Gemini uses 'model' for system messages
|
|
387
|
-
case 'user':
|
|
388
|
-
return 'user';
|
|
389
|
-
case 'assistant':
|
|
390
|
-
return 'model';
|
|
391
|
-
default:
|
|
392
|
-
return 'user';
|
|
393
|
-
}
|
|
394
|
-
}
|
|
395
|
-
/* ────────────────────────────────────────────────────────── */
|
|
396
|
-
/* Convert NDJSON stream to common format */
|
|
397
|
-
/* ────────────────────────────────────────────────────────── */
|
|
398
|
-
async parseStream(res, onPartial) {
|
|
399
|
-
const reader = res.body.getReader();
|
|
400
|
-
const dec = new TextDecoder();
|
|
401
|
-
const textBlocks = [];
|
|
402
|
-
const toolBlocks = [];
|
|
403
|
-
let buf = '';
|
|
404
|
-
const flush = (payload) => {
|
|
405
|
-
if (!payload || payload === '[DONE]')
|
|
406
|
-
return;
|
|
407
|
-
let obj;
|
|
408
|
-
try {
|
|
409
|
-
obj = JSON.parse(payload);
|
|
410
|
-
}
|
|
411
|
-
catch {
|
|
412
|
-
return;
|
|
413
|
-
}
|
|
414
|
-
for (const cand of obj.candidates ?? []) {
|
|
415
|
-
for (const part of cand.content?.parts ?? []) {
|
|
416
|
-
if (part.text) {
|
|
417
|
-
onPartial(part.text);
|
|
418
|
-
StreamTextAccumulator.addTextBlock(textBlocks, part.text);
|
|
419
|
-
}
|
|
420
|
-
if (part.functionCall) {
|
|
421
|
-
toolBlocks.push({
|
|
422
|
-
type: 'tool_use',
|
|
423
|
-
id: this.genUUID(),
|
|
424
|
-
name: part.functionCall.name,
|
|
425
|
-
input: part.functionCall.args ?? {},
|
|
426
|
-
});
|
|
427
|
-
}
|
|
428
|
-
if (part.functionResponse) {
|
|
429
|
-
toolBlocks.push({
|
|
430
|
-
type: 'tool_result',
|
|
431
|
-
tool_use_id: part.functionResponse.name,
|
|
432
|
-
content: JSON.stringify(part.functionResponse.response),
|
|
433
|
-
});
|
|
434
|
-
}
|
|
435
|
-
}
|
|
436
|
-
}
|
|
437
|
-
};
|
|
438
|
-
while (true) {
|
|
439
|
-
const { done, value } = await reader.read();
|
|
440
|
-
if (done)
|
|
441
|
-
break;
|
|
442
|
-
buf += dec.decode(value, { stream: true });
|
|
443
|
-
let nl;
|
|
444
|
-
while ((nl = buf.indexOf('\n')) !== -1) {
|
|
445
|
-
let line = buf.slice(0, nl);
|
|
446
|
-
buf = buf.slice(nl + 1);
|
|
447
|
-
if (line.endsWith('\r'))
|
|
448
|
-
line = line.slice(0, -1); // CRLF support
|
|
449
|
-
if (!line.trim()) {
|
|
450
|
-
flush('');
|
|
451
|
-
continue;
|
|
452
|
-
} // keep-alive empty line
|
|
453
|
-
if (line.startsWith('data:'))
|
|
454
|
-
line = line.slice(5).trim();
|
|
455
|
-
if (!line)
|
|
456
|
-
continue;
|
|
457
|
-
flush(line);
|
|
458
|
-
}
|
|
459
|
-
}
|
|
460
|
-
if (buf)
|
|
461
|
-
flush(buf);
|
|
462
|
-
const blocks = [...textBlocks, ...toolBlocks];
|
|
463
|
-
return {
|
|
464
|
-
blocks,
|
|
465
|
-
stop_reason: toolBlocks.some((b) => b.type === 'tool_use')
|
|
466
|
-
? 'tool_use'
|
|
467
|
-
: 'end',
|
|
468
|
-
};
|
|
469
|
-
}
|
|
470
|
-
/* ────────────────────────────────────────────────────────── */
|
|
471
|
-
/* Convert JSON of non-stream (= generateContent) */
|
|
472
|
-
/* ────────────────────────────────────────────────────────── */
|
|
473
|
-
parseOneShot(data) {
|
|
474
|
-
const textBlocks = [];
|
|
475
|
-
const toolBlocks = [];
|
|
476
|
-
for (const cand of data.candidates ?? []) {
|
|
477
|
-
for (const part of cand.content?.parts ?? []) {
|
|
478
|
-
if (part.text) {
|
|
479
|
-
textBlocks.push({ type: 'text', text: part.text });
|
|
480
|
-
}
|
|
481
|
-
if (part.functionCall) {
|
|
482
|
-
toolBlocks.push({
|
|
483
|
-
type: 'tool_use',
|
|
484
|
-
id: this.genUUID(),
|
|
485
|
-
name: part.functionCall.name,
|
|
486
|
-
input: part.functionCall.args ?? {},
|
|
487
|
-
});
|
|
488
|
-
}
|
|
489
|
-
if (part.functionResponse) {
|
|
490
|
-
toolBlocks.push({
|
|
491
|
-
type: 'tool_result',
|
|
492
|
-
tool_use_id: part.functionResponse.name,
|
|
493
|
-
content: JSON.stringify(part.functionResponse.response),
|
|
494
|
-
});
|
|
495
|
-
}
|
|
496
|
-
}
|
|
497
|
-
}
|
|
498
|
-
const blocks = [...textBlocks, ...toolBlocks];
|
|
499
|
-
return {
|
|
500
|
-
blocks,
|
|
501
|
-
stop_reason: toolBlocks.some((b) => b.type === 'tool_use')
|
|
502
|
-
? 'tool_use'
|
|
503
|
-
: 'end',
|
|
504
|
-
};
|
|
505
|
-
}
|
|
506
|
-
/* ────────────────────────────────────────────────────────── */
|
|
507
|
-
/* chatOnce (text) */
|
|
508
|
-
/* ────────────────────────────────────────────────────────── */
|
|
509
|
-
async chatOnce(messages, stream = true, onPartialResponse = () => { }, maxTokens) {
|
|
510
|
-
const res = await this.callGemini(messages, this.model, stream, maxTokens);
|
|
511
|
-
return stream
|
|
512
|
-
? this.parseStream(res, onPartialResponse)
|
|
513
|
-
: this.parseOneShot(await res.json());
|
|
514
|
-
}
|
|
515
|
-
/* ────────────────────────────────────────────────────────── */
|
|
516
|
-
/* visionChatOnce (images) */
|
|
517
|
-
/* ────────────────────────────────────────────────────────── */
|
|
518
|
-
async visionChatOnce(messages, stream = false, onPartialResponse = () => { }, maxTokens) {
|
|
519
|
-
const res = await this.callGemini(messages, this.visionModel, stream, maxTokens);
|
|
520
|
-
return stream
|
|
521
|
-
? this.parseStream(res, onPartialResponse)
|
|
522
|
-
: this.parseOneShot(await res.json());
|
|
523
|
-
}
|
|
524
|
-
/* ────────────────────────────────────────────────────────── */
|
|
525
|
-
/* UUID helper */
|
|
526
|
-
/* ────────────────────────────────────────────────────────── */
|
|
527
|
-
genUUID() {
|
|
528
|
-
return typeof crypto !== 'undefined' && crypto.randomUUID
|
|
529
|
-
? crypto.randomUUID()
|
|
530
|
-
: 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, (c) => {
|
|
531
|
-
const r = (Math.random() * 16) | 0;
|
|
532
|
-
const v = c === 'x' ? r : (r & 0x3) | 0x8;
|
|
533
|
-
return v.toString(16);
|
|
534
|
-
});
|
|
535
|
-
}
|
|
536
|
-
}
|
|
537
|
-
//# sourceMappingURL=GeminiChatService.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"GeminiChatService.js","sourceRoot":"","sources":["../../../../../src/services/chat/providers/gemini/GeminiChatService.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,39 +0,0 @@
|
|
|
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
|
-
}
|