@yrpri/api 9.0.230 → 9.0.232
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/controllers/allOurIdeas.js +1 -1
- package/controllers/communities.cjs +282 -91
- package/controllers/domains.cjs +54 -8
- package/controllers/groups.cjs +51 -6
- package/controllers/points.cjs +4 -9
- package/controllers/posts.cjs +7 -9
- package/controllers/ratings.cjs +3 -6
- package/models/point.cjs +31 -3
- package/models/post.cjs +2 -3
- package/package.json +3 -3
- package/services/engine/allOurIdeas/aiHelper.d.ts +7 -4
- package/services/engine/allOurIdeas/aiHelper.js +34 -19
- package/services/engine/allOurIdeas/explainAnswersAssistant.d.ts +1 -1
- package/services/engine/allOurIdeas/explainAnswersAssistant.js +3 -9
- package/services/engine/moderation/fraud/CreateFraudAuditReport.cjs +35 -11
- package/services/engine/moderation/fraud/CreateFraudAuditReport.d.cts +21 -0
- package/services/engine/moderation/fraud/FraudBase.cjs +38 -18
- package/services/engine/moderation/fraud/FraudBase.d.cts +2 -0
- package/services/engine/moderation/fraud/FraudDeleteBase.cjs +48 -29
- package/services/engine/moderation/fraud/FraudDeleteBase.d.cts +8 -6
- package/services/engine/moderation/fraud/FraudDeleteEndorsements.cjs +5 -4
- package/services/engine/moderation/fraud/FraudDeleteEndorsements.d.cts +2 -2
- package/services/engine/moderation/fraud/FraudDeletePointQualities.cjs +3 -2
- package/services/engine/moderation/fraud/FraudDeletePointQualities.d.cts +1 -1
- package/services/engine/moderation/fraud/FraudDeletePoints.cjs +3 -2
- package/services/engine/moderation/fraud/FraudDeletePoints.d.cts +1 -1
- package/services/engine/moderation/fraud/FraudDeletePosts.cjs +3 -2
- package/services/engine/moderation/fraud/FraudDeleteRatings.cjs +61 -4
- package/services/engine/moderation/fraud/FraudGetBase.cjs +44 -20
- package/services/engine/moderation/fraud/FraudGetBase.d.cts +5 -0
- package/services/engine/moderation/fraud/FraudGetEndorsements.cjs +4 -13
- package/services/engine/moderation/fraud/FraudGetEndorsements.d.cts +1 -1
- package/services/engine/moderation/fraud/FraudGetPointQualities.cjs +3 -0
- package/services/engine/moderation/fraud/FraudGetPointQualities.d.cts +1 -1
- package/services/engine/moderation/fraud/FraudGetPoints.cjs +3 -0
- package/services/engine/moderation/fraud/FraudGetPoints.d.cts +1 -1
- package/services/engine/moderation/fraud/FraudGetPosts.cjs +17 -16
- package/services/engine/moderation/fraud/FraudGetPosts.d.cts +3 -3
- package/services/engine/moderation/fraud/FraudGetRatings.cjs +62 -30
- package/services/engine/moderation/fraud/FraudGetRatings.d.cts +4 -1
- package/services/engine/moderation/fraud/FraudRequestValidation.cjs +143 -0
- package/services/engine/moderation/fraud/FraudRequestValidation.d.cts +21 -0
- package/services/engine/moderation/fraud/FraudScannerNotifier.cjs +59 -35
- package/services/engine/moderation/fraud/FraudScannerNotifier.d.cts +20 -1
- package/services/llms/baseChatBot.d.ts +2 -0
- package/services/llms/baseChatBot.js +25 -9
- package/services/llms/imageGeneration/chatGptImageGenerator.d.ts +2 -2
- package/services/llms/imageGeneration/chatGptImageGenerator.js +13 -10
- package/services/llms/imageGeneration/collectionImageGenerator.js +31 -13
- package/services/llms/imageGeneration/dalleImageGenerator.d.ts +2 -2
- package/services/llms/imageGeneration/dalleImageGenerator.js +28 -16
- package/services/llms/imageGeneration/fluxImageGenerator.d.ts +2 -2
- package/services/llms/imageGeneration/fluxImageGenerator.js +9 -3
- package/services/llms/imageGeneration/iImageGenerator.d.ts +8 -1
- package/services/llms/imageGeneration/imageModelConfig.cjs +319 -0
- package/services/llms/imageGeneration/imageModelConfig.d.cts +79 -0
- package/services/llms/imageGeneration/imagenImageGenerator.d.ts +2 -3
- package/services/llms/imageGeneration/imagenImageGenerator.js +10 -10
- package/tests/fraudManagement.test.cjs +470 -0
- package/tests/fraudManagement.test.d.cts +1 -0
- package/tests/imageModelConfig.test.cjs +144 -0
- package/tests/imageModelConfig.test.d.cts +1 -0
- package/utils/ai_image_generation_guard.cjs +268 -0
- package/utils/ai_image_generation_guard.d.cts +34 -0
- package/utils/fingerprint_data.cjs +32 -0
- package/utils/fingerprint_data.d.cts +6 -0
- package/utils/recount_utils.cjs +53 -37
- package/utils/recount_utils.d.cts +7 -7
|
@@ -0,0 +1,319 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
const defaultOpenAiImageModel = "gpt-image-2";
|
|
3
|
+
const defaultImagenImageModel = "imagen-4.0-generate-001";
|
|
4
|
+
const defaultGptImage2LandscapeSize = "2048x1152";
|
|
5
|
+
const defaultAoiIconProfileName = "aoiIcon";
|
|
6
|
+
const defaultRegularAiImageProfileName = "regularAiImage";
|
|
7
|
+
const imageProviders = ["openai", "azureOpenai", "flux", "imagen"];
|
|
8
|
+
const openAiGptImageModels = [
|
|
9
|
+
"gpt-image-2",
|
|
10
|
+
"gpt-image-1.5",
|
|
11
|
+
"gpt-image-1",
|
|
12
|
+
"gpt-image-1-mini",
|
|
13
|
+
];
|
|
14
|
+
const openAiDalleImageModels = ["dall-e-3"];
|
|
15
|
+
const openAiGptImageQualities = ["auto", "low", "medium", "high"];
|
|
16
|
+
const openAiDalleImageQualities = ["standard", "hd"];
|
|
17
|
+
const openAiLegacyGptImageSizes = [
|
|
18
|
+
"auto",
|
|
19
|
+
"1024x1024",
|
|
20
|
+
"1536x1024",
|
|
21
|
+
"1024x1536",
|
|
22
|
+
];
|
|
23
|
+
const openAiDalleImageSizes = ["1024x1024", "1792x1024", "1024x1792"];
|
|
24
|
+
const imagenImageModels = [
|
|
25
|
+
"imagen-4.0-generate-001",
|
|
26
|
+
"imagen-4.0-fast-generate-001",
|
|
27
|
+
"imagen-4.0-ultra-generate-001",
|
|
28
|
+
"imagen-3.0-generate-002",
|
|
29
|
+
"imagen-3.0-generate-001",
|
|
30
|
+
"imagen-3.0-fast-generate-001",
|
|
31
|
+
];
|
|
32
|
+
const imagenAspectRatios = ["1:1", "3:4", "4:3", "9:16", "16:9"];
|
|
33
|
+
const imagenResolutionAspectRatios = {
|
|
34
|
+
"1024x1024": "1:1",
|
|
35
|
+
"2048x2048": "1:1",
|
|
36
|
+
"896x1280": "3:4",
|
|
37
|
+
"1792x2560": "3:4",
|
|
38
|
+
"1280x896": "4:3",
|
|
39
|
+
"2560x1792": "4:3",
|
|
40
|
+
"768x1408": "9:16",
|
|
41
|
+
"1536x2816": "9:16",
|
|
42
|
+
"1408x768": "16:9",
|
|
43
|
+
"2816x1536": "16:9",
|
|
44
|
+
};
|
|
45
|
+
const supportedAspectRatioSizes = [
|
|
46
|
+
"1:1",
|
|
47
|
+
"16:9",
|
|
48
|
+
"9:16",
|
|
49
|
+
"4:3",
|
|
50
|
+
"3:4",
|
|
51
|
+
"3:2",
|
|
52
|
+
"2:3",
|
|
53
|
+
"4:5",
|
|
54
|
+
"5:4",
|
|
55
|
+
"21:9",
|
|
56
|
+
"9:21",
|
|
57
|
+
];
|
|
58
|
+
const imageGenerationProfiles = {
|
|
59
|
+
[defaultAoiIconProfileName]: {
|
|
60
|
+
imageProvider: "openai",
|
|
61
|
+
imageModel: "gpt-image-2",
|
|
62
|
+
imageSize: "1024x1024",
|
|
63
|
+
imageQuality: "low",
|
|
64
|
+
imageType: "icon",
|
|
65
|
+
generationContexts: ["aoiIconPublic", "aoiIconAdmin"],
|
|
66
|
+
},
|
|
67
|
+
[defaultRegularAiImageProfileName]: {
|
|
68
|
+
imageProvider: "openai",
|
|
69
|
+
imageModel: "gpt-image-2",
|
|
70
|
+
imageSize: defaultGptImage2LandscapeSize,
|
|
71
|
+
imageQuality: "medium",
|
|
72
|
+
imageType: "logo",
|
|
73
|
+
generationContexts: ["regularAiImage"],
|
|
74
|
+
},
|
|
75
|
+
};
|
|
76
|
+
const uniqueDefined = (values) => [...new Set(values.filter(Boolean))];
|
|
77
|
+
const parsePixelSize = (imageSize) => {
|
|
78
|
+
const match = /^(\d+)x(\d+)$/.exec(imageSize || "");
|
|
79
|
+
if (!match)
|
|
80
|
+
return undefined;
|
|
81
|
+
return {
|
|
82
|
+
width: Number(match[1]),
|
|
83
|
+
height: Number(match[2]),
|
|
84
|
+
};
|
|
85
|
+
};
|
|
86
|
+
const greatestCommonDivisor = (a, b) => b === 0 ? a : greatestCommonDivisor(b, a % b);
|
|
87
|
+
const getAspectRatioForImageSize = (imageSize) => {
|
|
88
|
+
if (!imageSize)
|
|
89
|
+
return undefined;
|
|
90
|
+
if (imagenResolutionAspectRatios[imageSize]) {
|
|
91
|
+
return imagenResolutionAspectRatios[imageSize];
|
|
92
|
+
}
|
|
93
|
+
if (supportedAspectRatioSizes.includes(imageSize))
|
|
94
|
+
return imageSize;
|
|
95
|
+
const parsedSize = parsePixelSize(imageSize);
|
|
96
|
+
if (!parsedSize)
|
|
97
|
+
return undefined;
|
|
98
|
+
const divisor = greatestCommonDivisor(parsedSize.width, parsedSize.height);
|
|
99
|
+
return `${parsedSize.width / divisor}:${parsedSize.height / divisor}`;
|
|
100
|
+
};
|
|
101
|
+
const isValidGptImage2Size = (imageSize) => {
|
|
102
|
+
if (imageSize === "auto")
|
|
103
|
+
return true;
|
|
104
|
+
const parsedSize = parsePixelSize(imageSize);
|
|
105
|
+
if (!parsedSize)
|
|
106
|
+
return false;
|
|
107
|
+
const { width, height } = parsedSize;
|
|
108
|
+
const longEdge = Math.max(width, height);
|
|
109
|
+
const shortEdge = Math.min(width, height);
|
|
110
|
+
const totalPixels = width * height;
|
|
111
|
+
return (width > 0 &&
|
|
112
|
+
height > 0 &&
|
|
113
|
+
longEdge <= 3840 &&
|
|
114
|
+
width % 16 === 0 &&
|
|
115
|
+
height % 16 === 0 &&
|
|
116
|
+
longEdge / shortEdge <= 3 &&
|
|
117
|
+
totalPixels >= 655360 &&
|
|
118
|
+
totalPixels <= 8294400);
|
|
119
|
+
};
|
|
120
|
+
const isValidAspectRatioSize = (imageSize) => supportedAspectRatioSizes.includes(imageSize) || Boolean(parsePixelSize(imageSize));
|
|
121
|
+
const isValidImagenImageSize = (imageSize) => {
|
|
122
|
+
const aspectRatio = getAspectRatioForImageSize(imageSize);
|
|
123
|
+
return Boolean(aspectRatio && imagenAspectRatios.includes(aspectRatio));
|
|
124
|
+
};
|
|
125
|
+
const getAllowedImageModels = (imageProvider) => {
|
|
126
|
+
switch (imageProvider) {
|
|
127
|
+
case "openai":
|
|
128
|
+
return [...openAiGptImageModels, ...openAiDalleImageModels];
|
|
129
|
+
case "azureOpenai":
|
|
130
|
+
return uniqueDefined([process.env.AZURE_OPENAI_API_DALLE_DEPLOYMENT_NAME]);
|
|
131
|
+
case "flux":
|
|
132
|
+
return uniqueDefined([process.env.FLUX_PRO_MODEL_NAME]);
|
|
133
|
+
case "imagen":
|
|
134
|
+
return imagenImageModels;
|
|
135
|
+
default:
|
|
136
|
+
return [];
|
|
137
|
+
}
|
|
138
|
+
};
|
|
139
|
+
const getDefaultImageModelForProvider = (imageProvider) => {
|
|
140
|
+
switch (imageProvider) {
|
|
141
|
+
case "openai":
|
|
142
|
+
return defaultOpenAiImageModel;
|
|
143
|
+
case "azureOpenai":
|
|
144
|
+
return process.env.AZURE_OPENAI_API_DALLE_DEPLOYMENT_NAME;
|
|
145
|
+
case "flux":
|
|
146
|
+
return process.env.FLUX_PRO_MODEL_NAME;
|
|
147
|
+
case "imagen":
|
|
148
|
+
return defaultImagenImageModel;
|
|
149
|
+
default:
|
|
150
|
+
return undefined;
|
|
151
|
+
}
|
|
152
|
+
};
|
|
153
|
+
const getDefaultImageSizeForOptions = (imageProvider, imageModel, imageType) => {
|
|
154
|
+
if (imageProvider === "openai" && imageModel === "gpt-image-2") {
|
|
155
|
+
return imageType === "icon" ? "1024x1024" : defaultGptImage2LandscapeSize;
|
|
156
|
+
}
|
|
157
|
+
if (imageProvider === "openai" && openAiGptImageModels.includes(imageModel)) {
|
|
158
|
+
return imageType === "icon" ? "1024x1024" : "1536x1024";
|
|
159
|
+
}
|
|
160
|
+
if ((imageProvider === "openai" && openAiDalleImageModels.includes(imageModel)) ||
|
|
161
|
+
imageProvider === "azureOpenai") {
|
|
162
|
+
return imageType === "icon" ? "1024x1024" : "1792x1024";
|
|
163
|
+
}
|
|
164
|
+
return undefined;
|
|
165
|
+
};
|
|
166
|
+
const getDefaultImageQualityForOptions = (imageProvider, imageModel) => {
|
|
167
|
+
if (imageProvider === "openai" && openAiGptImageModels.includes(imageModel)) {
|
|
168
|
+
return "medium";
|
|
169
|
+
}
|
|
170
|
+
if ((imageProvider === "openai" && openAiDalleImageModels.includes(imageModel)) ||
|
|
171
|
+
imageProvider === "azureOpenai") {
|
|
172
|
+
return "standard";
|
|
173
|
+
}
|
|
174
|
+
return undefined;
|
|
175
|
+
};
|
|
176
|
+
const validateImageSize = (imageProvider, imageModel, imageSize) => {
|
|
177
|
+
if (!imageSize)
|
|
178
|
+
return undefined;
|
|
179
|
+
if (imageProvider === "openai" && imageModel === "gpt-image-2") {
|
|
180
|
+
return isValidGptImage2Size(imageSize)
|
|
181
|
+
? undefined
|
|
182
|
+
: `Unsupported image size for ${imageModel}: ${imageSize}`;
|
|
183
|
+
}
|
|
184
|
+
if (imageProvider === "openai" && openAiGptImageModels.includes(imageModel)) {
|
|
185
|
+
return openAiLegacyGptImageSizes.includes(imageSize)
|
|
186
|
+
? undefined
|
|
187
|
+
: `Unsupported image size for ${imageModel}: ${imageSize}`;
|
|
188
|
+
}
|
|
189
|
+
if ((imageProvider === "openai" && openAiDalleImageModels.includes(imageModel)) ||
|
|
190
|
+
imageProvider === "azureOpenai") {
|
|
191
|
+
return openAiDalleImageSizes.includes(imageSize)
|
|
192
|
+
? undefined
|
|
193
|
+
: `Unsupported image size for ${imageModel}: ${imageSize}`;
|
|
194
|
+
}
|
|
195
|
+
if (imageProvider === "flux" || imageProvider === "imagen") {
|
|
196
|
+
const isValidSize = imageProvider === "imagen"
|
|
197
|
+
? isValidImagenImageSize(imageSize)
|
|
198
|
+
: isValidAspectRatioSize(imageSize);
|
|
199
|
+
return isValidSize
|
|
200
|
+
? undefined
|
|
201
|
+
: `Unsupported image size for ${imageProvider}: ${imageSize}`;
|
|
202
|
+
}
|
|
203
|
+
return undefined;
|
|
204
|
+
};
|
|
205
|
+
const validateImageQuality = (imageProvider, imageModel, imageQuality) => {
|
|
206
|
+
if (!imageQuality)
|
|
207
|
+
return undefined;
|
|
208
|
+
if (imageProvider === "openai" && openAiGptImageModels.includes(imageModel)) {
|
|
209
|
+
return openAiGptImageQualities.includes(imageQuality)
|
|
210
|
+
? undefined
|
|
211
|
+
: `Unsupported image quality for ${imageModel}: ${imageQuality}`;
|
|
212
|
+
}
|
|
213
|
+
if ((imageProvider === "openai" && openAiDalleImageModels.includes(imageModel)) ||
|
|
214
|
+
imageProvider === "azureOpenai") {
|
|
215
|
+
return openAiDalleImageQualities.includes(imageQuality)
|
|
216
|
+
? undefined
|
|
217
|
+
: `Unsupported image quality for ${imageModel}: ${imageQuality}`;
|
|
218
|
+
}
|
|
219
|
+
return `Image quality is not supported for ${imageProvider}`;
|
|
220
|
+
};
|
|
221
|
+
const normalizeImageGenerationOptions = (imageProvider, imageModel, imageSize, imageQuality) => {
|
|
222
|
+
const normalizedProvider = imageProvider || "openai";
|
|
223
|
+
if (!imageProviders.includes(normalizedProvider)) {
|
|
224
|
+
return {
|
|
225
|
+
error: `Unsupported image provider: ${normalizedProvider}`,
|
|
226
|
+
};
|
|
227
|
+
}
|
|
228
|
+
const normalizedModel = imageModel || getDefaultImageModelForProvider(normalizedProvider);
|
|
229
|
+
if (!normalizedModel) {
|
|
230
|
+
return {
|
|
231
|
+
error: `No image model is configured for provider: ${normalizedProvider}`,
|
|
232
|
+
};
|
|
233
|
+
}
|
|
234
|
+
const allowedModels = getAllowedImageModels(normalizedProvider);
|
|
235
|
+
if (!allowedModels.includes(normalizedModel)) {
|
|
236
|
+
return {
|
|
237
|
+
error: `Unsupported image model for ${normalizedProvider}: ${normalizedModel}`,
|
|
238
|
+
};
|
|
239
|
+
}
|
|
240
|
+
const imageSizeError = validateImageSize(normalizedProvider, normalizedModel, imageSize);
|
|
241
|
+
if (imageSizeError) {
|
|
242
|
+
return { error: imageSizeError };
|
|
243
|
+
}
|
|
244
|
+
const imageQualityError = validateImageQuality(normalizedProvider, normalizedModel, imageQuality);
|
|
245
|
+
if (imageQualityError) {
|
|
246
|
+
return { error: imageQualityError };
|
|
247
|
+
}
|
|
248
|
+
return {
|
|
249
|
+
imageProvider: normalizedProvider,
|
|
250
|
+
imageModel: normalizedModel,
|
|
251
|
+
...(imageSize ? { imageSize } : {}),
|
|
252
|
+
...(imageQuality ? { imageQuality } : {}),
|
|
253
|
+
};
|
|
254
|
+
};
|
|
255
|
+
const getDefaultImageGenerationProfileName = (generationContext) => {
|
|
256
|
+
switch (generationContext) {
|
|
257
|
+
case "aoiIconPublic":
|
|
258
|
+
case "aoiIconAdmin":
|
|
259
|
+
return defaultAoiIconProfileName;
|
|
260
|
+
case "regularAiImage":
|
|
261
|
+
return defaultRegularAiImageProfileName;
|
|
262
|
+
default:
|
|
263
|
+
return undefined;
|
|
264
|
+
}
|
|
265
|
+
};
|
|
266
|
+
const normalizeImageGenerationProfileOptions = (imageGenerationProfile, generationContext, imageType) => {
|
|
267
|
+
const profileName = imageGenerationProfile || getDefaultImageGenerationProfileName(generationContext);
|
|
268
|
+
const profile = imageGenerationProfiles[profileName];
|
|
269
|
+
if (!profile) {
|
|
270
|
+
return {
|
|
271
|
+
error: `Unsupported image generation profile: ${profileName}`,
|
|
272
|
+
};
|
|
273
|
+
}
|
|
274
|
+
if (!profile.generationContexts.includes(generationContext)) {
|
|
275
|
+
return {
|
|
276
|
+
error: `Image generation profile ${profileName} is not allowed for ${generationContext}`,
|
|
277
|
+
};
|
|
278
|
+
}
|
|
279
|
+
if (imageType && imageType !== profile.imageType) {
|
|
280
|
+
return {
|
|
281
|
+
error: `Image generation profile ${profileName} only supports ${profile.imageType} images`,
|
|
282
|
+
};
|
|
283
|
+
}
|
|
284
|
+
const options = normalizeImageGenerationOptions(profile.imageProvider, profile.imageModel, profile.imageSize, profile.imageQuality);
|
|
285
|
+
if (options.error)
|
|
286
|
+
return options;
|
|
287
|
+
return {
|
|
288
|
+
...options,
|
|
289
|
+
imageGenerationProfile: profileName,
|
|
290
|
+
};
|
|
291
|
+
};
|
|
292
|
+
module.exports = {
|
|
293
|
+
defaultOpenAiImageModel,
|
|
294
|
+
defaultImagenImageModel,
|
|
295
|
+
defaultGptImage2LandscapeSize,
|
|
296
|
+
defaultAoiIconProfileName,
|
|
297
|
+
defaultRegularAiImageProfileName,
|
|
298
|
+
imageProviders,
|
|
299
|
+
imageGenerationProfiles,
|
|
300
|
+
openAiGptImageModels,
|
|
301
|
+
openAiDalleImageModels,
|
|
302
|
+
imagenImageModels,
|
|
303
|
+
imagenAspectRatios,
|
|
304
|
+
imagenResolutionAspectRatios,
|
|
305
|
+
openAiGptImageQualities,
|
|
306
|
+
openAiDalleImageQualities,
|
|
307
|
+
openAiLegacyGptImageSizes,
|
|
308
|
+
openAiDalleImageSizes,
|
|
309
|
+
getAspectRatioForImageSize,
|
|
310
|
+
getAllowedImageModels,
|
|
311
|
+
getDefaultImageGenerationProfileName,
|
|
312
|
+
getDefaultImageModelForProvider,
|
|
313
|
+
getDefaultImageSizeForOptions,
|
|
314
|
+
getDefaultImageQualityForOptions,
|
|
315
|
+
isOpenAiGptImageModel: (imageModel) => openAiGptImageModels.includes(imageModel),
|
|
316
|
+
isOpenAiDalleImageModel: (imageModel) => openAiDalleImageModels.includes(imageModel),
|
|
317
|
+
normalizeImageGenerationOptions,
|
|
318
|
+
normalizeImageGenerationProfileOptions,
|
|
319
|
+
};
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
export const defaultOpenAiImageModel: "gpt-image-2";
|
|
2
|
+
export const defaultImagenImageModel: "imagen-4.0-generate-001";
|
|
3
|
+
export const defaultGptImage2LandscapeSize: "2048x1152";
|
|
4
|
+
export const defaultAoiIconProfileName: "aoiIcon";
|
|
5
|
+
export const defaultRegularAiImageProfileName: "regularAiImage";
|
|
6
|
+
export const imageProviders: string[];
|
|
7
|
+
export namespace imageGenerationProfiles {
|
|
8
|
+
namespace aoiIcon {
|
|
9
|
+
let imageProvider: string;
|
|
10
|
+
let imageModel: string;
|
|
11
|
+
let imageSize: string;
|
|
12
|
+
let imageQuality: string;
|
|
13
|
+
let imageType: string;
|
|
14
|
+
let generationContexts: string[];
|
|
15
|
+
}
|
|
16
|
+
namespace regularAiImage {
|
|
17
|
+
let imageProvider_1: string;
|
|
18
|
+
export { imageProvider_1 as imageProvider };
|
|
19
|
+
let imageModel_1: string;
|
|
20
|
+
export { imageModel_1 as imageModel };
|
|
21
|
+
export { defaultGptImage2LandscapeSize as imageSize };
|
|
22
|
+
let imageQuality_1: string;
|
|
23
|
+
export { imageQuality_1 as imageQuality };
|
|
24
|
+
let imageType_1: string;
|
|
25
|
+
export { imageType_1 as imageType };
|
|
26
|
+
let generationContexts_1: string[];
|
|
27
|
+
export { generationContexts_1 as generationContexts };
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
export const openAiGptImageModels: string[];
|
|
31
|
+
export const openAiDalleImageModels: string[];
|
|
32
|
+
export const imagenImageModels: string[];
|
|
33
|
+
export const imagenAspectRatios: string[];
|
|
34
|
+
export const imagenResolutionAspectRatios: {
|
|
35
|
+
"1024x1024": string;
|
|
36
|
+
"2048x2048": string;
|
|
37
|
+
"896x1280": string;
|
|
38
|
+
"1792x2560": string;
|
|
39
|
+
"1280x896": string;
|
|
40
|
+
"2560x1792": string;
|
|
41
|
+
"768x1408": string;
|
|
42
|
+
"1536x2816": string;
|
|
43
|
+
"1408x768": string;
|
|
44
|
+
"2816x1536": string;
|
|
45
|
+
};
|
|
46
|
+
export const openAiGptImageQualities: string[];
|
|
47
|
+
export const openAiDalleImageQualities: string[];
|
|
48
|
+
export const openAiLegacyGptImageSizes: string[];
|
|
49
|
+
export const openAiDalleImageSizes: string[];
|
|
50
|
+
export function getAspectRatioForImageSize(imageSize: any): any;
|
|
51
|
+
export function getAllowedImageModels(imageProvider: any): any[];
|
|
52
|
+
export function getDefaultImageGenerationProfileName(generationContext: any): "aoiIcon" | "regularAiImage" | undefined;
|
|
53
|
+
export function getDefaultImageModelForProvider(imageProvider: any): string | undefined;
|
|
54
|
+
export function getDefaultImageSizeForOptions(imageProvider: any, imageModel: any, imageType: any): "2048x1152" | "1024x1024" | "1536x1024" | "1792x1024" | undefined;
|
|
55
|
+
export function getDefaultImageQualityForOptions(imageProvider: any, imageModel: any): "medium" | "standard" | undefined;
|
|
56
|
+
export function normalizeImageGenerationOptions(imageProvider: any, imageModel: any, imageSize: any, imageQuality: any): {
|
|
57
|
+
error: string;
|
|
58
|
+
} | {
|
|
59
|
+
imageQuality?: any;
|
|
60
|
+
imageSize?: any;
|
|
61
|
+
imageProvider: any;
|
|
62
|
+
imageModel: any;
|
|
63
|
+
error?: undefined;
|
|
64
|
+
};
|
|
65
|
+
export function normalizeImageGenerationProfileOptions(imageGenerationProfile: any, generationContext: any, imageType: any): {
|
|
66
|
+
error: string;
|
|
67
|
+
} | {
|
|
68
|
+
imageGenerationProfile: any;
|
|
69
|
+
error: string;
|
|
70
|
+
} | {
|
|
71
|
+
imageGenerationProfile: any;
|
|
72
|
+
imageQuality?: any;
|
|
73
|
+
imageSize?: any;
|
|
74
|
+
imageProvider: any;
|
|
75
|
+
imageModel: any;
|
|
76
|
+
error?: undefined;
|
|
77
|
+
};
|
|
78
|
+
export declare function isOpenAiGptImageModel(imageModel: any): boolean;
|
|
79
|
+
export declare function isOpenAiDalleImageModel(imageModel: any): boolean;
|
|
@@ -1,16 +1,15 @@
|
|
|
1
|
-
import { IImageGenerator, YpAiGenerateImageTypes } from "./iImageGenerator.js";
|
|
1
|
+
import { IImageGenerator, YpAiGenerateImageTypes, YpImageGenerationOptions } from "./iImageGenerator.js";
|
|
2
2
|
import { S3Service } from "./s3Service.js";
|
|
3
3
|
export declare class ImagenImageGenerator implements IImageGenerator {
|
|
4
4
|
private s3Service;
|
|
5
5
|
private maxRetryCount;
|
|
6
6
|
private projectId;
|
|
7
7
|
private location;
|
|
8
|
-
private endpoint;
|
|
9
8
|
private s3Bucket;
|
|
10
9
|
constructor(s3Service: S3Service);
|
|
11
10
|
/**
|
|
12
11
|
* Generates an image from a text prompt using Vertex AI Imagen
|
|
13
12
|
* and returns a public S3 URL to the uploaded image.
|
|
14
13
|
*/
|
|
15
|
-
generateImageUrl(prompt: string, type?: YpAiGenerateImageTypes): Promise<string | undefined>;
|
|
14
|
+
generateImageUrl(prompt: string, type?: YpAiGenerateImageTypes, options?: YpImageGenerationOptions): Promise<string | undefined>;
|
|
16
15
|
}
|
|
@@ -4,6 +4,8 @@ import { v4 as uuidv4 } from "uuid";
|
|
|
4
4
|
import { PredictionServiceClient } from "@google-cloud/aiplatform";
|
|
5
5
|
import { helpers } from "@google-cloud/aiplatform";
|
|
6
6
|
import log from "../../../utils/loggerTs.js";
|
|
7
|
+
import imageModelConfig from "./imageModelConfig.cjs";
|
|
8
|
+
const { defaultImagenImageModel, getAspectRatioForImageSize } = imageModelConfig;
|
|
7
9
|
export class ImagenImageGenerator {
|
|
8
10
|
constructor(s3Service) {
|
|
9
11
|
this.s3Service = s3Service;
|
|
@@ -11,8 +13,6 @@ export class ImagenImageGenerator {
|
|
|
11
13
|
// Pull these from your environment or config
|
|
12
14
|
this.projectId = process.env.GOOGLE_CLOUD_PROJECT_ID || "";
|
|
13
15
|
this.location = process.env.GOOGLE_CLOUD_IMAGEN_LOCATION || "us-east1";
|
|
14
|
-
// Matches the official endpoint for Imagen v3.0:
|
|
15
|
-
this.endpoint = `projects/${this.projectId}/locations/${this.location}/publishers/google/models/imagen-3.0-generate-002`;
|
|
16
16
|
this.s3Bucket = process.env.S3_BUCKET || "";
|
|
17
17
|
if (!this.projectId) {
|
|
18
18
|
log.warn("Warning: GOOGLE_CLOUD_PROJECT_ID is not set. Vertex AI calls may fail.");
|
|
@@ -25,9 +25,11 @@ export class ImagenImageGenerator {
|
|
|
25
25
|
* Generates an image from a text prompt using Vertex AI Imagen
|
|
26
26
|
* and returns a public S3 URL to the uploaded image.
|
|
27
27
|
*/
|
|
28
|
-
async generateImageUrl(prompt, type = "logo") {
|
|
28
|
+
async generateImageUrl(prompt, type = "logo", options) {
|
|
29
29
|
let retryCount = 0;
|
|
30
30
|
let finalUrl;
|
|
31
|
+
const imageModel = options?.imageModel || defaultImagenImageModel;
|
|
32
|
+
const endpoint = `projects/${this.projectId}/locations/${this.location}/publishers/google/models/${imageModel}`;
|
|
31
33
|
// Configure the API endpoint for Vertex AI
|
|
32
34
|
const clientOptions = {
|
|
33
35
|
apiEndpoint: `${this.location}-aiplatform.googleapis.com`,
|
|
@@ -43,17 +45,15 @@ export class ImagenImageGenerator {
|
|
|
43
45
|
const instances = [instanceValue];
|
|
44
46
|
const parameter = {
|
|
45
47
|
sampleCount: 1,
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
safetyFilterLevel: "block_some",
|
|
51
|
-
personGeneration: "allow_adult",
|
|
48
|
+
aspectRatio: options?.imageSize
|
|
49
|
+
? getAspectRatioForImageSize(options.imageSize)
|
|
50
|
+
: "16:9",
|
|
51
|
+
safetySetting: "block_medium_and_above",
|
|
52
52
|
};
|
|
53
53
|
const parameters = helpers.toValue(parameter);
|
|
54
54
|
// 2) Build the predict request
|
|
55
55
|
const request = {
|
|
56
|
-
endpoint
|
|
56
|
+
endpoint,
|
|
57
57
|
instances,
|
|
58
58
|
parameters,
|
|
59
59
|
};
|