通用规范
本文档定义平台所有 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_token2.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 |