ClouisleClouisle

API 错误与重试

按 HTTP 状态和业务错误码恢复 API 调用

所有响应都使用同一信封结构,成功与失败共用:

{"code": 0, "data": {}, "msg": "success"}

失败时 code 为非零,data 可能为 null 或携带结构化细节(如超出的大小上限、剩余尝试次数)。msg 已按请求语言本地化,不要用 msg 文本分支,请始终用 code。

code 的取值来自后端 ResponseCode 枚举(backend/app/schemas/response.py),是本页所有清单的唯一权威来源。HTTP 状态只是传输层提示。

HTTP 状态映射

HTTP 状态与业务 code 并非一一对应。同一个 code 可能以不同 HTTP 状态出现(例如 2003 在 JWT 解析失败时为 403,在密码错误时为 400),因此先看 HTTP 状态做粗分类,再以响应体中的 code 做精确分支。

来源HTTP业务 code
BusinessError(默认)400其自身 code(如用户名已存在 5002)
校验错误(Pydantic)4221001
未提供认证信息4012000
无效 JWT / 已吊销 / 单会话被顶下线4012001
API Key 已过期4012002
用户停用或待审批(认证中间件)4012004
JWT 无法解析或已过期4032003
权限不足4033000 / 3001 / 3002 / 3003 / 3004
资源不存在4044000–4005、6000 系列、6200/6210/6211
模型配额超限4296103
服务器内部错误5001003
通用 HTTPException其状态码1000 / 2000 / 3000 / 4000

只有 6103(模型配额)会稳定返回 HTTP 429;5400(邮件额度)与 5312(TOTP 连续失败限速)都返回 HTTP 400。不要按 HTTP 状态推断限速,必须读取 code。

业务错误码清单

下表覆盖当前版本全部已定义错误码。某一区间未使用的号码属于保留段,请勿实现分支。

HTTP 列标注的是当前代码实际抛出的状态;标「400」表示未显式指定状态(BusinessError 默认值)。少数 code 在不同端点会使用不同状态(例如 1004、3001、6000 系列、6100),表中给出最常见取值,实际仍以响应为准。

标「保留」的 code 已在枚举中定义,但后端当前没有任何抛出点。集成时不要依赖它们出现。

通用错误(1000-1999)

代码常量含义HTTP
1000UNKNOWN_ERROR未分类错误400(LLM 处理路径 500)
1001VALIDATION_ERROR请求校验失败422(Pydantic);手动抛出为 400
1002BAD_REQUEST请求格式或参数非法400(个别冲突场景 409)
1003INTERNAL_ERROR服务器内部错误500
1004FORBIDDEN通用禁止操作403

1001 的 data.errors 是字段名到消息数组的字典,不是数组:

{
  "code": 1001,
  "data": {
    "errors": {
      "email": ["Invalid email address"],
      "password": ["String should have at least 8 characters"]
    }
  },
  "msg": "Validation error"
}

认证错误(2000-2999)

代码常量含义HTTP
2000UNAUTHORIZED缺少认证信息401
2001INVALID_TOKENJWT 已吊销/已过期,或 API Key 无效、已停用401
2002TOKEN_EXPIREDAPI Key 已过期(JWT 过期走 2003)401
2003INVALID_CREDENTIALS用户名/密码错误,或 JWT 无法解析/已过期403(JWT);400(密码错误)
2004INACTIVE_USER用户已停用或待审批401

2001 还用于单会话模式下被新登录顶下线的旧令牌(msg_key 为 session_expired_new_login),以及令牌黑名单命中。

权限错误(3000-3999)

代码常量含义HTTP
3000PERMISSION_DENIED无权访问该资源或执行该操作403
3001INSUFFICIENT_PRIVILEGES需要超级管理员权限403
3002NOT_TEAM_MEMBER不是目标团队成员403(POST /teams/{team_id}/leave 为 404)
3003TEAM_ADMIN_REQUIRED需要团队 owner 或 admin 角色403
3004TEAM_OWNER_REQUIRED需要团队 owner 角色403

3000 也是 API Key 资源绑定不匹配的返回码(msg_key 为 api_key_no_agent_access / api_key_no_workflow_access),见 API Keys API。

资源错误(4000-4999)

代码常量含义HTTP
4000NOT_FOUND通用资源不存在404
4001USER_NOT_FOUND用户不存在404
4002ROLE_NOT_FOUND角色不存在404
4003PERMISSION_NOT_FOUND权限不存在404
4004TEAM_NOT_FOUND团队不存在404
4005TEAM_MEMBER_NOT_FOUND团队成员记录不存在404

注册与账户(5000-5099)

代码常量含义
5000REGISTRATION_DISABLED开放注册已关闭
5001ALREADY_EXISTS资源已存在(通用)
5002USERNAME_EXISTS用户名已存在
5003EMAIL_EXISTS邮箱已存在
5004EMAIL_NOT_VERIFIED需先完成邮箱验证才能登录
5005VERIFICATION_CODE_INVALID验证码或重置令牌无效
5006VERIFICATION_CODE_EXPIRED验证码或邮件令牌已过期
5007EMAIL_SEND_FAILED邮件发送失败(常见原因:SMTP 未配置)
5008EMAIL_SEND_TOO_FREQUENT邮件发送过于频繁(60 秒冷却)

该区间统一返回 HTTP 400。5007 的 data、5008 的 data.remaining_seconds 可提供更精确的提示。

重复冲突(5100-5199)

代码常量含义
5100ROLE_NAME_EXISTS角色名已存在
5101PERMISSION_CODE_EXISTS权限码已存在
5102TEAM_NAME_EXISTS团队名已存在
5103ALREADY_TEAM_MEMBER用户已是团队成员
5104DUPLICATE_NAME名称重复(通用)

该区间统一返回 HTTP 400。重试不会成功,请改名或改为更新既有资源。

操作被禁止(5200-5299)

代码常量含义
5200CANNOT_DELETE_SYSTEM_ROLE不能删除系统角色
5201CANNOT_DELETE_SUPERUSER不能删除超级管理员
5202CANNOT_DELETE_SYSTEM_PERMISSION不能删除系统权限
5203CANNOT_UPDATE_SYSTEM_PERMISSION不能修改系统权限
5204CANNOT_MODIFY_SYSTEM_ROLE不能修改系统角色
5205CANNOT_DELETE_DEFAULT_TEAM不能删除默认团队
5206CANNOT_ADD_AS_OWNER不能直接把成员添加为 owner
5207CANNOT_CHANGE_OWNER_ROLE不能修改 owner 的角色
5208CANNOT_PROMOTE_TO_OWNER不能直接把成员提升为 owner
5209CANNOT_REMOVE_OWNER不能移除 owner
5210OWNER_CANNOT_LEAVEowner 必须先移交所有权才能退出团队
5211ROLE_IN_USE角色仍被用户占用
5212USER_ALREADY_ACTIVE用户已处于激活状态
5213USER_ALREADY_INACTIVE用户已处于停用状态
5214CANNOT_DEACTIVATE_SUPERUSER不能停用超级管理员

该区间统一返回 HTTP 400。变更为 owner 请使用移交所有权接口,见 Teams API。

登录安全(5300-5399)

代码常量含义
5300ACCOUNT_LOCKED账号因连续登录失败被锁定(默认 5 次、锁定 15 分钟)
5301TOO_MANY_LOGIN_ATTEMPTS登录尝试次数过多(保留)
5302CAPTCHA_REQUIRED需要提交人机验证
5303CAPTCHA_INVALID人机验证未通过或凭据已失效
5304PASSWORD_EXPIRED密码已过期(保留)
5305FORCE_PASSWORD_CHANGE_REQUIRED必须修改密码(保留)
5306PASSWORD_MIN_AGE_NOT_MET未达到最小密码年龄,暂不能再次修改
5307PASSWORD_RECENTLY_USED新密码与历史密码重复(保留)
5310TOTP_REQUIRED需要两步验证(保留)
5311TOTP_INVALID动态码或备用码错误
5312TOTP_RATE_LIMITEDTOTP 连续失败过多被临时限速(HTTP 400)
5313TOTP_NOT_ENABLED该账号未开启两步验证
5314TOTP_ALREADY_ENABLED该账号已开启两步验证
5315TOTP_SETUP_EXPIREDTOTP 绑定会话过期
5316TOTP_SETUP_REQUIRED系统要求先完成绑定(保留)

密码过期或管理员强制修改密码不是错误:登录接口仍返回 code: 0,但在 data 中带 force_password_change: true 与 reason;系统要求绑定 TOTP 时返回 requires_totp_setup: true。见 认证与用户登录 API。

速率限制(5400-5499)

代码常量含义HTTP
5400RATE_LIMITED邮件额度耗尽或供应商限速映射400

5400 的 data 会给出具体维度,例如批量发信时的 {"limit": 100, "period": "hour"} 或 {"requested": 3, "remaining": 1}。

知识库(6000-6099)

代码常量含义HTTP
6000KB_NOT_FOUND知识库不存在404
6001KB_NAME_EXISTS知识库名已存在400
6002DOCUMENT_NOT_FOUND文档不存在404
6003INVALID_DOCUMENT_TYPE文档类型不支持400
6004DOCUMENT_PROCESSING_FAILED文档处理失败(保留)—
6005CHUNK_NOT_FOUND分块不存在404
6006DOCUMENT_PROCESSING文档仍在处理中,操作暂不可用400
6007KB_ACCESS_DENIED无权访问该知识库403

6007 与 6201(Agent)语义一致:资源存在但当前用户/API Key 不在可访问范围内。客户端应提示申请权限,而不是重试。

模型(6100-6199)

代码常量含义HTTP
6100MODEL_NOT_FOUND模型不存在404
6101TEAM_MODEL_NOT_FOUND团队模型授权不存在404
6102TEAM_MODEL_EXISTS该模型已授权给团队400
6103MODEL_QUOTA_EXCEEDED团队模型配额(Token 或请求数)超限429
6104MODEL_NOT_AUTHORIZED团队未获得该模型授权400
6105MODEL_VISION_NOT_SUPPORTED模型不支持视觉输入(保留)—
6106MODEL_DISABLED模型或团队授权已被停用400

6103 唯一稳定返回 HTTP 429;6106 与 6104 都表示「当前不可用」,但 6104 需要在团队模型授权中新增记录,6106 只需重新启用已有授权的 is_enabled。

Agent 与会话(6200-6299)

代码常量含义HTTP
6200AGENT_NOT_FOUNDAgent 不存在404
6201AGENT_ACCESS_DENIED无权访问该 Agent403
6202AGENT_NOT_PUBLISHEDAgent 未发布(保留)—
6210CONVERSATION_NOT_FOUND会话不存在或不属于当前用户404
6211MESSAGE_NOT_FOUND消息不存在404

当前后端不校验 Agent 的发布状态,6202 保留但不会被抛出。对话时不要据此判断;未授权会返回 6201/3000,模型不可用会返回 6104/6106。

SSO(6300-6399)

代码常量含义
6300SSO_PROVIDER_NOT_FOUNDSSO 提供商不存在或未启用
6301SSO_SESSION_EXPIREDSSO 登录会话已过期(保留)
6302SSO_REGISTRATION_DISABLEDSSO 自动注册已关闭
6303SSO_AUTHENTICATION_FAILEDSSO 认证失败(保留)
6304SSO_INVALID_CONFIGURATIONSSO 配置不完整或非法
6305SSO_PROVIDER_NAME_EXISTS提供商名称已存在
6306PASSWORD_LOGIN_DISABLED站点强制 SSO,密码登录已禁用

该区间统一返回 HTTP 400(6306 出现在登录接口,因此也提示「改用 SSO 登录」而不是重试)。

处理表

HTTP / 业务范围处理方式
401、2000-2002、2004重新登录、刷新 JWT,或替换已过期/无效/被停用的 API Key;2004 需联系管理员恢复账号
403、3000-3004检查角色、团队成员关系、owner/admin 要求,以及 API Key 的 Agent/Workflow 绑定
404、4000-4005、6000/6002/6005/6200/6210/6211确认资源 ID、所属团队与当前团队上下文
400、1001-1004修复 JSON、必填字段、类型或业务校验;1001 时逐字段读取 data.errors
5000-5008按注册、账户创建或邮箱验证流程提示用户操作
5100-5214不要自动重试:改名称、改流程,或改用更新/移交类端点
5300-5316按锁定、验证码、密码策略或 TOTP 提示操作
5400退避后重试;批量发信可减少收件人数量
6000-6007检查知识库权限、文档类型、处理状态与分块 ID
6100-6106检查团队模型授权、配额用量与启用状态
6103(HTTP 429)退避并降低并发;或等待配额周期重置
6200/6201确认 Agent ID 与访问范围(团队可见性或 API Key 绑定)
6300-6306检查 SSO 提供商配置、回调、自动注册开关,以及是否已禁用密码登录

可重试与不可重试

网络超时、503/504、供应商暂不可用、5400 与 6103 限速,以及部分后台任务失败可以指数退避重试。

以下情况不要盲目重试:

  • 1001-1004:请求本身非法,重试会得到同样结果。
  • 3000-3004、6007、6201:权限问题,需先变更授权。
  • 2001、2002、2004:凭据或账号状态问题。
  • 4000-4005:资源不存在,先确认 ID 与上下文。
  • 5100-5214:约束冲突,需改变请求内容。
  • 6104、6106:模型授权或启用状态问题。
  • 6306:该部署已关闭密码登录。

幂等的读取请求可安全重试;POST 类端点(发送消息、运行工作流、创建资源)重试前请先查询状态,避免重复写入或重复触发外部副作用。

SSE 错误处理

流式端点在线路中途出错时不会改变 HTTP 状态(此时响应头已发出),而是在事件流中推送错误事件:

  • Agent 流收到 error 事件后,保留已接收的正文与 message_id,再决定重试或提示用户。因为此时消息可能已落库,重试前先查询会话消息,避免重复提问。
  • 工作流流断线后使用 stream_url 与最后收到的事件序号恢复订阅,不要重新触发 POST /workflows/{workflow_id}/run。

两类流的完整事件清单见 流式事件。

相关文档

这篇文章对你有帮助吗?

本页目录