ModelSite
平台概念

错误码

HTTP 错误状态码、错误响应结构与重试策略

所有错误返回 JSON,error 对象含 typemessage,有时带 codecode 目前存在时只是把 type 原样复制一份,做分支判断请用 type)。

没有 error.param 字段——跟其他一些厂商的 API 不同,ModelSite 的错误对象不会单独标出是哪个参数出的错,出错细节看 error.message

状态码

状态码真实 type含义排查
400invalid_request_error请求格式/参数错误,或 model 未知检查 body、必填字段、model
401authentication_errorAPI Key 缺失、无效或已过期确认 Authorization: Bearer 头,以及控制台里 Key 的有效期
402insufficient_quota余额不足充值
403model_access_error(Key 无权用该模型)/ permission_denied_error(上游拒绝)无权访问该模型/操作确认 Key 权限或模型开放范围
404not_found_error查询的资源不存在(单个模型、response_idcache_id核对 ID——模型用 GET /v1/models
408timeout_error上游调用超时重试
413invalid_request_error请求体过大减少 token
422unprocessable_entity_error请求格式合法但语义无法处理检查 tools/response_format
429rate_limit_error触发限流降并发,按 Retry-After 退避
500server_error / internal_server_error平台内部异常通常是临时性的;持续报错请联系支持
502server_error / bad_gateway_error上游不可达平台自动切换上游;稍后重试
503overloaded_error平台达到容量上限,或所有上游都已耗尽退避后重试,看 Retry-After

500/502 具体会拿到上表两个 type 值中的哪一个,取决于内部哪个环节失败——请按状态码分支处理,不要依赖具体是哪个字符串。

上表是平台归一化后的 type 集合——极少数情况下你也可能看到 content_policy_violationcontext_length_exceeded(都是 400)作为最终错误冒出来。

错误响应

{
  "error": {
    "type": "invalid_request_error",
    "message": "unknown model: foo-1"
  }
}
字段说明
error.type错误类别(见上表)——做分支判断用这个字段
error.message人可读的说明
error.code有时会出现;目前只是 error.type 的复制品,不是更细粒度的错误码

重试策略

在你收到任何响应内容之前发生的 5xx / 上游超时,平台已经自动重试过了,这种情况不需要客户端激进重试。客户端应该对 429503(都带 Retry-After)做指数退避,并为极少数"流已经开始后中途中断"的场景自建重试——这种情况是终态,已经流出的部分仍会计费。

import time
def call_with_retry(fn, tries=4):
    for i in range(tries):
        try:
            return fn()
        except RateLimitError:
            time.sleep(2 ** i)   # 1, 2, 4, 8s
    raise

On this page