/** * 万相API测试脚本 * D140 · 铸渊 ICE-GL-ZY001 * * 验证万相2.7文生视频API配置与参数是否正常 * 默认 dry-run,不会提交付费生成任务。 * * 用法: * node tools/test-wan-api.js * node tools/test-wan-api.js --paid-once */ const { submitT2VTask, queryWanTask, API_KEY, WAN_T2V_SPEC, BASE_URL, preflightCheckT2V, } = require('../engines/wan-api-adapter'); async function main() { console.log('=== 万相2.7 API 测试 ===\n'); const paidOnce = process.argv.includes('--paid-once'); // 1. 检查密钥 if (!API_KEY) { console.error('❌ ALIYUN_BAILIAN_API_KEY 未配置'); console.error(' 请在 video-ai-system/.env 中设置'); process.exit(1); } console.log('✅ API Key 已配置'); console.log('✅ 模型:', WAN_T2V_SPEC.model); console.log('✅ Base URL:', BASE_URL); // 2. 构造一个简单的测试任务 const testPrompt = '一只小猫在月光下奔跑,毛发随风飘动,背景是星空和湖泊,电影级画面'; console.log('\n📝 测试提示词:', testPrompt); console.log('⏱ 时长: 5秒 分辨率: 720P 比例: 16:9\n'); const preflight = preflightCheckT2V({ prompt: testPrompt, duration: 5, resolution: '720P', ratio: '16:9', }); if (!preflight.valid) { console.error('❌ 预校验失败:', preflight.errors.join('; ')); process.exit(1); } if (!paidOnce) { console.log('✅ 预校验通过'); if (preflight.warnings.length > 0) { console.log('⚠️ 预校验提醒:', preflight.warnings.join('; ')); } console.log('\nDRY-RUN:未提交真实万相任务,不产生费用。'); console.log('如需真实付费烟测,请确认预算后运行: node tools/test-wan-api.js --paid-once'); process.exit(0); } console.log('⚠️ --paid-once 已开启:将提交一次真实万相任务,可能产生费用。\n'); try { const { taskId, preflight: paidPreflight } = await submitT2VTask({ prompt: testPrompt, duration: 5, resolution: '720P', ratio: '16:9', }); console.log('\n✅ 任务提交成功!'); console.log(' Task ID:', taskId); console.log(' 预校验:', paidPreflight.valid ? '通过' : '失败'); // 3. 轮询查询 console.log('\n⏳ 轮询查询中...\n'); let pollCount = 0; const maxPolls = 80; while (pollCount < maxPolls) { pollCount++; await new Promise(r => setTimeout(r, 15000)); // 15秒间隔 const result = await queryWanTask(taskId); if (result.status === 'completed') { console.log('\n🎉 视频生成成功!'); console.log(' 视频URL:', result.videoUrl); console.log(' 元数据:', JSON.stringify(result.videoMeta, null, 2)); process.exit(0); } if (result.status === 'failed') { console.error('\n❌ 生成失败:', result.error); console.error(' 原始响应:', JSON.stringify(result.rawResponse, null, 2).substring(0, 500)); process.exit(1); } // 仍在生成 const elapsed = pollCount * 15; console.log(` [${elapsed}s] 生成中... (task: ${taskId.substring(0, 8)}...)`); } console.error('\n⏰ 轮询超时'); process.exit(1); } catch (err) { console.error('\n❌ 测试失败:', err.message); process.exit(1); } } main();