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

392 lines
12 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.

# RunningHub集成完成报告
**完成时间:** 2025-10-20
**版本号:** v2.1.0
---
## ✅ 实现完成清单
### 1. 核心接口和DTO ✅
| 文件 | 说明 | 状态 |
|------|------|------|
| `AIProvider.java` | 统一服务商接口 | ✅ 完成 |
| `ProviderTaskRequest.java` | 统一请求DTO | ✅ 完成 |
| `ProviderTaskResponse.java` | 统一响应DTO | ✅ 完成 |
| `ProviderTaskStatus.java` | 任务状态DTO | ✅ 完成 |
| `ProviderTaskResult.java` | 任务结果DTO | ✅ 完成 |
### 2. RunningHub专用DTO ✅
| 文件 | 说明 | 状态 |
|------|------|------|
| `RunningHubSubmitRequest.java` | 提交请求 | ✅ 完成 |
| `RunningHubNodeInfo.java` | 节点信息 | ✅ 完成 |
| `RunningHubSubmitResponse.java` | 提交响应 | ✅ 完成 |
| `RunningHubStatusResponse.java` | 状态查询响应 | ✅ 完成 |
| `RunningHubOutputResponse.java` | 结果查询响应 | ✅ 完成 |
### 3. Provider实现 ✅
| 文件 | 说明 | 状态 |
|------|------|------|
| `OpenAIProviderImpl.java` | OpenAI适配器同步 | ✅ 完成 |
| `RunningHubProviderImpl.java` | RunningHub适配器异步 | ✅ 完成 |
### 4. 核心服务 ✅
| 文件 | 说明 | 状态 |
|------|------|------|
| `AIProviderService.java` | Provider路由服务 | ✅ 完成 |
| `RunningHubPollingScheduler.java` | 轮询调度器 | ✅ 完成 |
| `AiTaskServiceImpl.java` | 任务服务(已集成) | ✅ 完成 |
### 5. 数据库和配置 ✅
| 文件 | 说明 | 状态 |
|------|------|------|
| `V5__add_provider_support.sql` | 数据库迁移脚本 | ✅ 完成 |
| `application.yml` | 多厂商配置 | ✅ 完成 |
| `AiTask.java` | 实体类更新 | ✅ 完成 |
| `PointsConfig.java` | 实体类更新 | ✅ 完成 |
| `AiTaskMapper.xml` | SQL映射更新 | ✅ 完成 |
---
## 🎯 系统架构
```
┌─────────────────────────────────────────────────────────────┐
│ 用户提交任务 │
│ (JWT or API Key认证) │
└────────────────────────┬────────────────────────────────────┘
┌─────────────────────────────────────────────────────────────┐
│ AiTaskController │
└────────────────────────┬────────────────────────────────────┘
┌─────────────────────────────────────────────────────────────┐
│ AiTaskServiceImpl │
│ 1. 扣积分 │
│ 2. 创建任务 │
│ 3. 读取 points_config.provider_type │
│ 4. 路由到不同流程 │
└────────┬──────────────────────────────┬─────────────────────┘
│ │
▼ ▼
┌──────────────────┐ ┌──────────────────┐
│ OpenAI流程 │ │ RunningHub流程 │
│ (同步) │ │ (异步) │
└──────┬───────────┘ └─────────┬─────────┘
│ │
↓ ↓
┌──────────────────┐ ┌──────────────────┐
│1. 加入队列 │ │1. 直接提交 │
│2. TaskScheduler │ │2. 返回taskId │
│ 定时调度 │ │3. 更新DB │
│3. AsyncExecutor │ │ │
│ 同步执行 │ │ │
│4. 立即返回结果 │ │ │
└──────────────────┘ └─────────┬─────────┘
┌──────────────────┐
│RunningHub │
│PollingScheduler │
│ │
│每5秒轮询: │
│1. 查询状态 │
│2. SUCCESS→获取 │
│3. FAILED→退款 │
│4. 更新DB+通知 │
└──────────────────┘
```
---
## 📋 工作流程对比
### OpenAI流程同步
1. 用户提交任务
2. 系统扣除积分,创建任务
3. 任务加入队列status='queued'
4. `TaskScheduler` 调度任务
5. `AsyncTaskExecutor` 调用OpenAI API
6. 立即返回结果URL
7. 更新status='completed'
8. 发送WebSocket通知
**耗时:** ~10-30秒
### RunningHub流程异步
1. 用户提交任务
2. 系统扣除积分,创建任务
3. 直接调用RunningHub API
4. 获得taskId更新status='processing'
5. `RunningHubPollingScheduler` 每5秒轮询
6. 检测到SUCCESS状态
7. 调用outputs接口获取结果URL
8. 更新status='completed'
9. 发送WebSocket通知
**耗时:** ~2-5分钟
---
## 🔧 配置说明
### application.yml
```yaml
ai:
providers:
openai:
enabled: true
base-url: https://api.apiyi.com/v1/chat/completions
api-key: "sk-xxx"
runninghub:
enabled: true
base-url: https://www.runninghub.cn
submit-url: /task/openapi/ai-app/run
status-url: /task/openapi/status
output-url: /task/openapi/outputs
default-webapp-id: "1973555977595301890"
api-key: "your_runninghub_api_key"
polling-interval: 5000
max-polling-times: 120
```
### points_config表配置
```sql
-- RunningHub模型示例
INSERT INTO `points_config` VALUES
(8, 'rh_sora2_portrait', 160, 'RunningHub Sora2 竖屏视频10秒', 1, 'runninghub',
'{"webappId":"1973555977595301890","duration":10,"model":"portrait"}', NOW(), NOW());
```
**providerConfig字段说明**
- `webappId`: RunningHub应用ID
- `duration`: 视频时长(秒)
- `model`: 模型类型portrait/landscape/portrait-hd/landscape-hd
---
## 🚀 部署步骤
### 1. 数据库迁移
```bash
mysql -u root -p 1818ai < V5__add_provider_support.sql
```
### 2. 更新配置
编辑 `application.yml`填入RunningHub API Key
```yaml
ai:
providers:
runninghub:
api-key: "YOUR_RUNNINGHUB_API_KEY"
```
### 3. 编译部署
```bash
# 编译
mvn clean package -DskipTests
# 停止服务
sudo systemctl stop spring_1818_user_server
# 备份旧版本
sudo cp /www/wwwroot/1818_user_server/1818_user_server-1.0-SNAPSHOT.jar \
/www/wwwroot/1818_user_server/1818_user_server-1.0-SNAPSHOT.jar.bak
# 部署新版本
sudo cp target/1818_user_server-1.0-SNAPSHOT.jar \
/www/wwwroot/1818_user_server/
# 启动服务
sudo systemctl start spring_1818_user_server
# 查看日志
sudo journalctl -u spring_1818_user_server -f
```
---
## 🧪 测试指南
### 1. 测试OpenAI模型验证兼容性
```bash
curl -X POST "http://localhost:8081/user/ai/tasks/submit" \
-H "Authorization: Bearer YOUR_JWT_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"modelName": "sora_image",
"prompt": "一只可爱的猫咪"
}'
```
**预期结果:**
- 任务立即执行
- 30秒内返回completed状态
- resultUrl包含图片地址
### 2. 测试RunningHub模型
```bash
curl -X POST "http://localhost:8081/user/ai/tasks/submit" \
-H "Authorization: Bearer YOUR_JWT_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"modelName": "rh_sora2_portrait",
"prompt": "一个人在海边奔跑,镜头从远到近"
}'
```
**预期结果:**
- 任务提交成功status='processing'
- 返回taskNo和providerTaskId
- 2-5分钟后status变为'completed'
- resultUrl包含视频地址
### 3. 查看轮询日志
```bash
tail -f logs/application.log | grep "RunningHub"
```
**正常日志示例:**
```
2025-10-20 15:30:05 INFO - 提交任务到RunningHub: TASK20251020153005ABC
2025-10-20 15:30:06 INFO - RunningHub任务提交成功: TASK20251020153005ABC, providerTaskId: 1980149306768457730
2025-10-20 15:30:11 DEBUG - RunningHub轮询 - 发现1个待处理任务
2025-10-20 15:30:11 DEBUG - 轮询任务: TASK20251020153005ABC, providerTaskId: 1980149306768457730
2025-10-20 15:30:11 DEBUG - 任务 TASK20251020153005ABC 状态: RUNNING
...
2025-10-20 15:33:21 INFO - 任务成功 - taskNo: TASK20251020153005ABC
2025-10-20 15:33:22 INFO - 任务 TASK20251020153005ABC 处理完成结果URL: https://rh-images.xiaoyaoyou.com/...
```
---
## 📊 数据库变更
### ai_task表新增字段
```sql
ALTER TABLE `ai_task`
ADD COLUMN `provider_type` VARCHAR(50) NULL,
ADD COLUMN `provider_task_id` VARCHAR(100) NULL,
ADD COLUMN `provider_response` TEXT NULL;
```
### points_config表新增字段
```sql
ALTER TABLE `points_config`
ADD COLUMN `provider_type` VARCHAR(50) NOT NULL DEFAULT 'openai',
ADD COLUMN `provider_config` TEXT NULL;
```
---
## ⚠️ 注意事项
### 1. 兼容性
- ✅ 现有OpenAI模型完全不受影响
- ✅ 现有API接口保持不变
- ✅ 现有数据可正常使用
### 2. 轮询性能
- 每5秒轮询一次RunningHub任务
- 最多同时处理100个任务
- 建议生产环境增加Redis缓存减少数据库压力
### 3. 错误处理
- RunningHub任务失败会自动退还积分
- 超时任务会被标记为failed
- 所有异常都有详细日志记录
### 4. 监控建议
```bash
# 查看RunningHub任务数量
SELECT COUNT(*) FROM ai_task
WHERE provider_type='runninghub' AND status='processing';
# 查看平均处理时间
SELECT AVG(TIMESTAMPDIFF(SECOND, start_time, complete_time)) as avg_seconds
FROM ai_task
WHERE provider_type='runninghub' AND status='completed'
AND complete_time > DATE_SUB(NOW(), INTERVAL 1 DAY);
```
---
## 🎯 功能对比
| 特性 | OpenAI格式 | RunningHub |
|------|-----------|------------|
| **认证方式** | Bearer Token | API Key |
| **调用方式** | 同步 | 异步 |
| **返回方式** | 立即返回 | 轮询查询 |
| **处理时间** | 10-30秒 | 2-5分钟 |
| **支持类型** | 图片、视频 | 视频 |
| **横竖屏** | URL参数 | model字段 |
| **队列管理** | Redis队列 | RunningHub内部 |
| **进度追踪** | WebSocket | WebSocket |
---
## 🔮 未来扩展
1. **更多服务商**可以继续添加其他AI服务商Midjourney、Stable Diffusion等
2. **智能路由**:根据价格、速度、成功率自动选择最优服务商
3. **负载均衡**:同一个模型配置多个服务商,实现负载分担
4. **降级策略**:主服务商故障时自动切换到备用服务商
5. **成本优化**:根据用户等级选择不同价格的服务商
---
## 📞 技术支持
如遇问题,请检查:
1. **数据库迁移是否成功**
```sql
DESC ai_task; -- 检查是否有provider_type字段
```
2. **配置是否正确**
```bash
grep "runninghub" src/main/resources/application.yml
```
3. **服务是否启动**
```bash
ps aux | grep spring_1818_user_server
```
4. **日志是否有报错**
```bash
tail -100 logs/application.log
```
---
**集成完成!** 🎉
系统现已支持OpenAI和RunningHub双服务商用户可以无感切换使用不同的AI生成服务