UNPKG

coze-plugin-utils

Version:

Comprehensive utility library for Coze plugins with multimedia processing, browser automation, cloud storage integration, and AI-powered video/audio generation capabilities

217 lines 6.75 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.fetchImageAsBase64 = fetchImageAsBase64; exports.getViduResult = getViduResult; exports.imageToVideo = imageToVideo; exports.startEndToVideo = startEndToVideo; exports.referenceToVideo = referenceToVideo; exports.textToVideo = textToVideo; exports.textToAudio = textToAudio; exports.timingToAudio = timingToAudio; const core_1 = require("../core"); const media_1 = require("../media"); var ViduResultState; (function (ViduResultState) { ViduResultState["created"] = "created"; ViduResultState["queueing"] = "queueing"; ViduResultState["processing"] = "processing"; ViduResultState["success"] = "success"; ViduResultState["failed"] = "failed"; ViduResultState["timeout"] = "timeout"; })(ViduResultState || (ViduResultState = {})); async function fetchImageAsBase64(url) { const res = await fetch(url); if (!res.ok) { throw new Error(`Failed to fetch image. Status: ${res.status}`); } const arrayBuffer = await res.arrayBuffer(); const buffer = Buffer.from(arrayBuffer); const mime = (0, media_1.detectMimeType)(buffer); if (!mime) { throw new Error('Unsupported or unknown image type.'); } const base64 = buffer.toString('base64'); return `data:${mime};base64,${base64}`; } async function getViduResult(taskId, timeout = 180) { const apiKey = (0, core_1.getGlobalConfig)('vidu')?.apiKey; if (!apiKey) { throw new Error('请先配置 vidu apiKey'); } const headers = { 'Content-Type': 'application/json', Authorization: `Token ${apiKey}`, }; const stateUrl = `https://api.vidu.cn/ent/v2/tasks/${taskId}/creations`; const startTime = Date.now(); let errorMsg = ''; let creations = []; let state = ViduResultState.created; do { await (0, core_1.sleep)(100); // sleep 100ms const result = await (await fetch(stateUrl, { headers, method: 'GET', })).json(); state = result.state; if (state === 'failed') { errorMsg = result.err_code; break; } if (state === 'success') { creations = result.creations; break; } const timeCost = Date.now() - startTime; if (timeCost > timeout * 1000) { state = ViduResultState.timeout; break; } } while (1); return { task_id: taskId, state, creations, errorMsg, }; } // 文生图 async function generateVideo(api, imageUrls, options) { const apiKey = (0, core_1.getGlobalConfig)('vidu')?.apiKey; if (!apiKey) { throw new Error('请先配置 vidu apiKey'); } const images = await Promise.all(imageUrls.map(fetchImageAsBase64)); const headers = { 'Content-Type': 'application/json', Authorization: `Token ${apiKey}`, }; const { model, prompt, style, duration, seed, resolution, movement_amplitude, callback_url, timeout, bgm } = options; const payload = { model, }; if (images && images.length > 0) payload.images = images; if (style) payload.style = style; if (prompt) payload.prompt = prompt; if (duration) payload.duration = duration; if (seed != null) payload.seed = seed; if (resolution) payload.resolution = resolution; if (movement_amplitude) payload.movement_amplitude = movement_amplitude; if (callback_url) payload.callback_url = callback_url; if (bgm) payload.bgm = bgm; const res = await (await fetch(api, { headers, method: 'POST', body: JSON.stringify(payload), })).json(); const { task_id } = res; if (!task_id) { return { errorMsg: res, }; } const result = await getViduResult(task_id, timeout); return { ...result, }; } async function imageToVideo(imageUrl, options) { return generateVideo('https://api.vidu.cn/ent/v2/img2video', [imageUrl], options); } async function startEndToVideo(startImageUrl, endImageUrl, options) { return generateVideo('https://api.vidu.cn/ent/v2/start-end2video', [startImageUrl, endImageUrl], options); } async function referenceToVideo(referenceImageUrl, options) { if (!options.prompt) { throw new Error('prompt is required'); } return generateVideo('https://api.vidu.cn/ent/v2/reference2video', [referenceImageUrl], options); } async function textToVideo(options) { if (!options.prompt) { throw new Error('prompt is required'); } return generateVideo('https://api.vidu.cn/ent/v2/text2video', [], options); } async function textToAudio(options) { const apiKey = (0, core_1.getGlobalConfig)('vidu')?.apiKey; if (!apiKey) { throw new Error('请先配置 vidu apiKey'); } const headers = { 'Content-Type': 'application/json', Authorization: `Token ${apiKey}`, }; const { model, prompt, duration, seed, callback_url } = options; const payload = { model, prompt, }; if (duration) payload.duration = duration; if (seed != null) payload.seed = seed; if (callback_url) payload.callback_url = callback_url; const res = await (await fetch('https://api.vidu.cn/ent/v2/text2audio', { headers, method: 'POST', body: JSON.stringify(payload), })).json(); const { task_id } = res; if (!task_id) { return { errorMsg: res, }; } const result = await getViduResult(task_id); return { ...result, }; } async function timingToAudio(options) { const apiKey = (0, core_1.getGlobalConfig)('vidu')?.apiKey; if (!apiKey) { throw new Error('请先配置 vidu apiKey'); } const headers = { 'Content-Type': 'application/json', Authorization: `Token ${apiKey}`, }; const { model, timing_prompts, duration, seed, callback_url } = options; const payload = { model, timing_prompts, }; if (duration) payload.duration = duration; if (seed != null) payload.seed = seed; if (callback_url) payload.callback_url = callback_url; const res = await (await fetch('https://api.vidu.cn/ent/v2/timing2audio', { headers, method: 'POST', body: JSON.stringify(payload), })).json(); const { task_id } = res; if (!task_id) { return { errorMsg: res, }; } const result = await getViduResult(task_id); return { ...result, }; } //# sourceMappingURL=vidu.js.map