吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 306|回复: 1
上一主题 下一主题
收起左侧

[讨论] 【编程思路】图片生成任务的上传、轮询与结果访问怎么隔离

[复制链接]
跳转到指定楼层
楼主
werdedeage 发表于 2026-9-30 13:28 回帖奖励
最近整理一个浏览器端的图片生成流程时,我更容易遇到的问题不是“模型能不能生成”,而是上传、任务创建、轮询和结果访问之间的边界没有分清。

先说明范围:下面只讨论已经由用户选择、且通过应用公开接口校验的 JPG、PNG 或 WebP 参考图,以及一个带幂等键的异步生成任务。不讨论绕过访问控制、处理未获授权的图片,也不把生成结果当成自动拥有商用权利。实际模型、分辨率、宽高比和 Prompt 限制应以能力接口返回值为准。

我从实际 Web service 的调用顺序里抽出这几步:

1. 先请求上传意图,再把文件 PUT 到短期地址,最后调用 complete 让 API 校验签名、尺寸和文件大小。
2. 只把 complete 返回的 upload id 放进 generation task;多图模式额外合并已有的输入资源 id。
3. 创建任务时使用幂等键,避免重试把同一次请求重复扣费。
4. 任务创建后只轮询任务状态,不把“已经上传”误显示成“已经生成”。
5. 只有状态为 succeeded 且 outputs 非空时才显示结果;失败、取消和超时都要保留错误与退款状态。

关键代码是对真实调用边界的精简记录,不是可直接下载的完整项目:

[code=typescript]
const TERMINAL = new Set(["succeeded", "failed", "cancelled", "timed_out"]);

async function submitAndPoll(input, request) {
  const completedUploadIds = [];
  try {
    for (const file of input.files) {
      const upload = await generationService.uploadImage(file);
      completedUploadIds.push(upload.upload_id);
    }

    const task = await generationService.createTask(
      {
        ...request,
        input_upload_ids: [...completedUploadIds, ...(input.existingAssetIds ?? [])],
      },
      "generation-" + crypto.randomUUID(),
    );

    let current = task;
    while (!TERMINAL.has(current.status)) {
      await new Promise((resolve) => setTimeout(resolve, 3000));
      current = await generationService.getTask(current.id, current.guest_result_token ?? undefined);
    }

    if (current.status !== "succeeded" || !current.outputs.length) {
      throw new Error(current.error_code || "generation_finished_without_output");
    }
    return current.outputs;
  } finally {
    // The API owns the durable task; failed uploads are cleaned up by the
    // service when the task was never accepted.
  }
}
[/code]

我觉得这里有几个容易被忽略的点:

- 能力接口返回的 model、prompt_max_chars、分辨率和可用组合才是前端校验的来源,不能把某一组配置永久写死在页面里。
- 轮询循环要有 AbortController 或等价的取消边界;任务进入终态、页面离开或会话失效时不能继续无期限请求。
- succeeded 但 outputs 为空时仍然不能进入“可下载”状态,这种响应应被当成异常处理。
- 结果 URL 是短期访问凭证,展示和下载都应通过授权的 media access 入口,不应该当成永久公开地址。
- 任务超时、provider 失败、用户取消和会话恢复失败是不同的错误,不要用一个“生成失败”字符串覆盖它们。

想请教大家:大家在实现这种异步图片任务时,会把上传资源、任务状态和结果访问拆成三个独立状态机,还是像上面一样由一个任务对象统一驱动?如果允许多任务并行,如何避免旧任务的轮询响应覆盖当前编辑器状态?

发帖前要善用【论坛搜索】功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

沙发
lmyx2008 发表于 2026-9-30 15:21
模型不对
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - 52pojie.cn ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2026-10-2 02:16

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表