UNPKG

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
"use strict"; 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