apexify.js 4.9.24 → 4.9.25
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/cjs/canvas/ApexPainter.js +1 -1
- package/dist/cjs/canvas/ApexPainter.js.map +1 -1
- package/dist/cjs/index.d.ts +2 -22
- package/dist/cjs/index.d.ts.map +1 -1
- package/dist/cjs/index.js +2 -17
- package/dist/cjs/index.js.map +1 -1
- package/dist/cjs/tsconfig.cjs.tsbuildinfo +1 -1
- package/dist/cjs/utils.d.ts +1 -3
- package/dist/cjs/utils.d.ts.map +1 -1
- package/dist/cjs/utils.js +1 -11
- package/dist/cjs/utils.js.map +1 -1
- package/dist/esm/canvas/ApexPainter.js +1 -1
- package/dist/esm/canvas/ApexPainter.js.map +1 -1
- package/dist/esm/index.d.ts +2 -22
- package/dist/esm/index.d.ts.map +1 -1
- package/dist/esm/index.js +2 -17
- package/dist/esm/index.js.map +1 -1
- package/dist/esm/tsconfig.esm.tsbuildinfo +1 -1
- package/dist/esm/utils.d.ts +1 -3
- package/dist/esm/utils.d.ts.map +1 -1
- package/dist/esm/utils.js +1 -11
- package/dist/esm/utils.js.map +1 -1
- package/lib/canvas/ApexPainter.ts +3 -3
- package/lib/index.ts +4 -11
- package/lib/utils.ts +1 -3
- package/package.json +3 -12
- package/dist/cjs/ai/ApexAI.d.ts +0 -145
- package/dist/cjs/ai/ApexAI.d.ts.map +0 -1
- package/dist/cjs/ai/ApexAI.js +0 -494
- package/dist/cjs/ai/ApexAI.js.map +0 -1
- package/dist/cjs/ai/ApexModules.d.ts +0 -53
- package/dist/cjs/ai/ApexModules.d.ts.map +0 -1
- package/dist/cjs/ai/ApexModules.js +0 -824
- package/dist/cjs/ai/ApexModules.js.map +0 -1
- package/dist/cjs/ai/functions/readFiles.d.ts +0 -2
- package/dist/cjs/ai/functions/readFiles.d.ts.map +0 -1
- package/dist/cjs/ai/functions/readFiles.js +0 -96
- package/dist/cjs/ai/functions/readFiles.js.map +0 -1
- package/dist/cjs/ai/functions/tokenizer.d.ts +0 -10
- package/dist/cjs/ai/functions/tokenizer.d.ts.map +0 -1
- package/dist/cjs/ai/functions/tokenizer.js +0 -64
- package/dist/cjs/ai/functions/tokenizer.js.map +0 -1
- package/dist/cjs/ai/functions/validOptions.d.ts +0 -22
- package/dist/cjs/ai/functions/validOptions.d.ts.map +0 -1
- package/dist/cjs/ai/functions/validOptions.js +0 -103
- package/dist/cjs/ai/functions/validOptions.js.map +0 -1
- package/dist/cjs/ai/modals/electronHub/chatmodels.d.ts +0 -7
- package/dist/cjs/ai/modals/electronHub/chatmodels.d.ts.map +0 -1
- package/dist/cjs/ai/modals/electronHub/chatmodels.js +0 -51
- package/dist/cjs/ai/modals/electronHub/chatmodels.js.map +0 -1
- package/dist/cjs/ai/modals/electronHub/imageModels.d.ts +0 -12
- package/dist/cjs/ai/modals/electronHub/imageModels.d.ts.map +0 -1
- package/dist/cjs/ai/modals/electronHub/imageModels.js +0 -92
- package/dist/cjs/ai/modals/electronHub/imageModels.js.map +0 -1
- package/dist/cjs/ai/modals/electronHub/speechModels.d.ts +0 -7
- package/dist/cjs/ai/modals/electronHub/speechModels.d.ts.map +0 -1
- package/dist/cjs/ai/modals/electronHub/speechModels.js +0 -63
- package/dist/cjs/ai/modals/electronHub/speechModels.js.map +0 -1
- package/dist/cjs/ai/modals/electronHub/videoModels.d.ts +0 -6
- package/dist/cjs/ai/modals/electronHub/videoModels.d.ts.map +0 -1
- package/dist/cjs/ai/modals/electronHub/videoModels.js +0 -63
- package/dist/cjs/ai/modals/electronHub/videoModels.js.map +0 -1
- package/dist/cjs/ai/modals/groq/chatgroq.d.ts +0 -9
- package/dist/cjs/ai/modals/groq/chatgroq.d.ts.map +0 -1
- package/dist/cjs/ai/modals/groq/chatgroq.js +0 -64
- package/dist/cjs/ai/modals/groq/chatgroq.js.map +0 -1
- package/dist/cjs/ai/modals/groq/imageAnalyzer.d.ts +0 -8
- package/dist/cjs/ai/modals/groq/imageAnalyzer.d.ts.map +0 -1
- package/dist/cjs/ai/modals/groq/imageAnalyzer.js +0 -82
- package/dist/cjs/ai/modals/groq/imageAnalyzer.js.map +0 -1
- package/dist/cjs/ai/modals/groq/whisper.d.ts +0 -5
- package/dist/cjs/ai/modals/groq/whisper.d.ts.map +0 -1
- package/dist/cjs/ai/modals/groq/whisper.js +0 -108
- package/dist/cjs/ai/modals/groq/whisper.js.map +0 -1
- package/dist/cjs/ai/modals/hercai/chatModels.d.ts +0 -7
- package/dist/cjs/ai/modals/hercai/chatModels.d.ts.map +0 -1
- package/dist/cjs/ai/modals/hercai/chatModels.js +0 -23
- package/dist/cjs/ai/modals/hercai/chatModels.js.map +0 -1
- package/dist/cjs/ai/utils.d.ts +0 -5
- package/dist/cjs/ai/utils.d.ts.map +0 -1
- package/dist/cjs/ai/utils.js +0 -15
- package/dist/cjs/ai/utils.js.map +0 -1
- package/dist/esm/ai/ApexAI.d.ts +0 -145
- package/dist/esm/ai/ApexAI.d.ts.map +0 -1
- package/dist/esm/ai/ApexAI.js +0 -494
- package/dist/esm/ai/ApexAI.js.map +0 -1
- package/dist/esm/ai/ApexModules.d.ts +0 -53
- package/dist/esm/ai/ApexModules.d.ts.map +0 -1
- package/dist/esm/ai/ApexModules.js +0 -824
- package/dist/esm/ai/ApexModules.js.map +0 -1
- package/dist/esm/ai/functions/readFiles.d.ts +0 -2
- package/dist/esm/ai/functions/readFiles.d.ts.map +0 -1
- package/dist/esm/ai/functions/readFiles.js +0 -96
- package/dist/esm/ai/functions/readFiles.js.map +0 -1
- package/dist/esm/ai/functions/tokenizer.d.ts +0 -10
- package/dist/esm/ai/functions/tokenizer.d.ts.map +0 -1
- package/dist/esm/ai/functions/tokenizer.js +0 -64
- package/dist/esm/ai/functions/tokenizer.js.map +0 -1
- package/dist/esm/ai/functions/validOptions.d.ts +0 -22
- package/dist/esm/ai/functions/validOptions.d.ts.map +0 -1
- package/dist/esm/ai/functions/validOptions.js +0 -103
- package/dist/esm/ai/functions/validOptions.js.map +0 -1
- package/dist/esm/ai/modals/electronHub/chatmodels.d.ts +0 -7
- package/dist/esm/ai/modals/electronHub/chatmodels.d.ts.map +0 -1
- package/dist/esm/ai/modals/electronHub/chatmodels.js +0 -51
- package/dist/esm/ai/modals/electronHub/chatmodels.js.map +0 -1
- package/dist/esm/ai/modals/electronHub/imageModels.d.ts +0 -12
- package/dist/esm/ai/modals/electronHub/imageModels.d.ts.map +0 -1
- package/dist/esm/ai/modals/electronHub/imageModels.js +0 -92
- package/dist/esm/ai/modals/electronHub/imageModels.js.map +0 -1
- package/dist/esm/ai/modals/electronHub/speechModels.d.ts +0 -7
- package/dist/esm/ai/modals/electronHub/speechModels.d.ts.map +0 -1
- package/dist/esm/ai/modals/electronHub/speechModels.js +0 -63
- package/dist/esm/ai/modals/electronHub/speechModels.js.map +0 -1
- package/dist/esm/ai/modals/electronHub/videoModels.d.ts +0 -6
- package/dist/esm/ai/modals/electronHub/videoModels.d.ts.map +0 -1
- package/dist/esm/ai/modals/electronHub/videoModels.js +0 -63
- package/dist/esm/ai/modals/electronHub/videoModels.js.map +0 -1
- package/dist/esm/ai/modals/groq/chatgroq.d.ts +0 -9
- package/dist/esm/ai/modals/groq/chatgroq.d.ts.map +0 -1
- package/dist/esm/ai/modals/groq/chatgroq.js +0 -64
- package/dist/esm/ai/modals/groq/chatgroq.js.map +0 -1
- package/dist/esm/ai/modals/groq/imageAnalyzer.d.ts +0 -8
- package/dist/esm/ai/modals/groq/imageAnalyzer.d.ts.map +0 -1
- package/dist/esm/ai/modals/groq/imageAnalyzer.js +0 -82
- package/dist/esm/ai/modals/groq/imageAnalyzer.js.map +0 -1
- package/dist/esm/ai/modals/groq/whisper.d.ts +0 -5
- package/dist/esm/ai/modals/groq/whisper.d.ts.map +0 -1
- package/dist/esm/ai/modals/groq/whisper.js +0 -108
- package/dist/esm/ai/modals/groq/whisper.js.map +0 -1
- package/dist/esm/ai/modals/hercai/chatModels.d.ts +0 -7
- package/dist/esm/ai/modals/hercai/chatModels.d.ts.map +0 -1
- package/dist/esm/ai/modals/hercai/chatModels.js +0 -23
- package/dist/esm/ai/modals/hercai/chatModels.js.map +0 -1
- package/dist/esm/ai/utils.d.ts +0 -5
- package/dist/esm/ai/utils.d.ts.map +0 -1
- package/dist/esm/ai/utils.js +0 -15
- package/dist/esm/ai/utils.js.map +0 -1
- package/lib/ai/ApexAI.ts +0 -758
- package/lib/ai/ApexModules.ts +0 -916
- package/lib/ai/functions/readFiles.ts +0 -66
- package/lib/ai/functions/tokenizer.ts +0 -69
- package/lib/ai/functions/validOptions.ts +0 -116
- package/lib/ai/modals/electronHub/chatmodels.ts +0 -57
- package/lib/ai/modals/electronHub/imageModels.ts +0 -116
- package/lib/ai/modals/electronHub/speechModels.ts +0 -75
- package/lib/ai/modals/electronHub/videoModels.ts +0 -75
- package/lib/ai/modals/groq/chatgroq.ts +0 -78
- package/lib/ai/modals/groq/imageAnalyzer.ts +0 -83
- package/lib/ai/modals/groq/whisper.ts +0 -114
- package/lib/ai/modals/hercai/chatModels.ts +0 -20
- package/lib/ai/utils.ts +0 -15
package/lib/ai/ApexModules.ts
DELETED
|
@@ -1,916 +0,0 @@
|
|
|
1
|
-
import { validateModels } from "./functions/validOptions";
|
|
2
|
-
import { whisper } from './modals/groq/whisper';
|
|
3
|
-
import { connect } from 'verse.db';
|
|
4
|
-
import { chatGroq } from './modals/groq/chatgroq';
|
|
5
|
-
import { groqAnalyzer } from './utils';
|
|
6
|
-
import { electronImagine } from './modals/electronHub/imageModels';
|
|
7
|
-
import { electronChat } from './modals/electronHub/chatmodels';
|
|
8
|
-
import { electronSpeech } from './modals/electronHub/speechModels';
|
|
9
|
-
import { electronVideo } from './modals/electronHub/videoModels';
|
|
10
|
-
import { GoogleGenerativeAI } from"@google/generative-ai";
|
|
11
|
-
import { Hercai } from "hercai";
|
|
12
|
-
|
|
13
|
-
const dbConfig = {
|
|
14
|
-
adapter: 'json',
|
|
15
|
-
dataPath: 'Ai_Chat-History'
|
|
16
|
-
}
|
|
17
|
-
|
|
18
|
-
const db = new connect(dbConfig)
|
|
19
|
-
|
|
20
|
-
export interface ApexImagineOptions {
|
|
21
|
-
nsfw?: boolean | undefined;
|
|
22
|
-
deepCheck?: boolean;
|
|
23
|
-
nsfwWords?: string[];
|
|
24
|
-
count?: number;
|
|
25
|
-
negative_prompt?: string;
|
|
26
|
-
sampler?: any;
|
|
27
|
-
image_style?: any;
|
|
28
|
-
width?: number;
|
|
29
|
-
height?: number;
|
|
30
|
-
format?: "jpeg" | "png";
|
|
31
|
-
quality?: number;
|
|
32
|
-
steps?: number;
|
|
33
|
-
seed?: number;
|
|
34
|
-
cfg_scale?: number;
|
|
35
|
-
Api_Key?: string
|
|
36
|
-
}
|
|
37
|
-
const hercai = new Hercai('6eZZOdDwm6Epdzn8mnhcX9SBDkxvoNYcNj9ILS0P44=');
|
|
38
|
-
|
|
39
|
-
type ChatModelOption = "v3" | "v3-32k" | "turbo" | "turbo-16k" | "gemini" ;
|
|
40
|
-
type hercmodals = "v3" | "lexica" | "prodia" | "animefy" | "raava" | "shonin" | "simurg";
|
|
41
|
-
|
|
42
|
-
async function ApexImagine(model: string, prompt: string, options?: ApexImagineOptions): Promise<string[] | undefined> {
|
|
43
|
-
let imageURL: string | Buffer = '';
|
|
44
|
-
let response: string[] = [];
|
|
45
|
-
const imageType = await validateModels();
|
|
46
|
-
const { Api_Key = 'eaebff6e-c7b2-477c-8edd-9aa91becf1e3', nsfw = false, deepCheck = false, nsfwWords = [], count = 2, negative_prompt = "", sampler = "DPM++ 2M Karras", height = 1024, width = 1024, cfg_scale = 9, steps = 20, seed = -1, image_style = "cinematic" } = options ?? {};
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
if (!/^[a-zA-Z0-9\s.,;:'"?!\-]*$/.test(prompt)) {
|
|
50
|
-
prompt = await electronChat({
|
|
51
|
-
modelName: 'llama-3.1-405b',
|
|
52
|
-
prompt: `Translate the text below into English:\n\n${prompt}`
|
|
53
|
-
}) as string;
|
|
54
|
-
}
|
|
55
|
-
|
|
56
|
-
if (count > 4 || count <= 0) throw new Error("Inavlid usage. Count can't be less than 0 or more than 4.");
|
|
57
|
-
if ((width || height) <= 0) throw new Error("Inavlid usage. Image width/height can't be less than 0 or more than 1024.");
|
|
58
|
-
|
|
59
|
-
for (let i = 0; i < count; i++) {
|
|
60
|
-
if (imageType.validHercImageModels.includes(model)) {
|
|
61
|
-
if (model === 'prodia-v2') {
|
|
62
|
-
imageURL = (await hercai.betaDrawImage({
|
|
63
|
-
prompt: prompt,
|
|
64
|
-
negative_prompt: negative_prompt,
|
|
65
|
-
sampler: "DPM-Solver",
|
|
66
|
-
image_style: image_style,
|
|
67
|
-
width: width,
|
|
68
|
-
height: height,
|
|
69
|
-
scale: cfg_scale,
|
|
70
|
-
steps: steps
|
|
71
|
-
})).url;
|
|
72
|
-
} else {
|
|
73
|
-
imageURL = (await hercai.drawImage({
|
|
74
|
-
model: model as hercmodals,
|
|
75
|
-
prompt: prompt,
|
|
76
|
-
negative_prompt: negative_prompt
|
|
77
|
-
})).url;
|
|
78
|
-
}
|
|
79
|
-
} else if (imageType.validElectronModels.includes(model)) {
|
|
80
|
-
|
|
81
|
-
const gen = await electronImagine({ ApiKey: Api_Key as string, prompt: prompt, modelName: model, resizeOptions: { height, width, format: options?.format, quality: options?.quality } });
|
|
82
|
-
if (gen === null) throw new Error('this model reached rate limit. Provide your own api key from: "https://discord.gg/94qUZWhwFE"');
|
|
83
|
-
imageURL = gen as string
|
|
84
|
-
} else {
|
|
85
|
-
throw new Error("Invalid model provided. Please check docs/npm page for valid models.");
|
|
86
|
-
}
|
|
87
|
-
|
|
88
|
-
if (imageURL) {
|
|
89
|
-
if (nsfw === false && deepCheck === false) {
|
|
90
|
-
response.push(imageURL);
|
|
91
|
-
} else {
|
|
92
|
-
|
|
93
|
-
const NSFWWORDS: string[] = [
|
|
94
|
-
"2g1c",
|
|
95
|
-
"2 girls 1 cup",
|
|
96
|
-
"acrotomophilia",
|
|
97
|
-
"alabama hot pocket",
|
|
98
|
-
"alaskan pipeline",
|
|
99
|
-
"anal",
|
|
100
|
-
"anilingus",
|
|
101
|
-
"anus",
|
|
102
|
-
"apeshit",
|
|
103
|
-
"arsehole",
|
|
104
|
-
"ass",
|
|
105
|
-
"asshole",
|
|
106
|
-
"assmunch",
|
|
107
|
-
"auto erotic",
|
|
108
|
-
"autoerotic",
|
|
109
|
-
"babeland",
|
|
110
|
-
"baby batter",
|
|
111
|
-
"baby juice",
|
|
112
|
-
"ball gag",
|
|
113
|
-
"ball gravy",
|
|
114
|
-
"ball kicking",
|
|
115
|
-
"ball licking",
|
|
116
|
-
"ball sack",
|
|
117
|
-
"ball sucking",
|
|
118
|
-
"bangbros",
|
|
119
|
-
"bangbus",
|
|
120
|
-
"bareback",
|
|
121
|
-
"barely legal",
|
|
122
|
-
"barenaked",
|
|
123
|
-
"bastard",
|
|
124
|
-
"bastardo",
|
|
125
|
-
"bastinado",
|
|
126
|
-
"bbw",
|
|
127
|
-
"bdsm",
|
|
128
|
-
"beaner",
|
|
129
|
-
"beaners",
|
|
130
|
-
"beaver cleaver",
|
|
131
|
-
"beaver lips",
|
|
132
|
-
"beastiality",
|
|
133
|
-
"bestiality",
|
|
134
|
-
"big black",
|
|
135
|
-
"big breasts",
|
|
136
|
-
"big knockers",
|
|
137
|
-
"big tits",
|
|
138
|
-
"bimbos",
|
|
139
|
-
"birdlock",
|
|
140
|
-
"bitch",
|
|
141
|
-
"bitches",
|
|
142
|
-
"black cock",
|
|
143
|
-
"blonde action",
|
|
144
|
-
"blonde on blonde action",
|
|
145
|
-
"blowjob",
|
|
146
|
-
"blow job",
|
|
147
|
-
"blow your load",
|
|
148
|
-
"blue waffle",
|
|
149
|
-
"blumpkin",
|
|
150
|
-
"bollocks",
|
|
151
|
-
"bondage",
|
|
152
|
-
"boner",
|
|
153
|
-
"boob",
|
|
154
|
-
"boobs",
|
|
155
|
-
"booty call",
|
|
156
|
-
"brown showers",
|
|
157
|
-
"brunette action",
|
|
158
|
-
"bukkake",
|
|
159
|
-
"bulldyke",
|
|
160
|
-
"bullet vibe",
|
|
161
|
-
"bullshit",
|
|
162
|
-
"bung hole",
|
|
163
|
-
"bunghole",
|
|
164
|
-
"busty",
|
|
165
|
-
"butt",
|
|
166
|
-
"buttcheeks",
|
|
167
|
-
"butthole",
|
|
168
|
-
"camel toe",
|
|
169
|
-
"camgirl",
|
|
170
|
-
"camslut",
|
|
171
|
-
"camwhore",
|
|
172
|
-
"carpet muncher",
|
|
173
|
-
"carpetmuncher",
|
|
174
|
-
"chocolate rosebuds",
|
|
175
|
-
"cialis",
|
|
176
|
-
"circlejerk",
|
|
177
|
-
"cleveland steamer",
|
|
178
|
-
"clit",
|
|
179
|
-
"clitoris",
|
|
180
|
-
"clover clamps",
|
|
181
|
-
"clusterfuck",
|
|
182
|
-
"cock",
|
|
183
|
-
"cocks",
|
|
184
|
-
"coprolagnia",
|
|
185
|
-
"coprophilia",
|
|
186
|
-
"cornhole",
|
|
187
|
-
"coon",
|
|
188
|
-
"coons",
|
|
189
|
-
"creampie",
|
|
190
|
-
"cum",
|
|
191
|
-
"cumming",
|
|
192
|
-
"cumshot",
|
|
193
|
-
"cumshots",
|
|
194
|
-
"cunnilingus",
|
|
195
|
-
"cunt",
|
|
196
|
-
"darkie",
|
|
197
|
-
"date rape",
|
|
198
|
-
"daterape",
|
|
199
|
-
"deep throat",
|
|
200
|
-
"deepthroat",
|
|
201
|
-
"dendrophilia",
|
|
202
|
-
"dick",
|
|
203
|
-
"dildo",
|
|
204
|
-
"dingleberry",
|
|
205
|
-
"dingleberries",
|
|
206
|
-
"dirty pillows",
|
|
207
|
-
"dirty sanchez",
|
|
208
|
-
"doggie style",
|
|
209
|
-
"doggiestyle",
|
|
210
|
-
"doggy style",
|
|
211
|
-
"doggystyle",
|
|
212
|
-
"dog style",
|
|
213
|
-
"dolcett",
|
|
214
|
-
"domination",
|
|
215
|
-
"dominatrix",
|
|
216
|
-
"dommes",
|
|
217
|
-
"donkey punch",
|
|
218
|
-
"double dong",
|
|
219
|
-
"double penetration",
|
|
220
|
-
"dp action",
|
|
221
|
-
"dry hump",
|
|
222
|
-
"dvda",
|
|
223
|
-
"eat my ass",
|
|
224
|
-
"ecchi",
|
|
225
|
-
"ejaculation",
|
|
226
|
-
"erotic",
|
|
227
|
-
"erotism",
|
|
228
|
-
"escort",
|
|
229
|
-
"eunuch",
|
|
230
|
-
"fag",
|
|
231
|
-
"faggot",
|
|
232
|
-
"fecal",
|
|
233
|
-
"felch",
|
|
234
|
-
"fellatio",
|
|
235
|
-
"feltch",
|
|
236
|
-
"female squirting",
|
|
237
|
-
"femdom",
|
|
238
|
-
"figging",
|
|
239
|
-
"fingerbang",
|
|
240
|
-
"fingering",
|
|
241
|
-
"fisting",
|
|
242
|
-
"foot fetish",
|
|
243
|
-
"footjob",
|
|
244
|
-
"frotting",
|
|
245
|
-
"fuck",
|
|
246
|
-
"fuck buttons",
|
|
247
|
-
"fuckin",
|
|
248
|
-
"fucking",
|
|
249
|
-
"fucktards",
|
|
250
|
-
"fudge packer",
|
|
251
|
-
"fudgepacker",
|
|
252
|
-
"futanari",
|
|
253
|
-
"gangbang",
|
|
254
|
-
"gang bang",
|
|
255
|
-
"gay sex",
|
|
256
|
-
"genitals",
|
|
257
|
-
"giant cock",
|
|
258
|
-
"girl on",
|
|
259
|
-
"girl on top",
|
|
260
|
-
"girls gone wild",
|
|
261
|
-
"goatcx",
|
|
262
|
-
"goatse",
|
|
263
|
-
"god damn",
|
|
264
|
-
"gokkun",
|
|
265
|
-
"golden shower",
|
|
266
|
-
"goodpoop",
|
|
267
|
-
"goo girl",
|
|
268
|
-
"goregasm",
|
|
269
|
-
"grope",
|
|
270
|
-
"group sex",
|
|
271
|
-
"g-spot",
|
|
272
|
-
"guro",
|
|
273
|
-
"hand job",
|
|
274
|
-
"handjob",
|
|
275
|
-
"hard core",
|
|
276
|
-
"hardcore",
|
|
277
|
-
"hentai",
|
|
278
|
-
"homoerotic",
|
|
279
|
-
"honkey",
|
|
280
|
-
"hooker",
|
|
281
|
-
"horny",
|
|
282
|
-
"hot carl",
|
|
283
|
-
"hot chick",
|
|
284
|
-
"how to kill",
|
|
285
|
-
"how to murder",
|
|
286
|
-
"huge fat",
|
|
287
|
-
"humping",
|
|
288
|
-
"incest",
|
|
289
|
-
"intercourse",
|
|
290
|
-
"jack off",
|
|
291
|
-
"jail bait",
|
|
292
|
-
"jailbait",
|
|
293
|
-
"jelly donut",
|
|
294
|
-
"jerk off",
|
|
295
|
-
"jigaboo",
|
|
296
|
-
"jiggaboo",
|
|
297
|
-
"jiggerboo",
|
|
298
|
-
"jizz",
|
|
299
|
-
"juggs",
|
|
300
|
-
"kike",
|
|
301
|
-
"kinbaku",
|
|
302
|
-
"kinkster",
|
|
303
|
-
"kinky",
|
|
304
|
-
"knobbing",
|
|
305
|
-
"leather restraint",
|
|
306
|
-
"leather straight jacket",
|
|
307
|
-
"lemon party",
|
|
308
|
-
"livesex",
|
|
309
|
-
"lolita",
|
|
310
|
-
"lovemaking",
|
|
311
|
-
"make me come",
|
|
312
|
-
"male squirting",
|
|
313
|
-
"masturbate",
|
|
314
|
-
"masturbating",
|
|
315
|
-
"masturbation",
|
|
316
|
-
"menage a trois",
|
|
317
|
-
"milf",
|
|
318
|
-
"missionary position",
|
|
319
|
-
"mong",
|
|
320
|
-
"motherfucker",
|
|
321
|
-
"mound of venus",
|
|
322
|
-
"mr hands",
|
|
323
|
-
"muff diver",
|
|
324
|
-
"muffdiving",
|
|
325
|
-
"nambla",
|
|
326
|
-
"nawashi",
|
|
327
|
-
"negro",
|
|
328
|
-
"neonazi",
|
|
329
|
-
"nigga",
|
|
330
|
-
"nigger",
|
|
331
|
-
"nig nog",
|
|
332
|
-
"nimphomania",
|
|
333
|
-
"nipple",
|
|
334
|
-
"nipples",
|
|
335
|
-
"nsfw",
|
|
336
|
-
'nsfw images',
|
|
337
|
-
"nude",
|
|
338
|
-
"nudity",
|
|
339
|
-
"nutten",
|
|
340
|
-
"nympho",
|
|
341
|
-
"nymphomania",
|
|
342
|
-
"octopussy",
|
|
343
|
-
"omorashi",
|
|
344
|
-
"one cup two girls",
|
|
345
|
-
'one guy one jar',
|
|
346
|
-
"orgasm",
|
|
347
|
-
"orgy",
|
|
348
|
-
'paedophile',
|
|
349
|
-
"paki",
|
|
350
|
-
"panties",
|
|
351
|
-
"panty",
|
|
352
|
-
"pedobear",
|
|
353
|
-
"pedophile",
|
|
354
|
-
'pegging',
|
|
355
|
-
'penis',
|
|
356
|
-
"phone sex",
|
|
357
|
-
'piece of shit',
|
|
358
|
-
"pikey",
|
|
359
|
-
"pissing",
|
|
360
|
-
"piss pig",
|
|
361
|
-
"pisspig",
|
|
362
|
-
"playboy",
|
|
363
|
-
"pleasure chest",
|
|
364
|
-
"pole smoker",
|
|
365
|
-
"ponyplay",
|
|
366
|
-
"poof",
|
|
367
|
-
"poon",
|
|
368
|
-
"poontang",
|
|
369
|
-
"punany",
|
|
370
|
-
"poop chute",
|
|
371
|
-
"poopchute",
|
|
372
|
-
"porn",
|
|
373
|
-
"porno",
|
|
374
|
-
"pornography",
|
|
375
|
-
"prince albert piercing",
|
|
376
|
-
"pthc",
|
|
377
|
-
"pubes",
|
|
378
|
-
"pussy",
|
|
379
|
-
"queaf",
|
|
380
|
-
"queef",
|
|
381
|
-
"quim",
|
|
382
|
-
"raghead",
|
|
383
|
-
"raging boner",
|
|
384
|
-
"rape",
|
|
385
|
-
"raping",
|
|
386
|
-
"rapist",
|
|
387
|
-
"rectum",
|
|
388
|
-
"reverse cowgirl",
|
|
389
|
-
"rimjob",
|
|
390
|
-
"rimming",
|
|
391
|
-
"rosy palm",
|
|
392
|
-
"rosy palm and her 5 sisters",
|
|
393
|
-
"rusty trombone",
|
|
394
|
-
"sadism",
|
|
395
|
-
"santorum",
|
|
396
|
-
"scat",
|
|
397
|
-
"schlong",
|
|
398
|
-
"scissoring",
|
|
399
|
-
"semen",
|
|
400
|
-
"sex",
|
|
401
|
-
"sexcam",
|
|
402
|
-
"sexo",
|
|
403
|
-
"sexy",
|
|
404
|
-
"sexual",
|
|
405
|
-
"sexually",
|
|
406
|
-
"sexuality",
|
|
407
|
-
"shaved beaver",
|
|
408
|
-
"shaved pussy",
|
|
409
|
-
"shemale",
|
|
410
|
-
"shibari",
|
|
411
|
-
"shit",
|
|
412
|
-
"shitblimp",
|
|
413
|
-
"shitty",
|
|
414
|
-
"shota",
|
|
415
|
-
"shrimping",
|
|
416
|
-
"skeet",
|
|
417
|
-
"slanteye",
|
|
418
|
-
"slut",
|
|
419
|
-
"s&m",
|
|
420
|
-
"smut",
|
|
421
|
-
"snatch",
|
|
422
|
-
"snowballing",
|
|
423
|
-
"sodomize",
|
|
424
|
-
"sodomy",
|
|
425
|
-
"spastic",
|
|
426
|
-
"spic",
|
|
427
|
-
"splooge",
|
|
428
|
-
"splooge moose",
|
|
429
|
-
"spooge",
|
|
430
|
-
"spread legs",
|
|
431
|
-
"spunk",
|
|
432
|
-
"strap on",
|
|
433
|
-
"strapon",
|
|
434
|
-
"strappado",
|
|
435
|
-
"strip club",
|
|
436
|
-
"style doggy",
|
|
437
|
-
"suck",
|
|
438
|
-
"sucks",
|
|
439
|
-
"suicide girls",
|
|
440
|
-
"sultry women",
|
|
441
|
-
"swastika",
|
|
442
|
-
"swinger",
|
|
443
|
-
"tainted love",
|
|
444
|
-
"taste my",
|
|
445
|
-
"tea bagging",
|
|
446
|
-
"threesome",
|
|
447
|
-
"throating",
|
|
448
|
-
"thumbzilla",
|
|
449
|
-
"tied up",
|
|
450
|
-
"tight white",
|
|
451
|
-
"tit",
|
|
452
|
-
"tits",
|
|
453
|
-
"titties",
|
|
454
|
-
"titty",
|
|
455
|
-
"topless",
|
|
456
|
-
"tosser",
|
|
457
|
-
"towelhead",
|
|
458
|
-
"tranny",
|
|
459
|
-
"tribadism",
|
|
460
|
-
"tub girl",
|
|
461
|
-
'tubgirl',
|
|
462
|
-
"tushy",
|
|
463
|
-
"twat",
|
|
464
|
-
"twink",
|
|
465
|
-
"twinkie",
|
|
466
|
-
"two girls one cup",
|
|
467
|
-
"undressing",
|
|
468
|
-
'upskirt',
|
|
469
|
-
"urethra play",
|
|
470
|
-
"urophilia",
|
|
471
|
-
"vagina",
|
|
472
|
-
"venus mound",
|
|
473
|
-
"viagra",
|
|
474
|
-
"vibrator",
|
|
475
|
-
"violet wand",
|
|
476
|
-
"vorarephilia",
|
|
477
|
-
"voyeur",
|
|
478
|
-
"voyeurweb",
|
|
479
|
-
"voyuer",
|
|
480
|
-
"vulva",
|
|
481
|
-
"wank",
|
|
482
|
-
"wetback",
|
|
483
|
-
"wet dream",
|
|
484
|
-
"white power",
|
|
485
|
-
"whore",
|
|
486
|
-
"worldsex",
|
|
487
|
-
"wrapping men",
|
|
488
|
-
"wrinkled starfish",
|
|
489
|
-
"xx",
|
|
490
|
-
"xxx",
|
|
491
|
-
"yaoi",
|
|
492
|
-
"yellow showers",
|
|
493
|
-
"yiffy",
|
|
494
|
-
"zoophilia",
|
|
495
|
-
"anal",
|
|
496
|
-
"arousal",
|
|
497
|
-
"balls",
|
|
498
|
-
"blowjob",
|
|
499
|
-
"busty",
|
|
500
|
-
"butt",
|
|
501
|
-
"cameltoe",
|
|
502
|
-
"climax",
|
|
503
|
-
"clitoris",
|
|
504
|
-
"cock",
|
|
505
|
-
"crotch",
|
|
506
|
-
"cum",
|
|
507
|
-
"cumshot",
|
|
508
|
-
"cunnilingus",
|
|
509
|
-
"dirty",
|
|
510
|
-
"dirtytalk",
|
|
511
|
-
"dildo",
|
|
512
|
-
"erect",
|
|
513
|
-
"erogenous",
|
|
514
|
-
"escort",
|
|
515
|
-
"explicit",
|
|
516
|
-
"facial",
|
|
517
|
-
"fetish",
|
|
518
|
-
"flirt",
|
|
519
|
-
"foreplay",
|
|
520
|
-
"genitals",
|
|
521
|
-
"groin",
|
|
522
|
-
"hardcore",
|
|
523
|
-
"hardon",
|
|
524
|
-
"horniness",
|
|
525
|
-
"horny",
|
|
526
|
-
"kamasutra",
|
|
527
|
-
"kinky",
|
|
528
|
-
"lewd",
|
|
529
|
-
"lingerie",
|
|
530
|
-
"lust",
|
|
531
|
-
"lustful",
|
|
532
|
-
"masturbate",
|
|
533
|
-
"mature",
|
|
534
|
-
"milf",
|
|
535
|
-
"naughty",
|
|
536
|
-
"naked",
|
|
537
|
-
"nipples",
|
|
538
|
-
"nude",
|
|
539
|
-
"obscene",
|
|
540
|
-
"oral",
|
|
541
|
-
"orgasm",
|
|
542
|
-
"penetration",
|
|
543
|
-
"penis",
|
|
544
|
-
"pleasure",
|
|
545
|
-
"porn",
|
|
546
|
-
"prostitute",
|
|
547
|
-
"provocative",
|
|
548
|
-
"pubic",
|
|
549
|
-
"pussy",
|
|
550
|
-
"seduce",
|
|
551
|
-
"seductive",
|
|
552
|
-
"sensual",
|
|
553
|
-
"sex",
|
|
554
|
-
"sexual",
|
|
555
|
-
"sperm",
|
|
556
|
-
"strip",
|
|
557
|
-
"striptease",
|
|
558
|
-
"swinger",
|
|
559
|
-
"testicles",
|
|
560
|
-
"thong",
|
|
561
|
-
"threesome",
|
|
562
|
-
"undies",
|
|
563
|
-
"undress",
|
|
564
|
-
"vagina",
|
|
565
|
-
"vibrator",
|
|
566
|
-
"wank",
|
|
567
|
-
"wet",
|
|
568
|
-
"hentai",
|
|
569
|
-
"bdsm",
|
|
570
|
-
"gay",
|
|
571
|
-
"lesbian",
|
|
572
|
-
"femboy",
|
|
573
|
-
"ass",
|
|
574
|
-
];
|
|
575
|
-
|
|
576
|
-
let shouldExclude = false;
|
|
577
|
-
|
|
578
|
-
if (nsfw === true) {
|
|
579
|
-
const caption = await groqAnalyzer({ img: imageURL, prompt });
|
|
580
|
-
if (!caption) return;
|
|
581
|
-
shouldExclude = NSFWWORDS.some(word => caption.includes(word));
|
|
582
|
-
shouldExclude = nsfwWords.some(word => caption.includes(word));
|
|
583
|
-
}
|
|
584
|
-
|
|
585
|
-
if (deepCheck === true) {
|
|
586
|
-
shouldExclude = shouldExclude || NSFWWORDS.some(word => prompt.includes(word));
|
|
587
|
-
shouldExclude = shouldExclude || NSFWWORDS.some(word => prompt.includes(word));
|
|
588
|
-
shouldExclude = shouldExclude || nsfwWords.some(word => prompt.includes(word));
|
|
589
|
-
shouldExclude = shouldExclude || nsfwWords.some(word => prompt.includes(word));
|
|
590
|
-
}
|
|
591
|
-
|
|
592
|
-
if (!shouldExclude) {
|
|
593
|
-
response.push(imageURL);
|
|
594
|
-
}
|
|
595
|
-
}
|
|
596
|
-
}
|
|
597
|
-
}
|
|
598
|
-
return response;
|
|
599
|
-
}
|
|
600
|
-
|
|
601
|
-
async function ApexChat(
|
|
602
|
-
model: string,
|
|
603
|
-
prompt: string,
|
|
604
|
-
{ userId, memory, limit, instruction, Api_key, threshold }: { userId?: string; memory?: boolean; limit?: number; instruction?: string; Api_key?: string, threshold?: number }
|
|
605
|
-
): Promise<string> {
|
|
606
|
-
try {
|
|
607
|
-
let enhancedPrompt: string = prompt;
|
|
608
|
-
let historyChat: string = `- This is Previous chat history between you (System) and the user (User). Don't use the history or reply back anything related to it unless being mentioned in user's new prompt\n`;
|
|
609
|
-
|
|
610
|
-
if (memory && userId) {
|
|
611
|
-
const userHistoryResult = (await db.find(`${userId}`, { userId })).results?.history || [];
|
|
612
|
-
const historyItems = Array.isArray(userHistoryResult) ? userHistoryResult : [];
|
|
613
|
-
|
|
614
|
-
historyItems.sort((a, b) => b.currentTime - a.currentTime);
|
|
615
|
-
|
|
616
|
-
const relevantMessages = await getRelevantHistoryAI(prompt, historyItems, limit ?? 12, threshold);
|
|
617
|
-
|
|
618
|
-
let formattedHistory = '';
|
|
619
|
-
relevantMessages.forEach((item) => {
|
|
620
|
-
formattedHistory += `User: ${item.user}\nSystem: ${item.model}\n\n`;
|
|
621
|
-
});
|
|
622
|
-
|
|
623
|
-
historyChat += `${formattedHistory}\n\n`;
|
|
624
|
-
enhancedPrompt = `This is the User's New Prompt:\n ${prompt}\n\n${historyChat}`;
|
|
625
|
-
}
|
|
626
|
-
|
|
627
|
-
let response: string;
|
|
628
|
-
if (enhancedPrompt.length >= 2000) {
|
|
629
|
-
const chunks = [];
|
|
630
|
-
while (enhancedPrompt.length > 0) {
|
|
631
|
-
chunks.push(enhancedPrompt.substring(0, 2000));
|
|
632
|
-
enhancedPrompt = enhancedPrompt.substring(2000);
|
|
633
|
-
}
|
|
634
|
-
|
|
635
|
-
const responses = await Promise.all(chunks.map(async (chunk) => {
|
|
636
|
-
return await processChunk(model, chunk, { ApiKey: Api_key, personality: instruction });
|
|
637
|
-
}));
|
|
638
|
-
|
|
639
|
-
response = responses.join('');
|
|
640
|
-
} else {
|
|
641
|
-
response = await processChunk(model, enhancedPrompt, { ApiKey: Api_key, personality: instruction });
|
|
642
|
-
}
|
|
643
|
-
|
|
644
|
-
if (memory && userId) {
|
|
645
|
-
await db.update(`${userId}`, { userId }, { $push: { history: { user: prompt, model: response } }, $set: { currentTime: Date.now() } }, true);
|
|
646
|
-
}
|
|
647
|
-
|
|
648
|
-
return response;
|
|
649
|
-
} catch (error: any) {
|
|
650
|
-
console.error(error.message);
|
|
651
|
-
return '';
|
|
652
|
-
}
|
|
653
|
-
}
|
|
654
|
-
|
|
655
|
-
const genAI = new GoogleGenerativeAI('AIzaSyCSNDp8lx9CT_DlLvbQwEAdOFC6Srph1dM');
|
|
656
|
-
|
|
657
|
-
const model = genAI.getGenerativeModel({ model: "text-embedding-004" });
|
|
658
|
-
|
|
659
|
-
async function getRelevantHistoryAI(prompt: string, history: any[], maxResults: number, threshold: number = 0.7): Promise<any[]> {
|
|
660
|
-
const trimmedPrompt = prompt.length > 20000 ? prompt.slice(0, 10000) + "..." + prompt.slice(-10000) : prompt;
|
|
661
|
-
|
|
662
|
-
// Batch embeddings instead of one-by-one calls
|
|
663
|
-
const [promptEmbedding, historyEmbeddings] = await Promise.all([
|
|
664
|
-
embedding(trimmedPrompt),
|
|
665
|
-
embeddingBatch(history.map(item => item.user))
|
|
666
|
-
]);
|
|
667
|
-
|
|
668
|
-
// Calculate cosine similarity in a single loop (faster)
|
|
669
|
-
const scores = historyEmbeddings.map((messageEmbedding, index) => ({
|
|
670
|
-
item: history[index],
|
|
671
|
-
score: cosineSimilarity(promptEmbedding, messageEmbedding)
|
|
672
|
-
}));
|
|
673
|
-
|
|
674
|
-
return scores
|
|
675
|
-
.filter(entry => entry.score >= threshold)
|
|
676
|
-
.sort((a, b) => b.score - a.score)
|
|
677
|
-
.slice(0, maxResults)
|
|
678
|
-
.map(entry => entry.item);
|
|
679
|
-
}
|
|
680
|
-
|
|
681
|
-
async function embeddingBatch(texts: string[]): Promise<number[][]> {
|
|
682
|
-
let embeddings: number[][] = [];
|
|
683
|
-
|
|
684
|
-
for (const text of texts) {
|
|
685
|
-
const trimmedText = text.length > 20000 ? text.slice(0, 10000) + "..." + text.slice(-10000) : text;
|
|
686
|
-
const embedded = await embedding(trimmedText);
|
|
687
|
-
embeddings.push(embedded);
|
|
688
|
-
}
|
|
689
|
-
|
|
690
|
-
return embeddings;
|
|
691
|
-
}
|
|
692
|
-
|
|
693
|
-
|
|
694
|
-
async function embedding(text: string): Promise<number[]> {
|
|
695
|
-
let maxRetries = 5;
|
|
696
|
-
let delay = 5000;
|
|
697
|
-
let attempt = 0;
|
|
698
|
-
|
|
699
|
-
while (attempt < maxRetries) {
|
|
700
|
-
try {
|
|
701
|
-
|
|
702
|
-
const response = await model.embedContent(text);
|
|
703
|
-
|
|
704
|
-
|
|
705
|
-
return response.embedding.values as number[];
|
|
706
|
-
} catch (error: any) {
|
|
707
|
-
if (error.response) {
|
|
708
|
-
console.warn(`❌ API Error - Status: ${error.response.status}, Message: ${error.response.statusText}`);
|
|
709
|
-
} else {
|
|
710
|
-
console.error("❌ Network or unknown error:", error.message);
|
|
711
|
-
}
|
|
712
|
-
|
|
713
|
-
if (error.response && error.response.status === 429) {
|
|
714
|
-
console.warn(`⚠️ Rate limited (429). Retrying in ${delay / 1000} seconds...`);
|
|
715
|
-
await new Promise(res => setTimeout(res, delay));
|
|
716
|
-
} else {
|
|
717
|
-
throw error;
|
|
718
|
-
}
|
|
719
|
-
}
|
|
720
|
-
|
|
721
|
-
attempt++;
|
|
722
|
-
}
|
|
723
|
-
|
|
724
|
-
throw new Error("Max retries reached. Failed to get embedding.");
|
|
725
|
-
}
|
|
726
|
-
|
|
727
|
-
function cosineSimilarity(a: number[], b: number[]): number {
|
|
728
|
-
const dotProduct = a.reduce((sum, val, i) => sum + val * b[i], 0);
|
|
729
|
-
const magnitudeA = Math.sqrt(a.reduce((sum, val) => sum + val * val, 0));
|
|
730
|
-
const magnitudeB = Math.sqrt(b.reduce((sum, val) => sum + val * val, 0));
|
|
731
|
-
return dotProduct / (magnitudeA * magnitudeB);
|
|
732
|
-
}
|
|
733
|
-
|
|
734
|
-
async function resetHistory({ id, last }: { id: string; last: number | string }): Promise<boolean> {
|
|
735
|
-
if (!id) return false;
|
|
736
|
-
|
|
737
|
-
try {
|
|
738
|
-
|
|
739
|
-
const getUserData = (await db.findCollection(`${id}`, 'normal')).results;
|
|
740
|
-
|
|
741
|
-
if (!getUserData) return false;
|
|
742
|
-
|
|
743
|
-
const userRecord = (await db.find(`${id}`, { userId: id })).results;
|
|
744
|
-
if (!userRecord || !userRecord.history) return false;
|
|
745
|
-
|
|
746
|
-
const countHistory = userRecord.history.length;
|
|
747
|
-
|
|
748
|
-
let updateQuery: any = {};
|
|
749
|
-
|
|
750
|
-
if (typeof last === "string" && last.toLowerCase() === "all") {
|
|
751
|
-
updateQuery = { $set: { history: [] } };
|
|
752
|
-
} else if (typeof last === "number" && last > 0) {
|
|
753
|
-
const keep = Math.max(countHistory - last, 0);
|
|
754
|
-
if (keep === 0) {
|
|
755
|
-
updateQuery = { $set: { history: [] } };
|
|
756
|
-
} else {
|
|
757
|
-
updateQuery = { $slice: { history: keep } };
|
|
758
|
-
}
|
|
759
|
-
} else {
|
|
760
|
-
console.log("Invalid value for 'last'. Must be a positive number or 'all'.");
|
|
761
|
-
return false;
|
|
762
|
-
}
|
|
763
|
-
|
|
764
|
-
await db.update(`${id}`, { userId: id }, updateQuery);
|
|
765
|
-
return true
|
|
766
|
-
} catch (error) {
|
|
767
|
-
console.error("Error resetting history:", error);
|
|
768
|
-
return false
|
|
769
|
-
}
|
|
770
|
-
}
|
|
771
|
-
|
|
772
|
-
|
|
773
|
-
async function processChunk(
|
|
774
|
-
model: string,
|
|
775
|
-
prompt: string,
|
|
776
|
-
{ ApiKey, personality }: { ApiKey?: string; personality?: string }
|
|
777
|
-
): Promise<string> {
|
|
778
|
-
const validOptions = await validateModels();
|
|
779
|
-
let response: string;
|
|
780
|
-
switch (true) {
|
|
781
|
-
case validOptions.validHercChatModels.includes(model):
|
|
782
|
-
response = (
|
|
783
|
-
await hercai.question({
|
|
784
|
-
model: model as ChatModelOption,
|
|
785
|
-
content: prompt,
|
|
786
|
-
personality
|
|
787
|
-
})
|
|
788
|
-
).reply;
|
|
789
|
-
break;
|
|
790
|
-
case validOptions.validGroqChatModels.includes(model):
|
|
791
|
-
response = await chatGroq({
|
|
792
|
-
API_KEY: ApiKey,
|
|
793
|
-
apiName: model,
|
|
794
|
-
prompt,
|
|
795
|
-
instruction: personality
|
|
796
|
-
});
|
|
797
|
-
break;
|
|
798
|
-
|
|
799
|
-
case validOptions.validElectronModels.includes(model):
|
|
800
|
-
response = (await electronChat({
|
|
801
|
-
ApiKey,
|
|
802
|
-
prompt,
|
|
803
|
-
instruction: personality,
|
|
804
|
-
modelName: model
|
|
805
|
-
})) as string;
|
|
806
|
-
break;
|
|
807
|
-
|
|
808
|
-
default:
|
|
809
|
-
throw new Error("Invalid model.");
|
|
810
|
-
}
|
|
811
|
-
|
|
812
|
-
return response;
|
|
813
|
-
}
|
|
814
|
-
|
|
815
|
-
|
|
816
|
-
async function ApexListener(options: { filepath: string, model?: string, prompt?: string, lang?: string, apiKey?: string }) {
|
|
817
|
-
|
|
818
|
-
const { filepath, model = 'v3', prompt = '', lang = 'en', apiKey = undefined } = options;
|
|
819
|
-
|
|
820
|
-
const validatedLang = validateLanguageInput(lang);
|
|
821
|
-
|
|
822
|
-
if (!validatedLang) {
|
|
823
|
-
throw new Error(`Unsupported language: ${lang}. Please provide a valid ISO 639-1 language code or language name.`);
|
|
824
|
-
}
|
|
825
|
-
|
|
826
|
-
const transcribe = await whisper(prompt, filepath, validatedLang, apiKey);
|
|
827
|
-
|
|
828
|
-
const enhancer = `Below is the the speech/text that has been said in the voice/audio file.\n\n${transcribe}`;
|
|
829
|
-
|
|
830
|
-
let response = "";
|
|
831
|
-
if (model) response = await ApexChat(model, enhancer, {});
|
|
832
|
-
|
|
833
|
-
|
|
834
|
-
return { response, transcribe };
|
|
835
|
-
};
|
|
836
|
-
|
|
837
|
-
function validateLanguageInput(lang: string): string | null {
|
|
838
|
-
const supportedLanguages = [
|
|
839
|
-
{ code: 'en', name: 'English' },
|
|
840
|
-
{ code: 'es', name: 'Spanish' },
|
|
841
|
-
{ code: 'fr', name: 'French' },
|
|
842
|
-
{ code: 'de', name: 'German' },
|
|
843
|
-
{ code: 'it', name: 'Italian' },
|
|
844
|
-
{ code: 'pt', name: 'Portuguese' },
|
|
845
|
-
{ code: 'ru', name: 'Russian' },
|
|
846
|
-
{ code: 'zh', name: 'Chinese' },
|
|
847
|
-
{ code: 'ja', name: 'Japanese' },
|
|
848
|
-
{ code: 'ko', name: 'Korean' },
|
|
849
|
-
{ code: 'ar', name: 'Arabic' },
|
|
850
|
-
{ code: 'hi', name: 'Hindi' },
|
|
851
|
-
{ code: 'bn', name: 'Bengali' },
|
|
852
|
-
{ code: 'pa', name: 'Punjabi' },
|
|
853
|
-
{ code: 'ur', name: 'Urdu' },
|
|
854
|
-
{ code: 'tr', name: 'Turkish' },
|
|
855
|
-
{ code: 'vi', name: 'Vietnamese' },
|
|
856
|
-
{ code: 'th', name: 'Thai' },
|
|
857
|
-
{ code: 'nl', name: 'Dutch' },
|
|
858
|
-
{ code: 'pl', name: 'Polish' },
|
|
859
|
-
{ code: 'sv', name: 'Swedish' },
|
|
860
|
-
{ code: 'no', name: 'Norwegian' },
|
|
861
|
-
{ code: 'fi', name: 'Finnish' },
|
|
862
|
-
{ code: 'da', name: 'Danish' },
|
|
863
|
-
{ code: 'el', name: 'Greek' },
|
|
864
|
-
{ code: 'he', name: 'Hebrew' },
|
|
865
|
-
{ code: 'fa', name: 'Persian' },
|
|
866
|
-
{ code: 'hu', name: 'Hungarian' },
|
|
867
|
-
{ code: 'cs', name: 'Czech' },
|
|
868
|
-
{ code: 'ro', name: 'Romanian' },
|
|
869
|
-
{ code: 'uk', name: 'Ukrainian' },
|
|
870
|
-
{ code: 'bg', name: 'Bulgarian' },
|
|
871
|
-
{ code: 'ms', name: 'Malay' },
|
|
872
|
-
{ code: 'id', name: 'Indonesian' },
|
|
873
|
-
{ code: 'tl', name: 'Tagalog' },
|
|
874
|
-
{ code: 'nl', name: 'Dutch' }
|
|
875
|
-
];
|
|
876
|
-
|
|
877
|
-
const foundByCode = supportedLanguages.find(langObj => langObj.code === lang.toLowerCase());
|
|
878
|
-
if (foundByCode) {
|
|
879
|
-
return foundByCode.code;
|
|
880
|
-
}
|
|
881
|
-
|
|
882
|
-
const foundByName = supportedLanguages.find(langObj => langObj.name.toLowerCase() === lang.toLowerCase());
|
|
883
|
-
if (foundByName) {
|
|
884
|
-
return foundByName.code;
|
|
885
|
-
}
|
|
886
|
-
|
|
887
|
-
return null;
|
|
888
|
-
}
|
|
889
|
-
|
|
890
|
-
async function ApexText2Speech({
|
|
891
|
-
ApiKey,
|
|
892
|
-
inputText,
|
|
893
|
-
modelName,
|
|
894
|
-
personality
|
|
895
|
-
}: {
|
|
896
|
-
ApiKey?: string;
|
|
897
|
-
inputText: string;
|
|
898
|
-
modelName?: "elevenlabs" | "myshell-tts" | "deepinfra-tts" | "whisper-large-v3" | "distil-large-v3" | string;
|
|
899
|
-
personality?: string;
|
|
900
|
-
}): Promise<Buffer> {
|
|
901
|
-
const maxLength = 3000;
|
|
902
|
-
const trimmedInput = inputText.length > maxLength ? inputText.slice(0, maxLength) : inputText;
|
|
903
|
-
|
|
904
|
-
return await electronSpeech({ ApiKey, inputText: trimmedInput, modelName, personality });
|
|
905
|
-
}
|
|
906
|
-
|
|
907
|
-
|
|
908
|
-
async function ApexVideo({ ApiKey, prompt, modelName }: {
|
|
909
|
-
ApiKey?: string;
|
|
910
|
-
prompt: string;
|
|
911
|
-
modelName?: string;
|
|
912
|
-
}): Promise<string>{
|
|
913
|
-
return await electronVideo({ ApiKey, prompt, modelName })
|
|
914
|
-
}
|
|
915
|
-
|
|
916
|
-
export { ApexImagine, ApexChat, ApexListener, ApexText2Speech, ApexVideo, resetHistory };
|