指南
错误
查看所有 CheaperGen API 错误代码和 HTTP 状态码——400、401、402、404、409、429、502、503——以及各错误的原因和处理或重试方式。
API 使用标准 HTTP 状态码:2xx 表示成功,4xx 表示请求需要修改,5xx 表示我们的服务或上游服务发生故障。所有错误响应采用相同的 JSON 结构,因此可以集中处理。
错误格式#
{
"error": {
"code": "invalid_request",
"message": "\"resolution\" must be one of: 480p, 720p",
"param": "resolution"
}
}code— 稳定且机器可读的错误代码。请根据此字段编写分支逻辑,不要依赖错误消息。message— 适合记录日志的易读说明,措辞可能会调整。param— 仅当特定请求字段导致错误时才会返回。
错误代码#
| HTTP | 状态码 | 说明 | 处理方法 | 是否重试? |
|---|---|---|---|---|
| 400 | invalid_request | 请求正文不是有效 JSON、缺少必填字段、数值超出范围或不被允许、正文包含未知参数、提示词引用了不存在的内容,或参考视频/音频文件无法读取或超出模型限制(时长、大小、分辨率、帧率)。param 会指出出错字段。 | 修正请求。错误信息会明确说明具体问题。 | 修复后重试 |
| 401 | unauthorized | API 密钥缺失、格式错误或已撤销。 | 检查 Authorization: Bearer 标头,并确认密钥仍然有效。 | 修复后重试 |
| 402 | insufficient_balance | 余额不足,无法支付此次生成费用。未扣款。 | 前往“控制面板 → 账单”充值或启用自动充值。参见 计费。 | 修复后重试 |
| 404 | not_found | 端点 ID、模型或生成任务不存在,或该生成任务属于其他账户。 | 请在 模型列表 中检查 ID。 | 否 |
| 409 | conflict | 请求与资源当前状态冲突,通常是因为尝试取消已开始运行或已完成的生成任务。 | 读取生成任务,查看当前状态。 | 否 |
| 410 | model_delisted | 此模型已停止提供。请求未提交,也未扣款;此前的生成记录仍可查看。 | 请从 模型列表 选择其他模型。 | 否 |
| 429 | rate_limited | 请求速率过高,或者等待开始的生成任务队列已满。 | 稍后再试。参见 速率限制。 | 采用退避重试 |
| 500 | internal_error | 我们的服务出现问题。 | 稍后再试。如果问题仍然存在,请联系支持团队,并提供请求时间。 | 采用退避重试 |
| 501 | direct_upload_unavailable | 此部署不支持直接(预签名)上传。 | 请改用 multipart/form-data 上传。参见 文件上传。 | 否 |
| 502 | — | 请求尚未到达我们的 API 前,网关或网络发生错误(较少见)。上游模型故障不会显示为 HTTP 错误;生成任务会失败并附带错误原因。 | 稍后重试。不会扣款。 | 采用退避重试 |
| 503 | model_unavailable | 模型暂时无法接受新的生成请求。 | 请稍后重试或切换模型。查看 状态页面。 | 采用退避重试 |
| 503 | pricing_unavailable | 暂时无法读取价格,因此未对请求报价。没有提交请求,也没有收费。 | 几秒后使用相同的 Idempotency-Key 重试同一请求(响应中会包含 Retry-After 请求头)。 | 采用退避重试 |
| 503 | fallback_price_declined | 常规算力暂时不可用,目前仅能使用应急价格(最高不超过官方价格),但你传入了 allow_fallback_price: false。不会扣款;错误信息会同时列出两种价格。 | 稍后再试以使用常规价格,或传入 allow_fallback_price: true(默认值)以接受应急价格。 | 采用退避重试 |
| 400 | max_cost_exceeded | 包含应急价格在内的费用超过了你设置的 max_cost_usd。不会扣款。 | 请降低分辨率或时长;也可以确认价格并提高 max_cost_usd。 | 修复后重试 |
生成任务中的错误#
HTTP 错误表示请求本身被拒绝,不会扣款。已接受后失败的生成与此不同:API 调用仍然成功(即使任务立即失败,POST /run 仍会返回 202),而生成任务的 status 会变为 failed,并包含 error 对象。冻结金额会自动退还。同一对象也会出现在 GET /generations、Webhook 负载和 MCP 工具结果中。
{
"status": "failed",
"error": {
"code": "generation_failed",
"message": "ByteDance's safety review for Seedance 2.0 Fast rejected this request (the prompt or an input file).",
"reason": "content_blocked",
"hint": "Describe the character's look instead of naming a copyrighted character or real person, keep it non-explicit, or try another model.",
"retryable": false,
"refunded": true,
"detail": "你的请求未通过内容安全检查。请调整提示词后重试。"
}
}code 是通用错误类别(自产品上线以来记录的四种值)。reason 会准确说明失败原因,请根据此字段编写分支逻辑并向用户展示 message 和 hint。retryable 会说明使用相同请求重试是否可能成功;param 会在可判断时指出需要修改的字段;detail 会保留模型服务提供商的原始措辞。
| error.reason | error.code | 发生了什么 | 处理方法 | 按原样重新发送? |
|---|---|---|---|---|
content_blocked | generation_failed | 模型供应商的安全过滤器拒绝了提示词、输入文件或生成结果(例如,指定的受版权保护角色、真人或露骨内容)。提示会说明是哪一方的过滤器拦截了内容。 | 改写提示词(描述外观,而不要直接提及角色、品牌或真人),更换输入文件,或尝试其他供应商的模型。原样重试仍会以同样方式失败。 | 否,先修改 |
invalid_input | generation_failed | 模型无法接受某项输入或设置:文件过大、格式不受支持、尺寸或宽高比不正确、时长过长,或者某个值不受支持。如果可以确定,param 会标明对应字段。 | 修正指定字段(参阅模型 API 页面上的限制)后重新提交,或尝试其他模型。 | 否,先修改 |
input_unreachable | generation_failed | 无法下载输入 URL:它需要登录、签名链接已过期、链接没有直接指向文件,或托管方拒绝了请求。如果模型服务商无法获取文件,我们通常会自行下载并使用副本重试;因此,这通常表示文件根本无法下载。 | 请使用公开的直接文件 URL,或通过 POST /api/v1/uploads 上传文件,然后重新提交。 | 否,先修改 |
upstream_unavailable | upstream_error | 模型供应商发生故障、负载过高或已达到容量上限,我们已尝试所有符合条件的路由。 | 一两分钟后重试,或改用其他模型。 | 是 |
upstream_error | upstream_error | 我们尝试所有符合条件的路由后,供应商在生成过程中仍发生了内部错误。 | 请重试;此类错误通常是暂时的。如果持续失败,请尝试其他模型。 | 是 |
timeout | timeout | 生成未能在时限内完成(时限由供应商设定,或使用我们的 40 分钟上限)。 | 请重试。缩短视频片段或降低分辨率通常能更快完成。 | 是 |
output_unavailable | upstream_error | 模型已完成生成,但没有返回可用文件;或者结果无法下载并保存。 | Retry. | 是 |
model_unavailable | model_unavailable | 生成过程中,该模型或其当前模式已停止提供服务。 | 请选择其他模型,或稍后重试。 | 否,先修改 |
canceled | upstream_error | 供应商在任务完成前取消了任务,或使任务过期。(用户自行取消的生成状态为 canceled,且不会带有错误。) | Retry. | 是 |
generation_failed | generation_failed | 模型在没有生成结果的情况下停止,且未提供原因。 | 先重试一次;如果再次失败,请简化提示词或输入,或尝试其他模型。 | 是 |
由请求本身导致的失败(content_blocked、invalid_input 中不被接受的文件、input_unreachable)不会改用其他服务提供商重试,因为仍会以相同方式被拒绝。遇到服务中断和上游错误时,系统会先在所有符合条件的路由中重试,价格保持不变。参见 失败与退款。
当服务商表示无法下载你的某个输入文件时,我们通常会尝试自行下载。如果下载成功,任务会使用我们托管的副本重试——价格不变,你无需进行任何操作;生成记录仍会显示你提交的 URL,副本会按其 保留期限 与生成记录一同删除。因此,input_unreachable 通常表示文件根本无法下载:需要登录、签名链接已过期、链接没有直接指向文件,或文件托管方拒绝了请求。我们可复制最大 30 MB 的图像、200 MB 的视频和 50 MB 的音频;更大的文件或无法读取的文件会以 invalid_input 失败。
安全地重试#
对 429、500、502 和 503 采用指数退避并加入随机抖动后重试。其他 4xx 错误请勿原样重试,否则会以相同方式失败。
提交请求不具备幂等性
每次成功的 POST /run/{endpoint} 都会创建并计费一个新的生成任务。如果提交请求因网络超时而结束,无法确定任务是否已被接受,请先查看 最近的生成任务,再决定是否重新提交。
const RETRYABLE = new Set([429, 500, 502, 503]);
export async function postWithRetry(url, headers, body, attempts = 5) {
let resp;
for (let attempt = 0; attempt < attempts; attempt++) {
resp = await fetch(url, { method: "POST", headers, body: JSON.stringify(body) });
if (!RETRYABLE.has(resp.status)) break;
// exponential backoff with jitter: ~1s, 2s, 4s, 8s…
await new Promise((r) => setTimeout(r, Math.min(2 ** attempt, 30) * 1000 + Math.random() * 1000));
}
const data = await resp.json();
if (!resp.ok) throw new Error(`${resp.status} ${data.error.code}: ${data.error.message}`);
return data;
}验证示例#
验证错误会指出字段及其允许值,可直接展示给开发者:
[
{
"error": {
"code": "invalid_request",
"message": "\"prompt\" is required",
"param": "prompt"
}
},
{
"error": {
"code": "invalid_request",
"message": "Unknown parameter \"resoluton\"",
"param": "resoluton"
}
},
{
"error": {
"code": "not_found",
"message": "Unknown endpoint \"bytedance/seedance-2.0-fast/text-to-gif\". See GET /api/v1/models."
}
}
]你也可以在不运行任务的情况下查询价格:POST /api/v1/quote/{endpoint} 会验证与价格相关的字段并返回费用。参见 API 参考文档。
有不清楚或缺少的内容?发邮件至 support@cheapergen.com——我们会认真阅读每一封邮件。