错误处理与计费规则
区分请求拒绝、任务失败和网络超时,避免重复生成与重复费用。
请求错误与任务失败不是一回事
视频 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 |
| 401 | invalid_api_key:密钥缺失或无效 |
| 402 | insufficient_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 原样重新提交;查询必须用创建任务的同一把密钥 |
| 409 | request_id_conflict:该请求 ID 已被另一份请求内容或另一把密钥使用。model 换一种写法(例如旧 ID 和 /v1/models 的 id)也算不同的请求内容。重试时请求内容必须完全相同;新的生成请换一个新 ID。task_not_cancellable(取消模型任务时):任务已不在排队中(正在发出、已发出或已结束),不能取消,响应里带它当前的 status,继续查询即可 |
| 429 | rate_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;没有拿到响应时先查看调用日志,确认结果再决定是否重新生成。
排查顺序
- 在调用日志查模型、状态、费用和请求 ID。
- 确认密钥有效、余额足够且有对应能力的权限。
- 重新读取实时目录和该能力 Schema,检查参数与上下架状态。
- 查询视频任务时使用创建时的同一把密钥。
- 反馈问题附请求 ID;不要发送密钥或带签名的媒体链接。