n8n-nodes-sd3gen
Version:
n8n nodes to integrate for AI image generation
231 lines • 9.4 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.AiImageGen = void 0;
const n8n_workflow_1 = require("n8n-workflow");
const jimp_1 = require("jimp");
class AiImageGen {
constructor() {
this.description = {
displayName: 'AI Image Generator',
name: 'aiImageGen',
icon: 'file:logo.svg',
group: ['transform'],
version: 1,
description: 'Generate images using AI models',
defaults: {
name: 'AI Image Generator',
},
inputs: ['main'],
outputs: ['main'],
properties: [
{
displayName: 'Prompt',
name: 'prompt',
type: 'string',
default: '',
required: true,
description: 'Text prompt for image generation',
},
{
displayName: 'Negative Prompt',
name: 'negativePrompt',
type: 'string',
default: '',
description: 'Things to exclude from the generation',
},
{
displayName: 'Model',
name: 'model',
type: 'options',
options: [
{
name: 'Flux',
value: 'flux',
},
{
name: 'Tamarin',
value: 'tamarin',
},
{
name: 'Super Anime',
value: 'superAnime',
},
{
name: 'Visi Canvas',
value: 'visiCanvas',
},
],
default: 'flux',
required: true,
description: 'AI model to use',
},
{
displayName: 'Size',
name: 'size',
type: 'options',
options: [
{
name: 'Square (1:1)',
value: '1:1',
},
{
name: 'Portrait (3:4)',
value: '3:4',
},
{
name: 'Landscape (4:3)',
value: '4:3',
},
],
default: '4:3',
},
{
displayName: 'Batch Size',
name: 'batchSize',
type: 'options',
options: [
{
name: '1 Image',
value: 1,
},
{
name: '2 Images',
value: 2,
},
],
default: 1,
},
{
displayName: 'Output Format',
name: 'outputFormat',
type: 'options',
options: [
{
name: 'JPEG',
value: 'jpeg',
},
{
name: 'PNG',
value: 'png',
},
],
default: 'jpeg',
description: 'The format of the output images',
},
{
displayName: 'JPEG Quality',
name: 'jpegQuality',
type: 'number',
typeOptions: {
minValue: 1,
maxValue: 100
},
default: 80,
description: 'Quality of JPEG output (1-100)',
displayOptions: {
show: {
outputFormat: ['jpeg'],
},
},
},
],
};
}
async execute() {
const items = this.getInputData();
const returnData = [];
const outputFormat = this.getNodeParameter('outputFormat', 0);
let jpegQuality = 0;
if (outputFormat === 'jpeg') {
jpegQuality = this.getNodeParameter('jpegQuality', 0);
}
for (let i = 0; i < items.length; i++) {
const prompt = this.getNodeParameter('prompt', i);
const model = this.getNodeParameter('model', i);
const size = this.getNodeParameter('size', i);
const batchSize = this.getNodeParameter('batchSize', i);
const negativePrompt = this.getNodeParameter('negativePrompt', i);
const uniqueResponse = await this.helpers.httpRequest({
method: 'GET',
url: "https://stablediffusion3net.erweima.ai/api/auth/unique-id?canvas=" + Date.now(),
headers: {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.3',
'Accept-Language': 'en-US,en;q=0.9',
'Accept': 'application/json, text/plain, */*',
},
});
if (uniqueResponse.code !== 200) {
throw new n8n_workflow_1.NodeOperationError(this.getNode(), 'Can\'t get unique-id');
}
const response = await this.helpers.httpRequest({
method: 'POST',
url: 'https://stablediffusion3net.erweima.ai/api/v1/generate/create',
headers: {
uniqueid: uniqueResponse.data,
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.3',
'Accept-Language': 'en-US,en;q=0.9',
'Accept': 'application/json, text/plain, */*',
},
body: {
prompt,
model,
size,
batchSize,
negativePrompt,
},
json: true,
});
const recordUuid = response.data.recordUuid;
console.log("[AIImageGen] recordUuid: " + recordUuid);
let picState = 'queuing';
let statusResponse = {};
while (picState === 'queuing' || picState === 'waitingStart' || picState === 'generating') {
await new Promise(resolve => setTimeout(resolve, 1000));
statusResponse = await this.helpers.httpRequest({
method: 'GET',
url: `https://stablediffusion3net.erweima.ai/api/v1/generate/record-detail?recordUuid=${recordUuid}`,
headers: {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.3',
'Accept-Language': 'en-US,en;q=0.9',
'Accept': 'application/json, text/plain, */*',
},
});
picState = statusResponse.data.picState;
console.log("[AIImageGen] picState: " + statusResponse.data.picState);
}
if (picState === 'success') {
for (let picUrl of JSON.parse(statusResponse.data.picUrl)) {
const fileName = picUrl.picUrl.split('/').pop();
const image = await jimp_1.Jimp.read(picUrl.picUrl);
let outputBuffer;
if (outputFormat === 'jpeg') {
outputBuffer = await image.getBuffer("image/jpeg", { quality: jpegQuality });
}
else {
outputBuffer = await image.getBuffer(`image/png`);
}
const outputBase64 = outputBuffer.toString('base64');
returnData.push({
json: {},
binary: {
data: {
fileName: fileName,
data: outputBase64,
fileType: 'image',
fileSize: Math.round(outputBuffer.length / 1024 * 10) / 10 + " kB",
fileExtension: outputFormat,
mimeType: `image/${outputFormat}`,
}
}
});
}
}
else {
throw new n8n_workflow_1.NodeOperationError(this.getNode(), 'Image generation failed');
}
}
return [returnData];
}
}
exports.AiImageGen = AiImageGen;
//# sourceMappingURL=AiImageGen.node.js.map