12 KiB
12 KiB
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流程(同步)
- 用户提交任务
- 系统扣除积分,创建任务
- 任务加入队列(status='queued')
TaskScheduler调度任务AsyncTaskExecutor调用OpenAI API- 立即返回结果URL
- 更新status='completed'
- 发送WebSocket通知
耗时: ~10-30秒
RunningHub流程(异步)
- 用户提交任务
- 系统扣除积分,创建任务
- 直接调用RunningHub API
- 获得taskId,更新status='processing'
RunningHubPollingScheduler每5秒轮询- 检测到SUCCESS状态
- 调用outputs接口获取结果URL
- 更新status='completed'
- 发送WebSocket通知
耗时: ~2-5分钟
🔧 配置说明
application.yml
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表配置
-- 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应用IDduration: 视频时长(秒)model: 模型类型(portrait/landscape/portrait-hd/landscape-hd)
🚀 部署步骤
1. 数据库迁移
mysql -u root -p 1818ai < V5__add_provider_support.sql
2. 更新配置
编辑 application.yml,填入RunningHub API Key:
ai:
providers:
runninghub:
api-key: "YOUR_RUNNINGHUB_API_KEY"
3. 编译部署
# 编译
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模型(验证兼容性)
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模型
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. 查看轮询日志
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表新增字段
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表新增字段
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. 监控建议
# 查看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 |
🔮 未来扩展
- 更多服务商:可以继续添加其他AI服务商(Midjourney、Stable Diffusion等)
- 智能路由:根据价格、速度、成功率自动选择最优服务商
- 负载均衡:同一个模型配置多个服务商,实现负载分担
- 降级策略:主服务商故障时自动切换到备用服务商
- 成本优化:根据用户等级选择不同价格的服务商
📞 技术支持
如遇问题,请检查:
-
数据库迁移是否成功
DESC ai_task; -- 检查是否有provider_type字段 -
配置是否正确
grep "runninghub" src/main/resources/application.yml -
服务是否启动
ps aux | grep spring_1818_user_server -
日志是否有报错
tail -100 logs/application.log
集成完成! 🎉
系统现已支持OpenAI和RunningHub双服务商,用户可以无感切换使用不同的AI生成服务!