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
JavaScript
;
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