Node-Packages / artworks.yaml
mypiper's picture
Update artworks.yaml
0a479db verified
_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