apexify.js 4.1.5 → 4.1.7
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/dist/ai/modals-chat/Gemini-flash.d.ts.map +1 -1
- package/dist/ai/modals-chat/Gemini-flash.js +62 -46
- package/dist/ai/modals-chat/Gemini-flash.js.map +1 -1
- package/dist/ai/modals-chat/Gemini-pro.d.ts.map +1 -1
- package/dist/ai/modals-chat/Gemini-pro.js +61 -45
- package/dist/ai/modals-chat/Gemini-pro.js.map +1 -1
- package/lib/ai/modals-chat/Gemini-flash.ts +151 -139
- package/lib/ai/modals-chat/Gemini-pro.ts +150 -138
- package/package.json +2 -2
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Gemini-flash.d.ts","sourceRoot":"","sources":["../../../lib/ai/modals-chat/Gemini-flash.ts"],"names":[],"mappings":"AAUA,wBAAsB,WAAW,CAAC,OAAO,EAAE;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,UAAU,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAC;IAAC,WAAW,EAAE,MAAM,CAAC;IAAC,UAAU,EAAE,GAAG,CAAC;IAAC,EAAE,EAAE,OAAO,CAAA;
|
|
1
|
+
{"version":3,"file":"Gemini-flash.d.ts","sourceRoot":"","sources":["../../../lib/ai/modals-chat/Gemini-flash.ts"],"names":[],"mappings":"AAUA,wBAAsB,WAAW,CAAC,OAAO,EAAE;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,UAAU,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAC;IAAC,WAAW,EAAE,MAAM,CAAC;IAAC,UAAU,EAAE,GAAG,CAAC;IAAC,EAAE,EAAE,OAAO,CAAA;CAAE,EAAE,EAAE,EAAE;IAAE,aAAa,EAAE,MAAM,GAAG,IAAI,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAAA;CAAE,GAAG,OAAO,CAAC,GAAG,CAAC,CAsMnP"}
|
|
@@ -13,27 +13,28 @@ const verse_db_1 = require("verse.db");
|
|
|
13
13
|
const axios_1 = __importDefault(require("axios"));
|
|
14
14
|
let currentApiKeyIndex = 0;
|
|
15
15
|
async function geminiFlash(message, AI) {
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
16
|
+
async function validateKey(apiKey) {
|
|
17
|
+
try {
|
|
18
|
+
const validateResponse = await axios_1.default.get(`https://generativelanguage.googleapis.com/v1beta/models?key=${apiKey}`);
|
|
19
|
+
return validateResponse.status === 200;
|
|
20
|
+
}
|
|
21
|
+
catch (error) {
|
|
22
|
+
console.error(`Error validating API key: ${apiKey}`, error);
|
|
23
|
+
return false;
|
|
24
|
+
}
|
|
20
25
|
}
|
|
21
|
-
|
|
22
|
-
let
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
genAI = new generative_ai_1.GoogleGenerativeAI(config_1.default.apiKeys[apiKeyIndex]);
|
|
28
|
-
break;
|
|
26
|
+
async function getValidGenAI(apiKeys, initialIndex) {
|
|
27
|
+
for (let i = initialIndex; i < apiKeys.length; i++) {
|
|
28
|
+
const apiKey = apiKeys[i];
|
|
29
|
+
if (await validateKey(apiKey)) {
|
|
30
|
+
currentApiKeyIndex = i;
|
|
31
|
+
return new generative_ai_1.GoogleGenerativeAI(apiKey);
|
|
29
32
|
}
|
|
30
|
-
else {
|
|
31
|
-
apiKeyIndex++;
|
|
32
|
-
}
|
|
33
|
-
}
|
|
34
|
-
if (apiKeyIndex === config_1.default.apiKeys.length) {
|
|
35
|
-
return 'All provided API keys are invalid.';
|
|
36
33
|
}
|
|
34
|
+
return null;
|
|
35
|
+
}
|
|
36
|
+
async function processRequest(genAI) {
|
|
37
|
+
var _a, _b;
|
|
37
38
|
let personalityString = '';
|
|
38
39
|
if (AI.AiPersonality) {
|
|
39
40
|
const personalityFilePath = path_1.default.join(process.cwd(), AI.AiPersonality);
|
|
@@ -62,7 +63,7 @@ async function geminiFlash(message, AI) {
|
|
|
62
63
|
},
|
|
63
64
|
];
|
|
64
65
|
const systemInstruction = `${personalityString}\n And working on discord in serverName: ${message.serverName} at channelName: ${message.channelName} and responding to the userName: <@${message.userId}>`;
|
|
65
|
-
const model = genAI.getGenerativeModel({ model: "gemini-1.5-
|
|
66
|
+
const model = genAI.getGenerativeModel({ model: "gemini-1.5-flash-latest", systemInstruction, generationConfig, safetySettings });
|
|
66
67
|
const defaultHistory = [
|
|
67
68
|
{
|
|
68
69
|
role: "user",
|
|
@@ -78,11 +79,11 @@ async function geminiFlash(message, AI) {
|
|
|
78
79
|
},
|
|
79
80
|
{
|
|
80
81
|
role: "model",
|
|
81
|
-
parts: [{ text: `Yes,
|
|
82
|
+
parts: [{ text: `Yes, I save chat history for each user if it is enabled in my configuration otherwise no data being saved.` }],
|
|
82
83
|
},
|
|
83
84
|
{
|
|
84
85
|
role: "user",
|
|
85
|
-
parts: [{ text: `How is your data/memory/chat history
|
|
86
|
+
parts: [{ text: `How is your data/memory/chat history managed?` }],
|
|
86
87
|
},
|
|
87
88
|
{
|
|
88
89
|
role: "model",
|
|
@@ -90,21 +91,17 @@ async function geminiFlash(message, AI) {
|
|
|
90
91
|
}
|
|
91
92
|
];
|
|
92
93
|
let historyData = undefined;
|
|
94
|
+
let db;
|
|
93
95
|
if (message.db) {
|
|
94
96
|
db = new verse_db_1.connect({ adapter: 'json', dataPath: `${message.serverId}_ChatHistory` });
|
|
95
97
|
const data = await db.find(`${message.userId}_chatHistory`, { userId: message.userId });
|
|
96
|
-
|
|
97
|
-
await db.update(`${message.userId}_chatHistory`, { userId: message.userId }, { $set: { history: [] } }, true);
|
|
98
|
-
}
|
|
99
|
-
else {
|
|
100
|
-
historyData = ((_d = data.results) === null || _d === void 0 ? void 0 : _d.history) || undefined;
|
|
101
|
-
}
|
|
98
|
+
historyData = ((_a = data.results) === null || _a === void 0 ? void 0 : _a.history) || undefined;
|
|
102
99
|
}
|
|
103
100
|
const chat = model.startChat({
|
|
104
101
|
history: historyData || defaultHistory,
|
|
105
102
|
generationConfig
|
|
106
103
|
});
|
|
107
|
-
const imgURL = ((
|
|
104
|
+
const imgURL = ((_b = message.attachment) === null || _b === void 0 ? void 0 : _b.url) || null;
|
|
108
105
|
let result;
|
|
109
106
|
if (imgURL) {
|
|
110
107
|
const imageData = await urlToBase64(imgURL);
|
|
@@ -121,7 +118,7 @@ async function geminiFlash(message, AI) {
|
|
|
121
118
|
}
|
|
122
119
|
const response = await result.response.text();
|
|
123
120
|
if (message.db) {
|
|
124
|
-
const
|
|
121
|
+
const userHistory = {
|
|
125
122
|
$push: {
|
|
126
123
|
"history": {
|
|
127
124
|
role: "user",
|
|
@@ -129,8 +126,8 @@ async function geminiFlash(message, AI) {
|
|
|
129
126
|
}
|
|
130
127
|
},
|
|
131
128
|
};
|
|
132
|
-
historyData = await db.update(`${message.userId}_chatHistory`, { userId: message.userId },
|
|
133
|
-
const
|
|
129
|
+
historyData = await db.update(`${message.userId}_chatHistory`, { userId: message.userId }, userHistory, true);
|
|
130
|
+
const modelHistory = {
|
|
134
131
|
$push: {
|
|
135
132
|
"history": {
|
|
136
133
|
role: "model",
|
|
@@ -138,17 +135,46 @@ async function geminiFlash(message, AI) {
|
|
|
138
135
|
}
|
|
139
136
|
},
|
|
140
137
|
};
|
|
141
|
-
historyData = await db.update(`${message.userId}_chatHistory`, { userId: message.userId },
|
|
138
|
+
historyData = await db.update(`${message.userId}_chatHistory`, { userId: message.userId }, modelHistory, true);
|
|
142
139
|
}
|
|
143
140
|
return response;
|
|
144
141
|
}
|
|
142
|
+
async function urlToBase64(imageURL) {
|
|
143
|
+
try {
|
|
144
|
+
const convertedBuffer = await (0, general_functions_1.converter)(imageURL, 'png');
|
|
145
|
+
const base64String = convertedBuffer.toString('base64');
|
|
146
|
+
return base64String;
|
|
147
|
+
}
|
|
148
|
+
catch (error) {
|
|
149
|
+
throw new Error(`Failed to fetch and convert the image: ${error.message}`);
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
try {
|
|
153
|
+
let genAI;
|
|
154
|
+
if (AI.API_KEY && await validateKey(AI.API_KEY)) {
|
|
155
|
+
genAI = new generative_ai_1.GoogleGenerativeAI(AI.API_KEY);
|
|
156
|
+
}
|
|
157
|
+
else {
|
|
158
|
+
genAI = await getValidGenAI(config_1.default.apiKeys, currentApiKeyIndex);
|
|
159
|
+
if (!genAI) {
|
|
160
|
+
return 'All provided API keys are invalid.';
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
return await processRequest(genAI);
|
|
164
|
+
}
|
|
145
165
|
catch (e) {
|
|
146
166
|
if (e.message) {
|
|
147
|
-
if (e.
|
|
148
|
-
|
|
167
|
+
if (e.status === 429 || e.status === 403) {
|
|
168
|
+
currentApiKeyIndex++;
|
|
169
|
+
if (currentApiKeyIndex < config_1.default.apiKeys.length) {
|
|
170
|
+
return await geminiFlash(message, AI);
|
|
171
|
+
}
|
|
172
|
+
else {
|
|
173
|
+
return 'Ai is on a cooldown for the rest of the day. Either provide your own API key or wait for tomorrow. Check ai.google.dev for free apikeys';
|
|
174
|
+
}
|
|
149
175
|
}
|
|
150
|
-
else if (e.
|
|
151
|
-
return
|
|
176
|
+
else if (e.status === 400) {
|
|
177
|
+
return `The hoster/bot owner/the used host isn't supported by gemini.`;
|
|
152
178
|
}
|
|
153
179
|
else if (e.message === '[GoogleGenerativeAI Error]: Candidate was blocked due to SAFETY') {
|
|
154
180
|
console.error(e);
|
|
@@ -166,14 +192,4 @@ async function geminiFlash(message, AI) {
|
|
|
166
192
|
}
|
|
167
193
|
}
|
|
168
194
|
exports.geminiFlash = geminiFlash;
|
|
169
|
-
async function urlToBase64(imageURL) {
|
|
170
|
-
try {
|
|
171
|
-
const convertedBuffer = await (0, general_functions_1.converter)(imageURL, 'png');
|
|
172
|
-
const base64String = convertedBuffer.toString('base64');
|
|
173
|
-
return base64String;
|
|
174
|
-
}
|
|
175
|
-
catch (error) {
|
|
176
|
-
throw new Error(`Failed to fetch and convert the image: ${error.message}`);
|
|
177
|
-
}
|
|
178
|
-
}
|
|
179
195
|
//# sourceMappingURL=Gemini-flash.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Gemini-flash.js","sourceRoot":"","sources":["../../../lib/ai/modals-chat/Gemini-flash.ts"],"names":[],"mappings":";;;;;;AAAA,yDAA6F;AAC7F,gDAAwB;AACxB,4CAAoB;AACpB,sDAA8B;AAC9B,4EAAiE;AACjE,
|
|
1
|
+
{"version":3,"file":"Gemini-flash.js","sourceRoot":"","sources":["../../../lib/ai/modals-chat/Gemini-flash.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Gemini-pro.d.ts","sourceRoot":"","sources":["../../../lib/ai/modals-chat/Gemini-pro.ts"],"names":[],"mappings":"AAUA,wBAAsB,SAAS,CAAC,OAAO,EAAE;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,UAAU,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAC;IAAC,WAAW,EAAE,MAAM,CAAC;IAAC,UAAU,EAAE,GAAG,CAAC;IAAC,EAAE,EAAE,OAAO,CAAA;
|
|
1
|
+
{"version":3,"file":"Gemini-pro.d.ts","sourceRoot":"","sources":["../../../lib/ai/modals-chat/Gemini-pro.ts"],"names":[],"mappings":"AAUA,wBAAsB,SAAS,CAAC,OAAO,EAAE;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,UAAU,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAC;IAAC,WAAW,EAAE,MAAM,CAAC;IAAC,UAAU,EAAE,GAAG,CAAC;IAAC,EAAE,EAAE,OAAO,CAAA;CAAE,EAAE,EAAE,EAAE;IAAE,aAAa,EAAE,MAAM,GAAG,IAAI,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAAA;CAAE,GAAG,OAAO,CAAC,GAAG,CAAC,CAsMjP"}
|
|
@@ -13,27 +13,28 @@ const verse_db_1 = require("verse.db");
|
|
|
13
13
|
const axios_1 = __importDefault(require("axios"));
|
|
14
14
|
let currentApiKeyIndex = 0;
|
|
15
15
|
async function geminiPro(message, AI) {
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
16
|
+
async function validateKey(apiKey) {
|
|
17
|
+
try {
|
|
18
|
+
const validateResponse = await axios_1.default.get(`https://generativelanguage.googleapis.com/v1beta/models?key=${apiKey}`);
|
|
19
|
+
return validateResponse.status === 200;
|
|
20
|
+
}
|
|
21
|
+
catch (error) {
|
|
22
|
+
console.error(`Error validating API key: ${apiKey}`, error);
|
|
23
|
+
return false;
|
|
24
|
+
}
|
|
20
25
|
}
|
|
21
|
-
|
|
22
|
-
let
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
genAI = new generative_ai_1.GoogleGenerativeAI(config_1.default.apiKeys[apiKeyIndex]);
|
|
28
|
-
break;
|
|
26
|
+
async function getValidGenAI(apiKeys, initialIndex) {
|
|
27
|
+
for (let i = initialIndex; i < apiKeys.length; i++) {
|
|
28
|
+
const apiKey = apiKeys[i];
|
|
29
|
+
if (await validateKey(apiKey)) {
|
|
30
|
+
currentApiKeyIndex = i;
|
|
31
|
+
return new generative_ai_1.GoogleGenerativeAI(apiKey);
|
|
29
32
|
}
|
|
30
|
-
else {
|
|
31
|
-
apiKeyIndex++;
|
|
32
|
-
}
|
|
33
|
-
}
|
|
34
|
-
if (apiKeyIndex === config_1.default.apiKeys.length) {
|
|
35
|
-
return 'All provided API keys are invalid.';
|
|
36
33
|
}
|
|
34
|
+
return null;
|
|
35
|
+
}
|
|
36
|
+
async function processRequest(genAI) {
|
|
37
|
+
var _a, _b;
|
|
37
38
|
let personalityString = '';
|
|
38
39
|
if (AI.AiPersonality) {
|
|
39
40
|
const personalityFilePath = path_1.default.join(process.cwd(), AI.AiPersonality);
|
|
@@ -78,11 +79,11 @@ async function geminiPro(message, AI) {
|
|
|
78
79
|
},
|
|
79
80
|
{
|
|
80
81
|
role: "model",
|
|
81
|
-
parts: [{ text: `Yes,
|
|
82
|
+
parts: [{ text: `Yes, I save chat history for each user if it is enabled in my configuration otherwise no data being saved.` }],
|
|
82
83
|
},
|
|
83
84
|
{
|
|
84
85
|
role: "user",
|
|
85
|
-
parts: [{ text: `How is your data/memory/chat history
|
|
86
|
+
parts: [{ text: `How is your data/memory/chat history managed?` }],
|
|
86
87
|
},
|
|
87
88
|
{
|
|
88
89
|
role: "model",
|
|
@@ -90,21 +91,17 @@ async function geminiPro(message, AI) {
|
|
|
90
91
|
}
|
|
91
92
|
];
|
|
92
93
|
let historyData = undefined;
|
|
94
|
+
let db;
|
|
93
95
|
if (message.db) {
|
|
94
96
|
db = new verse_db_1.connect({ adapter: 'json', dataPath: `${message.serverId}_ChatHistory` });
|
|
95
97
|
const data = await db.find(`${message.userId}_chatHistory`, { userId: message.userId });
|
|
96
|
-
|
|
97
|
-
await db.update(`${message.userId}_chatHistory`, { userId: message.userId }, { $set: { history: [] } }, true);
|
|
98
|
-
}
|
|
99
|
-
else {
|
|
100
|
-
historyData = ((_d = data.results) === null || _d === void 0 ? void 0 : _d.history) || undefined;
|
|
101
|
-
}
|
|
98
|
+
historyData = ((_a = data.results) === null || _a === void 0 ? void 0 : _a.history) || undefined;
|
|
102
99
|
}
|
|
103
100
|
const chat = model.startChat({
|
|
104
101
|
history: historyData || defaultHistory,
|
|
105
102
|
generationConfig
|
|
106
103
|
});
|
|
107
|
-
const imgURL = ((
|
|
104
|
+
const imgURL = ((_b = message.attachment) === null || _b === void 0 ? void 0 : _b.url) || null;
|
|
108
105
|
let result;
|
|
109
106
|
if (imgURL) {
|
|
110
107
|
const imageData = await urlToBase64(imgURL);
|
|
@@ -121,7 +118,7 @@ async function geminiPro(message, AI) {
|
|
|
121
118
|
}
|
|
122
119
|
const response = await result.response.text();
|
|
123
120
|
if (message.db) {
|
|
124
|
-
const
|
|
121
|
+
const userHistory = {
|
|
125
122
|
$push: {
|
|
126
123
|
"history": {
|
|
127
124
|
role: "user",
|
|
@@ -129,8 +126,8 @@ async function geminiPro(message, AI) {
|
|
|
129
126
|
}
|
|
130
127
|
},
|
|
131
128
|
};
|
|
132
|
-
historyData = await db.update(`${message.userId}_chatHistory`, { userId: message.userId },
|
|
133
|
-
const
|
|
129
|
+
historyData = await db.update(`${message.userId}_chatHistory`, { userId: message.userId }, userHistory, true);
|
|
130
|
+
const modelHistory = {
|
|
134
131
|
$push: {
|
|
135
132
|
"history": {
|
|
136
133
|
role: "model",
|
|
@@ -138,17 +135,46 @@ async function geminiPro(message, AI) {
|
|
|
138
135
|
}
|
|
139
136
|
},
|
|
140
137
|
};
|
|
141
|
-
historyData = await db.update(`${message.userId}_chatHistory`, { userId: message.userId },
|
|
138
|
+
historyData = await db.update(`${message.userId}_chatHistory`, { userId: message.userId }, modelHistory, true);
|
|
142
139
|
}
|
|
143
140
|
return response;
|
|
144
141
|
}
|
|
142
|
+
async function urlToBase64(imageURL) {
|
|
143
|
+
try {
|
|
144
|
+
const convertedBuffer = await (0, general_functions_1.converter)(imageURL, 'png');
|
|
145
|
+
const base64String = convertedBuffer.toString('base64');
|
|
146
|
+
return base64String;
|
|
147
|
+
}
|
|
148
|
+
catch (error) {
|
|
149
|
+
throw new Error(`Failed to fetch and convert the image: ${error.message}`);
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
try {
|
|
153
|
+
let genAI;
|
|
154
|
+
if (AI.API_KEY && await validateKey(AI.API_KEY)) {
|
|
155
|
+
genAI = new generative_ai_1.GoogleGenerativeAI(AI.API_KEY);
|
|
156
|
+
}
|
|
157
|
+
else {
|
|
158
|
+
genAI = await getValidGenAI(config_1.default.apiKeys, currentApiKeyIndex);
|
|
159
|
+
if (!genAI) {
|
|
160
|
+
return 'All provided API keys are invalid.';
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
return await processRequest(genAI);
|
|
164
|
+
}
|
|
145
165
|
catch (e) {
|
|
146
166
|
if (e.message) {
|
|
147
|
-
if (e.
|
|
148
|
-
|
|
167
|
+
if (e.status === 429 || e.status === 403) {
|
|
168
|
+
currentApiKeyIndex++;
|
|
169
|
+
if (currentApiKeyIndex < config_1.default.apiKeys.length) {
|
|
170
|
+
return await geminiPro(message, AI);
|
|
171
|
+
}
|
|
172
|
+
else {
|
|
173
|
+
return 'Ai is on a cooldown for the rest of the day. Either provide your own API key or wait for tomorrow. Check ai.google.dev for free apikeys';
|
|
174
|
+
}
|
|
149
175
|
}
|
|
150
|
-
else if (e.
|
|
151
|
-
return
|
|
176
|
+
else if (e.status === 400) {
|
|
177
|
+
return `The hoster/bot owner/the used host isn't supported by gemini.`;
|
|
152
178
|
}
|
|
153
179
|
else if (e.message === '[GoogleGenerativeAI Error]: Candidate was blocked due to SAFETY') {
|
|
154
180
|
console.error(e);
|
|
@@ -166,14 +192,4 @@ async function geminiPro(message, AI) {
|
|
|
166
192
|
}
|
|
167
193
|
}
|
|
168
194
|
exports.geminiPro = geminiPro;
|
|
169
|
-
async function urlToBase64(imageURL) {
|
|
170
|
-
try {
|
|
171
|
-
const convertedBuffer = await (0, general_functions_1.converter)(imageURL, 'png');
|
|
172
|
-
const base64String = convertedBuffer.toString('base64');
|
|
173
|
-
return base64String;
|
|
174
|
-
}
|
|
175
|
-
catch (error) {
|
|
176
|
-
throw new Error(`Failed to fetch and convert the image: ${error.message}`);
|
|
177
|
-
}
|
|
178
|
-
}
|
|
179
195
|
//# sourceMappingURL=Gemini-pro.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Gemini-pro.js","sourceRoot":"","sources":["../../../lib/ai/modals-chat/Gemini-pro.ts"],"names":[],"mappings":";;;;;;AAAA,yDAA6F;AAC7F,gDAAwB;AACxB,4CAAoB;AACpB,sDAA8B;AAC9B,4EAAiE;AACjE,
|
|
1
|
+
{"version":3,"file":"Gemini-pro.js","sourceRoot":"","sources":["../../../lib/ai/modals-chat/Gemini-pro.ts"],"names":[],"mappings":"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"}
|
|
@@ -3,195 +3,207 @@ import path from 'path';
|
|
|
3
3
|
import fs from 'fs';
|
|
4
4
|
import config from './config';
|
|
5
5
|
import { converter } from "../../canvas/utils/general functions";
|
|
6
|
-
import
|
|
6
|
+
import { connect } from "verse.db";
|
|
7
7
|
import axios from "axios";
|
|
8
8
|
|
|
9
9
|
let currentApiKeyIndex = 0;
|
|
10
10
|
|
|
11
|
-
export async function geminiFlash(message: { userId: string, serverName: string, serverId: string, channelName: string, attachment: any, db: boolean
|
|
11
|
+
export async function geminiFlash(message: { userId: string, serverName: string, serverId: string, channelName: string, attachment: any, db: boolean }, AI: { AiPersonality: string | null, userMsg: string, API_KEY: string | null }): Promise<any> {
|
|
12
12
|
|
|
13
|
-
|
|
13
|
+
async function validateKey(apiKey: string) {
|
|
14
|
+
try {
|
|
15
|
+
const validateResponse = await axios.get(`https://generativelanguage.googleapis.com/v1beta/models?key=${apiKey}`);
|
|
16
|
+
return validateResponse.status === 200;
|
|
17
|
+
} catch (error) {
|
|
18
|
+
console.error(`Error validating API key: ${apiKey}`, error);
|
|
19
|
+
return false;
|
|
20
|
+
}
|
|
21
|
+
}
|
|
14
22
|
|
|
15
|
-
|
|
16
|
-
|
|
23
|
+
async function getValidGenAI(apiKeys: string[], initialIndex: number): Promise<any> {
|
|
24
|
+
for (let i = initialIndex; i < apiKeys.length; i++) {
|
|
25
|
+
const apiKey = apiKeys[i];
|
|
26
|
+
if (await validateKey(apiKey)) {
|
|
27
|
+
currentApiKeyIndex = i;
|
|
28
|
+
return new GoogleGenerativeAI(apiKey);
|
|
29
|
+
}
|
|
17
30
|
}
|
|
31
|
+
return null;
|
|
32
|
+
}
|
|
18
33
|
|
|
19
|
-
|
|
20
|
-
let
|
|
21
|
-
let genAI: any;
|
|
22
|
-
while (apiKeyIndex < config.apiKeys.length) {
|
|
23
|
-
const validateKey = await axios.get(`https://generativelanguage.googleapis.com/v1beta/models?key=${config.apiKeys[apiKeyIndex]}`);
|
|
24
|
-
if (validateKey.status === 200) {
|
|
25
|
-
genAI = new GoogleGenerativeAI(config.apiKeys[apiKeyIndex]);
|
|
26
|
-
|
|
27
|
-
break;
|
|
28
|
-
} else {
|
|
29
|
-
apiKeyIndex++;
|
|
30
|
-
}
|
|
31
|
-
}
|
|
34
|
+
async function processRequest(genAI: any): Promise<any> {
|
|
35
|
+
let personalityString = '';
|
|
32
36
|
|
|
33
|
-
if (apiKeyIndex === config.apiKeys.length) {
|
|
34
|
-
return 'All provided API keys are invalid.';
|
|
35
|
-
}
|
|
36
|
-
let personalityString: string = '';
|
|
37
|
-
|
|
38
37
|
if (AI.AiPersonality) {
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
38
|
+
const personalityFilePath = path.join(process.cwd(), AI.AiPersonality);
|
|
39
|
+
const personalityContent = fs.readFileSync(personalityFilePath, 'utf-8');
|
|
40
|
+
personalityString = personalityContent.split('\n').join(' ');
|
|
42
41
|
}
|
|
43
42
|
|
|
44
43
|
const generationConfig = {
|
|
45
|
-
|
|
44
|
+
maxOutputTokens: 750,
|
|
46
45
|
};
|
|
47
46
|
|
|
48
47
|
const safetySettings = [
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
48
|
+
{
|
|
49
|
+
category: HarmCategory.HARM_CATEGORY_HARASSMENT,
|
|
50
|
+
threshold: HarmBlockThreshold.BLOCK_ONLY_HIGH,
|
|
51
|
+
},
|
|
52
|
+
{
|
|
53
|
+
category: HarmCategory.HARM_CATEGORY_HATE_SPEECH,
|
|
54
|
+
threshold: HarmBlockThreshold.BLOCK_MEDIUM_AND_ABOVE,
|
|
55
|
+
},
|
|
56
|
+
{
|
|
57
|
+
category: HarmCategory.HARM_CATEGORY_SEXUALLY_EXPLICIT,
|
|
58
|
+
threshold: HarmBlockThreshold.BLOCK_LOW_AND_ABOVE,
|
|
59
|
+
},
|
|
60
|
+
{
|
|
61
|
+
category: HarmCategory.HARM_CATEGORY_DANGEROUS_CONTENT,
|
|
62
|
+
threshold: HarmBlockThreshold.BLOCK_MEDIUM_AND_ABOVE,
|
|
63
|
+
},
|
|
65
64
|
];
|
|
66
65
|
|
|
67
66
|
const systemInstruction = `${personalityString}\n And working on discord in serverName: ${message.serverName} at channelName: ${message.channelName} and responding to the userName: <@${message.userId}>`;
|
|
68
|
-
const model = genAI.getGenerativeModel({ model: "gemini-1.5-
|
|
67
|
+
const model = genAI.getGenerativeModel({ model: "gemini-1.5-flash-latest", systemInstruction, generationConfig, safetySettings });
|
|
69
68
|
|
|
70
69
|
const defaultHistory = [
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
70
|
+
{
|
|
71
|
+
role: "user",
|
|
72
|
+
parts: [{ text: `Hey who are you?` }],
|
|
73
|
+
},
|
|
74
|
+
{
|
|
75
|
+
role: "model",
|
|
76
|
+
parts: [{ text: `I am an AI assistant built/developed/created by Apexify.js` }],
|
|
77
|
+
},
|
|
78
|
+
{
|
|
79
|
+
role: "user",
|
|
80
|
+
parts: [{ text: `You have chat Memory?` }],
|
|
81
|
+
},
|
|
82
|
+
{
|
|
83
|
+
role: "model",
|
|
84
|
+
parts: [{ text: `Yes, I save chat history for each user if it is enabled in my configuration otherwise no data being saved.` }],
|
|
85
|
+
},
|
|
86
|
+
{
|
|
87
|
+
role: "user",
|
|
88
|
+
parts: [{ text: `How is your data/memory/chat history managed?` }],
|
|
89
|
+
},
|
|
90
|
+
{
|
|
91
|
+
role: "model",
|
|
92
|
+
parts: [{ text: `It is managed by verse.db. A database used to manage JSON/SQL/YAML/SQOL database with ease and supports schema/schemaless data.` }],
|
|
93
|
+
}
|
|
95
94
|
];
|
|
96
95
|
|
|
97
96
|
let historyData: any[] | undefined = undefined;
|
|
98
97
|
|
|
98
|
+
let db: any;
|
|
99
99
|
if (message.db) {
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
if (!data.results?.history || data.results?.history?.length === 0) {
|
|
105
|
-
await db.update(`${message.userId}_chatHistory`, { userId: message.userId }, { $set: { history: [] } }, true);
|
|
106
|
-
} else {
|
|
107
|
-
historyData = data.results?.history || undefined;
|
|
108
|
-
}
|
|
100
|
+
db = new connect({ adapter: 'json', dataPath: `${message.serverId}_ChatHistory` });
|
|
101
|
+
const data = await db.find(`${message.userId}_chatHistory`, { userId: message.userId });
|
|
102
|
+
historyData = data.results?.history || undefined;
|
|
109
103
|
}
|
|
110
104
|
|
|
111
105
|
const chat = model.startChat({
|
|
112
106
|
history: historyData || defaultHistory,
|
|
113
107
|
generationConfig
|
|
114
108
|
});
|
|
115
|
-
|
|
109
|
+
|
|
116
110
|
const imgURL = message.attachment?.url || null;
|
|
117
111
|
let result: any;
|
|
118
112
|
|
|
119
113
|
if (imgURL) {
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
114
|
+
const imageData = await urlToBase64(imgURL);
|
|
115
|
+
const image = {
|
|
116
|
+
inlineData: {
|
|
117
|
+
data: imageData,
|
|
118
|
+
mimeType: "image/png",
|
|
119
|
+
},
|
|
120
|
+
};
|
|
121
|
+
result = await chat.sendMessage([AI.userMsg, image]);
|
|
128
122
|
} else {
|
|
129
|
-
|
|
123
|
+
result = await chat.sendMessage(AI.userMsg);
|
|
130
124
|
}
|
|
131
125
|
|
|
132
|
-
const response =
|
|
126
|
+
const response = await result.response.text();
|
|
133
127
|
|
|
134
128
|
if (message.db) {
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
129
|
+
const userHistory = {
|
|
130
|
+
$push: {
|
|
131
|
+
"history": {
|
|
132
|
+
role: "user",
|
|
133
|
+
parts: [{ text: `${AI.userMsg}` }]
|
|
134
|
+
}
|
|
135
|
+
},
|
|
136
|
+
};
|
|
137
|
+
|
|
138
|
+
historyData = await db.update(`${message.userId}_chatHistory`,
|
|
139
|
+
{ userId: message.userId },
|
|
140
|
+
userHistory,
|
|
141
|
+
true
|
|
142
|
+
);
|
|
143
|
+
|
|
144
|
+
const modelHistory = {
|
|
145
|
+
$push: {
|
|
146
|
+
"history": {
|
|
147
|
+
role: "model",
|
|
148
|
+
parts: [{ text: `${response}` }]
|
|
149
|
+
}
|
|
150
|
+
},
|
|
151
|
+
};
|
|
152
|
+
|
|
153
|
+
historyData = await db.update(`${message.userId}_chatHistory`,
|
|
160
154
|
{ userId: message.userId },
|
|
161
|
-
|
|
155
|
+
modelHistory,
|
|
162
156
|
true
|
|
163
|
-
|
|
157
|
+
);
|
|
164
158
|
}
|
|
165
159
|
|
|
166
160
|
return response;
|
|
167
|
-
}
|
|
161
|
+
}
|
|
162
|
+
|
|
163
|
+
async function urlToBase64(imageURL: string) {
|
|
164
|
+
try {
|
|
165
|
+
const convertedBuffer = await converter(imageURL, 'png');
|
|
166
|
+
const base64String = convertedBuffer.toString('base64');
|
|
167
|
+
return base64String;
|
|
168
|
+
} catch (error: any) {
|
|
169
|
+
throw new Error(`Failed to fetch and convert the image: ${error.message}`);
|
|
170
|
+
}
|
|
171
|
+
}
|
|
172
|
+
|
|
173
|
+
try {
|
|
174
|
+
let genAI: any;
|
|
175
|
+
|
|
176
|
+
if (AI.API_KEY && await validateKey(AI.API_KEY)) {
|
|
177
|
+
genAI = new GoogleGenerativeAI(AI.API_KEY);
|
|
178
|
+
} else {
|
|
179
|
+
genAI = await getValidGenAI(config.apiKeys, currentApiKeyIndex);
|
|
180
|
+
if (!genAI) {
|
|
181
|
+
return 'All provided API keys are invalid.';
|
|
182
|
+
}
|
|
183
|
+
}
|
|
184
|
+
|
|
185
|
+
return await processRequest(genAI);
|
|
186
|
+
} catch (e: any) {
|
|
168
187
|
if (e.message) {
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
} else if (e.message === '[GoogleGenerativeAI Error]: Candidate was blocked due to SAFETY') {
|
|
174
|
-
console.error(e);
|
|
175
|
-
return `Due to safety enabled by gemini you have been blocked.`;
|
|
188
|
+
if (e.status === 429 || e.status === 403) {
|
|
189
|
+
currentApiKeyIndex++;
|
|
190
|
+
if (currentApiKeyIndex < config.apiKeys.length) {
|
|
191
|
+
return await geminiFlash(message, AI);
|
|
176
192
|
} else {
|
|
177
|
-
|
|
178
|
-
return `Try again later please... Either API is on a cooldown or an internal server error has occurred. If issue persists please contact the bot developer or owner of the npm package.`;
|
|
193
|
+
return 'Ai is on a cooldown for the rest of the day. Either provide your own API key or wait for tomorrow. Check ai.google.dev for free apikeys';
|
|
179
194
|
}
|
|
180
|
-
|
|
195
|
+
} else if (e.status === 400) {
|
|
196
|
+
return `The hoster/bot owner/the used host isn't supported by gemini.`;
|
|
197
|
+
} else if (e.message === '[GoogleGenerativeAI Error]: Candidate was blocked due to SAFETY') {
|
|
181
198
|
console.error(e);
|
|
182
|
-
return
|
|
199
|
+
return `Due to safety enabled by gemini you have been blocked.`;
|
|
200
|
+
} else {
|
|
201
|
+
console.error(e);
|
|
202
|
+
return `Try again later please... Either API is on a cooldown or an internal server error has occurred. If issue persists please contact the bot developer or owner of the npm package.`;
|
|
203
|
+
}
|
|
204
|
+
} else {
|
|
205
|
+
console.error(e);
|
|
206
|
+
return 'An unknown error has occurred.';
|
|
183
207
|
}
|
|
184
208
|
}
|
|
185
209
|
}
|
|
186
|
-
|
|
187
|
-
async function urlToBase64(imageURL: string) {
|
|
188
|
-
try {
|
|
189
|
-
const convertedBuffer = await converter(imageURL, 'png');
|
|
190
|
-
|
|
191
|
-
const base64String = convertedBuffer.toString('base64');
|
|
192
|
-
return base64String;
|
|
193
|
-
} catch (error: any) {
|
|
194
|
-
throw new Error(`Failed to fetch and convert the image: ${error.message}`);
|
|
195
|
-
}
|
|
196
|
-
}
|
|
197
|
-
|
|
@@ -3,195 +3,207 @@ import path from 'path';
|
|
|
3
3
|
import fs from 'fs';
|
|
4
4
|
import config from './config';
|
|
5
5
|
import { converter } from "../../canvas/utils/general functions";
|
|
6
|
-
import
|
|
6
|
+
import { connect } from "verse.db";
|
|
7
7
|
import axios from "axios";
|
|
8
8
|
|
|
9
9
|
let currentApiKeyIndex = 0;
|
|
10
10
|
|
|
11
|
-
export async function geminiPro(message: { userId: string, serverName: string, serverId: string, channelName: string, attachment: any, db: boolean
|
|
11
|
+
export async function geminiPro(message: { userId: string, serverName: string, serverId: string, channelName: string, attachment: any, db: boolean }, AI: { AiPersonality: string | null, userMsg: string, API_KEY: string | null }): Promise<any> {
|
|
12
12
|
|
|
13
|
-
|
|
13
|
+
async function validateKey(apiKey: string) {
|
|
14
|
+
try {
|
|
15
|
+
const validateResponse = await axios.get(`https://generativelanguage.googleapis.com/v1beta/models?key=${apiKey}`);
|
|
16
|
+
return validateResponse.status === 200;
|
|
17
|
+
} catch (error) {
|
|
18
|
+
console.error(`Error validating API key: ${apiKey}`, error);
|
|
19
|
+
return false;
|
|
20
|
+
}
|
|
21
|
+
}
|
|
14
22
|
|
|
15
|
-
|
|
16
|
-
|
|
23
|
+
async function getValidGenAI(apiKeys: string[], initialIndex: number): Promise<any> {
|
|
24
|
+
for (let i = initialIndex; i < apiKeys.length; i++) {
|
|
25
|
+
const apiKey = apiKeys[i];
|
|
26
|
+
if (await validateKey(apiKey)) {
|
|
27
|
+
currentApiKeyIndex = i;
|
|
28
|
+
return new GoogleGenerativeAI(apiKey);
|
|
29
|
+
}
|
|
17
30
|
}
|
|
31
|
+
return null;
|
|
32
|
+
}
|
|
18
33
|
|
|
19
|
-
|
|
20
|
-
let
|
|
21
|
-
let genAI: any;
|
|
22
|
-
while (apiKeyIndex < config.apiKeys.length) {
|
|
23
|
-
const validateKey = await axios.get(`https://generativelanguage.googleapis.com/v1beta/models?key=${config.apiKeys[apiKeyIndex]}`);
|
|
24
|
-
if (validateKey.status === 200) {
|
|
25
|
-
genAI = new GoogleGenerativeAI(config.apiKeys[apiKeyIndex]);
|
|
26
|
-
|
|
27
|
-
break;
|
|
28
|
-
} else {
|
|
29
|
-
apiKeyIndex++;
|
|
30
|
-
}
|
|
31
|
-
}
|
|
34
|
+
async function processRequest(genAI: any): Promise<any> {
|
|
35
|
+
let personalityString = '';
|
|
32
36
|
|
|
33
|
-
if (apiKeyIndex === config.apiKeys.length) {
|
|
34
|
-
return 'All provided API keys are invalid.';
|
|
35
|
-
}
|
|
36
|
-
let personalityString: string = '';
|
|
37
|
-
|
|
38
37
|
if (AI.AiPersonality) {
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
38
|
+
const personalityFilePath = path.join(process.cwd(), AI.AiPersonality);
|
|
39
|
+
const personalityContent = fs.readFileSync(personalityFilePath, 'utf-8');
|
|
40
|
+
personalityString = personalityContent.split('\n').join(' ');
|
|
42
41
|
}
|
|
43
42
|
|
|
44
43
|
const generationConfig = {
|
|
45
|
-
|
|
44
|
+
maxOutputTokens: 750,
|
|
46
45
|
};
|
|
47
46
|
|
|
48
47
|
const safetySettings = [
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
48
|
+
{
|
|
49
|
+
category: HarmCategory.HARM_CATEGORY_HARASSMENT,
|
|
50
|
+
threshold: HarmBlockThreshold.BLOCK_ONLY_HIGH,
|
|
51
|
+
},
|
|
52
|
+
{
|
|
53
|
+
category: HarmCategory.HARM_CATEGORY_HATE_SPEECH,
|
|
54
|
+
threshold: HarmBlockThreshold.BLOCK_MEDIUM_AND_ABOVE,
|
|
55
|
+
},
|
|
56
|
+
{
|
|
57
|
+
category: HarmCategory.HARM_CATEGORY_SEXUALLY_EXPLICIT,
|
|
58
|
+
threshold: HarmBlockThreshold.BLOCK_LOW_AND_ABOVE,
|
|
59
|
+
},
|
|
60
|
+
{
|
|
61
|
+
category: HarmCategory.HARM_CATEGORY_DANGEROUS_CONTENT,
|
|
62
|
+
threshold: HarmBlockThreshold.BLOCK_MEDIUM_AND_ABOVE,
|
|
63
|
+
},
|
|
65
64
|
];
|
|
66
65
|
|
|
67
66
|
const systemInstruction = `${personalityString}\n And working on discord in serverName: ${message.serverName} at channelName: ${message.channelName} and responding to the userName: <@${message.userId}>`;
|
|
68
67
|
const model = genAI.getGenerativeModel({ model: "gemini-1.5-pro-latest", systemInstruction, generationConfig, safetySettings });
|
|
69
68
|
|
|
70
69
|
const defaultHistory = [
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
70
|
+
{
|
|
71
|
+
role: "user",
|
|
72
|
+
parts: [{ text: `Hey who are you?` }],
|
|
73
|
+
},
|
|
74
|
+
{
|
|
75
|
+
role: "model",
|
|
76
|
+
parts: [{ text: `I am an AI assistant built/developed/created by Apexify.js` }],
|
|
77
|
+
},
|
|
78
|
+
{
|
|
79
|
+
role: "user",
|
|
80
|
+
parts: [{ text: `You have chat Memory?` }],
|
|
81
|
+
},
|
|
82
|
+
{
|
|
83
|
+
role: "model",
|
|
84
|
+
parts: [{ text: `Yes, I save chat history for each user if it is enabled in my configuration otherwise no data being saved.` }],
|
|
85
|
+
},
|
|
86
|
+
{
|
|
87
|
+
role: "user",
|
|
88
|
+
parts: [{ text: `How is your data/memory/chat history managed?` }],
|
|
89
|
+
},
|
|
90
|
+
{
|
|
91
|
+
role: "model",
|
|
92
|
+
parts: [{ text: `It is managed by verse.db. A database used to manage JSON/SQL/YAML/SQOL database with ease and supports schema/schemaless data.` }],
|
|
93
|
+
}
|
|
95
94
|
];
|
|
96
95
|
|
|
97
96
|
let historyData: any[] | undefined = undefined;
|
|
98
97
|
|
|
98
|
+
let db: any;
|
|
99
99
|
if (message.db) {
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
if (!data.results?.history || data.results?.history?.length === 0) {
|
|
105
|
-
await db.update(`${message.userId}_chatHistory`, { userId: message.userId }, { $set: { history: [] } }, true);
|
|
106
|
-
} else {
|
|
107
|
-
historyData = data.results?.history || undefined;
|
|
108
|
-
}
|
|
100
|
+
db = new connect({ adapter: 'json', dataPath: `${message.serverId}_ChatHistory` });
|
|
101
|
+
const data = await db.find(`${message.userId}_chatHistory`, { userId: message.userId });
|
|
102
|
+
historyData = data.results?.history || undefined;
|
|
109
103
|
}
|
|
110
104
|
|
|
111
105
|
const chat = model.startChat({
|
|
112
106
|
history: historyData || defaultHistory,
|
|
113
107
|
generationConfig
|
|
114
108
|
});
|
|
115
|
-
|
|
109
|
+
|
|
116
110
|
const imgURL = message.attachment?.url || null;
|
|
117
111
|
let result: any;
|
|
118
112
|
|
|
119
113
|
if (imgURL) {
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
114
|
+
const imageData = await urlToBase64(imgURL);
|
|
115
|
+
const image = {
|
|
116
|
+
inlineData: {
|
|
117
|
+
data: imageData,
|
|
118
|
+
mimeType: "image/png",
|
|
119
|
+
},
|
|
120
|
+
};
|
|
121
|
+
result = await chat.sendMessage([AI.userMsg, image]);
|
|
128
122
|
} else {
|
|
129
|
-
|
|
123
|
+
result = await chat.sendMessage(AI.userMsg);
|
|
130
124
|
}
|
|
131
125
|
|
|
132
|
-
const response =
|
|
126
|
+
const response = await result.response.text();
|
|
133
127
|
|
|
134
128
|
if (message.db) {
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
129
|
+
const userHistory = {
|
|
130
|
+
$push: {
|
|
131
|
+
"history": {
|
|
132
|
+
role: "user",
|
|
133
|
+
parts: [{ text: `${AI.userMsg}` }]
|
|
134
|
+
}
|
|
135
|
+
},
|
|
136
|
+
};
|
|
137
|
+
|
|
138
|
+
historyData = await db.update(`${message.userId}_chatHistory`,
|
|
139
|
+
{ userId: message.userId },
|
|
140
|
+
userHistory,
|
|
141
|
+
true
|
|
142
|
+
);
|
|
143
|
+
|
|
144
|
+
const modelHistory = {
|
|
145
|
+
$push: {
|
|
146
|
+
"history": {
|
|
147
|
+
role: "model",
|
|
148
|
+
parts: [{ text: `${response}` }]
|
|
149
|
+
}
|
|
150
|
+
},
|
|
151
|
+
};
|
|
152
|
+
|
|
153
|
+
historyData = await db.update(`${message.userId}_chatHistory`,
|
|
160
154
|
{ userId: message.userId },
|
|
161
|
-
|
|
155
|
+
modelHistory,
|
|
162
156
|
true
|
|
163
|
-
|
|
157
|
+
);
|
|
164
158
|
}
|
|
165
159
|
|
|
166
160
|
return response;
|
|
167
|
-
}
|
|
161
|
+
}
|
|
162
|
+
|
|
163
|
+
async function urlToBase64(imageURL: string) {
|
|
164
|
+
try {
|
|
165
|
+
const convertedBuffer = await converter(imageURL, 'png');
|
|
166
|
+
const base64String = convertedBuffer.toString('base64');
|
|
167
|
+
return base64String;
|
|
168
|
+
} catch (error: any) {
|
|
169
|
+
throw new Error(`Failed to fetch and convert the image: ${error.message}`);
|
|
170
|
+
}
|
|
171
|
+
}
|
|
172
|
+
|
|
173
|
+
try {
|
|
174
|
+
let genAI: any;
|
|
175
|
+
|
|
176
|
+
if (AI.API_KEY && await validateKey(AI.API_KEY)) {
|
|
177
|
+
genAI = new GoogleGenerativeAI(AI.API_KEY);
|
|
178
|
+
} else {
|
|
179
|
+
genAI = await getValidGenAI(config.apiKeys, currentApiKeyIndex);
|
|
180
|
+
if (!genAI) {
|
|
181
|
+
return 'All provided API keys are invalid.';
|
|
182
|
+
}
|
|
183
|
+
}
|
|
184
|
+
|
|
185
|
+
return await processRequest(genAI);
|
|
186
|
+
} catch (e: any) {
|
|
168
187
|
if (e.message) {
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
} else if (e.message === '[GoogleGenerativeAI Error]: Candidate was blocked due to SAFETY') {
|
|
174
|
-
console.error(e);
|
|
175
|
-
return `Due to safety enabled by gemini you have been blocked.`;
|
|
188
|
+
if (e.status === 429 || e.status === 403) {
|
|
189
|
+
currentApiKeyIndex++;
|
|
190
|
+
if (currentApiKeyIndex < config.apiKeys.length) {
|
|
191
|
+
return await geminiPro(message, AI);
|
|
176
192
|
} else {
|
|
177
|
-
|
|
178
|
-
return `Try again later please... Either API is on a cooldown or an internal server error has occurred. If issue persists please contact the bot developer or owner of the npm package.`;
|
|
193
|
+
return 'Ai is on a cooldown for the rest of the day. Either provide your own API key or wait for tomorrow. Check ai.google.dev for free apikeys';
|
|
179
194
|
}
|
|
180
|
-
|
|
195
|
+
} else if (e.status === 400) {
|
|
196
|
+
return `The hoster/bot owner/the used host isn't supported by gemini.`;
|
|
197
|
+
} else if (e.message === '[GoogleGenerativeAI Error]: Candidate was blocked due to SAFETY') {
|
|
181
198
|
console.error(e);
|
|
182
|
-
return
|
|
199
|
+
return `Due to safety enabled by gemini you have been blocked.`;
|
|
200
|
+
} else {
|
|
201
|
+
console.error(e);
|
|
202
|
+
return `Try again later please... Either API is on a cooldown or an internal server error has occurred. If issue persists please contact the bot developer or owner of the npm package.`;
|
|
203
|
+
}
|
|
204
|
+
} else {
|
|
205
|
+
console.error(e);
|
|
206
|
+
return 'An unknown error has occurred.';
|
|
183
207
|
}
|
|
184
208
|
}
|
|
185
209
|
}
|
|
186
|
-
|
|
187
|
-
async function urlToBase64(imageURL: string) {
|
|
188
|
-
try {
|
|
189
|
-
const convertedBuffer = await converter(imageURL, 'png');
|
|
190
|
-
|
|
191
|
-
const base64String = convertedBuffer.toString('base64');
|
|
192
|
-
return base64String;
|
|
193
|
-
} catch (error: any) {
|
|
194
|
-
throw new Error(`Failed to fetch and convert the image: ${error.message}`);
|
|
195
|
-
}
|
|
196
|
-
}
|
|
197
|
-
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "apexify.js",
|
|
3
|
-
"version": "4.1.
|
|
3
|
+
"version": "4.1.7",
|
|
4
4
|
"description": "Ai and Canvas library. Supports typescript and javascript",
|
|
5
5
|
"main": "./dist/index.js",
|
|
6
6
|
"types": "./dist/index.d.ts",
|
|
@@ -160,7 +160,7 @@
|
|
|
160
160
|
"pdf-parse": "^1.1.1",
|
|
161
161
|
"sharp": "^0.33.2",
|
|
162
162
|
"tesseract.js": "^5.0.5",
|
|
163
|
-
"verse.db": "^2.0.
|
|
163
|
+
"verse.db": "^2.0.5"
|
|
164
164
|
},
|
|
165
165
|
"devDependencies": {
|
|
166
166
|
"@types/gifencoder": "^2.0.3",
|