错误处理与计费规则

区分请求拒绝、任务失败和网络超时,避免重复生成与重复费用。

请求错误与任务失败不是一回事

视频 API 的 HTTP 错误使用公开错误结构,例如参数校验失败:

{
  "error": {
    "message": "The request contains an invalid parameter.",
    "type": "invalid_request_error",
    "code": "invalid_parameter"
  }
}

以 HTTP 状态及公开 code 判断处理方式,不要匹配完整 message。部分参数错误还会返回 param、allowed_values 等修正线索。视频请求错误经过公开错误转换,不应依赖模型厂商的原始错误码。

已创建的视频任务后来失败时,查询请求本身可以成功(HTTP 200),但任务的 status 是 failed,任务内的 error 当前只保证 message。不要把它与 HTTP 错误的 type/code 结构混淆。

图片接口目前仍有与视频不同的错误封装路径,不能假定其 type/code 枚举已完全统一。客户端应保留未知错误分支,以 HTTP 状态和调用日志辅助排查;不要依赖供应商消息的具体措辞。

按状态处理

HTTP 状态含义与处理
400请求有误,没有创建任务。检查 model 是否为 /v1/models 的 id,以及必填字段、类型及合法值,修正后再提交。native_model_unavailable:这个模型在另一个接口上,读取它在 /v1/models 中的 openapi_url,并改用 suggested_models 里的 ID
401invalid_api_key:密钥缺失或无效
402insufficient_balance:余额不足或余额为负,没有创建任务。余额为负时消息写明欠款;模型任务(/v1/model-tasks)余额不足以冻结时写明本次冻结金额;其他情况为通用文案,不要从消息里解析金额。充值后再提交,充值先抵扣欠款(异步任务可沿用同一个请求 ID)
403该密钥无权使用此模型或接口(access_denied),已停用(api_key_disabled),或不允许从当前网络地址使用(api_key_ip_not_allowed)
404(提交时)model_not_found(type 为 not_found_error):这个 ID 不能用此密钥调用,没有创建任务。不要原样重发,改用响应里的 suggested_models 或 /v1/models 的 id
404(查询时)task_not_found:该密钥下不存在此任务,通常是提交没有送达或被拒绝。不要继续轮询,用同一个 X-Request-Id 原样重新提交;查询必须用创建任务的同一把密钥
409request_id_conflict:该请求 ID 已被另一份请求内容或另一把密钥使用。model 换一种写法(例如旧 ID 和 /v1/models 的 id)也算不同的请求内容。重试时请求内容必须完全相同;新的生成请换一个新 ID。task_not_cancellable(取消模型任务时):任务已不在排队中(正在发出、已发出或已结束),不能取消,响应里带它当前的 status,继续查询即可
429rate_limit_exceeded:请求过于频繁,退避后重试;异步图片任务和模型任务用同一个请求 ID 重新提交。api_key_quota_exhausted:该密钥的额度已用完,重试无效,需要调高额度或换一个密钥。too_many_active_tasks:异步图片任务表示同时生成中或仍在结算的任务过多;模型任务超过可同时运行的数量时不会被拒绝,而是先排队,返回此错误表示你排队中的任务已达上限。稍等片刻后用同一个请求 ID 重新提交
5xx服务暂时异常(如 auth_unavailable、model_route_unavailable、生成服务暂时不可用 upstream_unavailable):异步图片任务和模型任务可用同一个请求 ID 退避后重新提交;视频和同步图片不要自动重发,先查调用日志。任务状态为 failed 时的 upstream_unavailable 含义不同,见下表

异步任务的常见错误码

code含义下一步
model_not_found(提交时 404)这个 ID 不能用此密钥调用,没有创建任务不要原样重发;改用响应里的 suggested_models 或 /v1/models 的 id
task_not_found(查询时 404)该密钥下没有这个任务用同一个 X-Request-Id 原样重新提交,不要一直轮询
artifact_not_found(下载模型任务结果文件时 404)任务还没完成,序号不是已完成任务声明的结果文件,或任务不是用这把密钥提交的查询任务直到 status 为 completed,只下载输出里声明的序号,并使用提交任务的同一把密钥;不要因此重新提交
request_id_conflict同一个请求 ID 配了不同的请求内容或密钥重试时保持请求内容一致;新生成换新 ID
invalid_request_id请求 ID 格式不对使用 1–128 位字母、数字、_ 或 -,推荐 UUID
insufficient_balance余额不足充值后用同一个请求 ID 重新提交
model_route_unavailable / channel_unavailable模型暂时不可用稍后用同一个请求 ID 重新提交
task_store_unavailable任务存储暂时不可用稍后重新查询同一个任务
generation_timeout任务受理后 15 分钟内仍未产出结果,或提交后 15 分钟仍未确认。平台已判定失败并全额退回预扣;已受理的任务会请求取消生成这条任务不会再出结果,也不会收费。用新的 X-Request-Id 重新提交;原 ID 只会返回这条失败任务
upstream_unavailable(查询任务返回 status: failed,且 error.code 为此值)生成服务暂时不可用,没有接受这次提交,任务没有开始。平台已立即判定失败并全额退回预扣不是参数问题,不用修改输入。稍后用新的 X-Request-Id 重新提交;原 ID 只会返回这条失败任务
invalid_parameters(模型任务 status: failed)输入参数被拒绝。error.issues 逐条列出被拒绝的字段 field(输入里的路径,如 voice、image_urls[0])和规则码 rule(如 unsupported_value 不支持的取值、file_format 文件格式、duration 时长、content_policy 内容审核),不返回原始错误文本。平台已判定失败并全额退回预扣按字段和规则码修改输入,再用新的 X-Request-Id 提交;原 ID 只会返回这条失败任务
cancelled(模型任务 status: failed)你在任务排队时取消了它(POST /v1/model-tasks/{id}/cancel)。任务从未发给模型,平台已全额退回预扣需要时用新的 X-Request-Id 重新提交
queue_timeout(模型任务 status: failed)任务提交后排队 5 分钟仍未开始。任务从未发给模型,平台已全额退回预扣稍后用新的 X-Request-Id 重新提交;原 ID 只会返回这条失败任务
model_unavailable_while_queued(模型任务 status: failed)任务排队期间模型暂时下线或线路变更,任务没有开始,平台已全额退回预扣不是输入问题。用新的 X-Request-Id 重新提交(会使用新的线路);用原 ID 重试只会返回这条失败任务
insufficient_balance(模型任务 status: failed)任务排队期间,其他请求的实际费用超出冻结金额,余额变为负数,所以这条任务没有开始,平台已全额退回预扣充值抵扣欠款后,用新的 X-Request-Id 重新提交

异步图片任务(/v1/images/tasks)和模型任务(/v1/model-tasks)自受理起 15 分钟内没有结果就会判定失败;提交后 15 分钟仍未确认的任务(图片任务显示为 submitting 或 submission_unknown,模型任务显示为 queued)也会以 generation_timeout 失败,不会被重新提交。所以异步图片任务的轮询等待上限设为 20 分钟即可看到最终状态。

模型任务超过可同时运行的数量(你的账户同时运行的任务数有上限,平台整体也有上限)时不会被拒绝,而是先排队:状态为 queued,并带估计的排队位置 queue_position(1 表示下一个,位置会变化)。你自己的任务超过账户上限时,会按提交顺序等你的其他任务完成。提交后排队 5 分钟仍未开始的任务以 queue_timeout 失败并全额退款;排队中的任务可以用 POST /v1/model-tasks/{id}/cancel(同一把密钥)取消,取消后以 cancelled 失败并全额退款;任务已不在排队中(正在发出、已发出或已结束)时不能取消。因此模型任务的轮询等待上限设为 25 分钟。任务对象以后可能增加字段,客户端应忽略不认识的字段。

视频任务状态

状态含义与下一步
queued排队中,可继续查询或请求取消
in_progress生成中,继续查询,不能直接取消
completed生成成功,从 /v1/videos/{id}/content 下载并转存
failed生成失败,查看任务 error.message 与调用日志
cancelled已取消,停止轮询

删除接口是 DELETE /v1/videos/{id}:排队任务取消,已完成、失败或过期的任务记录删除后不能再查询;运行中和已取消的任务不能再次更改。成功返回 204。被拒绝时按实际 HTTP 状态和错误体处理,不要依赖某个厂商的删除错误码。

建议每 5 秒轮询一次,并设置单次等待上限。到达上限只停止客户端等待,任务可能仍在运行;保存任务 ID,之后继续 GET 查询,不要再次 POST 生成。

图片结果

图片能力有同步和异步两种执行方式,以能力 Schema 的 api.endpoint 和目录 generation.mode 为准。同步 POST /v1/images/generations 成功后处理全部 data[].url;异步 POST /v1/images/tasks 返回任务 id,再查询 GET /v1/images/tasks/{id},完成后处理全部 data[].url。结果链接可能过期,异步任务可重新查询以获取新链接。页面关闭或链接过期不代表该次生成没有发生。

计费与重试边界

  • 实际价格以当前能力目录为准。pricing.basis 为 usage 时按实际用量结算:有 pricing.usage 时按其单价(每 pricing.usage.unit)计费;没有 pricing.usage 时没有公开单价,按实际成本结算;有 pricing.tokens 时按其列出的 token 单价计费(每 100 万 token 的美元价格,只列出计费的种类:text_input、image_input、input、text_output、image_output、cache_read)。提交时冻结 pricing.prepayment(如有),amount 是单次请求最多冻结的金额。有 pricing.prepayment.scales_with 时按本次输入冻结:冻结 = scales_with.price × max(scales_with.field 字段的字符数, 1) ÷ scales_with.per,向上取整到 $0.000001,最多 amount;字符按 Unicode 字符计,与该字段 maxLength 的计数相同;请求带有未声明的顶层字段,或其他顶层文本超过 64 个字符且不是 enum/const 取值时,按 amount 冻结。没有 scales_with 时冻结 amount。余额须不低于 $0.01 与本次冻结金额中的较大者,否则请求因余额不足被拒绝。结算按实际用量:多余部分退回,超出部分全额从余额扣除,余额可能因此变为负数;余额为负时新请求暂停(返回 402),充值后先抵扣欠款。其他情况按 pricing.rules。不能把文档示例价格当作固定费率。
  • 当前 Seedream 图片按张计量,Seedance 视频按输出 token 计量;其他模型接入后以各自规则为准。
  • 按 token 计价时,计算为 output_tokens × price ÷ unit。像素对齐等口径见单能力 Schema 的 x-billing-basis。
  • 确认被拒绝、确认生成失败或成功取消的排队任务不收生成费。
  • 异步图片任务和模型任务自受理起 15 分钟内无结果、或提交后 15 分钟仍未确认,即判定失败(generation_timeout)并全额退回预扣;之后即使生成仍产生费用,也由平台承担。
  • 生成服务暂时不可用、没有接受提交时,任务立即失败(upstream_unavailable)并全额退回预扣。
  • 模型任务的输入被拒绝时,任务失败(invalid_parameters)并全额退回预扣。
  • 模型任务排队期间被取消(cancelled)、排队超时(queue_timeout)、模型下线(model_unavailable_while_queued)或余额变负(insufficient_balance)时,任务从未发给模型,全额退回预扣。排队中的任务也已冻结金额:余额页会写明有多少金额冻结在进行中和排队中的请求里,没用完的部分会自动退回。
  • 网络断开、客户端超时、停止轮询并不证明任务失败;生成可能已完成并结算。
  • 多张图片应依据实际生成结果和账单核对,不按请求的最大张数直接认定费用。
  • 视频完成与费用显示可能存在短暂延迟;响应中的最终结算值和调用日志是核对依据。

重试规则按接口区分:

  • 异步图片任务 /v1/images/tasks、模型任务 /v1/model-tasks:提交是幂等的,任务 ID 就是你的 X-Request-Id。超时、连接失败、429 或 5xx 时,用同一个 X-Request-Id 原样重新提交:已提交的会返回原任务,不会重复生成或扣费。模型任务要求重发的请求体字节完全一致。任务已经失败(包括 generation_timeout、upstream_unavailable、invalid_parameters,以及模型任务的 cancelled、queue_timeout、model_unavailable_while_queued、insufficient_balance)时,同一个 ID 只会返回这条失败任务;重新生成要换一个新的 X-Request-Id。
  • 视频 /v1/videos、同步图片 /v1/images/generations:不按请求 ID 去重,重发会新建并计费。已拿到视频任务 ID 时继续查询该 ID;没有拿到响应时先查看调用日志,确认结果再决定是否重新生成。

排查顺序

  1. 在调用日志查模型、状态、费用和请求 ID。
  2. 确认密钥有效、余额足够且有对应能力的权限。
  3. 重新读取实时目录和该能力 Schema,检查参数与上下架状态。
  4. 查询视频任务时使用创建时的同一把密钥。
  5. 反馈问题附请求 ID;不要发送密钥或带签名的媒体链接。