@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.
Files changed (68) hide show
  1. package/controllers/allOurIdeas.js +1 -1
  2. package/controllers/communities.cjs +282 -91
  3. package/controllers/domains.cjs +54 -8
  4. package/controllers/groups.cjs +51 -6
  5. package/controllers/points.cjs +4 -9
  6. package/controllers/posts.cjs +7 -9
  7. package/controllers/ratings.cjs +3 -6
  8. package/models/point.cjs +31 -3
  9. package/models/post.cjs +2 -3
  10. package/package.json +3 -3
  11. package/services/engine/allOurIdeas/aiHelper.d.ts +7 -4
  12. package/services/engine/allOurIdeas/aiHelper.js +34 -19
  13. package/services/engine/allOurIdeas/explainAnswersAssistant.d.ts +1 -1
  14. package/services/engine/allOurIdeas/explainAnswersAssistant.js +3 -9
  15. package/services/engine/moderation/fraud/CreateFraudAuditReport.cjs +35 -11
  16. package/services/engine/moderation/fraud/CreateFraudAuditReport.d.cts +21 -0
  17. package/services/engine/moderation/fraud/FraudBase.cjs +38 -18
  18. package/services/engine/moderation/fraud/FraudBase.d.cts +2 -0
  19. package/services/engine/moderation/fraud/FraudDeleteBase.cjs +48 -29
  20. package/services/engine/moderation/fraud/FraudDeleteBase.d.cts +8 -6
  21. package/services/engine/moderation/fraud/FraudDeleteEndorsements.cjs +5 -4
  22. package/services/engine/moderation/fraud/FraudDeleteEndorsements.d.cts +2 -2
  23. package/services/engine/moderation/fraud/FraudDeletePointQualities.cjs +3 -2
  24. package/services/engine/moderation/fraud/FraudDeletePointQualities.d.cts +1 -1
  25. package/services/engine/moderation/fraud/FraudDeletePoints.cjs +3 -2
  26. package/services/engine/moderation/fraud/FraudDeletePoints.d.cts +1 -1
  27. package/services/engine/moderation/fraud/FraudDeletePosts.cjs +3 -2
  28. package/services/engine/moderation/fraud/FraudDeleteRatings.cjs +61 -4
  29. package/services/engine/moderation/fraud/FraudGetBase.cjs +44 -20
  30. package/services/engine/moderation/fraud/FraudGetBase.d.cts +5 -0
  31. package/services/engine/moderation/fraud/FraudGetEndorsements.cjs +4 -13
  32. package/services/engine/moderation/fraud/FraudGetEndorsements.d.cts +1 -1
  33. package/services/engine/moderation/fraud/FraudGetPointQualities.cjs +3 -0
  34. package/services/engine/moderation/fraud/FraudGetPointQualities.d.cts +1 -1
  35. package/services/engine/moderation/fraud/FraudGetPoints.cjs +3 -0
  36. package/services/engine/moderation/fraud/FraudGetPoints.d.cts +1 -1
  37. package/services/engine/moderation/fraud/FraudGetPosts.cjs +17 -16
  38. package/services/engine/moderation/fraud/FraudGetPosts.d.cts +3 -3
  39. package/services/engine/moderation/fraud/FraudGetRatings.cjs +62 -30
  40. package/services/engine/moderation/fraud/FraudGetRatings.d.cts +4 -1
  41. package/services/engine/moderation/fraud/FraudRequestValidation.cjs +143 -0
  42. package/services/engine/moderation/fraud/FraudRequestValidation.d.cts +21 -0
  43. package/services/engine/moderation/fraud/FraudScannerNotifier.cjs +59 -35
  44. package/services/engine/moderation/fraud/FraudScannerNotifier.d.cts +20 -1
  45. package/services/llms/baseChatBot.d.ts +2 -0
  46. package/services/llms/baseChatBot.js +25 -9
  47. package/services/llms/imageGeneration/chatGptImageGenerator.d.ts +2 -2
  48. package/services/llms/imageGeneration/chatGptImageGenerator.js +13 -10
  49. package/services/llms/imageGeneration/collectionImageGenerator.js +31 -13
  50. package/services/llms/imageGeneration/dalleImageGenerator.d.ts +2 -2
  51. package/services/llms/imageGeneration/dalleImageGenerator.js +28 -16
  52. package/services/llms/imageGeneration/fluxImageGenerator.d.ts +2 -2
  53. package/services/llms/imageGeneration/fluxImageGenerator.js +9 -3
  54. package/services/llms/imageGeneration/iImageGenerator.d.ts +8 -1
  55. package/services/llms/imageGeneration/imageModelConfig.cjs +319 -0
  56. package/services/llms/imageGeneration/imageModelConfig.d.cts +79 -0
  57. package/services/llms/imageGeneration/imagenImageGenerator.d.ts +2 -3
  58. package/services/llms/imageGeneration/imagenImageGenerator.js +10 -10
  59. package/tests/fraudManagement.test.cjs +470 -0
  60. package/tests/fraudManagement.test.d.cts +1 -0
  61. package/tests/imageModelConfig.test.cjs +144 -0
  62. package/tests/imageModelConfig.test.d.cts +1 -0
  63. package/utils/ai_image_generation_guard.cjs +268 -0
  64. package/utils/ai_image_generation_guard.d.cts +34 -0
  65. package/utils/fingerprint_data.cjs +32 -0
  66. package/utils/fingerprint_data.d.cts +6 -0
  67. package/utils/recount_utils.cjs +53 -37
  68. 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
- this.sendToClient("assistant", part.choices[0].delta.content);
130
- botMessage += part.choices[0].delta.content;
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
- // Pick a sensible canvas size from the image type
18
- let size = "1536x1024";
19
- if (type === "icon")
20
- size = "1024x1024";
21
- else if (type === "other")
22
- size = "1536x1024";
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: "gpt-image-1",
36
+ model,
34
37
  prompt: finalPrompt,
35
- quality: "medium",
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 useImagen = false;
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 (useImagen && process.env.GOOGLE_CLOUD_PROJECT_ID) {
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
- // Decide which generator to use
48
- if (this.imagenImageGenerator) {
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("Using ImagenImageGenerator");
58
+ log.info(`Using ImagenImageGenerator: ${imageOptions.imageModel}`);
51
59
  }
52
- else if (this.fluxImageGenerator) {
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("Using FluxImageGenerator");
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 (process.env.USE_CHATGPT_IMAGE_GENERATOR) {
75
+ else if (isOpenAiGptImageModel(imageOptions.imageModel)) {
57
76
  imageGenerator = this.chatGptImageGenerator;
58
- log.info("Using ChatGptImageGenerator");
77
+ log.info(`Using ChatGptImageGenerator: ${imageOptions.imageModel}`);
59
78
  }
60
79
  else {
61
- imageGenerator = this.dalleImageGenerator;
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 (useImagen && this.imagenImageGenerator) {
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 (this.azureOpenaAiBase && this.azureOpenAiApiKey && this.azureDalleDeployment) {
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: this.azureDalleDeployment,
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
- // Decide on image dimensions
32
- let size = "1792x1024";
33
- if (type === "logo") {
34
- size = "1792x1024";
35
- }
36
- else if (type === "icon") {
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 (this.azureOpenaAiBase && this.azureOpenAiApiKey && this.azureDalleDeployment) {
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: "dall-e-3",
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 (type === "logo") {
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
- result = await this.replicate.run(this.fluxProModelName, {
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
  }