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) | 422 | 1001 |
| 未提供认证信息 | 401 | 2000 |
| 无效 JWT / 已吊销 / 单会话被顶下线 | 401 | 2001 |
| API Key 已过期 | 401 | 2002 |
| 用户停用或待审批(认证中间件) | 401 | 2004 |
| JWT 无法解析或已过期 | 403 | 2003 |
| 权限不足 | 403 | 3000 / 3001 / 3002 / 3003 / 3004 |
| 资源不存在 | 404 | 4000–4005、6000 系列、6200/6210/6211 |
| 模型配额超限 | 429 | 6103 |
| 服务器内部错误 | 500 | 1003 |
通用 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 |
|---|---|---|---|
1000 | UNKNOWN_ERROR | 未分类错误 | 400(LLM 处理路径 500) |
1001 | VALIDATION_ERROR | 请求校验失败 | 422(Pydantic);手动抛出为 400 |
1002 | BAD_REQUEST | 请求格式或参数非法 | 400(个别冲突场景 409) |
1003 | INTERNAL_ERROR | 服务器内部错误 | 500 |
1004 | FORBIDDEN | 通用禁止操作 | 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 |
|---|---|---|---|
2000 | UNAUTHORIZED | 缺少认证信息 | 401 |
2001 | INVALID_TOKEN | JWT 已吊销/已过期,或 API Key 无效、已停用 | 401 |
2002 | TOKEN_EXPIRED | API Key 已过期(JWT 过期走 2003) | 401 |
2003 | INVALID_CREDENTIALS | 用户名/密码错误,或 JWT 无法解析/已过期 | 403(JWT);400(密码错误) |
2004 | INACTIVE_USER | 用户已停用或待审批 | 401 |
2001 还用于单会话模式下被新登录顶下线的旧令牌(msg_key 为 session_expired_new_login),以及令牌黑名单命中。
权限错误(3000-3999)
| 代码 | 常量 | 含义 | HTTP |
|---|---|---|---|
3000 | PERMISSION_DENIED | 无权访问该资源或执行该操作 | 403 |
3001 | INSUFFICIENT_PRIVILEGES | 需要超级管理员权限 | 403 |
3002 | NOT_TEAM_MEMBER | 不是目标团队成员 | 403(POST /teams/{team_id}/leave 为 404) |
3003 | TEAM_ADMIN_REQUIRED | 需要团队 owner 或 admin 角色 | 403 |
3004 | TEAM_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 |
|---|---|---|---|
4000 | NOT_FOUND | 通用资源不存在 | 404 |
4001 | USER_NOT_FOUND | 用户不存在 | 404 |
4002 | ROLE_NOT_FOUND | 角色不存在 | 404 |
4003 | PERMISSION_NOT_FOUND | 权限不存在 | 404 |
4004 | TEAM_NOT_FOUND | 团队不存在 | 404 |
4005 | TEAM_MEMBER_NOT_FOUND | 团队成员记录不存在 | 404 |
注册与账户(5000-5099)
| 代码 | 常量 | 含义 |
|---|---|---|
5000 | REGISTRATION_DISABLED | 开放注册已关闭 |
5001 | ALREADY_EXISTS | 资源已存在(通用) |
5002 | USERNAME_EXISTS | 用户名已存在 |
5003 | EMAIL_EXISTS | 邮箱已存在 |
5004 | EMAIL_NOT_VERIFIED | 需先完成邮箱验证才能登录 |
5005 | VERIFICATION_CODE_INVALID | 验证码或重置令牌无效 |
5006 | VERIFICATION_CODE_EXPIRED | 验证码或邮件令牌已过期 |
5007 | EMAIL_SEND_FAILED | 邮件发送失败(常见原因:SMTP 未配置) |
5008 | EMAIL_SEND_TOO_FREQUENT | 邮件发送过于频繁(60 秒冷却) |
该区间统一返回 HTTP 400。5007 的 data、5008 的 data.remaining_seconds 可提供更精确的提示。
重复冲突(5100-5199)
| 代码 | 常量 | 含义 |
|---|---|---|
5100 | ROLE_NAME_EXISTS | 角色名已存在 |
5101 | PERMISSION_CODE_EXISTS | 权限码已存在 |
5102 | TEAM_NAME_EXISTS | 团队名已存在 |
5103 | ALREADY_TEAM_MEMBER | 用户已是团队成员 |
5104 | DUPLICATE_NAME | 名称重复(通用) |
该区间统一返回 HTTP 400。重试不会成功,请改名或改为更新既有资源。
操作被禁止(5200-5299)
| 代码 | 常量 | 含义 |
|---|---|---|
5200 | CANNOT_DELETE_SYSTEM_ROLE | 不能删除系统角色 |
5201 | CANNOT_DELETE_SUPERUSER | 不能删除超级管理员 |
5202 | CANNOT_DELETE_SYSTEM_PERMISSION | 不能删除系统权限 |
5203 | CANNOT_UPDATE_SYSTEM_PERMISSION | 不能修改系统权限 |
5204 | CANNOT_MODIFY_SYSTEM_ROLE | 不能修改系统角色 |
5205 | CANNOT_DELETE_DEFAULT_TEAM | 不能删除默认团队 |
5206 | CANNOT_ADD_AS_OWNER | 不能直接把成员添加为 owner |
5207 | CANNOT_CHANGE_OWNER_ROLE | 不能修改 owner 的角色 |
5208 | CANNOT_PROMOTE_TO_OWNER | 不能直接把成员提升为 owner |
5209 | CANNOT_REMOVE_OWNER | 不能移除 owner |
5210 | OWNER_CANNOT_LEAVE | owner 必须先移交所有权才能退出团队 |
5211 | ROLE_IN_USE | 角色仍被用户占用 |
5212 | USER_ALREADY_ACTIVE | 用户已处于激活状态 |
5213 | USER_ALREADY_INACTIVE | 用户已处于停用状态 |
5214 | CANNOT_DEACTIVATE_SUPERUSER | 不能停用超级管理员 |
该区间统一返回 HTTP 400。变更为 owner 请使用移交所有权接口,见 Teams API。
登录安全(5300-5399)
| 代码 | 常量 | 含义 |
|---|---|---|
5300 | ACCOUNT_LOCKED | 账号因连续登录失败被锁定(默认 5 次、锁定 15 分钟) |
5301 | TOO_MANY_LOGIN_ATTEMPTS | 登录尝试次数过多(保留) |
5302 | CAPTCHA_REQUIRED | 需要提交人机验证 |
5303 | CAPTCHA_INVALID | 人机验证未通过或凭据已失效 |
5304 | PASSWORD_EXPIRED | 密码已过期(保留) |
5305 | FORCE_PASSWORD_CHANGE_REQUIRED | 必须修改密码(保留) |
5306 | PASSWORD_MIN_AGE_NOT_MET | 未达到最小密码年龄,暂不能再次修改 |
5307 | PASSWORD_RECENTLY_USED | 新密码与历史密码重复(保留) |
5310 | TOTP_REQUIRED | 需要两步验证(保留) |
5311 | TOTP_INVALID | 动态码或备用码错误 |
5312 | TOTP_RATE_LIMITED | TOTP 连续失败过多被临时限速(HTTP 400) |
5313 | TOTP_NOT_ENABLED | 该账号未开启两步验证 |
5314 | TOTP_ALREADY_ENABLED | 该账号已开启两步验证 |
5315 | TOTP_SETUP_EXPIRED | TOTP 绑定会话过期 |
5316 | TOTP_SETUP_REQUIRED | 系统要求先完成绑定(保留) |
密码过期或管理员强制修改密码不是错误:登录接口仍返回 code: 0,但在 data 中带 force_password_change: true 与 reason;系统要求绑定 TOTP 时返回 requires_totp_setup: true。见 认证与用户登录 API。
速率限制(5400-5499)
| 代码 | 常量 | 含义 | HTTP |
|---|---|---|---|
5400 | RATE_LIMITED | 邮件额度耗尽或供应商限速映射 | 400 |
5400 的 data 会给出具体维度,例如批量发信时的 {"limit": 100, "period": "hour"} 或 {"requested": 3, "remaining": 1}。
知识库(6000-6099)
| 代码 | 常量 | 含义 | HTTP |
|---|---|---|---|
6000 | KB_NOT_FOUND | 知识库不存在 | 404 |
6001 | KB_NAME_EXISTS | 知识库名已存在 | 400 |
6002 | DOCUMENT_NOT_FOUND | 文档不存在 | 404 |
6003 | INVALID_DOCUMENT_TYPE | 文档类型不支持 | 400 |
6004 | DOCUMENT_PROCESSING_FAILED | 文档处理失败(保留) | — |
6005 | CHUNK_NOT_FOUND | 分块不存在 | 404 |
6006 | DOCUMENT_PROCESSING | 文档仍在处理中,操作暂不可用 | 400 |
6007 | KB_ACCESS_DENIED | 无权访问该知识库 | 403 |
6007 与 6201(Agent)语义一致:资源存在但当前用户/API Key 不在可访问范围内。客户端应提示申请权限,而不是重试。
模型(6100-6199)
| 代码 | 常量 | 含义 | HTTP |
|---|---|---|---|
6100 | MODEL_NOT_FOUND | 模型不存在 | 404 |
6101 | TEAM_MODEL_NOT_FOUND | 团队模型授权不存在 | 404 |
6102 | TEAM_MODEL_EXISTS | 该模型已授权给团队 | 400 |
6103 | MODEL_QUOTA_EXCEEDED | 团队模型配额(Token 或请求数)超限 | 429 |
6104 | MODEL_NOT_AUTHORIZED | 团队未获得该模型授权 | 400 |
6105 | MODEL_VISION_NOT_SUPPORTED | 模型不支持视觉输入(保留) | — |
6106 | MODEL_DISABLED | 模型或团队授权已被停用 | 400 |
6103 唯一稳定返回 HTTP 429;6106 与 6104 都表示「当前不可用」,但 6104 需要在团队模型授权中新增记录,6106 只需重新启用已有授权的 is_enabled。
Agent 与会话(6200-6299)
| 代码 | 常量 | 含义 | HTTP |
|---|---|---|---|
6200 | AGENT_NOT_FOUND | Agent 不存在 | 404 |
6201 | AGENT_ACCESS_DENIED | 无权访问该 Agent | 403 |
6202 | AGENT_NOT_PUBLISHED | Agent 未发布(保留) | — |
6210 | CONVERSATION_NOT_FOUND | 会话不存在或不属于当前用户 | 404 |
6211 | MESSAGE_NOT_FOUND | 消息不存在 | 404 |
当前后端不校验 Agent 的发布状态,6202 保留但不会被抛出。对话时不要据此判断;未授权会返回 6201/3000,模型不可用会返回 6104/6106。
SSO(6300-6399)
| 代码 | 常量 | 含义 |
|---|---|---|
6300 | SSO_PROVIDER_NOT_FOUND | SSO 提供商不存在或未启用 |
6301 | SSO_SESSION_EXPIRED | SSO 登录会话已过期(保留) |
6302 | SSO_REGISTRATION_DISABLED | SSO 自动注册已关闭 |
6303 | SSO_AUTHENTICATION_FAILED | SSO 认证失败(保留) |
6304 | SSO_INVALID_CONFIGURATION | SSO 配置不完整或非法 |
6305 | SSO_PROVIDER_NAME_EXISTS | 提供商名称已存在 |
6306 | PASSWORD_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。
两类流的完整事件清单见 流式事件。
相关文档
- 认证与用户登录 API:
2000-2004、5300-5316、6306的产生场景 - API Keys API:
2001、2002、3000与 API Key 绑定限制 - Teams API:
3002-3004、4004、4005、5102、5103与5206-5210 - Users API:
5002、5003、5212-5214与密码生命周期错误
这篇文章对你有帮助吗?