指南
异步任务
提交长任务、轮询状态、处理终态并获取结果。
部分 Felo 操作会立即返回 task_id,并在后台完成。所有场景的模式一致:提交、轮询、获取结果。
两类任务
| 类别 | 提交 | 轮询 |
|---|---|---|
| Felo 工作流 | POST /v2/ppts、POST /v2/landing_page、POST /v2/mindmap | GET /v2/tasks/{task_id}/status |
| 模型生成 | POST /api/v1/videos/generations、POST /api/v1/images/generations | GET /api/v1/videos/generations/{task_id}、GET /api/v1/images/generations/{task_id} |
PPTX 导出是独立的异步操作:POST /v2/ppts/{ppt_business_id}/export,然后 GET /v2/ppts/{ppt_business_id}/export。
SuperAgent 不是轮询 API。它返回 stream_key 并使用 SSE;见 SuperAgent 参考。
生命周期
- 提交。 发送模型或工作流参数。提交成功会返回
task_id和初始状态。 - 轮询。 按固定间隔读取任务 endpoint。在代码中保留轮询间隔和最长等待时间。
- 完成。 成功时读取结果 URL 或输出字段。失败时读取错误,并决定是否重新提交。
状态值
Felo 工作流任务使用大写值:
| 状态 | 含义 |
|---|---|
RUNNING | 仍在处理 |
COMPLETED | 已成功完成 |
FAILED | 终态失败;读取 error_message |
PENDING | 在 historical 响应中为终态;读取 error_message |
EXPIRED | 终态;任务已不可用 |
CANCELED | 终态;任务已取消 |
模型生成任务使用小写值:queued、running、succeeded、failed 和 interrupted。失败任务可能包含带 message 和 type 的 error 对象。
未知状态值可能随后端演进出现。除非文档另有说明,否则将未知值视为非终态。
轮询
- Felo 工作流任务:每 2–5 秒轮询一次。
- 视频生成:每 5–10 秒轮询一次。
- 图片生成:从 2–5 秒开始,长任务逐步退避。
- 遇到终态、你设置的超时,或达到最大尝试次数时停止。
- 多个客户端同时轮询时加入抖动。
一个简单的 Node.js 循环:
async function pollStatus(taskId, { timeoutMs = 10 * 60 * 1000 } = {}) {
const deadline = Date.now() + timeoutMs;
while (Date.now() < deadline) {
const response = await fetch(`https://openapi.felo.ai/v2/tasks/${taskId}/status`, {
headers: { Authorization: `Bearer ${process.env.FELO_API_KEY}` },
});
if (!response.ok) throw new Error(`status ${response.status}`);
const payload = await response.json();
const status = payload.data?.status;
if (status === "COMPLETED") return payload.data;
if (["FAILED", "PENDING", "EXPIRED", "CANCELED"].includes(status)) {
throw new Error(payload.data?.error_message || status);
}
await new Promise((resolve) => setTimeout(resolve, 3000));
}
throw new Error("task timed out");
}获取结果
| 任务 | 结果 |
|---|---|
| PPT | GET /v2/tasks/{task_id}/historical 在可用时返回 ppt_url、ppt_biz_id 和 live_doc_url |
| 落地页 | historical 响应在可用时返回页面输出和 live_doc_url |
| 视频 / 图片 | 轮询响应返回 outputs;成功时条目是可匿名下载的签名媒体 URL |
| PPTX 导出 | 仅当 status 为 COMPLETED 时,轮询响应返回 download_url 和 expires_at |
PPTX 签名下载 URL 在签发后 30 分钟过期。再次调用 GET endpoint 可获得新 URL;这不会重新生成文件。
失败处理
- 重试前先读取任务的错误字段。有些失败由请求本身导致,会重复出现。
- 不要每次超时都盲目重新提交;先确认任务是否仍为
RUNNING。 402表示服务额度不足。429表示触发限流。只有条件解除后才重试。- 视频和图片生成的 callback 字段目前会被忽略。请轮询任务 endpoint,不要等待 webhook。