46 lines
2.8 KiB
JavaScript
46 lines
2.8 KiB
JavaScript
const fs = require('node:fs');
|
|
const vm = require('node:vm');
|
|
const assert = require('node:assert/strict');
|
|
const path = require('node:path');
|
|
const work = path.join(__dirname, '../integration-work');
|
|
const source = fs.readFileSync(path.join(work, 'backend.multivideo.mjs'), 'utf8');
|
|
function functionSource(name) {
|
|
const start = source.indexOf(`function ${name}(`);
|
|
const end = source.indexOf('\n}', start) + 2;
|
|
assert.ok(start >= 0 && end > start);
|
|
return source.slice(start, end);
|
|
}
|
|
const context = vm.createContext({URL});
|
|
vm.runInContext(`
|
|
const DEFAULT_MODEL2 = 'MiniMax-H3';
|
|
const PROMPT_MAX_CHARS = 7000;
|
|
const REF_LIMITS2 = {images:9, videos:3, audios:3, total:12};
|
|
const VALID_RATIOS = new Set(['16:9','9:16','1:1','4:3','3:4','21:9']);
|
|
${functionSource('normalizeSegment')}
|
|
${functionSource('joinProviderUrl')}
|
|
${functionSource('parseUrlArray2')}
|
|
${fs.readFileSync(path.join(work, 'local-video-adapter.js'), 'utf8')}
|
|
this.adapter = new LocalVideoAdapter();`, context);
|
|
const config = {baseUrl:'http://pool.test',apiKey:'test-secret'};
|
|
for (const model of ['MiniMax-H3','MiniMax-H3-Hybrid','MiniMax-H3-R2V-4Step','LTX-2.3','LTX-2.3-Text-Preserve','Wan2.2-I2V']) {
|
|
const request = context.adapter.buildGenerateRequest(config, {model,prompt:'A mountain.',duration:5,resolution:'720p',aspectRatio:'9:16'});
|
|
assert.equal(request.url,'http://pool.test/v2/video_generation');
|
|
assert.equal(request.body.model,model);
|
|
assert.equal(request.body.resolution,'720P');
|
|
assert.equal(request.body.ratio,'9:16');
|
|
}
|
|
const portrait = context.adapter.buildGenerateRequest(config, {model:'Wan2.2-I2V',prompt:'Move.',firstFrameUrl:'data:image/png;base64,AA==',duration:5});
|
|
assert.equal(portrait.body.content[1].role,'first_frame');
|
|
assert.ok(!('ratio' in portrait.body));
|
|
assert.throws(() => context.adapter.buildGenerateRequest(config, {model:'unknown'}), /Unknown local video model/);
|
|
assert.throws(() => context.adapter.buildGenerateRequest(config, {model:'LTX-2.3',referenceLinkUrl:'https://example.test'}), /image references/);
|
|
const jid = 'Z3B1Mzpqb2I';
|
|
assert.equal(context.adapter.buildPollRequest(config,jid).url,`http://pool.test/v2/query/video_generation/${jid}`);
|
|
assert.equal(context.adapter.parseGenerateResponse({task_id:jid}).taskId,jid);
|
|
assert.equal(context.adapter.parsePollResponse({task:{status:'failed',error:'sampler failed'}}).status,'failed');
|
|
assert.equal(context.adapter.parsePollResponse({task:{status:'succeeded',content:{url:'https://pool.test/video.mp4'}}}).videoUrl,'https://pool.test/video.mp4');
|
|
assert.ok(source.includes('video: ["volcengine", "minimax", "aliyun", "localvideo"]'));
|
|
assert.ok(source.includes('localvideo: new LocalVideoAdapter()'));
|
|
assert.ok(source.includes('if (p === "openai" || p === "localvideo")'));
|
|
console.log('Desktop adapter: all 6 model requests, image mode, validation and polling passed.');
|