// 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;
}