UNPKG

n8n-nodes-sd3gen

Version:

n8n nodes to integrate for AI image generation

231 lines 9.4 kB
"use strict"; 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