n8n-nodes-aimlapi
Version:
Custom n8n node for integrating with the AI/ML API platform (AIMLAPI) to interact with LLMs and multimodal AI models such as chat completion endpoints.
152 lines • 7.11 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.executeVideoGeneration = executeVideoGeneration;
const request_1 = require("../utils/request");
const object_1 = require("../utils/object");
const models_1 = require("../utils/models");
const generation_1 = require("../utils/generation");
function detectVideoProvider(model) {
const value = model.toLowerCase();
if (value.includes('veo') || value.includes('google')) {
return 'google';
}
if (value.includes('alibaba') || value.includes('wan')) {
return 'alibaba';
}
if (value.includes('minimax') || value.includes('live2d')) {
return 'minimax';
}
if (value.includes('kling')) {
return 'kling';
}
if (value.includes('runway') || value.includes('gen3a')) {
return 'runway';
}
return 'other';
}
function parseImageList(value) {
if (!value) {
return undefined;
}
if (Array.isArray(value)) {
const entries = value
.filter((entry) => typeof entry === 'string')
.map((entry) => entry.trim())
.filter(Boolean);
return entries.length ? entries : undefined;
}
if (typeof value === 'string') {
const entries = value
.split(/[\n,]+/)
.map((entry) => entry.trim())
.filter(Boolean);
return entries.length ? entries : undefined;
}
return undefined;
}
function resolveVideoUrl(entry) {
return (entry.url ||
entry.video_url ||
entry.videoUrl);
}
async function executeVideoGeneration({ context, itemIndex, baseURL, model, }) {
const prompt = context.getNodeParameter('videoPrompt', itemIndex);
const extract = context.getNodeParameter('videoExtract', itemIndex);
const options = context.getNodeParameter('videoOptions', itemIndex, {});
const endpoints = await (0, models_1.getModelEndpoints)(context, baseURL, model);
const generationPath = endpoints.find((endpoint) => endpoint.includes('/v2/generate/video')) ??
endpoints.find((endpoint) => endpoint.includes('/video/generations')) ??
'/v2/video/generations';
const requestOptions = (0, request_1.createRequestOptions)(baseURL, generationPath);
const provider = detectVideoProvider(model);
const body = {
model,
prompt,
};
const referenceImageUrl = options.referenceImageUrl;
const tailImageUrl = options.tailImageUrl;
const lastImageUrl = options.lastImageUrl;
switch (provider) {
case 'google': {
(0, object_1.setIfDefined)(body, 'image_url', referenceImageUrl);
(0, object_1.setIfDefined)(body, 'tail_image_url', tailImageUrl ?? lastImageUrl);
(0, object_1.setIfDefined)(body, 'aspect_ratio', options.aspectRatio);
(0, object_1.setIfDefined)(body, 'duration', options.duration);
(0, object_1.setIfDefined)(body, 'negative_prompt', options.negativePrompt);
(0, object_1.setIfDefined)(body, 'seed', options.seed);
(0, object_1.setIfDefined)(body, 'enhance_prompt', options.enhancePrompt);
break;
}
case 'alibaba': {
(0, object_1.setIfDefined)(body, 'resolution', options.resolution);
(0, object_1.setIfDefined)(body, 'aspect_ratio', options.aspectRatio);
(0, object_1.setIfDefined)(body, 'negative_prompt', options.negativePrompt);
(0, object_1.setIfDefined)(body, 'watermark', options.watermark);
(0, object_1.setIfDefined)(body, 'seed', options.seed);
(0, object_1.setIfDefined)(body, 'enable_prompt_expansion', options.enablePromptExpansion);
break;
}
case 'minimax': {
const firstFrame = options.firstFrameImage ?? referenceImageUrl;
(0, object_1.setIfDefined)(body, 'prompt_optimizer', options.promptOptimizer);
(0, object_1.setIfDefined)(body, 'first_frame_image', firstFrame);
break;
}
case 'kling': {
const images = parseImageList(options.imageList) ?? (referenceImageUrl ? [referenceImageUrl] : undefined);
(0, object_1.setIfDefined)(body, 'type', options.klingType);
(0, object_1.setIfDefined)(body, 'image_list', images);
(0, object_1.setIfDefined)(body, 'aspect_ratio', options.aspectRatio);
(0, object_1.setIfDefined)(body, 'negative_prompt', options.negativePrompt);
(0, object_1.setIfDefined)(body, 'duration', options.duration);
(0, object_1.setIfDefined)(body, 'external_task_id', options.externalTaskId);
break;
}
case 'runway': {
(0, object_1.setIfDefined)(body, 'image_url', referenceImageUrl);
(0, object_1.setIfDefined)(body, 'last_image_url', lastImageUrl ?? tailImageUrl);
(0, object_1.setIfDefined)(body, 'duration', options.duration);
(0, object_1.setIfDefined)(body, 'ratio', options.aspectRatio);
(0, object_1.setIfDefined)(body, 'seed', options.seed);
break;
}
default: {
(0, object_1.setIfDefined)(body, 'mode', options.mode);
(0, object_1.setIfDefined)(body, 'duration', options.duration);
(0, object_1.setIfDefined)(body, 'aspect_ratio', options.aspectRatio);
(0, object_1.setIfDefined)(body, 'cfg_scale', options.cfgScale);
(0, object_1.setIfDefined)(body, 'seed', options.seed);
(0, object_1.setIfDefined)(body, 'negative_prompt', options.negativePrompt);
(0, object_1.setIfDefined)(body, 'prompt_strength', options.promptStrength);
(0, object_1.setIfDefined)(body, 'reference_image_url', referenceImageUrl);
(0, object_1.setIfDefined)(body, 'reference_video_url', options.referenceVideoUrl);
(0, object_1.setIfDefined)(body, 'music_url', options.musicUrl);
break;
}
}
if (provider !== 'other') {
(0, object_1.setIfDefined)(body, 'music_url', options.musicUrl);
}
requestOptions.body = body;
const initialResponse = (await context.helpers.httpRequestWithAuthentication.call(context, 'aimlApi', requestOptions));
const rawResponse = await (0, generation_1.resolveGenerationResponse)(context, baseURL, generationPath, initialResponse, {
mediaType: 'video',
});
const data = (0, generation_1.extractVideoOutputs)(rawResponse);
switch (extract) {
case 'firstUrl': {
const url = data.map(resolveVideoUrl).find((value) => Boolean(value)) ?? '';
return { json: { url }, pairedItem: { item: itemIndex } };
}
case 'allUrls': {
const urls = data.map(resolveVideoUrl).filter((value) => Boolean(value));
return { json: { urls }, pairedItem: { item: itemIndex } };
}
default:
return {
json: { result: rawResponse },
pairedItem: { item: itemIndex },
};
}
}
//# sourceMappingURL=videoGeneration.execute.js.map