// API调用工具 const API = { async post(url, data) { const resp = await fetch(url, { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify(data) }); if (!resp.ok) { const err = await resp.text(); throw new Error(err); } return resp.json(); }, async get(url) { const resp = await fetch(url); if (!resp.ok) { const err = await resp.text(); throw new Error(err); } return resp.json(); } }; // 状态显示 function getStatusBadge(status) { const map = { 'CREATED': '已创建', 'QUEUED': '排队中', 'RUNNING': '执行中', 'SUCCESS': '成功', 'FAILED': '失败', 'CANCELED': '已取消' }; return map[status] || `${status}`; } // 格式化时间 function formatTime(ts) { if (!ts) return '-'; const d = new Date(ts); return d.toLocaleString('zh-CN'); } // 显示提示 function showAlert(msg, type = 'info') { const alert = document.createElement('div'); alert.className = `alert alert-${type}`; alert.textContent = msg; const container = document.querySelector('.container'); container.insertBefore(alert, container.firstChild); setTimeout(() => alert.remove(), 5000); } // 轮询任务状态 function pollTask(taskId, queryFn, onUpdate, interval = 3000) { let timer; const poll = async () => { try { const result = await queryFn(taskId); onUpdate(result); const status = result?.data?.status; if (status === 'SUCCESS' || status === 'FAILED' || status === 'CANCELED') { clearInterval(timer); } } catch (err) { console.error('轮询失败:', err); } }; poll(); timer = setInterval(poll, interval); return () => clearInterval(timer); } // 获取能力名称 function getCapabilityName(key) { const map = { 'pippit_novel_agent': '短剧/漫剧', 'pippit_avatar_marketing_agent': '带货营销', 'pippit_story_marketing_agent': '剧情营销', 'pippit_video_part_agent': '短片创作' }; return map[key] || key; } // 获取动作名称 function getActionName(key) { const map = { 'script_analysis': '剧本解析', 'narration_design': '旁白改编', 'character_generate': '角色生成', 'scene_generate': '场景生成', 'storyboard_design': '分镜设计', 'shot_video_generate': '分镜短片', 'shot_video_generate_fast': '分镜短片(Fast)', 'shot_video_compose': '成片合成', 'generate_video': '生成视频' }; return map[key] || key; }