@n8n/n8n-nodes-langchain
Version:

145 lines • 5.36 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.description = void 0;
exports.execute = execute;
const n8n_workflow_1 = require("n8n-workflow");
const interfaces_1 = require("../../helpers/interfaces");
const utils_1 = require("../../helpers/utils");
const transport_1 = require("../../transport");
const descriptions_1 = require("../descriptions");
const properties = [
{
...(0, descriptions_1.modelRLC)('imageGenerationModelSearch'),
displayOptions: { show: { '@version': [{ _cnd: { lt: 1.2 } }] } },
},
{
...(0, descriptions_1.modelRLC)('imageGenerationModelSearch'),
default: { mode: 'list', value: 'models/gemini-3.1-flash-image-preview' },
displayOptions: { show: { '@version': [{ _cnd: { gte: 1.2 } }] } },
},
{
displayName: 'Prompt',
name: 'prompt',
type: 'string',
placeholder: 'e.g. A cute cat eating a dinosaur',
description: 'A text description of the desired image(s)',
default: '',
typeOptions: {
rows: 2,
},
},
{
displayName: 'Options',
name: 'options',
placeholder: 'Add Option',
type: 'collection',
default: {},
options: [
{
displayName: 'Number of Images',
name: 'sampleCount',
default: 1,
description: 'Number of images to generate',
type: 'number',
displayOptions: {
show: {
'/modelId': [{ _cnd: { includes: 'imagen' } }],
},
},
typeOptions: {
minValue: 1,
},
},
{
displayName: 'Put Output in Field',
name: 'binaryPropertyOutput',
type: 'string',
default: 'data',
hint: 'The name of the output field to put the binary file data in',
},
],
},
];
const displayOptions = {
show: {
operation: ['generate'],
resource: ['image'],
},
};
exports.description = (0, n8n_workflow_1.updateDisplayOptions)(displayOptions, properties);
async function execute(i) {
const model = this.getNodeParameter('modelId', i, '', { extractValue: true });
const prompt = this.getNodeParameter('prompt', i, '');
const binaryPropertyOutput = this.getNodeParameter('options.binaryPropertyOutput', i, 'data');
if (model.includes('gemini')) {
const generationConfig = {
responseModalities: [interfaces_1.Modality.IMAGE, interfaces_1.Modality.TEXT],
};
const body = {
contents: [
{
role: 'user',
parts: [{ text: prompt }],
},
],
generationConfig,
};
const response = (await transport_1.apiRequest.call(this, 'POST', `/v1beta/${model}:generateContent`, {
body,
}));
const promises = response.candidates.map(async (candidate) => {
const imagePart = candidate.content.parts.find((part) => 'inlineData' in part);
const mimeType = imagePart?.inlineData.mimeType;
const fileName = (0, utils_1.getFilenameFromMimeType)(mimeType, 'image', 'png');
const buffer = Buffer.from(imagePart?.inlineData.data ?? '', 'base64');
const binaryData = await this.helpers.prepareBinaryData(buffer, fileName, mimeType);
return {
binary: {
[binaryPropertyOutput]: binaryData,
},
json: {
...binaryData,
data: undefined,
},
pairedItem: { item: i },
};
});
return await Promise.all(promises);
}
else if (model.includes('imagen')) {
const sampleCount = this.getNodeParameter('options.sampleCount', i, 1);
const body = {
instances: [
{
prompt,
},
],
parameters: {
sampleCount,
},
};
const response = (await transport_1.apiRequest.call(this, 'POST', `/v1beta/${model}:predict`, {
body,
}));
const promises = response.predictions.map(async (prediction) => {
const fileName = (0, utils_1.getFilenameFromMimeType)(prediction.mimeType, 'image', 'png');
const buffer = Buffer.from(prediction.bytesBase64Encoded ?? '', 'base64');
const binaryData = await this.helpers.prepareBinaryData(buffer, fileName, prediction.mimeType);
return {
binary: {
[binaryPropertyOutput]: binaryData,
},
json: {
...binaryData,
data: undefined,
},
pairedItem: { item: i },
};
});
return await Promise.all(promises);
}
throw new n8n_workflow_1.NodeOperationError(this.getNode(), `Model ${model} is not supported for image generation`, {
description: 'Please check the model ID and try again.',
});
}
//# sourceMappingURL=generate.operation.js.map