@innovastudio/contentbuilder 1.5.123 → 1.5.125

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/index.d.ts CHANGED
@@ -120,7 +120,6 @@ interface ContentBuilderOptions {
120
120
  audioSelectMaxWidth?: string;
121
121
  mediaSelectMaxWidth?: string;
122
122
  otherSelectMaxWidth?: string;
123
- assetPanelFullScreen?: boolean;
124
123
  codeEditorWidth?: string;
125
124
  codeEditorHeight?: string;
126
125
  codeEditorMaxWidth?: string;
@@ -215,6 +214,36 @@ interface ContentBuilderOptions {
215
214
  commandInfoCanvasMode?: any[];
216
215
  onStartRequest?: () => void;
217
216
 
217
+ imageModel?: string;
218
+ defaultImageGenerationProvider?: string;
219
+
220
+ //-- Asset Manager
221
+ listFilesUrl?: string;
222
+ listFoldersUrl?: string;
223
+ deleteFilesUrl?: string;
224
+ moveFilesUrl?: string;
225
+ createFolderUrl?: string;
226
+ uploadFilesUrl?: string;
227
+ renameFileUrl?: string;
228
+ getMmodelsUrl?: string;
229
+ textToImageUrl?: string;
230
+ upscaleImageUrl?: string;
231
+ controlNetUrl?: string;
232
+ saveTextUrl?: string;
233
+ viewUrl?: string;
234
+ viewFileUrl?: string;
235
+ assetFolderTree?: boolean;
236
+ assetFilesOnly?: boolean;
237
+ assetPanelReverse?: boolean;
238
+ assetRefreshButton?: boolean;
239
+ assetAllowedFileTypes?: any[];
240
+ assetShowRelativeTime?: boolean;
241
+ assetLocale?: string;
242
+ assetDateShortOptions?: any[];
243
+ assetDateLongOptions?: any[];
244
+ assetPanelFullScreen?: boolean;
245
+ //---
246
+
218
247
  //-- Form Builder
219
248
  defaultTextGenerationProvider?: string;
220
249
  model?: string;
@@ -281,5 +310,7 @@ declare class ContentBuilder {
281
310
  setPageSize(s?: string)
282
311
  openPageOptions(): void;
283
312
  print(): void;
313
+
314
+ generateImage(prompt: string, callback?: () => void): void;
284
315
  }
285
316
  export default ContentBuilder;
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@innovastudio/contentbuilder",
3
3
  "type": "module",
4
- "version": "1.5.123",
4
+ "version": "1.5.125",
5
5
  "description": "",
6
6
  "main": "public/contentbuilder/contentbuilder.esm.js",
7
7
  "types": "index.d.ts",
@@ -87075,11 +87075,29 @@ ${answer}
87075
87075
  data = await response.json();
87076
87076
  }
87077
87077
  if (data.error) {
87078
+ let errorMessage = '';
87079
+ if (typeof data.error === 'string') {
87080
+ errorMessage = data.error;
87081
+ } else if (typeof data.error === 'object') {
87082
+ // Target deeply nested error messages
87083
+ if (data.error.error && data.error.error.message) {
87084
+ errorMessage = data.error.error.message;
87085
+ } else if (data.error.message) {
87086
+ errorMessage = data.error.message;
87087
+ } else {
87088
+ // Fallback for other objects
87089
+ errorMessage = JSON.stringify(data.error);
87090
+ }
87091
+ } else {
87092
+ // Fallback for unexpected types
87093
+ errorMessage = String(data.error);
87094
+ }
87095
+
87078
87096
  // Error response from OpenAI goes here.
87079
- console.log('Error:\n' + data.error);
87097
+ console.log('Error:\n' + errorMessage);
87080
87098
 
87081
87099
  // ex. wrong API Key => Request failed with status code 401
87082
- this.util.showMessage(this.util.out('Request failed.'));
87100
+ this.util.showMessage(this.util.out('Request failed. ' + errorMessage));
87083
87101
  this.dictation.finish(); // Must be called after finished
87084
87102
  return;
87085
87103
  }
@@ -97944,11 +97962,151 @@ Add an image for each feature.`, 'Create a new content showcasing a photo galler
97944
97962
  }
97945
97963
  return closestRatio;
97946
97964
  }
97965
+ async waitingResultFal(jsonBody, requestId) {
97966
+ jsonBody.request_id = requestId;
97967
+ const getResultEndpoint = (model, requestId) => {
97968
+ let endpoint = `https://queue.fal.run/${model}/requests/${requestId}`;
97969
+ let firstTwoParts = model.split('/').slice(0, 2).join('/');
97970
+ endpoint = endpoint.replace('{MODEL}', firstTwoParts);
97971
+ return endpoint;
97972
+ };
97973
+ const resultEndpoint = getResultEndpoint(jsonBody.model, requestId);
97974
+ jsonBody.endpoint = resultEndpoint;
97975
+ let url = this.getResultUrl_Fal;
97976
+ let headers = {
97977
+ ...this.headers,
97978
+ ...this.defaultHeaders
97979
+ };
97980
+ const response = await fetch(url, {
97981
+ signal: this.signal,
97982
+ method: 'POST',
97983
+ headers,
97984
+ body: JSON.stringify(jsonBody)
97985
+ });
97986
+ // const result = await response.json();
97987
+ let text = await response.text(); // Read response as text first
97988
+ let result;
97989
+ try {
97990
+ result = JSON.parse(text); // Attempt to parse JSON
97991
+ } catch (e) {
97992
+ // console.log(text);
97993
+ return;
97994
+ }
97995
+ if (!result.error) {
97996
+ const data = result.data;
97997
+ let output = [];
97998
+ let output2 = [];
97999
+ data.entries && data.entries.forEach(item => {
98000
+ output.push(item.url);
98001
+ output2.push(item.file_url);
98002
+ });
98003
+ return {
98004
+ mediaGenerated: true,
98005
+ status: 'success',
98006
+ output,
98007
+ output2
98008
+ };
98009
+ } else {
98010
+ return {
98011
+ mediaGenerated: false,
98012
+ status: 'error',
98013
+ message: result.error //this.out('Request failed.')
98014
+ };
98015
+ }
98016
+ }
98017
+
98018
+ async generateImage_Fal(prompt, callback) {
98019
+ this.controller = new AbortController();
98020
+ this.signal = this.controller.signal;
98021
+ let model = this.imageModel || 'flux-schnell';
98022
+ let jsonBody = {};
98023
+ jsonBody.model = model;
98024
+ jsonBody.customData = this.customData;
98025
+ jsonBody.endpoint = `https://queue.fal.run/${model}`;
98026
+ jsonBody.payload = {
98027
+ prompt
98028
+ };
98029
+ let url = this.generateMediaUrl_Fal;
98030
+ let headers = {
98031
+ ...this.headers,
98032
+ ...this.defaultHeaders
98033
+ };
98034
+ const response = await fetch(url, {
98035
+ signal: this.signal,
98036
+ method: 'POST',
98037
+ headers,
98038
+ body: JSON.stringify(jsonBody)
98039
+ });
98040
+ const result = await response.json();
98041
+ if (result.error) {
98042
+ // console.log(result.error);
98043
+ this.dictation.finish();
98044
+ }
98045
+ let requestId = result.request_id;
98046
+ const getStatusEndpoint = (model, requestId) => {
98047
+ let endpoint = `https://queue.fal.run/${model}/requests/${requestId}`;
98048
+ let firstTwoParts = model.split('/').slice(0, 2).join('/');
98049
+ endpoint = endpoint.replace('{MODEL}', firstTwoParts);
98050
+ return endpoint;
98051
+ };
98052
+ const statusEndpoint = getStatusEndpoint(model, requestId);
98053
+ let inputCheckStatus = {
98054
+ model,
98055
+ endpoint: statusEndpoint,
98056
+ request_id: requestId
98057
+ // customData: this.customData
98058
+ };
98059
+
98060
+ let status;
98061
+ do {
98062
+ const response = await fetch(this.checkRequestStatusUrl_Fal, {
98063
+ signal: this.signal,
98064
+ method: 'POST',
98065
+ headers,
98066
+ body: JSON.stringify(inputCheckStatus)
98067
+ });
98068
+ const result = await response.json();
98069
+ if (result.ok && result.status) {
98070
+ // From endpoint that uses SDK
98071
+ status = result.status;
98072
+ } else if (result.data) {
98073
+ // From endpoint that uses API
98074
+ let data = result.data;
98075
+ if (data.image || data.audio || data.audio_file || data.video) {
98076
+ status = 'COMPLETED';
98077
+ } else if (data.detail && typeof data.detail === 'string' && data.detail.startsWith('Request is still in progress')) {
98078
+ //Request is still in progress
98079
+ status = 'IN_PROGRESS';
98080
+ } else if (data.status && !data.error) {
98081
+ status = data.status;
98082
+ }
98083
+ }
98084
+ if (!status) {
98085
+ // const message = result.error || (result.data && JSON.stringify(result.data)) || this.out('Request failed.');
98086
+ // console.log(message);
98087
+ return;
98088
+ }
98089
+ if (status !== 'COMPLETED') {
98090
+ await new Promise(resolve => setTimeout(resolve, 5000)); // Wait before retrying
98091
+ }
98092
+ } while (status !== 'COMPLETED');
98093
+ if (status === 'COMPLETED') {
98094
+ const mediaResult = await this.waitingResultFal(jsonBody, requestId);
98095
+ if (mediaResult.output && mediaResult.output.length === 1) {
98096
+ let imageUrl = mediaResult.output[0];
98097
+ callback(imageUrl);
98098
+ }
98099
+ }
98100
+ }
97947
98101
  async generateImage(prompt, callback) {
98102
+ if (this.defaultImageGenerationProvider === 'fal') {
98103
+ this.generateImage_Fal(prompt, callback);
98104
+ return;
98105
+ }
97948
98106
  this.controller = new AbortController(); // Create a new AbortController
97949
98107
  this.signal = this.controller.signal; // Get a new signal object
97950
98108
 
97951
- let model = this.imageModel || 'realistic-vision-v3';
98109
+ let model = this.imageModel || 'flux-schnell'; //realistic-vision-v3
97952
98110
  let negative_prompt = this.imageNegativePrompt || 'duplicate, (deformed iris, deformed pupils, semi-realistic, cgi, 3d, render, sketch, cartoon, drawing, anime:1.4), text, close up, cropped, out of frame, worst quality, low quality, jpeg artifacts, ugly, duplicate, morbid, mutilated, extra fingers, mutated hands, poorly drawn hands, poorly drawn face, mutation, deformed, blurry, dehydrated, bad anatomy, bad proportions, extra limbs, cloned face, disfigured, gross proportions, malformed limbs, missing arms, missing legs, extra arms, extra legs, fused fingers, too many fingers, long neck, bad_prompt_version2, bad-hands-5, badhandv4, bad anatomy, deformed, mutated, amputated, missing finger, extra finger, fused fingers, missing leg, extra leg, fused legs, missing digit, extra digit, fused digits, missing hand, extra hand, fused hands, missing arm, extra arm, fused arms, missing limb, extra limb, fused limbs, fused bodies, merged bodies, extra bodies, dual bodies, extra navel, elongated body, missing joint, extra joint, fused joints, deformed hip, twisted limbs, twisted legs, twisted arms, missing head, extra head, double head, twins, missing ear, extra ear, deformed ear, black and white, monochrome, multiple views, blurry, text, signature, head out of frame, paintings, sketches, (worst quality:2), (low quality:2), (normal quality:2), lowres, grayscale, glans, bad hands, error, extra digit, fewer digits, cropped, jpeg artifacts, watermark, username, bad feet, poorly drawn hands, poorly drawn face, mutation, too many fingers, long neck, long body, long arms, cross-eyed, mutated hands, polar lowres, bad body, bad proportions, gross proportions, cropped head , bad eyes, extra breast, missing breast, fused breasts, unnatural proportions, necklace';
97953
98111
  let steps = this.imageSteps || 25;
97954
98112
  let guidance = this.imageGuidance || 7.5;