通用规范

本文档定义平台所有 API 接口的基础规范,所有模块均遵循此约定。


1. Base URL

Base URL 说明
用户控制台 https://api.example.com/api/v1 注册用户调用
平台管理端 https://api.example.com/admin/v1 管理员专用

2. 认证方式

2.1 JWT Token(用户界面操作)

登录成功后获得 access_token,携带于请求头:

Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...
  • 有效期:2 小时(用户端)/ 8 小时(管理端,IP 绑定)
  • 过期后调用 POST /auth/refresh 换取新 Token

2.2 API Key(程序调用)

用于程序直接调用模型接口,格式为 sk- 前缀:

Authorization: Bearer sk-prod-xxxxxxxxxxxxxxxxxxxxxxxx
  • 在控制台「API Key 管理」页创建
  • 支持按类型(production / test)、IP 白名单、模型白名单和过期时间分类管理

2.3 管理端双因素认证(2FA)

管理员登录需完成两步:

步骤 1:POST /admin/v1/auth/login       → 返回临时 token(5 分钟有效)
步骤 2:POST /admin/v1/auth/2fa/verify  → 验证 TOTP/短信,返回正式 access_token

2.4 密码传输安全(RSA 加密)

所有涉及密码的接口(注册、登录、修改密码、重置密码)均不得明文传输密码。

步骤 1:GET /api/v1/auth/public-key   → 获取 RSA 公钥(有效期 30 分钟)
步骤 2:前端使用公钥加密密码           → Base64(RSA_ENCRYPT(password, public_key))
步骤 3:请求时携带 key_id + 加密密文   → 服务端用私钥解密后再做 bcrypt 处理

详见 02-auth-api.md


3. 统一响应格式

所有接口均返回以下结构:

{
  "code": 0,
  "message": "success",
  "data": {},
  "request_id": "req_550e8400-e29b-41d4-a716-446655440000",
  "timestamp": 1704067200
}
字段 类型 说明
code int 0 表示成功,非 0 表示错误(见错误码表)
message string 成功时为 "success",失败时为错误描述
data object/array/null 业务数据,失败时为 null
request_id string 唯一请求 ID,用于排查问题
timestamp int 服务端 Unix 时间戳(秒)

3.1 分页响应格式

列表接口统一返回分页结构:

{
  "code": 0,
  "message": "success",
  "data": {
    "items": [],
    "total": 100,
    "page": 1,
    "page_size": 20,
    "total_pages": 5
  }
}

3.2 通用分页查询参数

参数 类型 默认值 说明
page int 1 页码,从 1 开始
page_size int 20 每页条数,最大 100
order_by string created_at 排序字段
order string desc 排序方向:asc / desc

4. HTTP 状态码

状态码 含义
200 成功
201 创建成功
400 请求参数错误
401 未认证(Token 缺失或无效)
403 无权限
404 资源不存在
409 资源冲突(如邮箱已注册)
422 参数格式校验失败(Pydantic 错误)
429 请求频率超限
500 服务器内部错误
503 服务暂不可用(维护中)

5. 错误码体系

范围 分类 常见示例
1000-1099 认证错误 1001 Token 已过期,1002 Token 无效,1003 未登录
1100-1199 授权错误 1101 无权限,1102 账号已冻结,1103 2FA 验证失败
2000-2099 用户错误 2001 邮箱已注册,2002 手机号已注册,2003 用户不存在
2100-2199 实名认证 2101 已实名,2102 认证审核中,2103 企业认证失败
3000-3099 支付错误 3001 余额不足,3002 订单不存在,3003 订单已支付
3100-3199 代金券错误 3101 券码无效,3102 券已使用,3103 券已过期
4000-4099 模型错误 4001 模型不存在,4002 模型已禁用,4003 提供商不可用
4100-4199 限流错误 4101 超出 RPM 限制,4102 超出 TPM 限制
4200-4299 队列错误 4201 队列已满,4202 请求已取消
5000-5099 网关错误 5001 API Key 无效,5002 API Key 已过期,5003 IP 被封禁
6000-6099 计费错误 6001 计费规则不存在,6002 账单生成失败
6100-6199 账务错误 6101 对账失败,6102 发票申请失败

错误响应示例

{
  "code": 1001,
  "message": "Token 已过期,请重新登录",
  "data": null,
  "request_id": "req_550e8400-e29b-41d4-a716-446655440000",
  "timestamp": 1704067200
}

6. 请求头规范

请求头 必填 说明
Authorization 是(除公开接口) Bearer <token>
Content-Type POST/PUT 时必填 application/json
Accept-Language zh-CN / en-US,控制响应语言
X-Request-ID 客户端自定义请求 ID,原样返回于响应
X-Client-Version 客户端版本号,用于兼容性处理

7. 流式响应(SSE)

模型对话接口支持 Server-Sent Events 流式输出:

POST /api/v1/chat/completions
Content-Type: application/json
Accept: text/event-stream

{"model": "gpt-4o", "messages": [...], "stream": true}

响应格式:

data: {"id":"chatcmpl-001","choices":[{"delta":{"content":"你好"},"index":0}]}

data: {"id":"chatcmpl-001","choices":[{"delta":{"content":"!"},"index":0}]}

data: [DONE]

8. 时间与数据类型约定

类型 约定
时间格式 ISO 8601,统一 UTC:2024-01-01T12:00:00Z
时间戳 Unix 秒级整数
金额 字符串 Decimal,保留 2 位小数:"128.50"
Token 数量 integer
枚举值 小写下划线:"user_register"
ID 字段 字符串,带业务前缀:"u_01HX...""ord_20240101001"
布尔值 true / false