多彩编程 多彩编程MZPH · CODE BLOG
ARTICLE DETAIL

文章详情

深耕前端与后端开发技术的一线实战笔记与踩坑复盘。

Veo 3.1 怎么用?甜甜圈API 上 Veo 3.1 / Sora 2 的等待与轮询该这么写

Veo 3.1 怎么用?甜甜圈API 上 Veo 3.1 / Sora 2 的等待与轮询该这么写 接生视频 API和接生图完全是两个难度。生图几秒到几十秒一个同步请求就完事视频生成接口动辄一两分钟起步照着生图那套写网关先给你一个 504。这篇说清楚甜甜圈APIdashengfenshen.cn上跑Veo 3.1和Sora 2时超时、轮询、幂等该怎么处理。一、先把超时链路捋清楚超时不是一个值是一条链上最短的那个说了算环节常见默认值要改成HTTP 客户端Node 无超时 / Python 无超时180s 以上Nginx / 网关proxy_read_timeout60s300s云函数 / Serverless 执行上限30~60s换常驻服务或改异步前端 fetch浏览器默认较长别让前端直连最容易被忽略的是中间那层网关。本地 curl 跑得好好的一上服务器就 504九成是 Nginx 的proxy_read_timeout卡在默认 60 秒。location /api/video/ { proxy_pass http://127.0.0.1:3000; proxy_read_timeout 300s; # 生视频接口必须放宽 proxy_send_timeout 300s; }二、别让前端直连生视频接口用户点一下等两分钟页面白屏、手一抖刷新请求重发、积分双倍消耗。正确做法是后端接单 前端轮询前端 POST /api/video/create → 后端立刻返回 taskId不等生成 后端异步去调甜甜圈API 前端每 5s GET /api/video/:taskId → pending / done / failed后端的接单逻辑// 接单立刻落库并返回真正的生成放到后台跑 app.post(/api/video/create, async (req, res) { const taskId crypto.randomUUID(); await db.tasks.insert({ id: taskId, status: pending, prompt: req.body.prompt }); res.json({ taskId }); // 立刻返回不阻塞 runVideoTask(taskId, req.body.prompt).catch(async (e) { await db.tasks.update(taskId, { status: failed, error: e.message }); }); }); async function runVideoTask(taskId, prompt) { const r await fetch(https://dashengfenshen.cn/v1/chat/completions, { method: POST, headers: { Authorization: Bearer ${process.env.TTQ_API_KEY}, Content-Type: application/json, }, body: JSON.stringify({ model: Veo 3.1 视频生成, messages: [{ role: user, content: prompt }], }), signal: AbortSignal.timeout(300_000), // 5 分钟别用默认 }); if (!r.ok) throw new Error(生成失败 HTTP r.status); await db.tasks.update(taskId, { status: done, result: await r.json() }); }三、幂等最容易亏钱的地方Veo 3.1 一次 120 积分、Sora 2 一次 130 积分重复提交是实打实的损失。两道防线// 第一道同一个用户 同一段提示词短时间内直接复用上一次的任务 const key ${userId}:${md5(prompt)}; const recent await db.tasks.findRecent(key, 10 * 60 * 1000); // 10 分钟内 if (recent) return res.json({ taskId: recent.id, reused: true });第二道在前端提交后立刻禁用按钮靠taskId决定后续状态不要靠请求有没有回来。四、轮询别写死间隔固定 1 秒轮询两分钟就是 120 次无效请求。用递增间隔// 前 30 秒每 3 秒查一次之后拉长到 10 秒总时长封顶 6 分钟 async function poll(taskId, onUpdate) { const t0 Date.now(); while (Date.now() - t0 360_000) { const t await fetch(/api/video/${taskId}).then((r) r.json()); onUpdate(t); if (t.status ! pending) return t; await sleep(Date.now() - t0 30_000 ? 3000 : 10_000); } throw new Error(等待超时请到任务列表查看); }超时了也别把任务标成失败——后台可能还在跑标失败会让用户重新提交又是一次扣费。让它留在pending用户回任务列表还能看到结果。五、模型和消耗模型代码用途消耗Veo 3.1 视频生成商品视频、场景短片120 积分/次Sora 2镜头感更强的短片130 积分/次nano-banana-pro先出图再拿图去生视频10 积分/次gpt-image-2细节质感好的静态图按次计费省钱的做法先用生图接口把画面定下来满意了再拿这张图去跑生视频接口。直接文生视频反复试错一次 120 积分很快就烧完了。六、小结生视频接口的四个要点超时按整条链路放宽尤其网关那一层、前端不直连改成接单轮询、用提示词哈希做幂等防重复扣费、轮询间隔递增且超时不判失败。甜甜圈APIdashengfenshen.cn一个密钥就能同时调 Veo 3.1、Sora 2 和 nano banana pro、gpt-image-2模型全、价格便宜按次明码标价、并发高、出视频快、稳定。文档地址https://dashengfenshen.cn 。
返回列表