@yrpri/api 9.0.231 → 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 +2 -2
- 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
|
@@ -1 +1,20 @@
|
|
|
1
|
-
export {
|
|
1
|
+
export class FraudScannerNotifier {
|
|
2
|
+
currentCommunity: (import("sequelize").Model<YpCommunityData, Partial<YpCommunityData>> & YpCommunityData) | null;
|
|
3
|
+
uniqueCollectionItemsIds: {};
|
|
4
|
+
collectionsToScan: string[];
|
|
5
|
+
scannerModels: (typeof FraudGetPoints)[];
|
|
6
|
+
resetCounts(): void;
|
|
7
|
+
getCommunityURL(): string;
|
|
8
|
+
setupCounts(items: any, collectionType: any): void;
|
|
9
|
+
capitalizeFirstLetter(string: any): any;
|
|
10
|
+
formatNumber(value: any): any;
|
|
11
|
+
getNumberSign(number: any): "" | "+";
|
|
12
|
+
sendNotificationEmails(fraudAuditResults: any): Promise<void>;
|
|
13
|
+
getContainerOldCount(collectionType: any): any;
|
|
14
|
+
getWithDifference(results: any): any;
|
|
15
|
+
notify(): Promise<void>;
|
|
16
|
+
scan(): Promise<void>;
|
|
17
|
+
scanAndNotify(): Promise<any>;
|
|
18
|
+
}
|
|
19
|
+
export function runFraudScannerNotifier(): void;
|
|
20
|
+
import FraudGetPoints = require("./FraudGetPoints.cjs");
|
|
@@ -26,6 +26,8 @@ export declare class YpBaseChatBot {
|
|
|
26
26
|
sendAgentUpdate(message: string): void;
|
|
27
27
|
sendToClient(sender: YpSenderType, message: string, type?: YpAssistantMessageType, uniqueToken?: string | undefined, hiddenContextMessage?: boolean): void;
|
|
28
28
|
streamWebSocketResponses(stream: AsyncIterable<OpenAI.Chat.Completions.ChatCompletionChunk>): Promise<void>;
|
|
29
|
+
usesMaxCompletionTokens(modelName: string): boolean;
|
|
30
|
+
getStreamingChatCompletionParams(messages: OpenAI.Chat.Completions.ChatCompletionMessageParam[]): OpenAI.Chat.Completions.ChatCompletionCreateParamsStreaming;
|
|
29
31
|
saveMemoryIfNeeded(): Promise<void>;
|
|
30
32
|
setChatLog(chatLog: YpSimpleChatLog[]): Promise<void>;
|
|
31
33
|
conversation(chatLog: YpSimpleChatLog[]): Promise<void>;
|
|
@@ -41,6 +41,7 @@ export class YpBaseChatBot {
|
|
|
41
41
|
this.wsClientId = wsClientId;
|
|
42
42
|
this.wsClientSocket = wsClients.get(this.wsClientId);
|
|
43
43
|
this.wsClients = wsClients;
|
|
44
|
+
this.memory = { chatLog: [] };
|
|
44
45
|
log.info(`WebSockets: BaseChatBot constructor for ${this.wsClientId}`);
|
|
45
46
|
if (!this.wsClientSocket) {
|
|
46
47
|
log.error(`WebSockets: WS Client ${this.wsClientId} not found in streamWebSocketResponses`);
|
|
@@ -126,8 +127,11 @@ export class YpBaseChatBot {
|
|
|
126
127
|
try {
|
|
127
128
|
let botMessage = "";
|
|
128
129
|
for await (const part of stream) {
|
|
129
|
-
|
|
130
|
-
|
|
130
|
+
const content = part.choices[0].delta.content;
|
|
131
|
+
if (content) {
|
|
132
|
+
this.sendToClient("assistant", content);
|
|
133
|
+
botMessage += content;
|
|
134
|
+
}
|
|
131
135
|
if (part.choices[0].finish_reason == "stop") {
|
|
132
136
|
this.memory.chatLog.push({
|
|
133
137
|
sender: "assistant",
|
|
@@ -149,6 +153,24 @@ export class YpBaseChatBot {
|
|
|
149
153
|
resolve();
|
|
150
154
|
});
|
|
151
155
|
}
|
|
156
|
+
usesMaxCompletionTokens(modelName) {
|
|
157
|
+
return modelName.startsWith("gpt-5");
|
|
158
|
+
}
|
|
159
|
+
getStreamingChatCompletionParams(messages) {
|
|
160
|
+
const requestParams = {
|
|
161
|
+
model: this.llmModel,
|
|
162
|
+
messages,
|
|
163
|
+
stream: true,
|
|
164
|
+
};
|
|
165
|
+
if (this.usesMaxCompletionTokens(this.llmModel)) {
|
|
166
|
+
requestParams.max_completion_tokens = this.maxTokens;
|
|
167
|
+
}
|
|
168
|
+
else {
|
|
169
|
+
requestParams.max_tokens = this.maxTokens;
|
|
170
|
+
requestParams.temperature = this.temperature;
|
|
171
|
+
}
|
|
172
|
+
return requestParams;
|
|
173
|
+
}
|
|
152
174
|
async saveMemoryIfNeeded() {
|
|
153
175
|
if (this.persistMemory) {
|
|
154
176
|
await this.saveMemory();
|
|
@@ -171,13 +193,7 @@ export class YpBaseChatBot {
|
|
|
171
193
|
content: this.renderSystemPrompt(),
|
|
172
194
|
};
|
|
173
195
|
messages.unshift(systemMessage);
|
|
174
|
-
const stream = await this.openaiClient.chat.completions.create(
|
|
175
|
-
model: this.llmModel,
|
|
176
|
-
messages,
|
|
177
|
-
max_tokens: this.maxTokens,
|
|
178
|
-
temperature: this.temperature,
|
|
179
|
-
stream: true,
|
|
180
|
-
});
|
|
196
|
+
const stream = await this.openaiClient.chat.completions.create(this.getStreamingChatCompletionParams(messages));
|
|
181
197
|
this.streamWebSocketResponses(stream);
|
|
182
198
|
}
|
|
183
199
|
}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { IImageGenerator, YpAiGenerateImageTypes } from "./iImageGenerator.js";
|
|
1
|
+
import { IImageGenerator, YpAiGenerateImageTypes, YpImageGenerationOptions } from "./iImageGenerator.js";
|
|
2
2
|
export declare class ChatGptImageGenerator implements IImageGenerator {
|
|
3
3
|
private readonly maxRetryCount;
|
|
4
4
|
private readonly openAiKey?;
|
|
@@ -8,6 +8,6 @@ export declare class ChatGptImageGenerator implements IImageGenerator {
|
|
|
8
8
|
* The returned link remains live for ~60 minutes – be sure to download
|
|
9
9
|
* or cache it right away in the calling service.
|
|
10
10
|
*/
|
|
11
|
-
generateImageUrl(prompt: string, type?: YpAiGenerateImageTypes): Promise<string | undefined>;
|
|
11
|
+
generateImageUrl(prompt: string, type?: YpAiGenerateImageTypes, options?: YpImageGenerationOptions): Promise<string | undefined>;
|
|
12
12
|
}
|
|
13
13
|
export default ChatGptImageGenerator;
|
|
@@ -1,6 +1,8 @@
|
|
|
1
1
|
// chatGptImageGenerator.ts
|
|
2
2
|
import { OpenAI } from "openai";
|
|
3
3
|
import log from "../../../utils/loggerTs.js";
|
|
4
|
+
import imageModelConfig from "./imageModelConfig.cjs";
|
|
5
|
+
const { defaultOpenAiImageModel, getDefaultImageQualityForOptions, getDefaultImageSizeForOptions, } = imageModelConfig;
|
|
4
6
|
export class ChatGptImageGenerator {
|
|
5
7
|
constructor(openAiKey) {
|
|
6
8
|
this.maxRetryCount = 3;
|
|
@@ -12,14 +14,15 @@ export class ChatGptImageGenerator {
|
|
|
12
14
|
* The returned link remains live for ~60 minutes – be sure to download
|
|
13
15
|
* or cache it right away in the calling service.
|
|
14
16
|
*/
|
|
15
|
-
async generateImageUrl(prompt, type = "logo") {
|
|
17
|
+
async generateImageUrl(prompt, type = "logo", options) {
|
|
16
18
|
const client = new OpenAI({ apiKey: this.openAiKey });
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
19
|
+
const model = options?.imageModel || defaultOpenAiImageModel;
|
|
20
|
+
const size = options?.imageSize ||
|
|
21
|
+
getDefaultImageSizeForOptions("openai", model, type) ||
|
|
22
|
+
"1536x1024";
|
|
23
|
+
const quality = options?.imageQuality ||
|
|
24
|
+
getDefaultImageQualityForOptions("openai", model) ||
|
|
25
|
+
"medium";
|
|
23
26
|
const finalPrompt = `
|
|
24
27
|
${prompt}
|
|
25
28
|
|
|
@@ -30,11 +33,11 @@ export class ChatGptImageGenerator {
|
|
|
30
33
|
while (retryCount < this.maxRetryCount) {
|
|
31
34
|
try {
|
|
32
35
|
const res = await client.images.generate({
|
|
33
|
-
model
|
|
36
|
+
model,
|
|
34
37
|
prompt: finalPrompt,
|
|
35
|
-
quality:
|
|
38
|
+
quality: quality,
|
|
36
39
|
n: 1,
|
|
37
|
-
size,
|
|
40
|
+
size: size,
|
|
38
41
|
});
|
|
39
42
|
log.info("res", JSON.stringify(res, null, 2));
|
|
40
43
|
const b64Json = res?.data?.[0]?.b64_json;
|
|
@@ -11,12 +11,13 @@ import log from "../../../utils/loggerTs.js";
|
|
|
11
11
|
import models from "../../../models/index.cjs";
|
|
12
12
|
import { ImagenImageGenerator } from "./imagenImageGenerator.js";
|
|
13
13
|
import { ChatGptImageGenerator } from "./chatGptImageGenerator.js";
|
|
14
|
+
import imageModelConfig from "./imageModelConfig.cjs";
|
|
14
15
|
// For reference, in your code:
|
|
15
16
|
const dbModels = models;
|
|
16
17
|
const Image = dbModels.Image;
|
|
17
18
|
const AcBackgroundJob = dbModels.AcBackgroundJob;
|
|
18
19
|
const disableFlux = false;
|
|
19
|
-
const
|
|
20
|
+
const { isOpenAiDalleImageModel, isOpenAiGptImageModel, normalizeImageGenerationOptions, } = imageModelConfig;
|
|
20
21
|
export class CollectionImageGenerator {
|
|
21
22
|
constructor() {
|
|
22
23
|
this.s3Service = new S3Service(process.env.CLOUDFLARE_API_KEY, process.env.CLOUDFLARE_ZONE_ID);
|
|
@@ -29,7 +30,7 @@ export class CollectionImageGenerator {
|
|
|
29
30
|
}
|
|
30
31
|
this.dalleImageGenerator = new DalleImageGenerator(process.env.AZURE_OPENAI_API_BASE, process.env.AZURE_OPENAI_API_KEY, process.env.AZURE_OPENAI_API_DALLE_DEPLOYMENT_NAME, process.env.OPENAI_API_KEY);
|
|
31
32
|
this.chatGptImageGenerator = new ChatGptImageGenerator(process.env.OPENAI_API_KEY);
|
|
32
|
-
if (
|
|
33
|
+
if (process.env.GOOGLE_CLOUD_PROJECT_ID) {
|
|
33
34
|
this.imagenImageGenerator = new ImagenImageGenerator(this.s3Service);
|
|
34
35
|
}
|
|
35
36
|
}
|
|
@@ -44,29 +45,46 @@ export class CollectionImageGenerator {
|
|
|
44
45
|
const s3ImagePath = `ypGenAi/${workPackage.collectionType}/${workPackage.collectionId}/${uuidv4()}.png`;
|
|
45
46
|
try {
|
|
46
47
|
let imageGenerator;
|
|
47
|
-
|
|
48
|
-
if (
|
|
48
|
+
const rawImageOptions = normalizeImageGenerationOptions(workPackage.imageProvider, workPackage.imageModel, workPackage.imageSize, workPackage.imageQuality);
|
|
49
|
+
if (rawImageOptions.error) {
|
|
50
|
+
return reject(rawImageOptions.error);
|
|
51
|
+
}
|
|
52
|
+
const imageOptions = rawImageOptions;
|
|
53
|
+
if (imageOptions.imageProvider === "imagen") {
|
|
54
|
+
if (!this.imagenImageGenerator) {
|
|
55
|
+
return reject("Imagen image generator is not configured.");
|
|
56
|
+
}
|
|
49
57
|
imageGenerator = this.imagenImageGenerator;
|
|
50
|
-
log.info(
|
|
58
|
+
log.info(`Using ImagenImageGenerator: ${imageOptions.imageModel}`);
|
|
51
59
|
}
|
|
52
|
-
else if (
|
|
60
|
+
else if (imageOptions.imageProvider === "flux") {
|
|
61
|
+
if (!this.fluxImageGenerator) {
|
|
62
|
+
return reject("Flux image generator is not configured.");
|
|
63
|
+
}
|
|
53
64
|
imageGenerator = this.fluxImageGenerator;
|
|
54
|
-
log.info(
|
|
65
|
+
log.info(`Using FluxImageGenerator: ${imageOptions.imageModel}`);
|
|
66
|
+
}
|
|
67
|
+
else if (imageOptions.imageProvider === "azureOpenai") {
|
|
68
|
+
imageGenerator = this.dalleImageGenerator;
|
|
69
|
+
log.info(`Using Azure OpenAI image generator: ${imageOptions.imageModel}`);
|
|
70
|
+
}
|
|
71
|
+
else if (isOpenAiDalleImageModel(imageOptions.imageModel)) {
|
|
72
|
+
imageGenerator = this.dalleImageGenerator;
|
|
73
|
+
log.info(`Using DalleImageGenerator: ${imageOptions.imageModel}`);
|
|
55
74
|
}
|
|
56
|
-
else if (
|
|
75
|
+
else if (isOpenAiGptImageModel(imageOptions.imageModel)) {
|
|
57
76
|
imageGenerator = this.chatGptImageGenerator;
|
|
58
|
-
log.info(
|
|
77
|
+
log.info(`Using ChatGptImageGenerator: ${imageOptions.imageModel}`);
|
|
59
78
|
}
|
|
60
79
|
else {
|
|
61
|
-
|
|
62
|
-
log.info("Using DalleImageGenerator");
|
|
80
|
+
return reject(`Unsupported OpenAI image model: ${imageOptions.imageModel}`);
|
|
63
81
|
}
|
|
64
82
|
// 1) Generate image
|
|
65
|
-
const imageUrl = await imageGenerator.generateImageUrl(workPackage.prompt, workPackage.imageType);
|
|
83
|
+
const imageUrl = await imageGenerator.generateImageUrl(workPackage.prompt, workPackage.imageType, imageOptions);
|
|
66
84
|
if (!imageUrl) {
|
|
67
85
|
return reject("Error getting image URL from prompt.");
|
|
68
86
|
}
|
|
69
|
-
if (
|
|
87
|
+
if (imageOptions.imageProvider === "imagen") {
|
|
70
88
|
newImageUrl = imageUrl;
|
|
71
89
|
}
|
|
72
90
|
else {
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { IImageGenerator, YpAiGenerateImageTypes } from "./iImageGenerator.js";
|
|
1
|
+
import { IImageGenerator, YpAiGenerateImageTypes, YpImageGenerationOptions } from "./iImageGenerator.js";
|
|
2
2
|
export declare class DalleImageGenerator implements IImageGenerator {
|
|
3
3
|
private maxRetryCount;
|
|
4
4
|
private azureOpenaAiBase?;
|
|
@@ -6,5 +6,5 @@ export declare class DalleImageGenerator implements IImageGenerator {
|
|
|
6
6
|
private azureDalleDeployment?;
|
|
7
7
|
private openAiKey?;
|
|
8
8
|
constructor(azureOpenaAiBase: string | undefined, azureOpenAiApiKey: string | undefined, azureDalleDeployment: string | undefined, openAiKey: string | undefined);
|
|
9
|
-
generateImageUrl(prompt: string, type?: YpAiGenerateImageTypes): Promise<string | undefined>;
|
|
9
|
+
generateImageUrl(prompt: string, type?: YpAiGenerateImageTypes, options?: YpImageGenerationOptions): Promise<string | undefined>;
|
|
10
10
|
}
|
|
@@ -1,5 +1,7 @@
|
|
|
1
1
|
import { AzureOpenAI, OpenAI } from "openai";
|
|
2
2
|
import log from "../../../utils/loggerTs.js";
|
|
3
|
+
import imageModelConfig from "./imageModelConfig.cjs";
|
|
4
|
+
const { getDefaultImageQualityForOptions, getDefaultImageSizeForOptions, } = imageModelConfig;
|
|
3
5
|
export class DalleImageGenerator {
|
|
4
6
|
constructor(azureOpenaAiBase, azureOpenAiApiKey, azureDalleDeployment, openAiKey) {
|
|
5
7
|
this.maxRetryCount = 3;
|
|
@@ -8,17 +10,30 @@ export class DalleImageGenerator {
|
|
|
8
10
|
this.azureDalleDeployment = azureDalleDeployment;
|
|
9
11
|
this.openAiKey = openAiKey;
|
|
10
12
|
}
|
|
11
|
-
async generateImageUrl(prompt, type = "logo") {
|
|
13
|
+
async generateImageUrl(prompt, type = "logo", options) {
|
|
12
14
|
let client;
|
|
13
15
|
let result;
|
|
14
16
|
let retryCount = 0;
|
|
15
17
|
let retrying = true;
|
|
18
|
+
const hasAzureOpenAiConfig = Boolean(this.azureOpenaAiBase &&
|
|
19
|
+
this.azureOpenAiApiKey &&
|
|
20
|
+
this.azureDalleDeployment);
|
|
21
|
+
const useAzureOpenAi = options?.imageProvider === "azureOpenai" ||
|
|
22
|
+
(!options?.imageProvider && hasAzureOpenAiConfig);
|
|
23
|
+
const requestedModel = options?.imageModel ||
|
|
24
|
+
(useAzureOpenAi ? this.azureDalleDeployment : undefined) ||
|
|
25
|
+
"dall-e-3";
|
|
26
|
+
const imageProvider = useAzureOpenAi ? "azureOpenai" : "openai";
|
|
16
27
|
// Decide which client to instantiate (Azure vs. standard OpenAI)
|
|
17
|
-
if (
|
|
28
|
+
if (useAzureOpenAi) {
|
|
29
|
+
if (!this.azureOpenaAiBase || !this.azureOpenAiApiKey) {
|
|
30
|
+
log.error("Azure OpenAI image generator is not configured.");
|
|
31
|
+
return undefined;
|
|
32
|
+
}
|
|
18
33
|
client = new AzureOpenAI({
|
|
19
34
|
apiKey: this.azureOpenAiApiKey,
|
|
20
35
|
endpoint: this.azureOpenaAiBase,
|
|
21
|
-
deployment:
|
|
36
|
+
deployment: requestedModel,
|
|
22
37
|
apiVersion: "2024-10-21",
|
|
23
38
|
});
|
|
24
39
|
}
|
|
@@ -28,33 +43,30 @@ export class DalleImageGenerator {
|
|
|
28
43
|
apiKey: this.openAiKey,
|
|
29
44
|
});
|
|
30
45
|
}
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
size = "1024x1024";
|
|
38
|
-
}
|
|
39
|
-
const modelQuality = "standard";
|
|
46
|
+
const size = options?.imageSize ||
|
|
47
|
+
getDefaultImageSizeForOptions(imageProvider, requestedModel, type) ||
|
|
48
|
+
"1792x1024";
|
|
49
|
+
const modelQuality = options?.imageQuality ||
|
|
50
|
+
getDefaultImageQualityForOptions(imageProvider, requestedModel) ||
|
|
51
|
+
"standard";
|
|
40
52
|
while (retrying && retryCount < this.maxRetryCount) {
|
|
41
53
|
try {
|
|
42
54
|
// If using Azure OpenAI
|
|
43
|
-
if (
|
|
55
|
+
if (useAzureOpenAi) {
|
|
44
56
|
result = await client.images.generate({
|
|
45
57
|
prompt,
|
|
46
58
|
n: 1,
|
|
47
|
-
size,
|
|
59
|
+
size: size,
|
|
48
60
|
quality: modelQuality,
|
|
49
61
|
});
|
|
50
62
|
}
|
|
51
63
|
else {
|
|
52
64
|
// Standard OpenAI
|
|
53
65
|
result = await client.images.generate({
|
|
54
|
-
model:
|
|
66
|
+
model: requestedModel,
|
|
55
67
|
prompt,
|
|
56
68
|
n: 1,
|
|
57
|
-
size,
|
|
69
|
+
size: size,
|
|
58
70
|
quality: modelQuality,
|
|
59
71
|
});
|
|
60
72
|
}
|
|
@@ -1,9 +1,9 @@
|
|
|
1
|
-
import { IImageGenerator, YpAiGenerateImageTypes } from "./iImageGenerator.js";
|
|
1
|
+
import { IImageGenerator, YpAiGenerateImageTypes, YpImageGenerationOptions } from "./iImageGenerator.js";
|
|
2
2
|
export declare class FluxImageGenerator implements IImageGenerator {
|
|
3
3
|
private replicateApiKey;
|
|
4
4
|
private fluxProModelName;
|
|
5
5
|
private replicate;
|
|
6
6
|
private maxRetryCount;
|
|
7
7
|
constructor(replicateApiKey: string, fluxProModelName: string);
|
|
8
|
-
generateImageUrl(prompt: string, type?: YpAiGenerateImageTypes): Promise<string | undefined>;
|
|
8
|
+
generateImageUrl(prompt: string, type?: YpAiGenerateImageTypes, options?: YpImageGenerationOptions): Promise<string | undefined>;
|
|
9
9
|
}
|
|
@@ -1,5 +1,7 @@
|
|
|
1
1
|
import Replicate from "replicate";
|
|
2
2
|
import log from "../../../utils/loggerTs.js";
|
|
3
|
+
import imageModelConfig from "./imageModelConfig.cjs";
|
|
4
|
+
const { getAspectRatioForImageSize } = imageModelConfig;
|
|
3
5
|
export class FluxImageGenerator {
|
|
4
6
|
constructor(replicateApiKey, fluxProModelName) {
|
|
5
7
|
this.replicateApiKey = replicateApiKey;
|
|
@@ -7,14 +9,17 @@ export class FluxImageGenerator {
|
|
|
7
9
|
this.maxRetryCount = 3;
|
|
8
10
|
this.replicate = new Replicate({ auth: replicateApiKey });
|
|
9
11
|
}
|
|
10
|
-
async generateImageUrl(prompt, type = "logo") {
|
|
12
|
+
async generateImageUrl(prompt, type = "logo", options) {
|
|
11
13
|
let retryCount = 0;
|
|
12
14
|
let retrying = true;
|
|
13
15
|
let result;
|
|
14
16
|
// Configure the input to replicate’s model
|
|
15
17
|
const input = { prompt };
|
|
16
18
|
// Assign aspect ratio depending on type
|
|
17
|
-
if (
|
|
19
|
+
if (options?.imageSize) {
|
|
20
|
+
input.aspect_ratio = getAspectRatioForImageSize(options.imageSize);
|
|
21
|
+
}
|
|
22
|
+
else if (type === "logo") {
|
|
18
23
|
input.aspect_ratio = "16:9";
|
|
19
24
|
}
|
|
20
25
|
else if (type === "icon") {
|
|
@@ -25,7 +30,8 @@ export class FluxImageGenerator {
|
|
|
25
30
|
}
|
|
26
31
|
while (retrying && retryCount < this.maxRetryCount) {
|
|
27
32
|
try {
|
|
28
|
-
|
|
33
|
+
const modelName = options?.imageModel || this.fluxProModelName;
|
|
34
|
+
result = await this.replicate.run(modelName, {
|
|
29
35
|
input,
|
|
30
36
|
});
|
|
31
37
|
if (result) {
|
|
@@ -1,7 +1,14 @@
|
|
|
1
1
|
export type YpAiGenerateImageTypes = "logo" | "icon" | "other";
|
|
2
|
+
export type YpAiGenerateImageProvider = "openai" | "azureOpenai" | "flux" | "imagen";
|
|
3
|
+
export interface YpImageGenerationOptions {
|
|
4
|
+
imageProvider?: YpAiGenerateImageProvider;
|
|
5
|
+
imageModel?: string;
|
|
6
|
+
imageSize?: string;
|
|
7
|
+
imageQuality?: string;
|
|
8
|
+
}
|
|
2
9
|
export interface IImageGenerator {
|
|
3
10
|
/**
|
|
4
11
|
* Generates an image URL given a prompt and a type (logo, icon, etc.)
|
|
5
12
|
*/
|
|
6
|
-
generateImageUrl(prompt: string, type: YpAiGenerateImageTypes): Promise<string | undefined>;
|
|
13
|
+
generateImageUrl(prompt: string, type: YpAiGenerateImageTypes, options?: YpImageGenerationOptions): Promise<string | undefined>;
|
|
7
14
|
}
|