Files
1818web-hoduan/ADMIN_AI_POINTS_API_GUIDE.md
2025-11-14 17:41:15 +08:00

588 lines
15 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 管理端 - AI积分与模型配置 API 接口文档
## 📋 目录
1. [概述](#概述)
2. [认证说明](#认证说明)
3. [积分配置管理](#积分配置管理)
4. [系统配置管理](#系统配置管理)
5. [AI任务监控](#ai任务监控)
6. [业务流程说明](#业务流程说明)
7. [常见问题](#常见问题)
---
## 概述
本文档描述了管理员如何通过后台接口管理AI模型的积分价格、系统参数配置以及监控所有用户的AI任务。
### 基础信息
- **Base URL**: `https://your-domain.com`
- **接口前缀**: `/admin`
- **认证方式**: JWT Token (需要 ADMIN 角色)
- **数据格式**: JSON
### 积分与人民币兑换标准
根据系统设计,积分兑换标准如下:
```
1 元人民币 = 100 积分
```
**定价策略:** 在第三方API成本的基础上加价 50%
---
## 认证说明
### 获取管理员Token
**接口**: `POST /admin/auth/login`
**请求示例**:
```json
{
"username": "admin",
"password": "your_password"
}
```
**响应示例**:
```json
{
"code": 200,
"message": "登录成功",
"data": {
"token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...",
"userId": 1,
"username": "admin",
"role": 1
}
}
```
### 后续请求认证
所有管理端API请求都需要在HTTP Header中携带Token
```
Authorization: Bearer <your_token_here>
```
---
## 积分配置管理
管理员可以动态调整每个AI模型的积分消费价格。
### 1. 获取所有积分配置
**接口**: `GET /admin/configs/points`
**描述**: 获取所有AI模型的积分配置列表
**请求示例**:
```bash
curl -X GET "https://your-domain.com/admin/configs/points" \
-H "Authorization: Bearer <token>"
```
**响应示例**:
```json
{
"code": 200,
"message": "查询成功",
"data": [
{
"id": 1,
"modelName": "sora_image",
"pointsCost": 11,
"description": "Sora高质量图片生成",
"isEnabled": 1,
"createTime": "2025-10-19T10:00:00",
"updateTime": "2025-10-19T10:00:00"
},
{
"id": 2,
"modelName": "sora_video2",
"pointsCost": 160,
"description": "Sora视频生成 (竖屏10秒)",
"isEnabled": 1,
"createTime": "2025-10-19T10:00:00",
"updateTime": "2025-10-19T10:00:00"
}
]
}
```
### 2. 创建新的积分配置
**接口**: `POST /admin/configs/points`
**描述**: 为新的AI模型添加积分配置
**请求示例**:
```json
{
"modelName": "dalle-3",
"pointsCost": 50,
"description": "DALL-E 3图片生成",
"isEnabled": 1
}
```
**字段说明**:
- `modelName` (必填): 模型唯一标识需与第三方API的模型名称一致
- `pointsCost` (必填): 调用一次该模型需要消耗的积分数
- `description` (可选): 模型的描述信息
- `isEnabled` (必填): 是否启用 (1=启用, 0=禁用)
**响应示例**:
```json
{
"code": 200,
"message": "配置创建成功",
"data": {
"id": 8,
"modelName": "dalle-3",
"pointsCost": 50,
"description": "DALL-E 3图片生成",
"isEnabled": 1
}
}
```
### 3. 更新积分配置
**接口**: `PUT /admin/configs/points/{id}`
**描述**: 修改现有模型的积分价格或其他配置
**请求示例**:
```bash
curl -X PUT "https://your-domain.com/admin/configs/points/1" \
-H "Authorization: Bearer <token>" \
-H "Content-Type: application/json" \
-d '{
"pointsCost": 15,
"description": "Sora高质量图片生成已调价",
"isEnabled": 1
}'
```
**响应示例**:
```json
{
"code": 200,
"message": "配置更新成功",
"data": {
"id": 1,
"modelName": "sora_image",
"pointsCost": 15,
"description": "Sora高质量图片生成已调价",
"isEnabled": 1
}
}
```
### 4. 删除积分配置
**接口**: `DELETE /admin/configs/points/{id}`
**描述**: 删除指定的积分配置(逻辑删除)
**请求示例**:
```bash
curl -X DELETE "https://your-domain.com/admin/configs/points/8" \
-H "Authorization: Bearer <token>"
```
**响应示例**:
```json
{
"code": 200,
"message": "配置删除成功"
}
```
---
## 系统配置管理
管理员可以调整AI队列、任务超时等系统级参数。
### 1. 获取所有系统配置
**接口**: `GET /admin/configs/system`
**描述**: 获取所有系统配置项
**请求示例**:
```bash
curl -X GET "https://your-domain.com/admin/configs/system" \
-H "Authorization: Bearer <token>"
```
**响应示例**:
```json
{
"code": 200,
"message": "查询成功",
"data": [
{
"id": 1,
"configKey": "ai.queue.max_concurrent",
"configValue": "50",
"description": "每个AI模型的最大并发处理数",
"createTime": "2025-10-19T10:00:00",
"updateTime": "2025-10-19T10:00:00"
},
{
"id": 2,
"configKey": "ai.queue.max_user_concurrent",
"configValue": "3",
"description": "单个用户的最大并发任务数",
"createTime": "2025-10-19T10:00:00",
"updateTime": "2025-10-19T10:00:00"
},
{
"id": 3,
"configKey": "ai.task.timeout_minutes",
"configValue": "10",
"description": "任务处理超时时间(分钟)",
"createTime": "2025-10-19T10:00:00",
"updateTime": "2025-10-19T10:00:00"
}
]
}
```
### 2. 创建系统配置
**接口**: `POST /admin/configs/system`
**请求示例**:
```json
{
"configKey": "ai.queue.scan_interval",
"configValue": "3000",
"description": "队列扫描间隔(毫秒)"
}
```
### 3. 更新系统配置
**接口**: `PUT /admin/configs/system/{id}`
**描述**: 修改系统配置值
**请求示例**:
```json
{
"configValue": "100",
"description": "每个AI模型的最大并发处理数已调整"
}
```
**⚠️ 重要提示**:
- 修改 `ai.queue.max_concurrent` 等配置后,系统会**立即生效**(通过缓存刷新机制)
-`application.yml` 中的配置(如 `ai.queue.scan-interval`)需要**重启服务**才能生效
### 4. 删除系统配置
**接口**: `DELETE /admin/configs/system/{id}`
---
## AI任务监控
管理员可以查看和管理所有用户的AI生成任务。
### 1. 获取任务列表(分页)
**接口**: `GET /admin/ai/tasks/list`
**描述**: 分页查询所有AI任务支持多条件筛选
**查询参数**:
- `page` (可选): 页码,默认 1
- `size` (可选): 每页数量,默认 10
- `userId` (可选): 按用户ID筛选
- `status` (可选): 按状态筛选 (created, queued, processing, completed, failed, cancelled)
- `modelName` (可选): 按模型名称筛选
- `taskNo` (可选): 按任务编号模糊搜索
**请求示例**:
```bash
curl -X GET "https://your-domain.com/admin/ai/tasks/list?page=1&size=20&status=completed" \
-H "Authorization: Bearer <token>"
```
**响应示例**:
```json
{
"code": 200,
"message": "查询成功",
"data": {
"total": 156,
"pages": 8,
"pageNum": 1,
"pageSize": 20,
"list": [
{
"taskNo": "TASK20251019143022ABC123",
"userId": 1001,
"modelName": "sora_image",
"taskType": "image",
"prompt": "一只可爱的猫咪在花园里玩耍",
"status": "completed",
"progress": 100,
"progressMessage": "任务已成功完成。",
"pointsFrozen": 11,
"pointsConsumed": 11,
"resultUrl": "https://cdn.example.com/generated/abc123.jpg",
"queueTime": "2025-10-19T14:30:25",
"startTime": "2025-10-19T14:30:30",
"completeTime": "2025-10-19T14:31:15",
"createTime": "2025-10-19T14:30:22",
"updateTime": "2025-10-19T14:31:15"
}
]
}
}
```
### 2. 获取单个任务详情
**接口**: `GET /admin/ai/tasks/{taskNo}`
**描述**: 查询指定任务的详细信息
**请求示例**:
```bash
curl -X GET "https://your-domain.com/admin/ai/tasks/TASK20251019143022ABC123" \
-H "Authorization: Bearer <token>"
```
### 3. 强制取消任务
**接口**: `POST /admin/ai/tasks/{taskNo}/cancel`
**描述**: 手动取消一个处于排队中queued的任务并退还用户积分
**请求示例**:
```bash
curl -X POST "https://your-domain.com/admin/ai/tasks/TASK20251019143022ABC123/cancel" \
-H "Authorization: Bearer <token>"
```
**响应示例**:
```json
{
"code": 200,
"message": "任务 TASK20251019143022ABC123 已成功取消。"
}
```
**⚠️ 注意**:
- 只有状态为 `queued` 的任务可以被取消
- 已经在 `processing` 状态的任务无法取消
- 取消后,冻结的积分会全额退还给用户
---
## 业务流程说明
### 1. 积分定价流程
以 Sora Image 为例,完整的定价计算过程:
```
第三方API成本: $0.01/张
人民币成本: 0.01 × 7.3 (汇率) = 0.073 元
加价50%: 0.073 × 1.5 = 0.1095 元
向上取整: 0.11 元
转换为积分: 0.11 × 100 = 11 积分
```
**当前系统中的定价标准**:
| 模型名称 | 第三方成本 | 我方定价 | 积分价格 |
|---------|----------|---------|---------|
| sora_image | $0.01 | ¥0.11 | 11积分 |
| gpt-4o-image | $0.01 | ¥0.11 | 11积分 |
| sora_video2 | $0.15 | ¥1.60 | 160积分 |
| sora_video2-landscape | $0.15 | ¥1.60 | 160积分 |
| sora_video2-15s | $0.25 | ¥2.60 | 260积分 |
| sora_video2-landscape-15s | $0.25 | ¥2.60 | 260积分 |
| sora-2-pro-all | $0.40 | ¥4.20 | 420积分 |
### 2. 用户调用AI模型的完整流程
```
1. 用户提交任务
2. 系统检查用户积分是否充足
3. 冻结所需积分 (points_frozen)
4. 创建任务记录 (status: created)
5. 将任务放入Redis队列 (status: queued)
6. 调度器检测到可用槽位
7. 从队列取出任务,开始处理 (status: processing)
8. 异步调用第三方API
9a. 成功: 标记任务为completed记录result_url消耗积分
9b. 失败: 标记任务为failed全额退还积分
10. 通过WebSocket实时推送进度给用户
```
### 3. 任务超时保护机制
系统有完善的超时保护机制,防止任务卡死:
- **超时检查间隔**: 每60秒检查一次可在 `application.yml` 中配置 `ai.task.timeout-scan-interval`
- **超时判定标准**: 任务在 `processing` 状态下超过10分钟可在数据库 `system_config` 表中修改 `ai.task.timeout_minutes`
- **超时处理**: 自动标记为 `failed`,全额退还积分
### 4. 并发控制说明
**模型级并发控制**:
- 每个AI模型独立计数
- 默认最大并发数: 50`application.yml` 中配置为 `ai.queue.max-concurrent: 50`
- 当前正在处理的任务数达到上限时,新任务会在队列中等待
**用户级并发控制** (可选,已在 `system_config` 中预留配置):
- 单个用户最多同时处理3个任务`ai.queue.max_user_concurrent`
- 防止单个用户占用过多资源
---
## 常见问题
### Q1: 如何修改某个模型的积分价格?
**A**: 使用 `PUT /admin/configs/points/{id}` 接口更新 `pointsCost` 字段。修改后立即生效,影响所有后续创建的任务。
### Q2: 积分配置修改后,正在处理的任务会受影响吗?
**A**: 不会。每个任务在创建时就已经记录了 `points_frozen`(冻结的积分数),这个值不会因为后续的价格调整而改变。
### Q3: 如何临时禁用某个AI模型
**A**: 将该模型的 `isEnabled` 字段设置为 `0`。禁用后,用户提交该模型的任务时会收到错误提示,但不影响已经在队列中或正在处理的任务。
### Q4: 如何提高系统的处理能力?
**A**: 有两种方式:
1. **修改 `application.yml`**: 增加 `ai.queue.max-concurrent` 的值(需要重启服务)
2. **修改数据库**: 更新 `system_config` 表中 `ai.queue.max_concurrent` 的配置值(立即生效,无需重启)
**推荐使用方式2**,因为它更加灵活,可以根据服务器负载动态调整。
### Q5: 用户的积分是如何退款的?
**A**: 系统在以下情况会自动退还积分:
- 任务失败(`status: failed`
- 任务超时
- 管理员手动取消任务
- API调用异常
退款会记录在 `points_consumption_log` 表中,`change_type``refund`
### Q6: WebSocket推送是如何工作的
**A**:
1. 用户连接到 WebSocket 端点: `wss://your-domain.com/ws`
2. 用户订阅自己的进度频道: `/user/queue/tasks-progress`
3. 任务状态变化时创建、开始处理、完成、失败系统自动推送JSON格式的进度数据
4. 前端接收数据并更新UI如进度条、状态文本
### Q7: 如何查看系统当前的运行状态?
**A**: 可以通过以下方式监控:
1. 使用 `GET /admin/ai/tasks/list?status=processing` 查看当前正在处理的任务数量
2. 使用 `GET /admin/ai/tasks/list?status=queued` 查看队列中等待的任务数量
3. 检查 Redis 中的队列长度(技术手段)
### Q8: 如何备份和恢复积分配置?
**A**:
- **备份**: 导出 `points_config``system_config` 表的数据
- **恢复**: 使用 SQL 的 `INSERT ... ON DUPLICATE KEY UPDATE` 语句批量导入
系统在 `V2__add_ai_task_and_points_schema.sql` 中已经提供了初始化数据的示例。
---
## 附录:数据库表结构
### points_config 表
| 字段 | 类型 | 说明 |
|-----|------|------|
| id | bigint | 主键 |
| model_name | varchar(64) | 模型名称(唯一) |
| points_cost | int | 积分消耗 |
| description | varchar(255) | 模型描述 |
| is_enabled | tinyint(1) | 是否启用 |
| create_time | datetime | 创建时间 |
| update_time | datetime | 更新时间 |
| is_deleted | tinyint(1) | 逻辑删除标识 |
### system_config 表
| 字段 | 类型 | 说明 |
|-----|------|------|
| id | bigint | 主键 |
| config_key | varchar(64) | 配置键(唯一) |
| config_value | varchar(512) | 配置值 |
| description | varchar(255) | 配置说明 |
| create_time | datetime | 创建时间 |
| update_time | datetime | 更新时间 |
### ai_task 表
| 字段 | 类型 | 说明 |
|-----|------|------|
| id | bigint | 主键 |
| task_no | varchar(64) | 任务编号(唯一) |
| user_id | bigint | 用户ID |
| model_name | varchar(64) | 模型名称 |
| task_type | varchar(32) | 任务类型 |
| prompt | text | 提示词 |
| status | varchar(32) | 任务状态 |
| progress | int | 进度百分比 |
| progress_message | varchar(255) | 进度描述 |
| points_frozen | int | 冻结积分 |
| points_consumed | int | 实际消耗积分 |
| result_url | varchar(512) | 结果URL |
| error_message | text | 错误信息 |
| queue_time | datetime | 入队时间 |
| start_time | datetime | 开始处理时间 |
| complete_time | datetime | 完成时间 |
| create_time | datetime | 创建时间 |
| update_time | datetime | 更新时间 |
| is_deleted | tinyint(1) | 逻辑删除标识 |
---
## 技术支持
如有任何问题,请联系技术团队。
**文档版本**: v1.0
**最后更新**: 2025-10-19