apexify.js 4.1.6 → 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 +56 -32
- 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 +55 -31
- package/dist/ai/modals-chat/Gemini-pro.js.map +1 -1
- package/lib/ai/modals-chat/Gemini-flash.ts +155 -133
- package/lib/ai/modals-chat/Gemini-pro.ts +154 -132
- package/package.json +1 -1
|
@@ -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,23 +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
|
-
|
|
20
|
-
while (apiKeyIndex < config_1.default.apiKeys.length) {
|
|
21
|
-
const validateKey = await axios_1.default.get(`https://generativelanguage.googleapis.com/v1beta/models?key=${config_1.default.apiKeys[apiKeyIndex]}`);
|
|
22
|
-
if (validateKey.status === 200) {
|
|
23
|
-
genAI = new generative_ai_1.GoogleGenerativeAI(config_1.default.apiKeys[apiKeyIndex]);
|
|
24
|
-
break;
|
|
25
|
-
}
|
|
26
|
-
else {
|
|
27
|
-
apiKeyIndex++;
|
|
28
|
-
}
|
|
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;
|
|
29
20
|
}
|
|
30
|
-
|
|
31
|
-
|
|
21
|
+
catch (error) {
|
|
22
|
+
console.error(`Error validating API key: ${apiKey}`, error);
|
|
23
|
+
return false;
|
|
32
24
|
}
|
|
25
|
+
}
|
|
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);
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
return null;
|
|
35
|
+
}
|
|
36
|
+
async function processRequest(genAI) {
|
|
37
|
+
var _a, _b;
|
|
33
38
|
let personalityString = '';
|
|
34
39
|
if (AI.AiPersonality) {
|
|
35
40
|
const personalityFilePath = path_1.default.join(process.cwd(), AI.AiPersonality);
|
|
@@ -58,7 +63,7 @@ async function geminiFlash(message, AI) {
|
|
|
58
63
|
},
|
|
59
64
|
];
|
|
60
65
|
const systemInstruction = `${personalityString}\n And working on discord in serverName: ${message.serverName} at channelName: ${message.channelName} and responding to the userName: <@${message.userId}>`;
|
|
61
|
-
const model = genAI.getGenerativeModel({ model: "gemini-1.5-
|
|
66
|
+
const model = genAI.getGenerativeModel({ model: "gemini-1.5-flash-latest", systemInstruction, generationConfig, safetySettings });
|
|
62
67
|
const defaultHistory = [
|
|
63
68
|
{
|
|
64
69
|
role: "user",
|
|
@@ -74,11 +79,11 @@ async function geminiFlash(message, AI) {
|
|
|
74
79
|
},
|
|
75
80
|
{
|
|
76
81
|
role: "model",
|
|
77
|
-
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.` }],
|
|
78
83
|
},
|
|
79
84
|
{
|
|
80
85
|
role: "user",
|
|
81
|
-
parts: [{ text: `How is your data/memory/chat history
|
|
86
|
+
parts: [{ text: `How is your data/memory/chat history managed?` }],
|
|
82
87
|
},
|
|
83
88
|
{
|
|
84
89
|
role: "model",
|
|
@@ -134,13 +139,42 @@ async function geminiFlash(message, AI) {
|
|
|
134
139
|
}
|
|
135
140
|
return response;
|
|
136
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
|
+
}
|
|
137
165
|
catch (e) {
|
|
138
166
|
if (e.message) {
|
|
139
|
-
if (e.
|
|
140
|
-
|
|
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
|
+
}
|
|
141
175
|
}
|
|
142
|
-
else if (e.
|
|
143
|
-
return
|
|
176
|
+
else if (e.status === 400) {
|
|
177
|
+
return `The hoster/bot owner/the used host isn't supported by gemini.`;
|
|
144
178
|
}
|
|
145
179
|
else if (e.message === '[GoogleGenerativeAI Error]: Candidate was blocked due to SAFETY') {
|
|
146
180
|
console.error(e);
|
|
@@ -158,14 +192,4 @@ async function geminiFlash(message, AI) {
|
|
|
158
192
|
}
|
|
159
193
|
}
|
|
160
194
|
exports.geminiFlash = geminiFlash;
|
|
161
|
-
async function urlToBase64(imageURL) {
|
|
162
|
-
try {
|
|
163
|
-
const convertedBuffer = await (0, general_functions_1.converter)(imageURL, 'png');
|
|
164
|
-
const base64String = convertedBuffer.toString('base64');
|
|
165
|
-
return base64String;
|
|
166
|
-
}
|
|
167
|
-
catch (error) {
|
|
168
|
-
throw new Error(`Failed to fetch and convert the image: ${error.message}`);
|
|
169
|
-
}
|
|
170
|
-
}
|
|
171
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":";;;;;;AAAA,yDAA6F;AAC7F,gDAAwB;AACxB,4CAAoB;AACpB,sDAA8B;AAC9B,4EAAiE;AACjE,uCAAmC;AACnC,kDAA0B;AAE1B,IAAI,kBAAkB,GAAG,CAAC,CAAC;AAEpB,KAAK,UAAU,WAAW,CAAC,OAAoH,EAAE,EAA6E;IAEnO,KAAK,UAAU,WAAW,CAAC,MAAc;QACvC,IAAI,CAAC;YACH,MAAM,gBAAgB,GAAG,MAAM,eAAK,CAAC,GAAG,CAAC,+DAA+D,MAAM,EAAE,CAAC,CAAC;YAClH,OAAO,gBAAgB,CAAC,MAAM,KAAK,GAAG,CAAC;QACzC,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,CAAC,KAAK,CAAC,6BAA6B,MAAM,EAAE,EAAE,KAAK,CAAC,CAAC;YAC5D,OAAO,KAAK,CAAC;QACf,CAAC;IACH,CAAC;IAED,KAAK,UAAU,aAAa,CAAC,OAAiB,EAAE,YAAoB;QAClE,KAAK,IAAI,CAAC,GAAG,YAAY,EAAE,CAAC,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;YACnD,MAAM,MAAM,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;YAC1B,IAAI,MAAM,WAAW,CAAC,MAAM,CAAC,EAAE,CAAC;gBAC9B,kBAAkB,GAAG,CAAC,CAAC;gBACvB,OAAO,IAAI,kCAAkB,CAAC,MAAM,CAAC,CAAC;YACxC,CAAC;QACH,CAAC;QACD,OAAO,IAAI,CAAC;IACd,CAAC;IAED,KAAK,UAAU,cAAc,CAAC,KAAU;;QACtC,IAAI,iBAAiB,GAAG,EAAE,CAAC;QAE3B,IAAI,EAAE,CAAC,aAAa,EAAE,CAAC;YACrB,MAAM,mBAAmB,GAAG,cAAI,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,EAAE,CAAC,aAAa,CAAC,CAAC;YACvE,MAAM,kBAAkB,GAAG,YAAE,CAAC,YAAY,CAAC,mBAAmB,EAAE,OAAO,CAAC,CAAC;YACzE,iBAAiB,GAAG,kBAAkB,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QAC/D,CAAC;QAED,MAAM,gBAAgB,GAAG;YACvB,eAAe,EAAE,GAAG;SACrB,CAAC;QAEF,MAAM,cAAc,GAAG;YACrB;gBACE,QAAQ,EAAE,4BAAY,CAAC,wBAAwB;gBAC/C,SAAS,EAAE,kCAAkB,CAAC,eAAe;aAC9C;YACD;gBACE,QAAQ,EAAE,4BAAY,CAAC,yBAAyB;gBAChD,SAAS,EAAE,kCAAkB,CAAC,sBAAsB;aACrD;YACD;gBACE,QAAQ,EAAE,4BAAY,CAAC,+BAA+B;gBACtD,SAAS,EAAE,kCAAkB,CAAC,mBAAmB;aAClD;YACD;gBACE,QAAQ,EAAE,4BAAY,CAAC,+BAA+B;gBACtD,SAAS,EAAE,kCAAkB,CAAC,sBAAsB;aACrD;SACF,CAAC;QAEF,MAAM,iBAAiB,GAAG,GAAG,iBAAiB,4CAA4C,OAAO,CAAC,UAAU,oBAAoB,OAAO,CAAC,WAAW,sCAAsC,OAAO,CAAC,MAAM,GAAG,CAAC;QAC3M,MAAM,KAAK,GAAG,KAAK,CAAC,kBAAkB,CAAC,EAAE,KAAK,EAAE,yBAAyB,EAAE,iBAAiB,EAAE,gBAAgB,EAAE,cAAc,EAAE,CAAC,CAAC;QAElI,MAAM,cAAc,GAAG;YACrB;gBACE,IAAI,EAAE,MAAM;gBACZ,KAAK,EAAE,CAAC,EAAE,IAAI,EAAE,kBAAkB,EAAE,CAAC;aACtC;YACD;gBACE,IAAI,EAAE,OAAO;gBACb,KAAK,EAAE,CAAC,EAAE,IAAI,EAAE,4DAA4D,EAAE,CAAC;aAChF;YACD;gBACE,IAAI,EAAE,MAAM;gBACZ,KAAK,EAAE,CAAC,EAAE,IAAI,EAAE,uBAAuB,EAAE,CAAC;aAC3C;YACD;gBACE,IAAI,EAAE,OAAO;gBACb,KAAK,EAAE,CAAC,EAAE,IAAI,EAAE,4GAA4G,EAAE,CAAC;aAChI;YACD;gBACE,IAAI,EAAE,MAAM;gBACZ,KAAK,EAAE,CAAC,EAAE,IAAI,EAAE,+CAA+C,EAAE,CAAC;aACnE;YACD;gBACE,IAAI,EAAE,OAAO;gBACb,KAAK,EAAE,CAAC,EAAE,IAAI,EAAE,iIAAiI,EAAE,CAAC;aACrJ;SACF,CAAC;QAEF,IAAI,WAAW,GAAsB,SAAS,CAAC;QAE/C,IAAI,EAAO,CAAC;QACZ,IAAI,OAAO,CAAC,EAAE,EAAE,CAAC;YACf,EAAE,GAAG,IAAI,kBAAO,CAAC,EAAE,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,GAAG,OAAO,CAAC,QAAQ,cAAc,EAAE,CAAC,CAAC;YACnF,MAAM,IAAI,GAAG,MAAM,EAAE,CAAC,IAAI,CAAC,GAAG,OAAO,CAAC,MAAM,cAAc,EAAE,EAAE,MAAM,EAAE,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;YACxF,WAAW,GAAG,CAAA,MAAA,IAAI,CAAC,OAAO,0CAAE,OAAO,KAAI,SAAS,CAAC;QACnD,CAAC;QAED,MAAM,IAAI,GAAG,KAAK,CAAC,SAAS,CAAC;YAC3B,OAAO,EAAE,WAAW,IAAI,cAAc;YACtC,gBAAgB;SACjB,CAAC,CAAC;QAEH,MAAM,MAAM,GAAG,CAAA,MAAA,OAAO,CAAC,UAAU,0CAAE,GAAG,KAAI,IAAI,CAAC;QAC/C,IAAI,MAAW,CAAC;QAEhB,IAAI,MAAM,EAAE,CAAC;YACX,MAAM,SAAS,GAAG,MAAM,WAAW,CAAC,MAAM,CAAC,CAAC;YAC5C,MAAM,KAAK,GAAG;gBACZ,UAAU,EAAE;oBACV,IAAI,EAAE,SAAS;oBACf,QAAQ,EAAE,WAAW;iBACtB;aACF,CAAC;YACF,MAAM,GAAG,MAAM,IAAI,CAAC,WAAW,CAAC,CAAC,EAAE,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC,CAAC;QACvD,CAAC;aAAM,CAAC;YACN,MAAM,GAAG,MAAM,IAAI,CAAC,WAAW,CAAC,EAAE,CAAC,OAAO,CAAC,CAAC;QAC9C,CAAC;QAED,MAAM,QAAQ,GAAG,MAAM,MAAM,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC;QAE9C,IAAI,OAAO,CAAC,EAAE,EAAE,CAAC;YACf,MAAM,WAAW,GAAG;gBAClB,KAAK,EAAE;oBACL,SAAS,EAAE;wBACT,IAAI,EAAE,MAAM;wBACZ,KAAK,EAAE,CAAC,EAAE,IAAI,EAAE,GAAG,EAAE,CAAC,OAAO,EAAE,EAAE,CAAC;qBACnC;iBACF;aACF,CAAC;YAEF,WAAW,GAAG,MAAM,EAAE,CAAC,MAAM,CAAC,GAAG,OAAO,CAAC,MAAM,cAAc,EAC3D,EAAE,MAAM,EAAE,OAAO,CAAC,MAAM,EAAE,EAC1B,WAAW,EACX,IAAI,CACL,CAAC;YAEF,MAAM,YAAY,GAAG;gBACnB,KAAK,EAAE;oBACL,SAAS,EAAE;wBACT,IAAI,EAAE,OAAO;wBACb,KAAK,EAAE,CAAC,EAAE,IAAI,EAAE,GAAG,QAAQ,EAAE,EAAE,CAAC;qBACjC;iBACF;aACF,CAAC;YAEF,WAAW,GAAG,MAAM,EAAE,CAAC,MAAM,CAAC,GAAG,OAAO,CAAC,MAAM,cAAc,EAC3D,EAAE,MAAM,EAAE,OAAO,CAAC,MAAM,EAAE,EAC1B,YAAY,EACZ,IAAI,CACL,CAAC;QACJ,CAAC;QAED,OAAO,QAAQ,CAAC;IAClB,CAAC;IAED,KAAK,UAAU,WAAW,CAAC,QAAgB;QACzC,IAAI,CAAC;YACH,MAAM,eAAe,GAAG,MAAM,IAAA,6BAAS,EAAC,QAAQ,EAAE,KAAK,CAAC,CAAC;YACzD,MAAM,YAAY,GAAG,eAAe,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;YACxD,OAAO,YAAY,CAAC;QACtB,CAAC;QAAC,OAAO,KAAU,EAAE,CAAC;YACpB,MAAM,IAAI,KAAK,CAAC,0CAA0C,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC;QAC7E,CAAC;IACH,CAAC;IAED,IAAI,CAAC;QACH,IAAI,KAAU,CAAC;QAEf,IAAI,EAAE,CAAC,OAAO,IAAI,MAAM,WAAW,CAAC,EAAE,CAAC,OAAO,CAAC,EAAE,CAAC;YAChD,KAAK,GAAG,IAAI,kCAAkB,CAAC,EAAE,CAAC,OAAO,CAAC,CAAC;QAC7C,CAAC;aAAM,CAAC;YACN,KAAK,GAAG,MAAM,aAAa,CAAC,gBAAM,CAAC,OAAO,EAAE,kBAAkB,CAAC,CAAC;YAChE,IAAI,CAAC,KAAK,EAAE,CAAC;gBACX,OAAO,oCAAoC,CAAC;YAC9C,CAAC;QACH,CAAC;QAED,OAAO,MAAM,cAAc,CAAC,KAAK,CAAC,CAAC;IACrC,CAAC;IAAC,OAAO,CAAM,EAAE,CAAC;QAChB,IAAI,CAAC,CAAC,OAAO,EAAE,CAAC;YACd,IAAI,CAAC,CAAC,MAAM,KAAK,GAAG,IAAI,CAAC,CAAC,MAAM,KAAK,GAAG,EAAE,CAAC;gBACzC,kBAAkB,EAAE,CAAC;gBACrB,IAAI,kBAAkB,GAAG,gBAAM,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC;oBAC/C,OAAO,MAAM,WAAW,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;gBACxC,CAAC;qBAAM,CAAC;oBACN,OAAO,yIAAyI,CAAC;gBACnJ,CAAC;YACH,CAAC;iBAAM,IAAI,CAAC,CAAC,MAAM,KAAK,GAAG,EAAE,CAAC;gBAC5B,OAAO,+DAA+D,CAAC;YACzE,CAAC;iBAAM,IAAI,CAAC,CAAC,OAAO,KAAK,iEAAiE,EAAE,CAAC;gBAC3F,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;gBACjB,OAAO,wDAAwD,CAAC;YAClE,CAAC;iBAAM,CAAC;gBACN,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;gBACjB,OAAO,iLAAiL,CAAC;YAC3L,CAAC;QACH,CAAC;aAAM,CAAC;YACN,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;YACjB,OAAO,gCAAgC,CAAC;QAC1C,CAAC;IACH,CAAC;AACH,CAAC;AAtMD,kCAsMC"}
|
|
@@ -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,23 +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
|
-
|
|
20
|
-
while (apiKeyIndex < config_1.default.apiKeys.length) {
|
|
21
|
-
const validateKey = await axios_1.default.get(`https://generativelanguage.googleapis.com/v1beta/models?key=${config_1.default.apiKeys[apiKeyIndex]}`);
|
|
22
|
-
if (validateKey.status === 200) {
|
|
23
|
-
genAI = new generative_ai_1.GoogleGenerativeAI(config_1.default.apiKeys[apiKeyIndex]);
|
|
24
|
-
break;
|
|
25
|
-
}
|
|
26
|
-
else {
|
|
27
|
-
apiKeyIndex++;
|
|
28
|
-
}
|
|
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;
|
|
29
20
|
}
|
|
30
|
-
|
|
31
|
-
|
|
21
|
+
catch (error) {
|
|
22
|
+
console.error(`Error validating API key: ${apiKey}`, error);
|
|
23
|
+
return false;
|
|
32
24
|
}
|
|
25
|
+
}
|
|
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);
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
return null;
|
|
35
|
+
}
|
|
36
|
+
async function processRequest(genAI) {
|
|
37
|
+
var _a, _b;
|
|
33
38
|
let personalityString = '';
|
|
34
39
|
if (AI.AiPersonality) {
|
|
35
40
|
const personalityFilePath = path_1.default.join(process.cwd(), AI.AiPersonality);
|
|
@@ -74,11 +79,11 @@ async function geminiPro(message, AI) {
|
|
|
74
79
|
},
|
|
75
80
|
{
|
|
76
81
|
role: "model",
|
|
77
|
-
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.` }],
|
|
78
83
|
},
|
|
79
84
|
{
|
|
80
85
|
role: "user",
|
|
81
|
-
parts: [{ text: `How is your data/memory/chat history
|
|
86
|
+
parts: [{ text: `How is your data/memory/chat history managed?` }],
|
|
82
87
|
},
|
|
83
88
|
{
|
|
84
89
|
role: "model",
|
|
@@ -134,13 +139,42 @@ async function geminiPro(message, AI) {
|
|
|
134
139
|
}
|
|
135
140
|
return response;
|
|
136
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
|
+
}
|
|
137
165
|
catch (e) {
|
|
138
166
|
if (e.message) {
|
|
139
|
-
if (e.
|
|
140
|
-
|
|
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
|
+
}
|
|
141
175
|
}
|
|
142
|
-
else if (e.
|
|
143
|
-
return
|
|
176
|
+
else if (e.status === 400) {
|
|
177
|
+
return `The hoster/bot owner/the used host isn't supported by gemini.`;
|
|
144
178
|
}
|
|
145
179
|
else if (e.message === '[GoogleGenerativeAI Error]: Candidate was blocked due to SAFETY') {
|
|
146
180
|
console.error(e);
|
|
@@ -158,14 +192,4 @@ async function geminiPro(message, AI) {
|
|
|
158
192
|
}
|
|
159
193
|
}
|
|
160
194
|
exports.geminiPro = geminiPro;
|
|
161
|
-
async function urlToBase64(imageURL) {
|
|
162
|
-
try {
|
|
163
|
-
const convertedBuffer = await (0, general_functions_1.converter)(imageURL, 'png');
|
|
164
|
-
const base64String = convertedBuffer.toString('base64');
|
|
165
|
-
return base64String;
|
|
166
|
-
}
|
|
167
|
-
catch (error) {
|
|
168
|
-
throw new Error(`Failed to fetch and convert the image: ${error.message}`);
|
|
169
|
-
}
|
|
170
|
-
}
|
|
171
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,185 +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
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
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
|
+
}
|
|
22
|
+
|
|
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
|
+
}
|
|
30
|
+
}
|
|
31
|
+
return null;
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
async function processRequest(genAI: any): Promise<any> {
|
|
35
|
+
let personalityString = '';
|
|
26
36
|
|
|
27
|
-
if (apiKeyIndex === config.apiKeys.length) {
|
|
28
|
-
return 'All provided API keys are invalid.';
|
|
29
|
-
}
|
|
30
|
-
let personalityString: string = '';
|
|
31
|
-
|
|
32
37
|
if (AI.AiPersonality) {
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
38
|
+
const personalityFilePath = path.join(process.cwd(), AI.AiPersonality);
|
|
39
|
+
const personalityContent = fs.readFileSync(personalityFilePath, 'utf-8');
|
|
40
|
+
personalityString = personalityContent.split('\n').join(' ');
|
|
36
41
|
}
|
|
37
42
|
|
|
38
43
|
const generationConfig = {
|
|
39
|
-
|
|
44
|
+
maxOutputTokens: 750,
|
|
40
45
|
};
|
|
41
46
|
|
|
42
47
|
const safetySettings = [
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
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
|
+
},
|
|
59
64
|
];
|
|
60
65
|
|
|
61
66
|
const systemInstruction = `${personalityString}\n And working on discord in serverName: ${message.serverName} at channelName: ${message.channelName} and responding to the userName: <@${message.userId}>`;
|
|
62
|
-
const model = genAI.getGenerativeModel({ model: "gemini-1.5-
|
|
67
|
+
const model = genAI.getGenerativeModel({ model: "gemini-1.5-flash-latest", systemInstruction, generationConfig, safetySettings });
|
|
63
68
|
|
|
64
69
|
const defaultHistory = [
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
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
|
+
}
|
|
89
94
|
];
|
|
90
95
|
|
|
91
96
|
let historyData: any[] | undefined = undefined;
|
|
92
97
|
|
|
93
98
|
let db: any;
|
|
94
99
|
if (message.db) {
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
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;
|
|
98
103
|
}
|
|
99
104
|
|
|
100
105
|
const chat = model.startChat({
|
|
101
106
|
history: historyData || defaultHistory,
|
|
102
107
|
generationConfig
|
|
103
108
|
});
|
|
104
|
-
|
|
109
|
+
|
|
105
110
|
const imgURL = message.attachment?.url || null;
|
|
106
111
|
let result: any;
|
|
107
112
|
|
|
108
113
|
if (imgURL) {
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
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]);
|
|
117
122
|
} else {
|
|
118
|
-
|
|
123
|
+
result = await chat.sendMessage(AI.userMsg);
|
|
119
124
|
}
|
|
120
125
|
|
|
121
|
-
const response =
|
|
126
|
+
const response = await result.response.text();
|
|
122
127
|
|
|
123
128
|
if (message.db) {
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
);
|
|
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`,
|
|
154
|
+
{ userId: message.userId },
|
|
155
|
+
modelHistory,
|
|
156
|
+
true
|
|
157
|
+
);
|
|
154
158
|
}
|
|
155
159
|
|
|
156
160
|
return response;
|
|
157
|
-
}
|
|
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) {
|
|
158
187
|
if (e.message) {
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
} else if (e.message === '[GoogleGenerativeAI Error]: Candidate was blocked due to SAFETY') {
|
|
164
|
-
console.error(e);
|
|
165
|
-
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);
|
|
166
192
|
} else {
|
|
167
|
-
|
|
168
|
-
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';
|
|
169
194
|
}
|
|
170
|
-
|
|
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') {
|
|
198
|
+
console.error(e);
|
|
199
|
+
return `Due to safety enabled by gemini you have been blocked.`;
|
|
200
|
+
} else {
|
|
171
201
|
console.error(e);
|
|
172
|
-
return
|
|
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.';
|
|
173
207
|
}
|
|
174
208
|
}
|
|
175
209
|
}
|
|
176
|
-
|
|
177
|
-
async function urlToBase64(imageURL: string) {
|
|
178
|
-
try {
|
|
179
|
-
const convertedBuffer = await converter(imageURL, 'png');
|
|
180
|
-
|
|
181
|
-
const base64String = convertedBuffer.toString('base64');
|
|
182
|
-
return base64String;
|
|
183
|
-
} catch (error: any) {
|
|
184
|
-
throw new Error(`Failed to fetch and convert the image: ${error.message}`);
|
|
185
|
-
}
|
|
186
|
-
}
|
|
187
|
-
|
|
@@ -3,185 +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
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
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
|
+
}
|
|
22
|
+
|
|
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
|
+
}
|
|
30
|
+
}
|
|
31
|
+
return null;
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
async function processRequest(genAI: any): Promise<any> {
|
|
35
|
+
let personalityString = '';
|
|
26
36
|
|
|
27
|
-
if (apiKeyIndex === config.apiKeys.length) {
|
|
28
|
-
return 'All provided API keys are invalid.';
|
|
29
|
-
}
|
|
30
|
-
let personalityString: string = '';
|
|
31
|
-
|
|
32
37
|
if (AI.AiPersonality) {
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
38
|
+
const personalityFilePath = path.join(process.cwd(), AI.AiPersonality);
|
|
39
|
+
const personalityContent = fs.readFileSync(personalityFilePath, 'utf-8');
|
|
40
|
+
personalityString = personalityContent.split('\n').join(' ');
|
|
36
41
|
}
|
|
37
42
|
|
|
38
43
|
const generationConfig = {
|
|
39
|
-
|
|
44
|
+
maxOutputTokens: 750,
|
|
40
45
|
};
|
|
41
46
|
|
|
42
47
|
const safetySettings = [
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
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
|
+
},
|
|
59
64
|
];
|
|
60
65
|
|
|
61
66
|
const systemInstruction = `${personalityString}\n And working on discord in serverName: ${message.serverName} at channelName: ${message.channelName} and responding to the userName: <@${message.userId}>`;
|
|
62
67
|
const model = genAI.getGenerativeModel({ model: "gemini-1.5-pro-latest", systemInstruction, generationConfig, safetySettings });
|
|
63
68
|
|
|
64
69
|
const defaultHistory = [
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
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
|
+
}
|
|
89
94
|
];
|
|
90
95
|
|
|
91
96
|
let historyData: any[] | undefined = undefined;
|
|
92
97
|
|
|
93
98
|
let db: any;
|
|
94
99
|
if (message.db) {
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
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;
|
|
98
103
|
}
|
|
99
104
|
|
|
100
105
|
const chat = model.startChat({
|
|
101
106
|
history: historyData || defaultHistory,
|
|
102
107
|
generationConfig
|
|
103
108
|
});
|
|
104
|
-
|
|
109
|
+
|
|
105
110
|
const imgURL = message.attachment?.url || null;
|
|
106
111
|
let result: any;
|
|
107
112
|
|
|
108
113
|
if (imgURL) {
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
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]);
|
|
117
122
|
} else {
|
|
118
|
-
|
|
123
|
+
result = await chat.sendMessage(AI.userMsg);
|
|
119
124
|
}
|
|
120
125
|
|
|
121
|
-
const response =
|
|
126
|
+
const response = await result.response.text();
|
|
122
127
|
|
|
123
128
|
if (message.db) {
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
);
|
|
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`,
|
|
154
|
+
{ userId: message.userId },
|
|
155
|
+
modelHistory,
|
|
156
|
+
true
|
|
157
|
+
);
|
|
154
158
|
}
|
|
155
159
|
|
|
156
160
|
return response;
|
|
157
|
-
}
|
|
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) {
|
|
158
187
|
if (e.message) {
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
} else if (e.message === '[GoogleGenerativeAI Error]: Candidate was blocked due to SAFETY') {
|
|
164
|
-
console.error(e);
|
|
165
|
-
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);
|
|
166
192
|
} else {
|
|
167
|
-
|
|
168
|
-
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';
|
|
169
194
|
}
|
|
170
|
-
|
|
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') {
|
|
198
|
+
console.error(e);
|
|
199
|
+
return `Due to safety enabled by gemini you have been blocked.`;
|
|
200
|
+
} else {
|
|
171
201
|
console.error(e);
|
|
172
|
-
return
|
|
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.';
|
|
173
207
|
}
|
|
174
208
|
}
|
|
175
209
|
}
|
|
176
|
-
|
|
177
|
-
async function urlToBase64(imageURL: string) {
|
|
178
|
-
try {
|
|
179
|
-
const convertedBuffer = await converter(imageURL, 'png');
|
|
180
|
-
|
|
181
|
-
const base64String = convertedBuffer.toString('base64');
|
|
182
|
-
return base64String;
|
|
183
|
-
} catch (error: any) {
|
|
184
|
-
throw new Error(`Failed to fetch and convert the image: ${error.message}`);
|
|
185
|
-
}
|
|
186
|
-
}
|
|
187
|
-
|