跳转到主要内容

HTTP 错误码

所有 API 错误响应使用统一格式:
{
  "code": 40001,
  "message": "错误描述",
  "status": false,
  "data": null
}
HTTP业务码含义处理建议
20020000成功正常处理
40040001参数错误检查请求体 / Header
40140100未授权(Key 无效或缺失)检查 Authorization
40340300权限不足确认当前帐号能否调用该 web_app_id
40440400资源不存在检查 requestId / web_app_id
42942900超出并发配额降低并发 / 升级套餐
50050000服务内部错误重试;持续失败请联系支持
50350300服务不可用(维护中)稍后重试
业务码与 HTTP 状态码可能不一致。确认任务是否成功时,请以响应体 code == 20000status == true 为准。

任务状态机

任务从创建到终止的完整状态转换图:
中文版
状态含义是否产生费用
Queuing排队中取消时不计费
Preparing准备中免费
Running运行中中断时仍产生部分费用
Success成功完成完成全部计费
Failed失败完全退款
Canceled已取消免费

常见失败原因

1. web_app_id 不存在或无权限

{"code": 40400, "message": "web_app_id not found", "status": false}
排查:确认 ID 正确,且该 AI 应用处于已发布、已授权状态。

2. input_values 字段缺失或类型错误

{"code": 40001, "message": "invalid input_values: 84:CLIPTextEncode.text is required"}
排查:对照 AI 应用页紫色 API 按钮中的 input_values 完整 Schema,逐字段校对。

3. 输入文件 URL 不可访问

{"code": 20000, "status": true, "data": {"outputs": [{"audit_status": 4, "error_type": "INPUT_ACCESS_DENIED"}]}}
排查:确保使用的 URL 为 commit 接口返回的 BizyAir URL,而非任意公网 URL。

4. 内容审核不通过

{"outputs": [{"audit_status": 3, "error_type": "NSFW"}]}
排查:提示词中含敏感词 / 输入图含敏感内容,调整后重试。

5. Credits 余额不足

{"code": 42901, "message": "insufficient credits", "status": false}
排查:先充值。调用 /y/v1/wallet 确认余额。

6. 并发超限

{"code": 42900, "message": "too many concurrent tasks", "status": false}
排查:降低并发数、使用队列控制,或联系商务升级套餐。

重试策略

建议重试的错误

以下错误属于瞬态错误,安全重试:
情形重试策略
HTTP 429(限流)指数退避 + jitter(基座 2s,最多 5 次)
HTTP 500 / 502 / 503 / 504指数退避 + jitter,最多 3 次
网络超时 / 连接重置正常重试,最多 3 次
WebHook 回调回逐 200 OK 以外平台自动重试

不建议重试的错误

情形处理
HTTP 400修改参数后才重新提交
HTTP 401重新获取 / 更新 API Key
HTTP 403检查帐号权限 / 应用发布状态
HTTP 404检查 ID 是否拼写错误后重提
任务 Failed先看 error_type / error_msg,修正后重新提交

幂等性与 requestId

BizyAir 不自动对任务创建请求去重。如果你在没收到 requestId 的情况下盲重试 /create,可能产生重复任务与重复计费。建议:
  • 发送前先在客户端生成业务层幂等销 key
  • 若相同幂等销 key 对应的上一次已获 requestId,优先用 /detail 查询而非重新 /create

参考实现(Python)

import time, random, requests

def post_with_retry(url, headers, json_body, max_retries=3):
    for attempt in range(max_retries + 1):
        try:
            resp = requests.post(url, headers=headers, json=json_body, timeout=(10, 60))
            if resp.status_code == 200:
                return resp.json()
            if resp.status_code in (429, 500, 502, 503, 504) and attempt < max_retries:
                wait = min(2 ** attempt + random.random(), 30)
                time.sleep(wait); continue
            resp.raise_for_status()
        except (requests.ConnectionError, requests.Timeout):
            if attempt < max_retries:
                time.sleep(2 ** attempt); continue
            raise
    raise RuntimeError("exceeded retry budget")