| _id: artworks |
| description: Image generation, mask extraction, etc. |
| readme: Added PuLID |
| title: en=ArtWorks AI;ru=Узлы ArtWorks AI |
| url: https://huggingface.co/PiperMy/Node-Packages/resolve/main/artworks.yaml |
| version: 6 |
| nodes: |
| image_to_image_artworks: |
| _id: image_to_image_artworks |
| arrange: |
| x: 120 |
| y: 50 |
| category: |
| _id: generate_images |
| title: en=Generate images;ru=Генерация изображений |
| description: "" |
| environment: |
| OPEN_PAAS_USER: |
| title: PaaS user |
| type: string |
| scope: global |
| OPEN_PAAS_PASSWORD: |
| title: PaaS password |
| type: string |
| scope: global |
| PAAS_BASE_URL: |
| title: PaaS base url |
| type: string |
| scope: global |
| execution: regular |
| groups: |
| inputs: |
| SDXL: |
| order: 4 |
| title: SDXL checkpoints |
| description: Only for SDXL checkpoints |
| base: |
| order: 1 |
| title: en=Base;ru=Базовые параметры |
| inputs: |
| image: |
| order: 1 |
| title: en=Image;ru=Изображение |
| group: base |
| type: image |
| required: true |
| prompt: |
| order: 2 |
| title: en=Prompt;ru=Подсказка |
| group: base |
| type: string |
| required: true |
| multiline: true |
| negativePrompt: |
| order: 4 |
| title: en=Negative prompt;ru=Негативная подсказка |
| group: base |
| type: string |
| multiline: true |
| checkpoint: |
| order: 3 |
| title: en=Checkpoint;ru=Модель |
| group: base |
| type: string |
| required: true |
| default: juggernautXL_v9Rundiffusionphoto2.safetensors |
| enum: |
| - raemuXL_v40.safetensors|Raemu XL <SDXL> |
| - aamXLAnimeMix_v10.safetensors|AAM XL (Anime Mix) <SDXL> <Fantasy> |
| - dreamweaverPony25D.1erv.safetensors|DreamWeaver - Pony 2.5D Mix <SDXL> |
| - mixGEMAdam8witQegoow.NeWz.safetensors|MyMIX-G/Jem <SDXL> <Realistic> |
| - mfcgPDXL_v10.safetensors|MFCG PDXL <SDXL> |
| - aniku_0.2.fp16.safetensors|Anime Desire <SDXL> <Fantasy> |
| - flux1DevHyperNF4Flux1DevBNB_flux1DevHyperNF4.safetensors|Hyper NF4 Flux 1 <Flux> |
| - STOIQONewrealityFLUXSD_F1DPreAlpha.safetensors|New Reality Flux <Flux> |
| - juggernautXL_v9Rundiffusionphoto2.safetensors|Juggernaut XL <SDXL> |
| - animaPencilXL_v260.safetensors|Anima Pencil XL <SDXL> <Fantasy> |
| - bluePencilXL_v401.safetensors|Blue Pencil XL <SDXL> <Fantasy> |
| - pixelArtDiffusionXL_spriteShaper.safetensors|Pixel Art Diffusion XL <SDXL> <Fantasy> |
| - albedobaseXL_v20.safetensors|AlbedoBase XL <SDXL> |
| - leosamsHelloworldXL_helloworldXL50GPT4V.safetensors|Helloworld XL <SDXL> |
| - dynavisionXLAllInOneStylized_releaseV0610Bakedvae.safetensors|DynaVision XL All In One <SDXL> |
| - photon_v1.safetensors|Photon <SD 1.5> |
| - afroditexlNudePeople_20Bkdvae.safetensors|Nude People <NSFW> |
| - nosft-float8-e4m3fn.safetensors|Flux Nude People <NSFW> |
| - asdf_0.4a_lorapov_0.2_lust_0.4.fp16.safetensors|Real Porn <NSFW> |
| - Sexy_Aesthetic_SDXL_0.4x0.2.fp16.safetensors|Sexy & Beauty <NSFW> |
| - aniku_0.2.fp16.safetensors|Anime Desire <NSFW> |
| - anikurender_0.4b.fp16.safetensors|Hardcore Fantasy <NSFW> |
| denoisingStrength: |
| order: 6 |
| title: en=Denoising strength;ru=Степень изменения |
| group: base |
| type: float |
| required: true |
| min: 0.1 |
| max: 1 |
| step: 0.05 |
| default: 0.5 |
| cfgScale: |
| order: 7 |
| title: en=CFG scale;ru=Креативность |
| group: base |
| type: integer |
| required: true |
| min: 1 |
| max: 20 |
| step: 1 |
| default: 7 |
| imageSize: |
| order: 5 |
| title: en=Image size;ru=Размер изображения |
| group: base |
| type: string |
| placeholder: auto:auto |
| default: auto:auto |
| enum: |
| - auto:1024 |
| - 1024:auto |
| - auto:auto |
| performance: |
| order: 8 |
| title: en=Performance;ru=Производительность |
| group: base |
| type: string |
| default: speed |
| enum: |
| - express|⚡ Express |
| - speed|🚅 Speed |
| - quality|💎 Quality |
| seed: |
| order: 10 |
| title: en=Seed;ru=Начальный шум |
| group: base |
| type: integer |
| placeholder: "-1" |
| batchSize: |
| order: 9 |
| title: en=Batch size;ru=Кол-во |
| group: base |
| type: integer |
| min: 1 |
| max: 4 |
| step: 1 |
| default: 1 |
| sharpness: |
| order: 1 |
| title: en=Sharpness;ru=Фотоэффект |
| group: SDXL |
| type: integer |
| min: 0 |
| max: 30 |
| step: 1 |
| default: 2 |
| outputs: |
| image1: |
| title: en=Image 1;ru=Изображение 1 |
| type: image |
| images: |
| title: en=Images;ru=Изображения |
| type: image[] |
| image2: |
| title: en=Image 2;ru=Изображение 2 |
| type: image |
| image3: |
| title: en=Image 3;ru=Изображение 3 |
| type: image |
| image4: |
| title: en=Image 4;ru=Изображение 4 |
| type: image |
| package: artworks |
| script: | |
| const CHECK_TASK_INTERVAL = 3000; |
| const MAX_ATTEMPTS = 100; |
| |
| export async function run({ inputs, state }) { |
|
|
| const { FatalError, TimeoutError, RepeatNode, NextNode } = DEFINITIONS; |
| const { ArtWorks, fitSize, FatalError: ArtWorksError } = require('artworks'); |
| const sharp = require('sharp/lib/index.js'); |
|
|
| const PAAS_BASE_URL = env.variables.get('PAAS_BASE_URL'); |
| if (!PAAS_BASE_URL) { |
| throw new FatalError('Please, set PAAS_BASE_URL in environment'); |
| } |
| const OPEN_PAAS_USER = env.variables.get('OPEN_PAAS_USER'); |
| if (!OPEN_PAAS_USER) { |
| throw new FatalError('Please, set OPEN_PAAS_USER in environment'); |
| } |
| const OPEN_PAAS_PASSWORD = env.variables.get('OPEN_PAAS_PASSWORD'); |
| if (!OPEN_PAAS_PASSWORD) { |
| throw new FatalError('Please, set OPEN_PAAS_PASSWORD in environment'); |
| } |
|
|
| const artworks = new ArtWorks({ |
| baseUrl: PAAS_BASE_URL, |
| username: OPEN_PAAS_USER, |
| password: OPEN_PAAS_PASSWORD |
| }); |
|
|
| if (!state) { |
| const { |
| image, |
| prompt, |
| checkpoint, |
| negativePrompt, |
| imageSize, |
| denoisingStrength, |
| cfgScale, |
| performance, |
| batchSize, |
| seed, |
| // SDXL |
| sharpness, |
| } = inputs; |
| const payload = { |
| type: "image-to-image", |
| isFast: true, |
| payload: { |
| base64: false, |
| image, |
| prompt, |
| checkpoint, |
| negativePrompt, |
| ...(!!imageSize |
| ? await (async () => { |
| const { data } = await download(image); |
| const buffer = sharp(data); |
| const { width, height } = await buffer.metadata(); |
| if (imageSize !== "auto:auto") { |
| const { width: w, height: h } = fitSize(imageSize, height / width); |
| return { size: `${w}x${h}` }; |
| } |
|
|
| return {}; |
| })() |
| : {}), |
| denoisingStrength, |
| cfgScale, |
| performance, |
| ...(batchSize > 1 ? { batchSize } : {}), |
| seed, |
| // SDXL |
| sharpness |
| }, |
| }; |
| try { |
| const task = await artworks.createTask(payload); |
| console.log(`Task created ${task}`); |
| return RepeatNode.from({ |
| state: { |
| payload, |
| task, |
| attempt: 0, |
| startedAt: new Date() |
| }, |
| progress: { |
| total: MAX_ATTEMPTS, |
| processed: 0 |
| }, |
| delay: 2000 |
| }); |
| } catch (e) { |
| if (e instanceof ArtWorksError) { |
| throw new FatalError(e.message); |
| } |
| throw e; |
| } |
| } else { |
| const { |
| payload, |
| task, |
| attempt, |
| startedAt |
| } = state; |
|
|
| if (attempt > MAX_ATTEMPTS) { |
| try { |
| await artworks.cancelTask(task); |
| } catch (e) { } |
|
|
| const now = new Date(); |
| const time = (now - new Date(startedAt)) / 1000; |
| throw new TimeoutError(`PaaS task for text to image ${task} timeout in ${time} sec`); |
| } |
|
|
| console.log(`Check task ${attempt} ${task}`); |
|
|
| try { |
| const results = await artworks.checkState(task); |
| if (!results) { |
| return RepeatNode.from({ |
| delay: CHECK_TASK_INTERVAL, |
| state: { |
| payload, |
| task, |
| attempt: attempt + 1, |
| startedAt, |
| }, |
| progress: { |
| total: MAX_ATTEMPTS, |
| processed: attempt |
| }, |
| }); |
| } |
| let images = results.images.map((i) => i.url); |
| const [image1, image2, image3, image4] = images; |
| return NextNode.from({ |
| outputs: { |
| images, |
| image1, |
| image2, |
| image3, |
| image4 |
| } |
| }); |
| } catch (e) { |
| if (e instanceof ArtWorksError) { |
| throw new FatalError(e.message); |
| } |
| throw e; |
| } |
| } |
| } |
| source: catalog |
| title: en=Image to image;ru=Пересоздать изображение |
| version: 1 |
| generate_image_artworks: |
| _id: generate_image_artworks |
| arrange: |
| x: 470 |
| y: 50 |
| category: |
| _id: generate_images |
| title: en=Generate images;ru=Генерация изображений |
| environment: |
| OPEN_PAAS_USER: |
| title: PaaS user |
| type: string |
| scope: global |
| OPEN_PAAS_PASSWORD: |
| title: PaaS password |
| type: string |
| scope: global |
| PAAS_BASE_URL: |
| title: PaaS base url |
| type: string |
| scope: global |
| execution: regular |
| groups: |
| inputs: |
| SDXL: |
| order: 3 |
| title: SDXL checkpoints |
| description: Only for SDXL checkpoints |
| base: |
| order: 1 |
| title: en=Base parameters;ru=Базовые параметры |
| special: |
| order: 2 |
| title: en=Special;ru=Специальные возможности |
| inputs: |
| checkpoint: |
| order: 2 |
| title: en=Checkpoint;ru=Модель |
| group: base |
| type: string |
| required: true |
| default: juggernautXL_v9Rundiffusionphoto2.safetensors |
| enum: |
| - raemuXL_v40.safetensors|Raemu XL <SDXL> |
| - aamXLAnimeMix_v10.safetensors|AAM XL (Anime Mix) <SDXL> <Fantasy> |
| - dreamweaverPony25D.1erv.safetensors|DreamWeaver - Pony 2.5D Mix <SDXL> |
| - mixGEMAdam8witQegoow.NeWz.safetensors|MyMIX-G/Jem <SDXL> <Realistic> |
| - mfcgPDXL_v10.safetensors|MFCG PDXL <SDXL> |
| - aniku_0.2.fp16.safetensors|Anime Desire <SDXL> <Fantasy> |
| - flux1DevHyperNF4Flux1DevBNB_flux1DevHyperNF4.safetensors|Hyper NF4 Flux 1 <Flux> |
| - STOIQONewrealityFLUXSD_F1DPreAlpha.safetensors|New Reality Flux <Flux> |
| - juggernautXL_v9Rundiffusionphoto2.safetensors|Juggernaut XL <SDXL> |
| - animaPencilXL_v260.safetensors|Anima Pencil XL <SDXL> <Fantasy> |
| - bluePencilXL_v401.safetensors|Blue Pencil XL <SDXL> <Fantasy> |
| - pixelArtDiffusionXL_spriteShaper.safetensors|Pixel Art Diffusion XL <SDXL> <Fantasy> |
| - albedobaseXL_v20.safetensors|AlbedoBase XL <SDXL> |
| - leosamsHelloworldXL_helloworldXL50GPT4V.safetensors|Helloworld XL <SDXL> |
| - dynavisionXLAllInOneStylized_releaseV0610Bakedvae.safetensors|DynaVision XL All In One <SDXL> |
| - photon_v1.safetensors|Photon <SD 1.5> |
| - afroditexlNudePeople_20Bkdvae.safetensors|Nude People <NSFW> |
| - nosft-float8-e4m3fn.safetensors|Flux Nude People <NSFW> |
| - asdf_0.4a_lorapov_0.2_lust_0.4.fp16.safetensors|Real Porn <NSFW> |
| - PonyASDF_0.4_f6cosineb.fp16.safetensors|Real Porn Pony <NSFW> |
| - Sexy_Aesthetic_SDXL_0.4x0.2.fp16.safetensors|Sexy & Beauty <NSFW> |
| - aniku_0.2.fp16.safetensors|Anime Desire <NSFW> |
| - anikurender_0.4b.fp16.safetensors|Hardcore Fantasy <NSFW> |
| prompt: |
| order: 1 |
| title: en=Prompt;ru=Подсказка |
| group: base |
| type: string |
| required: true |
| multiline: true |
| default: cat walking on the moon |
| imageSize: |
| order: 4 |
| title: en=Size;ru=Размер |
| group: base |
| type: string |
| required: true |
| default: 1024x1024 |
| enum: |
| - 512x512|512x512 <SD 1.5> |
| - 512x768|512x768 <SD 1.5> |
| - 512x912|512x912 <SD 1.5> |
| - 576x768|576x768 <SD 1.5> |
| - 704x1344|704x1344 <SD 1.5> |
| - 704x1408|704x1408 <SD 1.5> |
| - 768x512|768x512 <SD 1.5> |
| - 768x576|768x576 <SD 1.5> |
| - 768x768|768x768 <SD 1.5> |
| - 768x1280|768x1280 <SD 1.5> |
| - 768x1344|768x1344 <SD 1.5> |
| - 832x1152|832x1152 <SD 1.5> |
| - 832x1216|832x1216 <SD 1.5> |
| - 896x1088|896x1088 <SD 1.5> |
| - 896x1152|896x1152 <SD 1.5> |
| - 912x512|912x512 <SD 1.5> |
| - 960x1024|960x1024 <SDXL> <Flux> <SD 1.5> |
| - 960x1088|960x1088 <SDXL> <Flux> <SD 1.5> |
| - 1024x1024|1024x1024 <SDXL> <Flux> <SD 1.5> |
| - 1024x960|1024x960 <SDXL> <Flux> <SD 1.5> |
| - 1088x896|1088x896 <SDXL> <Flux> <SD 1.5> |
| - 1088x960|1088x960 <SDXL> <Flux> <SD 1.5> |
| - 1152x832|1152x832 <SDXL> <Flux> <SD 1.5> |
| - 1152x896|1152x896 <SDXL> <Flux> <SD 1.5> |
| - 1216x832|1216x832 <SDXL> <Flux> |
| - 1280x768|1280x768 <SDXL> <Flux> |
| - 1344x704|1344x704 <SDXL> <Flux> |
| - 1344x768|1344x768 <SDXL> <Flux> |
| - 1408x704|1408x704 <SDXL> <Flux> |
| - 1472x704|1472x704 <SDXL> <Flux> |
| - 1536x640|1536x640 <SDXL> <Flux> |
| - 1600x640|1600x640 <SDXL> <Flux> |
| - 1664x576|1664x576 <SDXL> <Flux> |
| - 1728x576|1728x576 <SDXL> <Flux> |
| batchSize: |
| order: 7 |
| title: en=Batch size;ru=Кол-во |
| group: base |
| type: integer |
| min: 1 |
| max: 4 |
| step: 1 |
| default: 1 |
| negativePrompt: |
| order: 3 |
| title: en=Negative prompt;ru=Негативная подсказка |
| group: base |
| type: string |
| multiline: true |
| cfgScale: |
| order: 5 |
| title: en=CFG scale;ru=Креативность |
| group: base |
| type: float |
| required: true |
| min: 1 |
| max: 20 |
| step: 1 |
| default: 7 |
| performance: |
| order: 6 |
| title: en=Performance;ru=Производительность |
| group: base |
| type: string |
| default: speed |
| enum: |
| - express|⚡ Express |
| - speed|🚅 Speed |
| - quality|💎 Quality |
| sharpness: |
| order: 1 |
| title: en=Sharpness;ru=Фотоэффект |
| group: SDXL |
| type: integer |
| min: 0 |
| max: 30 |
| step: 1 |
| default: 2 |
| seed: |
| order: 8 |
| title: en=Seed;ru=Начальный шум |
| group: base |
| type: integer |
| placeholder: "-1" |
| controlNets: |
| order: 1 |
| title: en=Control nets;ru=Контрольные сети |
| group: special |
| type: json |
| schema: |
| id: control-nets |
| outputs: |
| images: |
| title: en=Images;ru=Изображения |
| type: image[] |
| image1: |
| title: en=Image 1;ru=Изображение 1 |
| type: image |
| image2: |
| title: en=Image 2;ru=Изображение 2 |
| type: image |
| image3: |
| title: en=Image 3;ru=Изображение 3 |
| type: image |
| image4: |
| title: en=Image 4;ru=Изображение 4 |
| type: image |
| package: artworks |
| script: | |
| const CHECK_TASK_INTERVAL = 3000; |
| const MAX_ATTEMPTS = 100; |
| |
| export async function run({ inputs, state }) { |
|
|
| const { FatalError, TimeoutError, RepeatNode, NextNode } = DEFINITIONS; |
| const { ArtWorks, FatalError: ArtWorksError } = require('artworks'); |
|
|
| const PAAS_BASE_URL = env.variables.get('PAAS_BASE_URL'); |
| if (!PAAS_BASE_URL) { |
| throw new FatalError('Please, set PAAS_BASE_URL in environment'); |
| } |
| const OPEN_PAAS_USER = env.variables.get('OPEN_PAAS_USER'); |
| if (!OPEN_PAAS_USER) { |
| throw new FatalError('Please, set OPEN_PAAS_USER in environment'); |
| } |
| const OPEN_PAAS_PASSWORD = env.variables.get('OPEN_PAAS_PASSWORD'); |
| if (!OPEN_PAAS_PASSWORD) { |
| throw new FatalError('Please, set OPEN_PAAS_PASSWORD in environment'); |
| } |
|
|
| const artworks = new ArtWorks({ |
| baseUrl: PAAS_BASE_URL, |
| username: OPEN_PAAS_USER, |
| password: OPEN_PAAS_PASSWORD |
| }); |
|
|
| if (!state) { |
| const { |
| prompt, |
| negativePrompt, |
| checkpoint, |
| cfgScale, |
| imageSize: size, |
| performance, |
| sharpness, |
| seed, |
| batchSize, |
| // SDXL |
| styles, |
| } = inputs; |
|
|
| const payload = { |
| type: "text-to-image", |
| isFast: true, |
| payload: { |
| base64: false, |
| prompt, |
| ...(!!negativePrompt ? { |
| negativePrompt |
| } : {}), |
| checkpoint, |
| cfgScale, |
| size, |
| performance: performance || "express", |
| ...(seed > 0 ? { |
| seed |
| } : {}), |
| ...(batchSize > 1 ? { |
| batchSize |
| } : {}), |
| // SDXL |
| ...(() => { |
| switch (checkpoint) { |
| case 'PonyASDF_0.4_f6cosineb.fp16.safetensors': |
| return { styles: ['Fooocus Pony', 'Fooocus Masterpiece'] }; |
| case 'asdf_0.4a_lorapov_0.2_lust_0.4.fp16.safetensors': |
| case 'aniku_0.2.fp16.safetensors': |
| return { styles: [] }; |
| case 'anikurender_0.4b.fp16.safetensors': |
| return { styles: ['Fooocus Sharp', 'Fooocus Pony', 'Fooocus V2'] }; |
| default: |
| return styles?.length > 0 ? { styles } : { styles }; |
| } |
|
|
| })(), |
| ...(sharpness > 2 ? { |
| sharpness |
| } : {}), |
| }, |
| }; |
| try { |
| const task = await artworks.createTask(payload); |
| console.log(`Task created ${task}`); |
| return RepeatNode.from({ |
| state: { |
| payload, |
| task, |
| attempt: 0, |
| startedAt: new Date() |
| }, |
| progress: { |
| total: MAX_ATTEMPTS, |
| processed: 0 |
| }, |
| delay: 2000 |
| }); |
| } catch (e) { |
| if (e instanceof ArtWorksError) { |
| throw new FatalError(e.message); |
| } |
| throw e; |
| } |
| } else { |
| const { |
| payload, |
| task, |
| attempt, |
| startedAt |
| } = state; |
|
|
| if (attempt > MAX_ATTEMPTS) { |
| try { |
| await artworks.cancelTask(task); |
| } catch (e) { } |
|
|
| const now = new Date(); |
| const time = (now - new Date(startedAt)) / 1000; |
| throw new TimeoutError(`PaaS task for text to image ${task} timeout in ${time} sec`); |
| } |
|
|
| console.log(`Check task ${attempt} ${task}`); |
|
|
| try { |
| const results = await artworks.checkState(task); |
| if (!results) { |
| return RepeatNode.from({ |
| delay: CHECK_TASK_INTERVAL, |
| state: { |
| payload, |
| task, |
| attempt: attempt + 1, |
| startedAt, |
| }, |
| progress: { |
| total: MAX_ATTEMPTS, |
| processed: attempt |
| }, |
| }); |
| } |
| let images = results.images.map((i) => i.url); |
| const [image1, image2, image3, image4] = images; |
| return NextNode.from({ |
| outputs: { |
| images, |
| image1, |
| image2, |
| image3, |
| image4 |
| } |
| }); |
| } catch (e) { |
| if (e instanceof ArtWorksError) { |
| throw new FatalError(e.message); |
| } |
| throw e; |
| } |
| } |
| } |
| source: catalog |
| title: en=Generate image;ru=Генерация изображения |
| version: 2 |
| inpaint_image_artworks: |
| _id: inpaint_image_artworks |
| arrange: |
| x: 770 |
| y: 50 |
| category: |
| _id: generate_images |
| title: en=Generate images;ru=Генерация изображений |
| environment: |
| OPEN_PAAS_USER: |
| title: PaaS user |
| type: string |
| scope: global |
| OPEN_PAAS_PASSWORD: |
| title: PaaS password |
| type: string |
| scope: global |
| PAAS_BASE_URL: |
| title: PaaS base url |
| type: string |
| scope: global |
| execution: regular |
| groups: |
| inputs: |
| mask: |
| order: 2 |
| title: en=Mask;ru=Маска |
| SDXL: |
| order: 4 |
| title: SDXL checkpoints |
| description: Only for SDXL checkpoints |
| base: |
| order: 1 |
| title: en=Base;ru=Базовые параметры |
| special: |
| order: 3 |
| title: en=Special;ru=Специальные возможности |
| inputs: |
| image: |
| order: 1 |
| title: en=Image;ru=Изображение |
| group: base |
| type: image |
| required: true |
| extensions: |
| - id: draw-mask |
| params: |
| mask: mask |
| prompt: |
| order: 2 |
| title: en=Prompt;ru=Подсказка |
| group: base |
| type: string |
| required: true |
| multiline: true |
| negativePrompt: |
| order: 4 |
| title: en=Negative prompt;ru=Негативная подсказка |
| group: base |
| type: string |
| multiline: true |
| checkpoint: |
| order: 3 |
| title: en=Checkpoint;ru=Модель |
| group: base |
| type: string |
| required: true |
| default: juggernautXL_v9Rundiffusionphoto2.safetensors |
| enum: |
| - raemuXL_v40.safetensors|Raemu XL <SDXL> |
| - aamXLAnimeMix_v10.safetensors|AAM XL (Anime Mix) <SDXL> <Fantasy> |
| - dreamweaverPony25D.1erv.safetensors|DreamWeaver - Pony 2.5D Mix <SDXL> |
| - mixGEMAdam8witQegoow.NeWz.safetensors|MyMIX-G/Jem <SDXL> <Realistic> |
| - mfcgPDXL_v10.safetensors|MFCG PDXL <SDXL> |
| - aniku_0.2.fp16.safetensors|Anime Desire <SDXL> <Fantasy> |
| - flux1DevHyperNF4Flux1DevBNB_flux1DevHyperNF4.safetensors|Hyper NF4 Flux 1 <Flux> |
| - STOIQONewrealityFLUXSD_F1DPreAlpha.safetensors|New Reality Flux <Flux> |
| - juggernautXL_v9Rundiffusionphoto2.safetensors|Juggernaut XL <SDXL> |
| - animaPencilXL_v260.safetensors|Anima Pencil XL <SDXL> <Fantasy> |
| - bluePencilXL_v401.safetensors|Blue Pencil XL <SDXL> <Fantasy> |
| - pixelArtDiffusionXL_spriteShaper.safetensors|Pixel Art Diffusion XL <SDXL> <Fantasy> |
| - albedobaseXL_v20.safetensors|AlbedoBase XL <SDXL> |
| - leosamsHelloworldXL_helloworldXL50GPT4V.safetensors|Helloworld XL <SDXL> |
| - dynavisionXLAllInOneStylized_releaseV0610Bakedvae.safetensors|DynaVision XL All In One <SDXL> |
| - photon_v1.safetensors|Photon <SD 1.5> |
| - afroditexlNudePeople_20Bkdvae.safetensors|Nude People <NSFW> |
| - nosft-float8-e4m3fn.safetensors|Flux Nude People <NSFW> |
| - asdf_0.4a_lorapov_0.2_lust_0.4.fp16.safetensors|Real Porn <NSFW> |
| - Sexy_Aesthetic_SDXL_0.4x0.2.fp16.safetensors|Sexy & Beauty <NSFW> |
| - aniku_0.2.fp16.safetensors|Anime Desire <NSFW> |
| - anikurender_0.4b.fp16.safetensors|Hardcore Fantasy <NSFW> |
| denoisingStrength: |
| order: 6 |
| title: en=Denoising strength;ru=Степень изменения |
| group: base |
| type: float |
| required: true |
| min: 0.1 |
| max: 1 |
| step: 0.05 |
| default: 0.5 |
| cfgScale: |
| order: 7 |
| title: en=CFG scale;ru=Креативность |
| group: base |
| type: integer |
| required: true |
| min: 1 |
| max: 20 |
| step: 1 |
| default: 7 |
| imageSize: |
| order: 5 |
| title: en=Image size;ru=Размер изображения |
| group: base |
| type: string |
| placeholder: auto:auto |
| default: auto:auto |
| enum: |
| - auto:1024 |
| - 1024:auto |
| - auto:auto |
| performance: |
| order: 8 |
| title: en=Performance;ru=Производительность |
| group: base |
| type: string |
| default: speed |
| enum: |
| - express|⚡ Express |
| - speed|🚅 Speed |
| - quality|💎 Quality |
| controlNets: |
| order: 1 |
| title: en=Control nets;ru=Контрольные сети |
| group: special |
| type: json |
| schema: |
| id: control-nets |
| seed: |
| order: 10 |
| title: en=Seed;ru=Начальный шум |
| group: base |
| type: integer |
| placeholder: "-1" |
| batchSize: |
| order: 9 |
| title: en=Batch size;ru=Кол-во |
| group: base |
| type: integer |
| min: 1 |
| max: 4 |
| step: 1 |
| default: 1 |
| mask: |
| order: 1 |
| title: en=Mask;ru=Маска |
| group: mask |
| type: image |
| required: true |
| invertMask: |
| order: 1 |
| title: en=Invert mask;ru=Инвертировать маску |
| group: SDXL |
| type: boolean |
| default: false |
| maskMargin: |
| order: 2 |
| title: en=Mask margin;ru=Отступ от маски |
| group: mask |
| type: integer |
| default: 10 |
| outputs: |
| image1: |
| title: en=Image 1;ru=Изображение 1 |
| type: image |
| images: |
| title: en=Images;ru=Изображения |
| type: image[] |
| image2: |
| title: en=Image 2;ru=Изображение 2 |
| type: image |
| image3: |
| title: en=Image 3;ru=Изображение 3 |
| type: image |
| image4: |
| title: en=Image 4;ru=Изображение 4 |
| type: image |
| package: artworks |
| script: | |
| const CHECK_TASK_INTERVAL = 3000; |
| const MAX_ATTEMPTS = 100; |
| |
| export async function run({ inputs, state }) { |
|
|
| const { FatalError, TimeoutError, RepeatNode, NextNode } = DEFINITIONS; |
| const { ArtWorks, fitSize, FatalError: ArtWorksError } = require('artworks'); |
| const sharp = require('sharp/lib/index.js'); |
|
|
| const PAAS_BASE_URL = env.variables.get('PAAS_BASE_URL'); |
| if (!PAAS_BASE_URL) { |
| throw new FatalError('Please, set PAAS_BASE_URL in environment'); |
| } |
| const OPEN_PAAS_USER = env.variables.get('OPEN_PAAS_USER'); |
| if (!OPEN_PAAS_USER) { |
| throw new FatalError('Please, set OPEN_PAAS_USER in environment'); |
| } |
| const OPEN_PAAS_PASSWORD = env.variables.get('OPEN_PAAS_PASSWORD'); |
| if (!OPEN_PAAS_PASSWORD) { |
| throw new FatalError('Please, set OPEN_PAAS_PASSWORD in environment'); |
| } |
|
|
| const artworks = new ArtWorks({ |
| baseUrl: PAAS_BASE_URL, |
| username: OPEN_PAAS_USER, |
| password: OPEN_PAAS_PASSWORD |
| }); |
|
|
| if (!state) { |
| const { |
| image, |
| prompt, |
| checkpoint, |
| negativePrompt, |
| imageSize, |
| denoisingStrength, |
| cfgScale, |
| performance, |
| batchSize, |
| seed, |
| // mask |
| mask, |
| maskMargin, |
| // special |
| controlNets, |
| // SDXL |
| invertMask, |
| } = inputs; |
| const payload = { |
| type: "inpaint-on-image", |
| isFast: true, |
| payload: { |
| base64: false, |
| image, |
| prompt, |
| checkpoint, |
| negativePrompt, |
| ...(!!imageSize |
| ? await (async () => { |
| const { data } = await download(image); |
| const buffer = sharp(data); |
| const { width, height } = await buffer.metadata(); |
| if (imageSize !== "auto:auto") { |
| const { width: w, height: h } = fitSize(imageSize, height / width); |
| return { size: `${w}x${h}` }; |
| } |
|
|
| return {}; |
| })() |
| : {}), |
| denoisingStrength, |
| cfgScale, |
| performance, |
| ...(batchSize > 1 ? { batchSize } : {}), |
| seed, |
| // mask |
| mask, |
| maskMargin, |
| // special |
| controlNets, |
| // SDXL |
| invertMask |
| }, |
| }; |
| try { |
| const task = await artworks.createTask(payload); |
| console.log(`Task created ${task}`); |
| return RepeatNode.from({ |
| state: { |
| payload, |
| task, |
| attempt: 0, |
| startedAt: new Date() |
| }, |
| progress: { |
| total: MAX_ATTEMPTS, |
| processed: 0 |
| }, |
| delay: 2000 |
| }); |
| } catch (e) { |
| if (e instanceof ArtWorksError) { |
| throw new FatalError(e.message); |
| } |
| throw e; |
| } |
| } else { |
| const { |
| payload, |
| task, |
| attempt, |
| startedAt |
| } = state; |
|
|
| if (attempt > MAX_ATTEMPTS) { |
| try { |
| await artworks.cancelTask(task); |
| } catch (e) { } |
|
|
| const now = new Date(); |
| const time = (now - new Date(startedAt)) / 1000; |
| throw new TimeoutError(`PaaS task for text to image ${task} timeout in ${time} sec`); |
| } |
|
|
| console.log(`Check task ${attempt} ${task}`); |
|
|
| try { |
| const results = await artworks.checkState(task); |
| if (!results) { |
| return RepeatNode.from({ |
| delay: CHECK_TASK_INTERVAL, |
| state: { |
| payload, |
| task, |
| attempt: attempt + 1, |
| startedAt, |
| }, |
| progress: { |
| total: MAX_ATTEMPTS, |
| processed: attempt |
| }, |
| }); |
| } |
| let images = results.images.map((i) => i.url); |
| const [image1, image2, image3, image4] = images; |
| return NextNode.from({ |
| outputs: { |
| images, |
| image1, |
| image2, |
| image3, |
| image4 |
| } |
| }); |
| } catch (e) { |
| if (e instanceof ArtWorksError) { |
| throw new FatalError(e.message); |
| } |
| throw e; |
| } |
| } |
| } |
| source: catalog |
| title: en=Inpaint on image;ru=Улучшить изображение |
| version: 1 |
| exctract_mask_on_image_artworks: |
| _id: exctract_mask_on_image_artworks |
| arrange: |
| x: 1070 |
| y: 50 |
| category: |
| _id: image_analysis |
| title: en=Image analysis;ru=Анализ изображений |
| environment: |
| OPEN_PAAS_USER: |
| title: PaaS user |
| type: string |
| scope: global |
| OPEN_PAAS_PASSWORD: |
| title: PaaS password |
| type: string |
| scope: global |
| PAAS_BASE_URL: |
| title: PaaS base url |
| type: string |
| scope: global |
| execution: regular |
| inputs: |
| image: |
| order: 1 |
| title: en=Image;ru=Изображение |
| type: image |
| required: true |
| type: |
| order: 2 |
| title: en=Type;ru=Тип поиска |
| type: string |
| required: true |
| default: yolo |
| enum: |
| - yolo|Yolo |
| - default|Prompt |
| prompt: |
| order: 4 |
| title: en=Prompt;ru=Подсказка |
| type: string |
| required: false |
| multiline: true |
| model: |
| order: 3 |
| title: en=Yolo model;ru=Yolo модель |
| type: string |
| required: false |
| default: deepfashion2_yolov8s-seg.pt |
| enum: |
| - deepfashion2_yolov8s-seg.pt |
| - face_yolov8m.pt |
| - face_yolov8n.pt |
| - face_yolov8s.pt |
| - female_breast_v3.2.pt |
| - hand_yolov8n.pt |
| - hand_yolov8s.pt |
| - penisV2.pt |
| - person_yolov8m-seg.pt |
| - person_yolov8n-seg.pt |
| - person_yolov8s-seg.pt |
| - vagina-v2.6.pt |
| threshold: |
| order: 5 |
| title: en=Threshold;ru=Чувствительность |
| type: float |
| required: true |
| min: 0.1 |
| max: 0.69 |
| step: 0.1 |
| default: 0.5 |
| confidence: |
| order: 6 |
| title: en=Confidence;ru=Уверенность |
| type: float |
| required: true |
| min: 0.1 |
| max: 0.99 |
| step: 0.1 |
| default: 0.5 |
| applyConvexHull: |
| order: 8 |
| title: en=Apply convex hull;ru=Сгладить края |
| type: boolean |
| default: false |
| outputs: |
| merged: |
| title: en=Merged;ru=Общая маска |
| type: image |
| masks: |
| title: en=Masks;ru=Контуры |
| type: json |
| schema: image-masks |
| package: artworks |
| script: |- |
| const CHECK_TASK_INTERVAL = 3000; |
| const MAX_ATTEMPTS = 20; |
| |
| export async function run({ inputs, state }) { |
|
|
| const { FatalError, TimeoutError, RepeatNode, NextNode } = DEFINITIONS; |
| const { ArtWorks, FatalError: ArtWorksError } = require('artworks'); |
| const sharp = require('sharp/lib/index.js'); |
|
|
| const PAAS_BASE_URL = env.variables.get('PAAS_BASE_URL'); |
| if (!PAAS_BASE_URL) { |
| throw new FatalError('Please, set PAAS_BASE_URL in environment'); |
| } |
| const OPEN_PAAS_USER = env.variables.get('OPEN_PAAS_USER'); |
| if (!OPEN_PAAS_USER) { |
| throw new FatalError('Please, set OPEN_PAAS_USER in environment'); |
| } |
| const OPEN_PAAS_PASSWORD = env.variables.get('OPEN_PAAS_PASSWORD'); |
| if (!OPEN_PAAS_PASSWORD) { |
| throw new FatalError('Please, set OPEN_PAAS_PASSWORD in environment'); |
| } |
|
|
| const artworks = new ArtWorks({ |
| baseUrl: PAAS_BASE_URL, |
| username: OPEN_PAAS_USER, |
| password: OPEN_PAAS_PASSWORD |
| }); |
|
|
| if (!state) { |
| const { image, type, model, prompt, threshold, applyConvexHull } = inputs; |
|
|
| const payload = { |
| type: "image-to-mask", |
| isFast: true, |
| payload: { |
| base64: false, |
| image, |
| type, |
| model, |
| prompt, |
| threshold, |
| applyConvexHull, |
| }, |
| }; |
| try { |
| const task = await artworks.createTask(payload); |
| console.log(`Task created ${task}`); |
| return RepeatNode.from({ |
| state: { |
| payload, |
| task, |
| attempt: 0, |
| startedAt: new Date() |
| }, |
| progress: { |
| total: MAX_ATTEMPTS, |
| processed: 0 |
| }, |
| delay: 5000 |
| }); |
| } catch (e) { |
| if (e instanceof ArtWorksError) { |
| throw new FatalError(e.message); |
| } |
| throw e; |
| } |
| } else { |
| const { |
| payload, |
| task, |
| attempt, |
| startedAt |
| } = state; |
|
|
| if (attempt > MAX_ATTEMPTS) { |
| try { |
| await artworks.cancelTask(task); |
| } catch (e) { } |
|
|
| const now = new Date(); |
| const time = (now - new Date(startedAt)) / 1000; |
| throw new TimeoutError(`PaaS task for text to image ${task} timeout in ${time} sec`); |
| } |
|
|
| console.log(`Check task ${attempt} ${task}`); |
|
|
| try { |
| const results = await artworks.checkState(task); |
| if (!results) { |
| return RepeatNode.from({ |
| delay: CHECK_TASK_INTERVAL, |
| state: { |
| payload, |
| task, |
| attempt: attempt + 1, |
| startedAt, |
| }, |
| progress: { |
| total: MAX_ATTEMPTS, |
| processed: attempt |
| }, |
| }); |
| } |
| const { masks: detected } = results; |
| const { image } = inputs; |
| const { data } = await download(image); |
| const { width, height } = await sharp(data).metadata(); |
|
|
| const areas = []; |
| const masks = []; |
| for (const m of detected) { |
| const { |
| mask, |
| confidence, |
| className, |
| coordinates: [left, top], |
| } = m; |
|
|
| const buffer = Buffer.from(mask, "base64"); |
|
|
| areas.push({ |
| input: buffer, |
| top, |
| left, |
| }); |
|
|
| const { width, height } = await sharp(buffer).metadata(); |
| masks.push({ |
| top, |
| left, |
| width, |
| height, |
| className, |
| confidence, |
| }); |
| } |
|
|
| let merged = await sharp({ |
| create: { |
| width, |
| height, |
| channels: 3, |
| background: { r: 0, g: 0, b: 0 }, |
| }, |
| }).composite(areas); |
| return NextNode.from({ |
| outputs: { |
| masks, |
| merged: await merged.png().toBuffer() |
| } |
| }); |
| } catch (e) { |
| if (e instanceof ArtWorksError) { |
| throw new FatalError(e.message); |
| } |
| throw e; |
| } |
| } |
| } |
| source: catalog |
| title: en=Extract mask on image;ru=Выделить маску |
| version: 1 |
| detect_face_on_image_artworks: |
| _id: detect_face_on_image_artworks |
| arrange: |
| x: 1070 |
| y: 330 |
| category: |
| _id: image_analysis |
| title: en=Image analysis;ru=Анализ изображений |
| environment: |
| OPEN_PAAS_USER: |
| title: PaaS user |
| type: string |
| scope: global |
| OPEN_PAAS_PASSWORD: |
| title: PaaS password |
| type: string |
| scope: global |
| PAAS_BASE_URL: |
| title: PaaS base url |
| type: string |
| scope: global |
| execution: regular |
| inputs: |
| image: |
| order: 1 |
| title: en=Image;ru=Изображение |
| type: image |
| required: true |
| index: |
| order: 2 |
| title: en=Index;ru=Индекс |
| type: integer |
| required: true |
| default: 0 |
| outputs: |
| face: |
| title: en=Face;ru=Лицо |
| type: image |
| features: |
| title: en=Features;ru=Характеристики |
| type: json |
| schema: face-features |
| package: artworks |
| script: | |
| const CHECK_TASK_INTERVAL = 3000; |
| const MAX_ATTEMPTS = 10; |
| |
| const FIT_FACE_SIZE = 512; |
|
|
| export async function fit(image, { maxWidth, maxHeight }) { |
| const { width, height } = await image.metadata(); |
| const orientation = width >= height ? "-" : "|"; |
|
|
| const sharp = require('sharp/lib/index.js'); |
|
|
| switch (orientation) { |
| case "-": |
| if (width > maxWidth) { |
| return sharp(await image.resize({ width: maxWidth }).toBuffer()); |
| } |
| break; |
| case "|": |
| if (height > maxHeight) { |
| return sharp(await image.resize({ height: maxHeight }).toBuffer()); |
| } |
| break; |
| } |
|
|
| return image; |
| } |
|
|
| export async function crop(source, face) { |
| const sharp = require('sharp/lib/index.js'); |
|
|
| const image = await sharp(source); |
| const metadata = await image.metadata(); |
|
|
| const UNCROP = 0.6; |
|
|
| let { x, y, width, height } = face; |
|
|
| const uncropX = width * UNCROP; |
| const uncropY = height * UNCROP; |
|
|
| width = Math.round(width + uncropX); |
| height = Math.round(height + uncropY); |
| x = Math.round(x - uncropX / 2); |
| y = Math.round(y - uncropY / 2); |
|
|
| const [left, top] = [Math.max(x, 0), Math.max(y, 0)]; |
| [width, height] = [ |
| Math.min(width, metadata.width - left), |
| Math.min(height, metadata.height - top), |
| ]; |
| const size = Math.min(width, height); |
|
|
| const crop = { |
| left, |
| top, |
| width: size, |
| height: size, |
| }; |
|
|
| const area = await fit(await image.clone().extract(crop).webp(), { |
| maxWidth: FIT_FACE_SIZE, |
| maxHeight: FIT_FACE_SIZE, |
| }); |
|
|
| return area.toBuffer(); |
| } |
|
|
| export async function run({ inputs, state }) { |
|
|
| const { FatalError, TimeoutError, RepeatNode, NextNode } = DEFINITIONS; |
| const { ArtWorks, FatalError: ArtWorksError } = require('artworks'); |
|
|
| const PAAS_BASE_URL = env.variables.get('PAAS_BASE_URL'); |
| if (!PAAS_BASE_URL) { |
| throw new FatalError('Please, set PAAS_BASE_URL in environment'); |
| } |
| const OPEN_PAAS_USER = env.variables.get('OPEN_PAAS_USER'); |
| if (!OPEN_PAAS_USER) { |
| throw new FatalError('Please, set OPEN_PAAS_USER in environment'); |
| } |
| const OPEN_PAAS_PASSWORD = env.variables.get('OPEN_PAAS_PASSWORD'); |
| if (!OPEN_PAAS_PASSWORD) { |
| throw new FatalError('Please, set OPEN_PAAS_PASSWORD in environment'); |
| } |
|
|
| const artworks = new ArtWorks({ |
| baseUrl: PAAS_BASE_URL, |
| username: OPEN_PAAS_USER, |
| password: OPEN_PAAS_PASSWORD |
| }); |
|
|
| if (!state) { |
| const { image, index } = inputs; |
|
|
| const payload = { |
| type: "detect-faces", |
| isFast: true, |
| payload: { |
| base64: false, |
| image, |
| features: ["age", "gender", "race", "emotion"], |
| }, |
| }; |
| try { |
| const task = await artworks.createTask(payload); |
| console.log(`Task created ${task}`); |
| return RepeatNode.from({ |
| state: { |
| payload, |
| task, |
| attempt: 0, |
| startedAt: new Date() |
| }, |
| progress: { |
| total: MAX_ATTEMPTS, |
| processed: 0 |
| }, |
| delay: 2000 |
| }); |
| } catch (e) { |
| if (e instanceof ArtWorksError) { |
| throw new FatalError(e.message); |
| } |
| throw e; |
| } |
| } else { |
| const { |
| payload, |
| task, |
| attempt, |
| startedAt |
| } = state; |
|
|
| if (attempt > MAX_ATTEMPTS) { |
| try { |
| await artworks.cancelTask(task); |
| } catch (e) { } |
|
|
| const now = new Date(); |
| const time = (now - new Date(startedAt)) / 1000; |
| throw new TimeoutError(`PaaS task for text to image ${task} timeout in ${time} sec`); |
| } |
|
|
| console.log(`Check task ${attempt} ${task}`); |
|
|
| try { |
| const results = await artworks.checkState(task); |
| if (!results) { |
| return RepeatNode.from({ |
| delay: CHECK_TASK_INTERVAL, |
| state: { |
| payload, |
| task, |
| attempt: attempt + 1, |
| startedAt, |
| }, |
| progress: { |
| total: MAX_ATTEMPTS, |
| processed: attempt |
| }, |
| }); |
| } |
| const { faces } = results; |
| const { image, index } = inputs; |
| const face = faces[index]; |
| if (!face) { |
| throw new FatalError("Face with such index was not found"); |
| } |
| const { x, y, width, height, ageFrom, ageTo, gender, race, emotion } = face; |
| const { data } = await download(image); |
| return NextNode.from({ |
| outputs: { |
| face: await crop(data, { |
| x, |
| y, |
| width, |
| height, |
| }), |
| features: { |
| ageFrom, |
| ageTo, |
| gender, |
| race, |
| emotion, |
| }, |
| }, |
| }); |
| } catch (e) { |
| if (e instanceof ArtWorksError) { |
| throw new FatalError(e.message); |
| } |
| throw e; |
| } |
| } |
| } |
| source: catalog |
| title: en=Detect face;ru=Определить лицо |
| version: 1 |
| upscale_image_artworks: |
| _id: upscale_image_artworks |
| arrange: |
| x: 470 |
| y: 400 |
| category: |
| _id: generate_images |
| title: en=Generate images;ru=Генерация изображений |
| environment: |
| OPEN_PAAS_USER: |
| title: PaaS user |
| type: string |
| scope: global |
| OPEN_PAAS_PASSWORD: |
| title: PaaS password |
| type: string |
| scope: global |
| PAAS_BASE_URL: |
| title: PaaS base url |
| type: string |
| scope: global |
| execution: regular |
| inputs: |
| image: |
| order: 1 |
| title: en=Image;ru=Изображение |
| type: image |
| required: true |
| upscalingResize: |
| order: 2 |
| title: en=Resize;ru=Увеличение |
| type: float |
| required: true |
| min: 0.1 |
| max: 4 |
| step: 0.1 |
| default: 2 |
| outputs: |
| image: |
| title: en=Image;ru=Изображение |
| type: image |
| package: artworks |
| script: |- |
| const CHECK_TASK_INTERVAL = 3000; |
| const MAX_ATTEMPTS = 20; |
| |
| export async function run({ inputs, state }) { |
|
|
| const { FatalError, TimeoutError, RepeatNode, NextNode } = DEFINITIONS; |
| const { ArtWorks, FatalError: ArtWorksError } = require('artworks'); |
|
|
| const PAAS_BASE_URL = env.variables.get('PAAS_BASE_URL'); |
| if (!PAAS_BASE_URL) { |
| throw new FatalError('Please, set PAAS_BASE_URL in environment'); |
| } |
| const OPEN_PAAS_USER = env.variables.get('OPEN_PAAS_USER'); |
| if (!OPEN_PAAS_USER) { |
| throw new FatalError('Please, set OPEN_PAAS_USER in environment'); |
| } |
| const OPEN_PAAS_PASSWORD = env.variables.get('OPEN_PAAS_PASSWORD'); |
| if (!OPEN_PAAS_PASSWORD) { |
| throw new FatalError('Please, set OPEN_PAAS_PASSWORD in environment'); |
| } |
|
|
| const artworks = new ArtWorks({ |
| baseUrl: PAAS_BASE_URL, |
| username: OPEN_PAAS_USER, |
| password: OPEN_PAAS_PASSWORD |
| }); |
|
|
| if (!state) { |
| const { |
| image, |
| upscalingResize, |
| } = inputs; |
|
|
| const payload = { |
| type: "upscale-image", |
| isFast: true, |
| payload: { |
| base64: false, |
| image, |
| upscalingResize, |
| }, |
| }; |
| try { |
| const task = await artworks.createTask(payload); |
| console.log(`Task created ${task}`); |
| return RepeatNode.from({ |
| state: { |
| payload, |
| task, |
| attempt: 0, |
| startedAt: new Date() |
| }, |
| progress: { |
| total: MAX_ATTEMPTS, |
| processed: 0 |
| }, |
| delay: 5000 |
| }); |
| } catch (e) { |
| if (e instanceof ArtWorksError) { |
| throw new FatalError(e.message); |
| } |
| throw e; |
| } |
| } else { |
| const { |
| payload, |
| task, |
| attempt, |
| startedAt |
| } = state; |
|
|
| if (attempt > MAX_ATTEMPTS) { |
| try { |
| await artworks.cancelTask(task); |
| } catch (e) { } |
|
|
| const now = new Date(); |
| const time = (now - new Date(startedAt)) / 1000; |
| throw new TimeoutError(`PaaS task for text to image ${task} timeout in ${time} sec`); |
| } |
|
|
| console.log(`Check task ${attempt} ${task}`); |
|
|
| try { |
| const results = await artworks.checkState(task); |
| if (!results) { |
| return RepeatNode.from({ |
| delay: CHECK_TASK_INTERVAL, |
| state: { |
| payload, |
| task, |
| attempt: attempt + 1, |
| startedAt, |
| }, |
| progress: { |
| total: MAX_ATTEMPTS, |
| processed: attempt |
| }, |
| }); |
| } |
| let { image: { url: image } } = results; |
| return NextNode.from({ |
| outputs: { |
| image |
| } |
| }); |
| } catch (e) { |
| if (e instanceof ArtWorksError) { |
| throw new FatalError(e.message); |
| } |
| throw e; |
| } |
| } |
| } |
| source: catalog |
| title: en=Upscale image;ru=Увеличить изображение |
| version: 1 |
| classify_image_artworks: |
| _id: classify_image_artworks |
| arrange: |
| x: 1070 |
| y: 460 |
| category: |
| _id: image_analysis |
| title: en=Image analysis;ru=Анализ изображений |
| environment: |
| OPEN_PAAS_USER: |
| title: PaaS user |
| type: string |
| scope: global |
| OPEN_PAAS_PASSWORD: |
| title: PaaS password |
| type: string |
| scope: global |
| PAAS_BASE_URL: |
| title: PaaS base url |
| type: string |
| scope: global |
| execution: regular |
| inputs: |
| image: |
| order: 1 |
| title: en=Image;ru=Изображение |
| type: image |
| required: true |
| labels: |
| order: 3 |
| title: en=Labels;ru=Теги |
| type: json |
| required: true |
| default: '{ "girl": "girl on photo", "male": "male on photo" }' |
| schema: |
| id: image-labels |
| model: |
| order: 2 |
| title: en=Model;ru=Модель |
| type: string |
| required: true |
| default: clip |
| enum: |
| - clip |
| - siglip-1 |
| - siglip-2 |
| outputs: |
| labels: |
| title: en=Labels;ru=Теги |
| type: json |
| package: artworks |
| script: |- |
| const CHECK_TASK_INTERVAL = 1000; |
| const MAX_ATTEMPTS = 20; |
| |
| export async function run({ inputs, state }) { |
|
|
| const { FatalError, TimeoutError, RepeatNode, NextNode } = DEFINITIONS; |
| const { ArtWorks, FatalError: ArtWorksError } = require('artworks'); |
|
|
| const PAAS_BASE_URL = env.variables.get('PAAS_BASE_URL'); |
| if (!PAAS_BASE_URL) { |
| throw new FatalError('Please, set PAAS_BASE_URL in environment'); |
| } |
| const OPEN_PAAS_USER = env.variables.get('OPEN_PAAS_USER'); |
| if (!OPEN_PAAS_USER) { |
| throw new FatalError('Please, set OPEN_PAAS_USER in environment'); |
| } |
| const OPEN_PAAS_PASSWORD = env.variables.get('OPEN_PAAS_PASSWORD'); |
| if (!OPEN_PAAS_PASSWORD) { |
| throw new FatalError('Please, set OPEN_PAAS_PASSWORD in environment'); |
| } |
|
|
| const artworks = new ArtWorks({ |
| baseUrl: PAAS_BASE_URL, |
| username: OPEN_PAAS_USER, |
| password: OPEN_PAAS_PASSWORD |
| }); |
|
|
| if (!state) { |
| const { image, model, labels } = inputs; |
|
|
| const payload = { |
| type: "classify-image", |
| isFast: true, |
| payload: { |
| base64: false, |
| image, |
| model, |
| labels: Object.values(labels), |
| }, |
| }; |
| try { |
| const task = await artworks.createTask(payload); |
| console.log(`Task created ${task}`); |
| return RepeatNode.from({ |
| state: { |
| payload, |
| task, |
| attempt: 0, |
| startedAt: new Date() |
| }, |
| progress: { |
| total: MAX_ATTEMPTS, |
| processed: 0 |
| }, |
| delay: 2000 |
| }); |
| } catch (e) { |
| if (e instanceof ArtWorksError) { |
| throw new FatalError(e.message); |
| } |
| throw e; |
| } |
| } else { |
| const { |
| payload, |
| task, |
| attempt, |
| startedAt |
| } = state; |
|
|
| if (attempt > MAX_ATTEMPTS) { |
| try { |
| await artworks.cancelTask(task); |
| } catch (e) { } |
|
|
| const now = new Date(); |
| const time = (now - new Date(startedAt)) / 1000; |
| throw new TimeoutError(`PaaS task for text to image ${task} timeout in ${time} sec`); |
| } |
|
|
| console.log(`Check task ${attempt} ${task}`); |
|
|
| try { |
| const results = await artworks.checkState(task); |
| if (!results) { |
| return RepeatNode.from({ |
| delay: CHECK_TASK_INTERVAL, |
| state: { |
| payload, |
| task, |
| attempt: attempt + 1, |
| startedAt, |
| }, |
| progress: { |
| total: MAX_ATTEMPTS, |
| processed: attempt |
| }, |
| }); |
| } |
| let { probs } = results; |
| const { labels } = inputs; |
| const tags = {}; |
| for (const key of Object.keys(labels)) { |
| tags[key] = probs[labels[key]]; |
| } |
| return NextNode.from({ |
| outputs: { |
| labels: tags |
| } |
| }); |
| } catch (e) { |
| if (e instanceof ArtWorksError) { |
| throw new FatalError(e.message); |
| } |
| throw e; |
| } |
| } |
| } |
| source: catalog |
| title: en=Classify image;ru=Тегировать изображение |
| version: 1 |
| translate_text_artworks: |
| _id: translate_text_artworks |
| arrange: |
| x: 110 |
| y: 620 |
| category: |
| _id: process_text |
| title: en=Process text;ru=Обработка текста |
| environment: |
| OPEN_PAAS_USER: |
| title: PaaS user |
| type: string |
| scope: global |
| OPEN_PAAS_PASSWORD: |
| title: PaaS password |
| type: string |
| scope: global |
| PAAS_BASE_URL: |
| title: PaaS base url |
| type: string |
| scope: global |
| execution: regular |
| inputs: |
| source: |
| order: 1 |
| title: en=Source language;ru=Исходный язык |
| type: string |
| required: true |
| default: auto |
| enum: |
| - auto|Auto |
| - en|English |
| - de|German |
| - ru|Russian |
| - es|Spanish |
| - fr|French |
| - it|Italian |
| - pt|Portuguese |
| - ja|Japanese |
| - ko|Korean |
| - hi|Hindi |
| - tr|Turkish |
| - zh|Chinese Simplified |
| target: |
| order: 2 |
| title: en=Target;ru=Целевой язык |
| description: github://generative-core/piper/main/docs/nodes/translate-text/target.md |
| type: string |
| required: true |
| default: de |
| enum: |
| - en|English |
| - de|German |
| - ru|Russian |
| - es|Spanish |
| - fr|French |
| - it|Italian |
| - pt|Portuguese |
| - ja|Japanese |
| - ko|Korean |
| - hi|Hindi |
| - tr|Turkish |
| - zh|Chinese Simplified |
| text: |
| order: 3 |
| title: en=Text;ru=Текст |
| type: string |
| required: true |
| multiline: true |
| outputs: |
| text: |
| title: en=Text;ru=Перевод |
| type: string |
| alternatives: |
| title: en=Alternatives;ru=Альтернативы |
| type: string[] |
| detectedLanguage: |
| title: en=Detected language;ru=Исходный язык |
| type: json |
| schema: detected-languages |
| package: artworks |
| script: | |
| const CHECK_TASK_INTERVAL = 3000; |
| const MAX_ATTEMPTS = 10; |
| |
| export async function run({ inputs, state }) { |
|
|
| const { FatalError, TimeoutError, RepeatNode, NextNode } = DEFINITIONS; |
| const { ArtWorks, FatalError: ArtWorksError } = require('artworks'); |
|
|
| const PAAS_BASE_URL = env.variables.get('PAAS_BASE_URL'); |
| if (!PAAS_BASE_URL) { |
| throw new FatalError('Please, set PAAS_BASE_URL in environment'); |
| } |
| const OPEN_PAAS_USER = env.variables.get('OPEN_PAAS_USER'); |
| if (!OPEN_PAAS_USER) { |
| throw new FatalError('Please, set OPEN_PAAS_USER in environment'); |
| } |
| const OPEN_PAAS_PASSWORD = env.variables.get('OPEN_PAAS_PASSWORD'); |
| if (!OPEN_PAAS_PASSWORD) { |
| throw new FatalError('Please, set OPEN_PAAS_PASSWORD in environment'); |
| } |
|
|
| const artworks = new ArtWorks({ |
| baseUrl: PAAS_BASE_URL, |
| username: OPEN_PAAS_USER, |
| password: OPEN_PAAS_PASSWORD |
| }); |
|
|
| if (!state) { |
| const { source, target, text } = inputs; |
|
|
| const payload = { |
| type: "translate-text", |
| isFast: true, |
| payload: { |
| source, |
| target, |
| text, |
| }, |
| }; |
| try { |
| const task = await artworks.createTask(payload); |
| console.log(`Task created ${task}`); |
| return RepeatNode.from({ |
| state: { |
| payload, |
| task, |
| attempt: 0, |
| startedAt: new Date() |
| }, |
| progress: { |
| total: MAX_ATTEMPTS, |
| processed: 0 |
| }, |
| delay: 2000 |
| }); |
| } catch (e) { |
| if (e instanceof ArtWorksError) { |
| throw new FatalError(e.message); |
| } |
| throw e; |
| } |
| } else { |
| const { |
| payload, |
| task, |
| attempt, |
| startedAt |
| } = state; |
|
|
| if (attempt > MAX_ATTEMPTS) { |
| try { |
| await artworks.cancelTask(task); |
| } catch (e) { } |
|
|
| const now = new Date(); |
| const time = (now - new Date(startedAt)) / 1000; |
| throw new TimeoutError(`PaaS task for text to image ${task} timeout in ${time} sec`); |
| } |
|
|
| console.log(`Check task ${attempt} ${task}`); |
|
|
| try { |
| const results = await artworks.checkState(task); |
| if (!results) { |
| return RepeatNode.from({ |
| delay: CHECK_TASK_INTERVAL, |
| state: { |
| payload, |
| task, |
| attempt: attempt + 1, |
| startedAt, |
| }, |
| progress: { |
| total: MAX_ATTEMPTS, |
| processed: attempt |
| }, |
| }); |
| } |
| console.log(results); |
| const { alternatives, detectedLanguage, text } = results; |
| return NextNode.from({ |
| outputs: { |
| alternatives, |
| detectedLanguage, |
| text |
| } |
| }); |
| } catch (e) { |
| if (e instanceof ArtWorksError) { |
| throw new FatalError(e.message); |
| } |
| throw e; |
| } |
| } |
| } |
| source: catalog |
| title: en=Translate text;ru=Перевести текст |
| version: 1 |
| face_swap_on_image_artworks: |
| _id: face_swap_on_image_artworks |
| arrange: |
| x: 440 |
| y: 630 |
| category: |
| _id: deep_swap |
| title: en=Deep swap;ru=Глубокая замена |
| environment: |
| OPEN_PAAS_USER: |
| title: PaaS user |
| type: string |
| scope: global |
| OPEN_PAAS_PASSWORD: |
| title: PaaS password |
| type: string |
| scope: global |
| PAAS_BASE_URL: |
| title: PaaS base url |
| type: string |
| scope: global |
| execution: regular |
| inputs: |
| face: |
| order: 1 |
| title: en=Face;ru=Лицо |
| type: image |
| required: true |
| image: |
| order: 2 |
| title: en=Image;ru=Изображение |
| type: image |
| required: true |
| outputs: |
| image: |
| title: en=Image;ru=Изображение |
| type: image |
| package: artworks |
| script: | |
| const CHECK_TASK_INTERVAL = 3000; |
| const MAX_ATTEMPTS = 20; |
| |
| export async function costs({ inputs }) { |
| return 0.1; |
| } |
|
|
| export async function run({ inputs, state }) { |
|
|
| const { FatalError, TimeoutError, RepeatNode, NextNode } = DEFINITIONS; |
| const { ArtWorks, FatalError: ArtWorksError } = require('artworks'); |
|
|
| const PAAS_BASE_URL = env.variables.get('PAAS_BASE_URL'); |
| if (!PAAS_BASE_URL) { |
| throw new FatalError('Please, set PAAS_BASE_URL in environment'); |
| } |
| const OPEN_PAAS_USER = env.variables.get('OPEN_PAAS_USER'); |
| if (!OPEN_PAAS_USER) { |
| throw new FatalError('Please, set OPEN_PAAS_USER in environment'); |
| } |
| const OPEN_PAAS_PASSWORD = env.variables.get('OPEN_PAAS_PASSWORD'); |
| if (!OPEN_PAAS_PASSWORD) { |
| throw new FatalError('Please, set OPEN_PAAS_PASSWORD in environment'); |
| } |
|
|
| const artworks = new ArtWorks({ |
| baseUrl: PAAS_BASE_URL, |
| username: OPEN_PAAS_USER, |
| password: OPEN_PAAS_PASSWORD |
| }); |
|
|
| if (!state) { |
| const { |
| face, |
| image |
| } = inputs; |
|
|
| const payload = { |
| type: "faceswap-on-image", |
| isFast: true, |
| payload: { |
| base64: false, |
| face, |
| image, |
| } |
| }; |
| try { |
| const task = await artworks.createTask(payload); |
| console.log(`Task created ${task}`); |
| return RepeatNode.from({ |
| state: { |
| payload, |
| task, |
| attempt: 0, |
| startedAt: new Date() |
| }, |
| progress: { |
| total: MAX_ATTEMPTS, |
| processed: 0 |
| }, |
| delay: 2000 |
| }); |
| } catch (e) { |
| if (e instanceof ArtWorksError) { |
| throw new FatalError(e.message); |
| } |
| throw e; |
| } |
| } else { |
| const { |
| payload, |
| task, |
| attempt, |
| startedAt |
| } = state; |
|
|
| if (attempt > MAX_ATTEMPTS) { |
| try { |
| await artworks.cancelTask(task); |
| } catch (e) { } |
|
|
| const now = new Date(); |
| const time = (now - new Date(startedAt)) / 1000; |
| throw new TimeoutError(`PaaS task for text to image ${task} timeout in ${time} sec`); |
| } |
|
|
| console.log(`Check task ${attempt} ${task}`); |
|
|
| try { |
| const results = await artworks.checkState(task); |
| if (!results) { |
| return RepeatNode.from({ |
| delay: CHECK_TASK_INTERVAL, |
| state: { |
| payload, |
| task, |
| attempt: attempt + 1, |
| startedAt, |
| }, |
| progress: { |
| total: MAX_ATTEMPTS, |
| processed: attempt |
| }, |
| }); |
| } |
| let { images: [{ url: image }] } = results; |
| return NextNode.from({ |
| outputs: { |
| image |
| }, |
| costs: costs({ inputs }) |
| }); |
| } catch (e) { |
| if (e instanceof ArtWorksError) { |
| throw new FatalError(e.message); |
| } |
| throw e; |
| } |
| } |
| } |
| source: catalog |
| title: en=Face swap on image;ru=Замена лица на изображении |
| version: 1 |
| remove_background_artworks: |
| _id: remove_background_artworks |
| arrange: |
| x: 750 |
| y: 630 |
| category: |
| _id: image_processing |
| title: en=Work with images;ru=Работа с изображениями |
| environment: |
| OPEN_PAAS_USER: |
| title: PaaS user |
| type: string |
| scope: global |
| OPEN_PAAS_PASSWORD: |
| title: PaaS password |
| type: string |
| scope: global |
| PAAS_BASE_URL: |
| title: PaaS base url |
| type: string |
| scope: global |
| execution: regular |
| inputs: |
| image: |
| order: 1 |
| title: en=Image;ru=Изображение |
| type: image |
| required: true |
| model: |
| order: 2 |
| title: en=Model;ru=Модель |
| type: string |
| required: true |
| default: isnet-general-use |
| enum: |
| - isnet-general-use|IsNet |
| - u2net|U2Net |
| outputs: |
| image: |
| title: en=Image;ru=Изображение |
| type: image |
| package: artworks |
| script: |- |
| const CHECK_TASK_INTERVAL = 3000; |
| const MAX_ATTEMPTS = 20; |
| |
| export async function run({ inputs, state }) { |
|
|
| const { FatalError, TimeoutError, RepeatNode, NextNode } = DEFINITIONS; |
| const { ArtWorks, FatalError: ArtWorksError } = require('artworks'); |
|
|
| const PAAS_BASE_URL = env.variables.get('PAAS_BASE_URL'); |
| if (!PAAS_BASE_URL) { |
| throw new FatalError('Please, set PAAS_BASE_URL in environment'); |
| } |
| const OPEN_PAAS_USER = env.variables.get('OPEN_PAAS_USER'); |
| if (!OPEN_PAAS_USER) { |
| throw new FatalError('Please, set OPEN_PAAS_USER in environment'); |
| } |
| const OPEN_PAAS_PASSWORD = env.variables.get('OPEN_PAAS_PASSWORD'); |
| if (!OPEN_PAAS_PASSWORD) { |
| throw new FatalError('Please, set OPEN_PAAS_PASSWORD in environment'); |
| } |
|
|
| const artworks = new ArtWorks({ |
| baseUrl: PAAS_BASE_URL, |
| username: OPEN_PAAS_USER, |
| password: OPEN_PAAS_PASSWORD |
| }); |
|
|
| if (!state) { |
| const { |
| image, |
| model, |
| } = inputs; |
|
|
| const payload = { |
| type: "remove-image-background", |
| isFast: true, |
| payload: { |
| base64: false, |
| model, |
| image, |
| }, |
| }; |
| try { |
| const task = await artworks.createTask(payload); |
| console.log(`Task created ${task}`); |
| return RepeatNode.from({ |
| state: { |
| payload, |
| task, |
| attempt: 0, |
| startedAt: new Date() |
| }, |
| progress: { |
| total: MAX_ATTEMPTS, |
| processed: 0 |
| }, |
| delay: 5000 |
| }); |
| } catch (e) { |
| if (e instanceof ArtWorksError) { |
| throw new FatalError(e.message); |
| } |
| throw e; |
| } |
| } else { |
| const { |
| payload, |
| task, |
| attempt, |
| startedAt |
| } = state; |
| |
| if (attempt > MAX_ATTEMPTS) { |
| try { |
| await artworks.cancelTask(task); |
| } catch (e) { } |
|
|
| const now = new Date(); |
| const time = (now - new Date(startedAt)) / 1000; |
| throw new TimeoutError(`PaaS task for text to image ${task} timeout in ${time} sec`); |
| } |
|
|
| console.log(`Check task ${attempt} ${task}`); |
|
|
| try { |
| const results = await artworks.checkState(task); |
| if (!results) { |
| return RepeatNode.from({ |
| delay: CHECK_TASK_INTERVAL, |
| state: { |
| payload, |
| task, |
| attempt: attempt + 1, |
| startedAt, |
| }, |
| progress: { |
| total: MAX_ATTEMPTS, |
| processed: attempt |
| }, |
| }); |
| } |
| let { image: { url: image } } = results; |
| return NextNode.from({ |
| outputs: { |
| image |
| } |
| }); |
| } catch (e) { |
| if (e instanceof ArtWorksError) { |
| throw new FatalError(e.message); |
| } |
| throw e; |
| } |
| } |
| } |
| source: catalog |
| title: en=Remove background;ru=Удалить фон |
| version: 1 |
| outpaint_image_artworks: |
| _id: outpaint_image_artworks |
| arrange: |
| x: 1070 |
| y: 630 |
| category: |
| _id: generate_images |
| title: en=Generate images;ru=Генерация изображений |
| environment: |
| OPEN_PAAS_USER: |
| title: PaaS user |
| type: string |
| scope: user |
| OPEN_PAAS_PASSWORD: |
| title: PaaS password |
| type: string |
| scope: user |
| PAAS_BASE_URL: |
| title: PaaS base url |
| type: string |
| scope: user |
| execution: regular |
| groups: |
| inputs: |
| base: |
| order: 1 |
| title: en=Base;ru=Базовые параметры |
| distance: |
| order: 2 |
| title: en=Distance;ru=Расширение |
| inputs: |
| image: |
| order: 1 |
| title: en=Image;ru=Изображение |
| group: base |
| type: image |
| required: true |
| prompt: |
| order: 2 |
| title: en=Prompt;ru=Подсказка |
| group: base |
| type: string |
| required: true |
| multiline: true |
| negativePrompt: |
| order: 4 |
| title: en=Negative prompt;ru=Негативная подсказка |
| group: base |
| type: string |
| multiline: true |
| checkpoint: |
| order: 3 |
| title: en=Checkpoint;ru=Модель |
| group: base |
| type: string |
| required: true |
| default: juggernautXL_v9Rundiffusionphoto2.safetensors |
| enum: |
| - raemuXL_v40.safetensors|Raemu XL <SDXL> |
| - aamXLAnimeMix_v10.safetensors|AAM XL (Anime Mix) <SDXL> <Fantasy> |
| - dreamweaverPony25D.1erv.safetensors|DreamWeaver - Pony 2.5D Mix <SDXL> |
| - mixGEMAdam8witQegoow.NeWz.safetensors|MyMIX-G/Jem <SDXL> <Realistic> |
| - mfcgPDXL_v10.safetensors|MFCG PDXL <SDXL> |
| - aniku_0.2.fp16.safetensors|Anime Desire <SDXL> <Fantasy> |
| - juggernautXL_v9Rundiffusionphoto2.safetensors|Juggernaut XL <SDXL> |
| - animaPencilXL_v260.safetensors|Anima Pencil XL <SDXL> <Fantasy> |
| - bluePencilXL_v401.safetensors|Blue Pencil XL <SDXL> <Fantasy> |
| - pixelArtDiffusionXL_spriteShaper.safetensors|Pixel Art Diffusion XL <SDXL> <Fantasy> |
| - albedobaseXL_v20.safetensors|AlbedoBase XL <SDXL> |
| - leosamsHelloworldXL_helloworldXL50GPT4V.safetensors|Helloworld XL <SDXL> |
| - dynavisionXLAllInOneStylized_releaseV0610Bakedvae.safetensors|DynaVision XL All In One <SDXL> |
| - afroditexlNudePeople_20Bkdvae.safetensors|Nude People <NSFW> |
| - asdf_0.4a_lorapov_0.2_lust_0.4.fp16.safetensors|Real Porn <NSFW> |
| - Sexy_Aesthetic_SDXL_0.4x0.2.fp16.safetensors|Sexy & Beauty <NSFW> |
| - aniku_0.2.fp16.safetensors|Anime Desire <NSFW> |
| - anikurender_0.4b.fp16.safetensors|Hardcore Fantasy <NSFW> |
| denoisingStrength: |
| order: 5 |
| title: en=Denoising strength;ru=Степень изменения |
| group: base |
| type: float |
| required: true |
| min: 0.1 |
| max: 1 |
| step: 0.05 |
| default: 0.5 |
| cfgScale: |
| order: 6 |
| title: en=CFG scale;ru=Креативность |
| group: base |
| type: integer |
| required: true |
| min: 1 |
| max: 20 |
| step: 1 |
| default: 7 |
| performance: |
| order: 7 |
| title: en=Performance;ru=Производительность |
| group: base |
| type: string |
| default: speed |
| enum: |
| - express|⚡ Express |
| - speed|🚅 Speed |
| - quality|💎 Quality |
| seed: |
| order: 9 |
| title: en=Seed;ru=Начальный шум |
| group: base |
| type: integer |
| placeholder: "-1" |
| batchSize: |
| order: 8 |
| title: en=Batch size;ru=Кол-во |
| group: base |
| type: integer |
| min: 1 |
| max: 4 |
| step: 1 |
| default: 1 |
| distanceTop: |
| order: 1 |
| title: en=Distance top;ru=Расширить сверху |
| group: distance |
| type: integer |
| min: 0 |
| max: 200 |
| step: 5 |
| default: 0 |
| distanceRight: |
| order: 2 |
| title: en=Distance right;ru=Расширить справа |
| group: distance |
| type: integer |
| min: 0 |
| max: 200 |
| step: 5 |
| default: 0 |
| distanceBottom: |
| order: 3 |
| title: en=Distance bottom;ru=Расширить снизу |
| group: distance |
| type: integer |
| min: 0 |
| max: 200 |
| step: 5 |
| default: 0 |
| distanceLeft: |
| order: 4 |
| title: en=Distance left;ru=Расширить слева |
| group: distance |
| type: integer |
| min: 0 |
| max: 200 |
| step: 5 |
| default: 0 |
| outputs: |
| image1: |
| title: en=Image 1;ru=Изображение 1 |
| type: image |
| images: |
| title: en=Images;ru=Изображения |
| type: image[] |
| image2: |
| title: en=Image 2;ru=Изображение 2 |
| type: image |
| image3: |
| title: en=Image 3;ru=Изображение 3 |
| type: image |
| image4: |
| title: en=Image 4;ru=Изображение 4 |
| type: image |
| package: artworks |
| script: | |
| const CHECK_TASK_INTERVAL = 5000; |
| const MAX_ATTEMPTS = 100; |
| |
| export async function run({ inputs, state }) { |
|
|
| const { FatalError, TimeoutError, RepeatNode, NextNode } = DEFINITIONS; |
| const { ArtWorks, fitSize, FatalError: ArtWorksError } = require('artworks'); |
| const sharp = require('sharp/lib/index.js'); |
|
|
| const PAAS_BASE_URL = env.variables.get('PAAS_BASE_URL'); |
| if (!PAAS_BASE_URL) { |
| throw new FatalError('Please, set PAAS_BASE_URL in environment'); |
| } |
| const OPEN_PAAS_USER = env.variables.get('OPEN_PAAS_USER'); |
| if (!OPEN_PAAS_USER) { |
| throw new FatalError('Please, set OPEN_PAAS_USER in environment'); |
| } |
| const OPEN_PAAS_PASSWORD = env.variables.get('OPEN_PAAS_PASSWORD'); |
| if (!OPEN_PAAS_PASSWORD) { |
| throw new FatalError('Please, set OPEN_PAAS_PASSWORD in environment'); |
| } |
|
|
| const artworks = new ArtWorks({ |
| baseUrl: PAAS_BASE_URL, |
| username: OPEN_PAAS_USER, |
| password: OPEN_PAAS_PASSWORD |
| }); |
|
|
| if (!state) { |
| const { |
| image, |
| prompt, |
| checkpoint, |
| negativePrompt, |
| denoisingStrength, |
| cfgScale, |
| performance, |
| batchSize, |
| seed, |
| // distance |
| distanceTop, |
| distanceRight, |
| distanceBottom, |
| distanceLeft |
| } = inputs; |
| const payload = { |
| type: "outpaint-on-image", |
| isFast: true, |
| payload: { |
| base64: false, |
| image, |
| prompt, |
| checkpoint, |
| negativePrompt, |
| denoisingStrength, |
| cfgScale, |
| performance, |
| ...(batchSize > 1 ? { batchSize } : {}), |
| seed, |
| // distance |
| distanceTop, |
| distanceRight, |
| distanceBottom, |
| distanceLeft |
| }, |
| }; |
| try { |
| const task = await artworks.createTask(payload); |
| console.log(`Task created ${task}`); |
| return RepeatNode.from({ |
| state: { |
| payload, |
| task, |
| attempt: 0, |
| startedAt: new Date() |
| }, |
| progress: { |
| total: MAX_ATTEMPTS, |
| processed: 0 |
| }, |
| delay: 5000 |
| }); |
| } catch (e) { |
| if (e instanceof ArtWorksError) { |
| throw new FatalError(e.message); |
| } |
| throw e; |
| } |
| } else { |
| const { |
| payload, |
| task, |
| attempt, |
| startedAt |
| } = state; |
|
|
| if (attempt > MAX_ATTEMPTS) { |
| try { |
| await artworks.cancelTask(task); |
| } catch (e) { } |
|
|
| const now = new Date(); |
| const time = (now - new Date(startedAt)) / 1000; |
| throw new TimeoutError(`PaaS task for text to image ${task} timeout in ${time} sec`); |
| } |
|
|
| console.log(`Check task ${attempt} ${task}`); |
|
|
| try { |
| const results = await artworks.checkState(task); |
| if (!results) { |
| return RepeatNode.from({ |
| delay: CHECK_TASK_INTERVAL, |
| state: { |
| payload, |
| task, |
| attempt: attempt + 1, |
| startedAt, |
| }, |
| progress: { |
| total: MAX_ATTEMPTS, |
| processed: attempt |
| }, |
| }); |
| } |
| let images = results.images.map((i) => i.url); |
| const [image1, image2, image3, image4] = images; |
| return NextNode.from({ |
| outputs: { |
| images, |
| image1, |
| image2, |
| image3, |
| image4 |
| } |
| }); |
| } catch (e) { |
| if (e instanceof ArtWorksError) { |
| throw new FatalError(e.message); |
| } |
| throw e; |
| } |
| } |
| } |
| source: catalog |
| title: en=Outpaint on image;ru=Расширить изображение |
| version: 1 |
| ask_llm_artworks: |
| _id: ask_llm_artworks |
| arrange: |
| x: 210 |
| y: 800 |
| category: |
| _id: llm_agents |
| title: en=Language Agents;ru=Языковые агенты |
| environment: |
| OPEN_PAAS_USER: |
| title: PaaS user |
| type: string |
| scope: global |
| OPEN_PAAS_PASSWORD: |
| title: PaaS password |
| type: string |
| scope: global |
| PAAS_BASE_URL: |
| title: PaaS base url |
| type: string |
| scope: global |
| execution: regular |
| inputs: |
| model: |
| order: 1 |
| title: en=Model;ru=Модель |
| type: string |
| required: true |
| default: mistral:7b |
| enum: |
| - mistral:7b |
| answerFormat: |
| order: 3 |
| title: en=Answer format;ru=Формат ответа |
| description: Don't forget add instructions for LLM |
| type: string |
| required: true |
| default: text |
| enum: |
| - text|Text |
| - json|JSON |
| question: |
| order: 2 |
| title: en=Question;ru=Вопрос |
| type: string |
| required: true |
| default: What time is it now? Only JSON ready to parse. |
| outputs: |
| text: |
| title: Text |
| type: string |
| json: |
| title: JSON |
| type: json |
| package: artworks |
| script: |- |
| const CHECK_TASK_INTERVAL = 3000; |
| const MAX_ATTEMPTS = 20; |
| |
| export async function run({ inputs, state }) { |
|
|
| const { FatalError, TimeoutError, RepeatNode, NextNode } = DEFINITIONS; |
| const { ArtWorks, FatalError: ArtWorksError } = require('artworks'); |
|
|
| const PAAS_BASE_URL = env.variables.get('PAAS_BASE_URL'); |
| if (!PAAS_BASE_URL) { |
| throw new FatalError('Please, set PAAS_BASE_URL in environment'); |
| } |
| const OPEN_PAAS_USER = env.variables.get('OPEN_PAAS_USER'); |
| if (!OPEN_PAAS_USER) { |
| throw new FatalError('Please, set OPEN_PAAS_USER in environment'); |
| } |
| const OPEN_PAAS_PASSWORD = env.variables.get('OPEN_PAAS_PASSWORD'); |
| if (!OPEN_PAAS_PASSWORD) { |
| throw new FatalError('Please, set OPEN_PAAS_PASSWORD in environment'); |
| } |
|
|
| const artworks = new ArtWorks({ |
| baseUrl: PAAS_BASE_URL, |
| username: OPEN_PAAS_USER, |
| password: OPEN_PAAS_PASSWORD |
| }); |
|
|
| if (!state) { |
| const { model, prompt } = inputs; |
|
|
| const payload = { |
| type: "ask-llm", |
| isFast: true, |
| payload: { |
| base64: false, |
| model, |
| prompt |
| }, |
| }; |
| try { |
| const task = await artworks.createTask(payload); |
| console.log(`Task created ${task}`); |
| return RepeatNode.from({ |
| state: { |
| payload, |
| task, |
| attempt: 0, |
| startedAt: new Date() |
| }, |
| progress: { |
| total: MAX_ATTEMPTS, |
| processed: 0 |
| }, |
| delay: 5000 |
| }); |
| } catch (e) { |
| if (e instanceof ArtWorksError) { |
| throw new FatalError(e.message); |
| } |
| throw e; |
| } |
| } else { |
| const { |
| payload, |
| task, |
| attempt, |
| startedAt |
| } = state; |
|
|
| if (attempt > MAX_ATTEMPTS) { |
| try { |
| await artworks.cancelTask(task); |
| } catch (e) { } |
|
|
| const now = new Date(); |
| const time = (now - new Date(startedAt)) / 1000; |
| throw new TimeoutError(`PaaS task for text to image ${task} timeout in ${time} sec`); |
| } |
|
|
| console.log(`Check task ${attempt} ${task}`); |
|
|
| try { |
| const results = await artworks.checkState(task); |
| if (!results) { |
| return RepeatNode.from({ |
| delay: CHECK_TASK_INTERVAL, |
| state: { |
| payload, |
| task, |
| attempt: attempt + 1, |
| startedAt, |
| }, |
| progress: { |
| total: MAX_ATTEMPTS, |
| processed: attempt |
| }, |
| }); |
| } |
| console.log(JSON.stringify(results)); |
| const { answerFormat } = inputs; |
| const { message: { content: answer } } = results; |
| switch (answerFormat) { |
| case 'text': |
| return NextNode.from({ outputs: { answer } }); |
| case 'json': |
| try { |
| const json = answer.replace(/^\`\`\`json\s*/ig, '').replace(/\`\`\`\s*$/ig, ''); |
| return NextNode.from({ outputs: { json: JSON.parse(json) } }); |
| } catch (e) { |
| console.log(e); |
| message(`Wrong JSON for question \`\`\`text\n${question}\n\`\`\`\nnanswer from LLM\n\`\`\`text${answer}\n\`\`\``, 'defect'); |
| throw new FatalError("Can't parse JSON asnwer from LLM"); |
| } |
| default: |
| throw new FatalError(`Wrong answer format ${answerFormat}`); |
| } |
| } catch (e) { |
| if (e instanceof ArtWorksError) { |
| throw new FatalError(e.message); |
| } |
| throw e; |
| } |
| } |
| } |
| source: catalog |
| title: en=Ask LLM agent;ru=Спросить LLM |
| version: 1 |
| ask_vlm_artworks: |
| _id: ask_vlm_artworks |
| arrange: |
| x: 590 |
| y: 800 |
| category: |
| _id: image_analysis |
| title: en=Image analysis;ru=Анализ изображений |
| environment: |
| OPEN_PAAS_USER: |
| title: PaaS user |
| type: string |
| scope: global |
| OPEN_PAAS_PASSWORD: |
| title: PaaS password |
| type: string |
| scope: global |
| PAAS_BASE_URL: |
| title: PaaS base url |
| type: string |
| scope: global |
| inputs: |
| image: |
| order: 1 |
| title: en=Image;ru=Изображение |
| type: image |
| required: true |
| prompt: |
| order: 2 |
| title: en=Prompt;ru=Подсказка |
| type: string |
| required: true |
| default: describe image |
| outputs: |
| text: |
| title: en=Text;ru=Описание |
| type: string |
| package: artworks |
| script: |- |
| const CHECK_TASK_INTERVAL = 3000; |
| const MAX_ATTEMPTS = 20; |
| |
| export async function run({ inputs, state }) { |
|
|
| const { FatalError, TimeoutError, RepeatNode, NextNode } = DEFINITIONS; |
| const { ArtWorks, FatalError: ArtWorksError } = require('artworks'); |
|
|
| const PAAS_BASE_URL = env.variables.get('PAAS_BASE_URL'); |
| if (!PAAS_BASE_URL) { |
| throw new FatalError('Please, set PAAS_BASE_URL in environment'); |
| } |
| const OPEN_PAAS_USER = env.variables.get('OPEN_PAAS_USER'); |
| if (!OPEN_PAAS_USER) { |
| throw new FatalError('Please, set OPEN_PAAS_USER in environment'); |
| } |
| const OPEN_PAAS_PASSWORD = env.variables.get('OPEN_PAAS_PASSWORD'); |
| if (!OPEN_PAAS_PASSWORD) { |
| throw new FatalError('Please, set OPEN_PAAS_PASSWORD in environment'); |
| } |
|
|
| const artworks = new ArtWorks({ |
| baseUrl: PAAS_BASE_URL, |
| username: OPEN_PAAS_USER, |
| password: OPEN_PAAS_PASSWORD |
| }); |
|
|
| if (!state) { |
| const { |
| image, |
| prompt, |
| } = inputs; |
|
|
| const payload = { |
| type: "ask-vlm", |
| isFast: true, |
| payload: { |
| base64: false, |
| image, |
| prompt, |
| }, |
| }; |
| try { |
| const task = await artworks.createTask(payload); |
| console.log(`Task created ${task}`); |
| return RepeatNode.from({ |
| state: { |
| payload, |
| task, |
| attempt: 0, |
| startedAt: new Date() |
| }, |
| progress: { |
| total: MAX_ATTEMPTS, |
| processed: 0 |
| }, |
| delay: 5000 |
| }); |
| } catch (e) { |
| if (e instanceof ArtWorksError) { |
| throw new FatalError(e.message); |
| } |
| throw e; |
| } |
| } else { |
| const { |
| payload, |
| task, |
| attempt, |
| startedAt |
| } = state; |
|
|
| if (attempt > MAX_ATTEMPTS) { |
| try { |
| await artworks.cancelTask(task); |
| } catch (e) { } |
|
|
| const now = new Date(); |
| const time = (now - new Date(startedAt)) / 1000; |
| throw new TimeoutError(`PaaS task for text to image ${task} timeout in ${time} sec`); |
| } |
|
|
| console.log(`Check task ${attempt} ${task}`); |
|
|
| try { |
| const results = await artworks.checkState(task); |
| if (!results) { |
| return RepeatNode.from({ |
| delay: CHECK_TASK_INTERVAL, |
| state: { |
| payload, |
| task, |
| attempt: attempt + 1, |
| startedAt, |
| }, |
| progress: { |
| total: MAX_ATTEMPTS, |
| processed: attempt |
| }, |
| }); |
| } |
| let { response: text } = results; |
| return NextNode.from({ |
| outputs: { |
| text |
| } |
| }); |
| } catch (e) { |
| if (e instanceof ArtWorksError) { |
| throw new FatalError(e.message); |
| } |
| throw e; |
| } |
| } |
| } |
| source: catalog |
| title: en=Ask VLM;ru=Спросить VLM |
| version: 1 |
| detect_nsfw_artworks: |
| _id: detect_nsfw_artworks |
| arrange: |
| x: 210 |
| y: 980 |
| category: |
| _id: image_analysis |
| title: en=Image analysis;ru=Анализ изображений |
| environment: |
| OPEN_PAAS_USER: |
| title: PaaS user |
| type: string |
| scope: global |
| OPEN_PAAS_PASSWORD: |
| title: PaaS password |
| type: string |
| scope: global |
| PAAS_BASE_URL: |
| title: PaaS base url |
| type: string |
| scope: global |
| execution: regular |
| inputs: |
| image: |
| order: 1 |
| title: en=Image;ru=Изображение |
| type: image |
| required: true |
| outputs: |
| scores: |
| title: en=Scores;ru=Оценки |
| type: json |
| package: artworks |
| script: |- |
| const CHECK_TASK_INTERVAL = 1000; |
| const MAX_ATTEMPTS = 20; |
| |
| export async function run({ inputs, state }) { |
|
|
| const { FatalError, TimeoutError, RepeatNode, NextNode } = DEFINITIONS; |
| const { ArtWorks, FatalError: ArtWorksError } = require('artworks'); |
|
|
| const PAAS_BASE_URL = env.variables.get('PAAS_BASE_URL'); |
| if (!PAAS_BASE_URL) { |
| throw new FatalError('Please, set PAAS_BASE_URL in environment'); |
| } |
| const OPEN_PAAS_USER = env.variables.get('OPEN_PAAS_USER'); |
| if (!OPEN_PAAS_USER) { |
| throw new FatalError('Please, set OPEN_PAAS_USER in environment'); |
| } |
| const OPEN_PAAS_PASSWORD = env.variables.get('OPEN_PAAS_PASSWORD'); |
| if (!OPEN_PAAS_PASSWORD) { |
| throw new FatalError('Please, set OPEN_PAAS_PASSWORD in environment'); |
| } |
|
|
| const artworks = new ArtWorks({ |
| baseUrl: PAAS_BASE_URL, |
| username: OPEN_PAAS_USER, |
| password: OPEN_PAAS_PASSWORD |
| }); |
|
|
| if (!state) { |
| const { image } = inputs; |
|
|
| const payload = { |
| type: "detect-nsfw", |
| isFast: true, |
| payload: { |
| base64: false, |
| image |
| }, |
| }; |
| try { |
| const task = await artworks.createTask(payload); |
| console.log(`Task created ${task}`); |
| return RepeatNode.from({ |
| state: { |
| payload, |
| task, |
| attempt: 0, |
| startedAt: new Date() |
| }, |
| progress: { |
| total: MAX_ATTEMPTS, |
| processed: 0 |
| }, |
| delay: 2000 |
| }); |
| } catch (e) { |
| if (e instanceof ArtWorksError) { |
| throw new FatalError(e.message); |
| } |
| throw e; |
| } |
| } else { |
| const { |
| payload, |
| task, |
| attempt, |
| startedAt |
| } = state; |
|
|
| if (attempt > MAX_ATTEMPTS) { |
| try { |
| await artworks.cancelTask(task); |
| } catch (e) { } |
|
|
| const now = new Date(); |
| const time = (now - new Date(startedAt)) / 1000; |
| throw new TimeoutError(`PaaS task for text to image ${task} timeout in ${time} sec`); |
| } |
|
|
| console.log(`Check task ${attempt} ${task}`); |
|
|
| try { |
| const results = await artworks.checkState(task); |
| if (!results) { |
| return RepeatNode.from({ |
| delay: CHECK_TASK_INTERVAL, |
| state: { |
| payload, |
| task, |
| attempt: attempt + 1, |
| startedAt, |
| }, |
| progress: { |
| total: MAX_ATTEMPTS, |
| processed: attempt |
| }, |
| }); |
| } |
| return NextNode.from({ |
| outputs: { |
| scores: results |
| } |
| }); |
| } catch (e) { |
| if (e instanceof ArtWorksError) { |
| throw new FatalError(e.message); |
| } |
| throw e; |
| } |
| } |
| } |
| source: catalog |
| title: en=Detect NSFW;ru=Определить NSFW |
| version: 1 |
| srore_aesthetics: |
| _id: srore_aesthetics |
| arrange: |
| x: 590 |
| y: 970 |
| category: |
| _id: image_analysis |
| title: en=Image analysis;ru=Анализ изображений |
| environment: |
| OPEN_PAAS_USER: |
| title: PaaS user |
| type: string |
| scope: global |
| OPEN_PAAS_PASSWORD: |
| title: PaaS password |
| type: string |
| scope: global |
| PAAS_BASE_URL: |
| title: PaaS base url |
| type: string |
| scope: global |
| execution: regular |
| inputs: |
| image: |
| order: 1 |
| title: en=Image;ru=Изображение |
| type: image |
| required: true |
| outputs: |
| scores: |
| title: en=Scores;ru=Оценки |
| type: json |
| package: artworks |
| script: |- |
| const CHECK_TASK_INTERVAL = 1000; |
| const MAX_ATTEMPTS = 20; |
| |
| export async function run({ inputs, state }) { |
|
|
| const { FatalError, TimeoutError, RepeatNode, NextNode } = DEFINITIONS; |
| const { ArtWorks, FatalError: ArtWorksError } = require('artworks'); |
|
|
| const PAAS_BASE_URL = env.variables.get('PAAS_BASE_URL'); |
| if (!PAAS_BASE_URL) { |
| throw new FatalError('Please, set PAAS_BASE_URL in environment'); |
| } |
| const OPEN_PAAS_USER = env.variables.get('OPEN_PAAS_USER'); |
| if (!OPEN_PAAS_USER) { |
| throw new FatalError('Please, set OPEN_PAAS_USER in environment'); |
| } |
| const OPEN_PAAS_PASSWORD = env.variables.get('OPEN_PAAS_PASSWORD'); |
| if (!OPEN_PAAS_PASSWORD) { |
| throw new FatalError('Please, set OPEN_PAAS_PASSWORD in environment'); |
| } |
|
|
| const artworks = new ArtWorks({ |
| baseUrl: PAAS_BASE_URL, |
| username: OPEN_PAAS_USER, |
| password: OPEN_PAAS_PASSWORD |
| }); |
|
|
| if (!state) { |
| const { image } = inputs; |
|
|
| const payload = { |
| type: "score-aesthetics", |
| isFast: true, |
| payload: { |
| base64: false, |
| image |
| }, |
| }; |
| try { |
| const task = await artworks.createTask(payload); |
| console.log(`Task created ${task}`); |
| return RepeatNode.from({ |
| state: { |
| payload, |
| task, |
| attempt: 0, |
| startedAt: new Date() |
| }, |
| progress: { |
| total: MAX_ATTEMPTS, |
| processed: 0 |
| }, |
| delay: 2000 |
| }); |
| } catch (e) { |
| if (e instanceof ArtWorksError) { |
| throw new FatalError(e.message); |
| } |
| throw e; |
| } |
| } else { |
| const { |
| payload, |
| task, |
| attempt, |
| startedAt |
| } = state; |
|
|
| if (attempt > MAX_ATTEMPTS) { |
| try { |
| await artworks.cancelTask(task); |
| } catch (e) { } |
|
|
| const now = new Date(); |
| const time = (now - new Date(startedAt)) / 1000; |
| throw new TimeoutError(`PaaS task for text to image ${task} timeout in ${time} sec`); |
| } |
|
|
| console.log(`Check task ${attempt} ${task}`); |
|
|
| try { |
| const results = await artworks.checkState(task); |
| if (!results) { |
| return RepeatNode.from({ |
| delay: CHECK_TASK_INTERVAL, |
| state: { |
| payload, |
| task, |
| attempt: attempt + 1, |
| startedAt, |
| }, |
| progress: { |
| total: MAX_ATTEMPTS, |
| processed: attempt |
| }, |
| }); |
| } |
| return NextNode.from({ |
| outputs: { |
| scores: results |
| } |
| }); |
| } catch (e) { |
| if (e instanceof ArtWorksError) { |
| throw new FatalError(e.message); |
| } |
| throw e; |
| } |
| } |
| } |
| source: catalog |
| title: en=Score aesthetics;ru=Оценить эстестику |
| version: 1 |
| dress_on_image: |
| _id: dress_on_image |
| arrange: |
| x: 210 |
| y: 1100 |
| category: |
| _id: deep_swap |
| title: en=Deep swap;ru=Глубокая замена |
| environment: |
| OPEN_PAAS_USER: |
| title: PaaS user |
| type: string |
| scope: global |
| OPEN_PAAS_PASSWORD: |
| title: PaaS password |
| type: string |
| scope: global |
| PAAS_BASE_URL: |
| title: PaaS base url |
| type: string |
| scope: global |
| execution: regular |
| inputs: |
| image: |
| order: 1 |
| title: en=Image;ru=Изображение |
| type: image |
| required: true |
| prompt: |
| order: 3 |
| title: en=Prompt;ru=Подсказка |
| type: string |
| required: true |
| multiline: true |
| default: RAW photo, red swimsuit |
| gender: |
| order: 2 |
| title: en=Gender;ru=Пол |
| type: string |
| default: auto |
| enum: |
| - auto |
| - male |
| - female |
| outputs: |
| image: |
| title: en=Image;ru=Изображение |
| type: image |
| package: artworks |
| script: |- |
| const CHECK_TASK_INTERVAL = 3000; |
| const MAX_ATTEMPTS = 100; |
| |
| export async function run({ inputs, state }) { |
|
|
| const { FatalError, TimeoutError, RepeatNode, NextNode } = DEFINITIONS; |
| const { ArtWorks, FatalError: ArtWorksError } = require('artworks'); |
|
|
| const PAAS_BASE_URL = env.variables.get('PAAS_BASE_URL'); |
| if (!PAAS_BASE_URL) { |
| throw new FatalError('Please, set PAAS_BASE_URL in environment'); |
| } |
| const OPEN_PAAS_USER = env.variables.get('OPEN_PAAS_USER'); |
| if (!OPEN_PAAS_USER) { |
| throw new FatalError('Please, set OPEN_PAAS_USER in environment'); |
| } |
| const OPEN_PAAS_PASSWORD = env.variables.get('OPEN_PAAS_PASSWORD'); |
| if (!OPEN_PAAS_PASSWORD) { |
| throw new FatalError('Please, set OPEN_PAAS_PASSWORD in environment'); |
| } |
|
|
| const artworks = new ArtWorks({ |
| baseUrl: PAAS_BASE_URL, |
| username: OPEN_PAAS_USER, |
| password: OPEN_PAAS_PASSWORD |
| }); |
|
|
| if (!state) { |
| const { image, gender, prompt } = inputs; |
|
|
| const payload = { |
| type: "dress-on-image", |
| isFast: true, |
| payload: { |
| base64: false, |
| image, |
| gender, |
| prompt |
| }, |
| }; |
| try { |
| const task = await artworks.createTask(payload); |
| console.log(`Task created ${task}`); |
| return RepeatNode.from({ |
| state: { |
| payload, |
| task, |
| attempt: 0, |
| startedAt: new Date() |
| }, |
| progress: { |
| total: MAX_ATTEMPTS, |
| processed: 0 |
| }, |
| delay: 2000 |
| }); |
| } catch (e) { |
| if (e instanceof ArtWorksError) { |
| throw new FatalError(e.message); |
| } |
| throw e; |
| } |
| } else { |
| const { |
| payload, |
| task, |
| attempt, |
| startedAt |
| } = state; |
|
|
| if (attempt > MAX_ATTEMPTS) { |
| try { |
| await artworks.cancelTask(task); |
| } catch (e) { } |
|
|
| const now = new Date(); |
| const time = (now - new Date(startedAt)) / 1000; |
| throw new TimeoutError(`PaaS task for text to image ${task} timeout in ${time} sec`); |
| } |
|
|
| console.log(`Check task ${attempt} ${task}`); |
|
|
| try { |
| const results = await artworks.checkState(task); |
| if (!results) { |
| return RepeatNode.from({ |
| delay: CHECK_TASK_INTERVAL, |
| state: { |
| payload, |
| task, |
| attempt: attempt + 1, |
| startedAt, |
| }, |
| progress: { |
| total: MAX_ATTEMPTS, |
| processed: attempt |
| }, |
| }); |
| } |
| let images = results.images.map((i) => i.url); |
| const [image] = images; |
| return NextNode.from({ |
| outputs: { |
| image |
| } |
| }); |
| } catch (e) { |
| if (e instanceof ArtWorksError) { |
| throw new FatalError(e.message); |
| } |
| throw e; |
| } |
| } |
| } |
| source: catalog |
| title: en=Dress on image;ru=Переодеть |
| version: 1 |
| text_to_video: |
| _id: text_to_video |
| arrange: |
| x: 540 |
| y: 1100 |
| category: |
| _id: generate_videos |
| title: en=Generate videos;ru=Генерация видео |
| environment: |
| OPEN_PAAS_USER: |
| title: PaaS user |
| type: string |
| scope: global |
| OPEN_PAAS_PASSWORD: |
| title: PaaS password |
| type: string |
| scope: global |
| PAAS_BASE_URL: |
| title: PaaS base url |
| type: string |
| scope: global |
| execution: regular |
| inputs: |
| prompt: |
| order: 1 |
| title: en=Prompt;ru=Подсказка |
| type: string |
| required: true |
| multiline: true |
| default: a sleek rocket launching from Earth |
| totalFrames: |
| order: 2 |
| title: en=Total frames;ru=Кол-во кадров |
| type: integer |
| min: 32 |
| max: 72 |
| step: 4 |
| default: 36 |
| fps: |
| order: 3 |
| title: FPS |
| type: integer |
| min: 12 |
| max: 24 |
| step: 2 |
| default: 18 |
| outputs: |
| video: |
| title: en=Video;ru=Видео |
| type: video |
| package: artworks |
| script: |- |
| const CHECK_TASK_INTERVAL = 5000; |
| const MAX_ATTEMPTS = 150; |
| |
| export async function run({ inputs, state }) { |
|
|
| const { FatalError, TimeoutError, RepeatNode, NextNode } = DEFINITIONS; |
| const { ArtWorks, FatalError: ArtWorksError } = require('artworks'); |
|
|
| const PAAS_BASE_URL = env.variables.get('PAAS_BASE_URL'); |
| if (!PAAS_BASE_URL) { |
| throw new FatalError('Please, set PAAS_BASE_URL in environment'); |
| } |
| const OPEN_PAAS_USER = env.variables.get('OPEN_PAAS_USER'); |
| if (!OPEN_PAAS_USER) { |
| throw new FatalError('Please, set OPEN_PAAS_USER in environment'); |
| } |
| const OPEN_PAAS_PASSWORD = env.variables.get('OPEN_PAAS_PASSWORD'); |
| if (!OPEN_PAAS_PASSWORD) { |
| throw new FatalError('Please, set OPEN_PAAS_PASSWORD in environment'); |
| } |
|
|
| const artworks = new ArtWorks({ |
| baseUrl: PAAS_BASE_URL, |
| username: OPEN_PAAS_USER, |
| password: OPEN_PAAS_PASSWORD |
| }); |
|
|
| if (!state) { |
| const { prompt, totalFrames, fps } = inputs; |
|
|
| const payload = { |
| type: "text-to-video", |
| isFast: true, |
| payload: { |
| base64: false, |
| prompt, |
| numFrames: totalFrames || 36, |
| fps: fps || 18 |
| }, |
| }; |
| try { |
| const task = await artworks.createTask(payload); |
| console.log(`Task created ${task}`); |
| return RepeatNode.from({ |
| state: { |
| payload, |
| task, |
| attempt: 0, |
| startedAt: new Date() |
| }, |
| progress: { |
| total: MAX_ATTEMPTS, |
| processed: 0 |
| }, |
| delay: 2000 |
| }); |
| } catch (e) { |
| if (e instanceof ArtWorksError) { |
| throw new FatalError(e.message); |
| } |
| throw e; |
| } |
| } else { |
| const { |
| payload, |
| task, |
| attempt, |
| startedAt |
| } = state; |
|
|
| if (attempt > MAX_ATTEMPTS) { |
| try { |
| await artworks.cancelTask(task); |
| } catch (e) { } |
|
|
| const now = new Date(); |
| const time = (now - new Date(startedAt)) / 1000; |
| throw new TimeoutError(`PaaS task for text to image ${task} timeout in ${time} sec`); |
| } |
|
|
| console.log(`Check task ${attempt} ${task}`); |
|
|
| try { |
| const results = await artworks.checkState(task); |
| if (!results) { |
| return RepeatNode.from({ |
| delay: CHECK_TASK_INTERVAL, |
| state: { |
| payload, |
| task, |
| attempt: attempt + 1, |
| startedAt, |
| }, |
| progress: { |
| total: MAX_ATTEMPTS, |
| processed: attempt |
| }, |
| }); |
| } |
| let { video: { url: video } } = results; |
| return NextNode.from({ |
| outputs: { |
| video |
| } |
| }); |
| } catch (e) { |
| if (e instanceof ArtWorksError) { |
| throw new FatalError(e.message); |
| } |
| throw e; |
| } |
| } |
| } |
| source: catalog |
| title: en=Text to video;ru=Сгенерировать видео |
| version: 1 |
| pulid: |
| _id: pulid |
| arrange: |
| x: 910 |
| y: 1100 |
| category: |
| _id: deep_swap |
| title: en=Deep swap;ru=Глубокая замена |
| environment: |
| OPEN_PAAS_USER: |
| title: PaaS user |
| type: string |
| scope: global |
| OPEN_PAAS_PASSWORD: |
| title: PaaS password |
| type: string |
| scope: global |
| PAAS_BASE_URL: |
| title: PaaS base url |
| type: string |
| scope: global |
| execution: regular |
| inputs: |
| person: |
| order: 1 |
| title: en=Person;ru=Персона |
| type: image |
| required: true |
| prompt: |
| order: 2 |
| title: en=Prompt;ru=Подсказка |
| type: string |
| required: true |
| multiline: true |
| outputs: |
| image: |
| title: "" |
| type: image |
| package: artworks |
| script: |- |
| const CHECK_TASK_INTERVAL = 5000; |
| const MAX_ATTEMPTS = 150; |
| |
| export async function run({ inputs, state }) { |
|
|
| const { FatalError, TimeoutError, RepeatNode, NextNode } = DEFINITIONS; |
| const { ArtWorks, FatalError: ArtWorksError } = require('artworks'); |
|
|
| const PAAS_BASE_URL = env.variables.get('PAAS_BASE_URL'); |
| if (!PAAS_BASE_URL) { |
| throw new FatalError('Please, set PAAS_BASE_URL in environment'); |
| } |
| const OPEN_PAAS_USER = env.variables.get('OPEN_PAAS_USER'); |
| if (!OPEN_PAAS_USER) { |
| throw new FatalError('Please, set OPEN_PAAS_USER in environment'); |
| } |
| const OPEN_PAAS_PASSWORD = env.variables.get('OPEN_PAAS_PASSWORD'); |
| if (!OPEN_PAAS_PASSWORD) { |
| throw new FatalError('Please, set OPEN_PAAS_PASSWORD in environment'); |
| } |
|
|
| const artworks = new ArtWorks({ |
| baseUrl: PAAS_BASE_URL, |
| username: OPEN_PAAS_USER, |
| password: OPEN_PAAS_PASSWORD |
| }); |
|
|
| if (!state) { |
| const { person, prompt } = inputs; |
|
|
| const payload = { |
| type: 'run-comfy', |
| isFast: true, |
| payload: { |
| pipeline: 'pullid', |
| args: { |
| image: person, |
| prompt, |
| aspect_ratio: '9:16', |
| } |
| }, |
| }; |
| try { |
| const task = await artworks.createTask(payload); |
| console.log(`Task created ${task}`); |
| return RepeatNode.from({ |
| state: { |
| payload, |
| task, |
| attempt: 0, |
| startedAt: new Date() |
| }, |
| progress: { |
| total: MAX_ATTEMPTS, |
| processed: 0 |
| }, |
| delay: 2000 |
| }); |
| } catch (e) { |
| if (e instanceof ArtWorksError) { |
| throw new FatalError(e.message); |
| } |
| throw e; |
| } |
| } else { |
| const { |
| payload, |
| task, |
| attempt, |
| startedAt |
| } = state; |
|
|
| if (attempt > MAX_ATTEMPTS) { |
| try { |
| await artworks.cancelTask(task); |
| } catch (e) { } |
|
|
| const now = new Date(); |
| const time = (now - new Date(startedAt)) / 1000; |
| throw new TimeoutError(`PaaS task for text to image ${task} timeout in ${time} sec`); |
| } |
|
|
| console.log(`Check task ${attempt} ${task}`); |
|
|
| try { |
| const results = await artworks.checkState(task); |
| if (!results) { |
| return RepeatNode.from({ |
| delay: CHECK_TASK_INTERVAL, |
| state: { |
| payload, |
| task, |
| attempt: attempt + 1, |
| startedAt, |
| }, |
| progress: { |
| total: MAX_ATTEMPTS, |
| processed: attempt |
| }, |
| }); |
| } |
| const { images: [{ url: image }] } = results; |
| return NextNode.from({ |
| outputs: { image } |
| }); |
| } catch (e) { |
| if (e instanceof ArtWorksError) { |
| throw new FatalError(e.message); |
| } |
| throw e; |
| } |
| } |
| } |
| source: catalog |
| title: PuLID |
| version: 1 |
|
|