| _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 | |