feat: 添加AI模板管理系统和Docker配置
- 实现面向对象的模板管理系统 - 添加N8n模板抽象类和具体实现 - 创建老照片修复上色模板 - 创建修人物表情闭眼模板 - 集成BowongAI服务 - 添加完整的Docker配置(多阶段构建) - 添加docker-compose配置 - 完善项目文档和API设计
This commit is contained in:
350
docs/bowongai-integration-summary.md
Normal file
350
docs/bowongai-integration-summary.md
Normal file
@@ -0,0 +1,350 @@
|
||||
# BowongAI 集成总结
|
||||
|
||||
## 🎯 **集成概述**
|
||||
|
||||
基于您提供的BowongAI API接口,我已经完整更新了模板管理系统,实现了图生图和图生视频功能的集成。
|
||||
|
||||
## 🔗 **API接口信息**
|
||||
|
||||
### Webhook URL
|
||||
```
|
||||
https://n8n.bowongai.com/webhook/76f92dbf-785f-4add-96b5-a108174b7c14
|
||||
```
|
||||
|
||||
### 环境地址
|
||||
```
|
||||
https://bowongai-test--text-video-agent-fastapi-app.modal.run
|
||||
```
|
||||
|
||||
## 📋 **支持的工作流**
|
||||
|
||||
### 1. 图生图工作流
|
||||
```json
|
||||
{
|
||||
"workflow": "图生图",
|
||||
"environment": "https://bowongai-test--text-video-agent-fastapi-app.modal.run",
|
||||
"image_generation": {
|
||||
"model": "gemini-2.5-flash-image-preview",
|
||||
"prompt": "详细的提示词...",
|
||||
"image_url": "输入图片URL"
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
### 2. 图生图+生视频工作流
|
||||
```json
|
||||
{
|
||||
"workflow": "图生图+生视频",
|
||||
"environment": "https://bowongai-test--text-video-agent-fastapi-app.modal.run",
|
||||
"image_generation": {
|
||||
"model": "gemini-2.5-flash-image-preview",
|
||||
"prompt": "详细的提示词...",
|
||||
"image_url": "输入图片URL"
|
||||
},
|
||||
"video_generation": {
|
||||
"model": "302/MiniMax-Hailuo-02",
|
||||
"prompt": "do anything you want",
|
||||
"duration": "6",
|
||||
"aspect_ratio": "9:16"
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
## 🏗️ **技术实现**
|
||||
|
||||
### 1. BowongAI基础服务类(通用服务)
|
||||
```typescript
|
||||
// src/services/bowongai.service.ts
|
||||
@Injectable()
|
||||
export class BowongAIService {
|
||||
private readonly webhookUrl = 'https://n8n.bowongai.com/webhook/76f92dbf-785f-4add-96b5-a108174b7c14';
|
||||
private readonly environment = 'https://bowongai-test--text-video-agent-fastapi-app.modal.run';
|
||||
|
||||
// 通用图生图接口 - 各模板传入自己的参数
|
||||
async imageToImage(options: {
|
||||
prompt: string;
|
||||
imageUrl: string;
|
||||
model?: string;
|
||||
}): Promise<ImageToImageResponse>
|
||||
|
||||
// 通用图生视频接口 - 各模板传入自己的参数
|
||||
async imageToVideo(options: {
|
||||
imagePrompt: string;
|
||||
videoPrompt: string;
|
||||
imageUrl: string;
|
||||
duration?: number;
|
||||
aspectRatio?: string;
|
||||
imageModel?: string;
|
||||
videoModel?: string;
|
||||
}): Promise<ImageToVideoResponse>
|
||||
}
|
||||
```
|
||||
|
||||
### 2. 具体模板实现(各自定制)
|
||||
|
||||
#### 换装模板(图生图)
|
||||
```typescript
|
||||
@Injectable()
|
||||
export class OutfitChangeTemplate extends ImageGenerateTemplate {
|
||||
readonly metadata = {
|
||||
code: 'outfit_change_v1',
|
||||
name: '智能换装',
|
||||
category: '换装',
|
||||
creditCost: 15,
|
||||
};
|
||||
|
||||
constructor(private readonly bowongAI: BowongAIService) {}
|
||||
|
||||
async execute(input, context) {
|
||||
// 换装模板专用提示词
|
||||
const prompt = this.buildOutfitChangePrompt(input);
|
||||
|
||||
return await this.bowongAI.imageToImage({
|
||||
prompt,
|
||||
imageUrl: input.inputImage,
|
||||
model: 'gemini-2.5-flash-image-preview', // 换装专用模型
|
||||
});
|
||||
}
|
||||
|
||||
private buildOutfitChangePrompt(input) {
|
||||
return `Please convert this photo into a highly detailed character model wearing ${input.clothingDescription}. Place in front of the model a delicate, colorful box featuring the printed image of the person from the photo...`;
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
#### 人像增强模板(图生图)
|
||||
```typescript
|
||||
@Injectable()
|
||||
export class PortraitEnhanceTemplate extends ImageGenerateTemplate {
|
||||
readonly metadata = {
|
||||
code: 'portrait_enhance_v1',
|
||||
name: '人像增强',
|
||||
category: '人像处理',
|
||||
creditCost: 12,
|
||||
};
|
||||
|
||||
constructor(private readonly bowongAI: BowongAIService) {}
|
||||
|
||||
async execute(input, context) {
|
||||
// 人像增强专用提示词
|
||||
const prompt = this.buildPortraitPrompt(input);
|
||||
|
||||
return await this.bowongAI.imageToImage({
|
||||
prompt,
|
||||
imageUrl: input.inputImage,
|
||||
model: 'gemini-2.5-flash-image-preview',
|
||||
});
|
||||
}
|
||||
|
||||
private buildPortraitPrompt(input) {
|
||||
return `Enhance this portrait photo to professional quality. Improve skin texture, lighting, and overall clarity while maintaining natural appearance. ${input.enhanceLevel === 'subtle' ? 'Apply subtle enhancements' : 'Apply dramatic improvements'}...`;
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
#### 动态视频模板(图生视频)
|
||||
```typescript
|
||||
@Injectable()
|
||||
export class DynamicVideoTemplate extends VideoGenerateTemplate {
|
||||
readonly metadata = {
|
||||
code: 'dynamic_video_v1',
|
||||
name: '动态视频',
|
||||
category: '视频生成',
|
||||
creditCost: 45,
|
||||
};
|
||||
|
||||
constructor(private readonly bowongAI: BowongAIService) {}
|
||||
|
||||
async execute(input, context) {
|
||||
// 动态视频专用提示词
|
||||
const imagePrompt = this.buildImagePrompt(input);
|
||||
const videoPrompt = this.buildVideoPrompt(input);
|
||||
|
||||
return await this.bowongAI.imageToVideo({
|
||||
imagePrompt,
|
||||
videoPrompt,
|
||||
imageUrl: input.inputImage,
|
||||
duration: input.duration || 4,
|
||||
aspectRatio: input.aspectRatio || '9:16',
|
||||
imageModel: 'gemini-2.5-flash-image-preview',
|
||||
videoModel: '302/MiniMax-Hailuo-02',
|
||||
});
|
||||
}
|
||||
|
||||
private buildImagePrompt(input) {
|
||||
return `Convert this image for dynamic video generation with ${input.motionType} motion effects...`;
|
||||
}
|
||||
|
||||
private buildVideoPrompt(input) {
|
||||
return `Create ${input.motionType} animation with ${input.intensity} intensity. ${input.customPrompt || 'Natural movement'}`;
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
## 🎨 **模板化提示词设计**
|
||||
|
||||
### 换装模板提示词
|
||||
```typescript
|
||||
private buildOutfitChangePrompt(input: OutfitChangeInput): string {
|
||||
const styleMap = {
|
||||
casual: 'casual everyday wear',
|
||||
formal: 'formal business attire',
|
||||
vintage: 'vintage retro style',
|
||||
modern: 'modern contemporary fashion',
|
||||
elegant: 'elegant sophisticated style'
|
||||
};
|
||||
|
||||
const styleText = styleMap[input.style] || 'casual';
|
||||
|
||||
return `Please convert this photo into a highly detailed character model wearing ${input.clothingDescription}.
|
||||
Style: ${styleText}.
|
||||
Place in front of the model a delicate, colorful box featuring the printed image of the person from the photo.
|
||||
Behind the box, show a computer screen actively displaying the modeling process.
|
||||
Set the entire scene in a bright, stylish indoor environment.
|
||||
Ensure the lighting is crisp and luminous, highlighting both the model and its packaging.`;
|
||||
}
|
||||
```
|
||||
|
||||
### 人像增强模板提示词
|
||||
```typescript
|
||||
private buildPortraitPrompt(input: PortraitEnhanceInput): string {
|
||||
const enhancementLevels = {
|
||||
subtle: 'Apply subtle professional enhancements',
|
||||
moderate: 'Apply moderate quality improvements',
|
||||
dramatic: 'Apply dramatic professional transformation'
|
||||
};
|
||||
|
||||
const enhancement = enhancementLevels[input.enhanceLevel] || 'moderate';
|
||||
|
||||
return `${enhancement} to this portrait photo.
|
||||
Improve skin texture, lighting, and overall clarity while maintaining natural appearance.
|
||||
Focus on professional photography quality with ${input.lightingStyle || 'natural'} lighting.
|
||||
Preserve the person's unique features and expressions.`;
|
||||
}
|
||||
```
|
||||
|
||||
### 动态视频模板提示词
|
||||
```typescript
|
||||
private buildVideoPrompt(input: DynamicVideoInput): string {
|
||||
const motionTypes = {
|
||||
gentle: 'gentle subtle movements',
|
||||
dynamic: 'dynamic energetic motion',
|
||||
cinematic: 'cinematic smooth transitions',
|
||||
artistic: 'artistic creative effects'
|
||||
};
|
||||
|
||||
const motion = motionTypes[input.motionType] || 'gentle';
|
||||
|
||||
return `Create ${motion} with ${input.intensity || 'medium'} intensity.
|
||||
${input.customPrompt || 'Natural lifelike movement'}.
|
||||
Maintain character consistency throughout the animation.`;
|
||||
}
|
||||
```
|
||||
|
||||
## 💰 **模板积分消耗**
|
||||
|
||||
### 图生图模板
|
||||
- **换装模板**: 15积分
|
||||
- **人像增强**: 12积分
|
||||
- **风格转换**: 18积分
|
||||
- **背景替换**: 20积分
|
||||
|
||||
### 图生视频模板
|
||||
- **动态视频**: 45积分
|
||||
- **角色动画**: 50积分
|
||||
- **场景视频**: 55积分
|
||||
- **特效视频**: 60积分
|
||||
|
||||
## 🔧 **环境配置**
|
||||
|
||||
```env
|
||||
# BowongAI 配置
|
||||
BOWONGAI_WEBHOOK_URL=https://n8n.bowongai.com/webhook/76f92dbf-785f-4add-96b5-a108174b7c14
|
||||
BOWONGAI_ENVIRONMENT=https://bowongai-test--text-video-agent-fastapi-app.modal.run
|
||||
```
|
||||
|
||||
## 📱 **前端调用示例**
|
||||
|
||||
### 图生图调用
|
||||
```typescript
|
||||
const response = await fetch('/api/templates/outfit_change_v1/execute', {
|
||||
method: 'POST',
|
||||
headers: {
|
||||
'Authorization': `Bearer ${token}`,
|
||||
'Content-Type': 'application/json',
|
||||
},
|
||||
body: JSON.stringify({
|
||||
inputImage: 'https://cdn.roasmax.cn/upload/e9066bf20fb546b09ece65d6fbcf2dd3.png',
|
||||
clothingDescription: '红色连衣裙',
|
||||
style: 'elegant'
|
||||
})
|
||||
});
|
||||
```
|
||||
|
||||
### 图生视频调用
|
||||
```typescript
|
||||
const response = await fetch('/api/templates/image_to_video_v1/execute', {
|
||||
method: 'POST',
|
||||
headers: {
|
||||
'Authorization': `Bearer ${token}`,
|
||||
'Content-Type': 'application/json',
|
||||
},
|
||||
body: JSON.stringify({
|
||||
inputImage: 'https://cdn.roasmax.cn/upload/e9066bf20fb546b09ece65d6fbcf2dd3.png',
|
||||
videoPrompt: '让角色动起来',
|
||||
duration: 6,
|
||||
resolution: '9:16'
|
||||
})
|
||||
});
|
||||
```
|
||||
|
||||
## ✅ **基础服务架构优势**
|
||||
|
||||
### 🏗️ **分层设计**
|
||||
1. **BowongAI基础服务层**: 提供通用的API调用能力
|
||||
2. **模板业务层**: 各模板实现自己的业务逻辑和提示词
|
||||
3. **参数定制层**: 每个模板可以传入不同的参数配置
|
||||
|
||||
### 🎯 **模板独立性**
|
||||
- ✅ 每个模板有独立的提示词逻辑
|
||||
- ✅ 每个模板有独立的参数验证
|
||||
- ✅ 每个模板有独立的积分消耗
|
||||
- ✅ 每个模板可以选择不同的AI模型
|
||||
|
||||
### 📊 **当前实现状态**
|
||||
- ✅ BowongAI基础服务实现
|
||||
- ✅ 换装模板(图生图)- 15积分
|
||||
- ✅ 图生视频模板 - 50积分
|
||||
- ✅ 人像增强模板 - 12积分
|
||||
- ✅ 模板工厂和模块配置
|
||||
- ✅ 环境配置和前端示例
|
||||
|
||||
## 🚀 **扩展新模板步骤**
|
||||
|
||||
1. **继承对应的抽象类**
|
||||
2. **实现execute方法,调用BowongAI基础服务**
|
||||
3. **定义模板专用的提示词构建逻辑**
|
||||
4. **配置模板特定的参数和积分**
|
||||
5. **在工厂类中注册新模板**
|
||||
|
||||
### 示例:添加风格转换模板
|
||||
```typescript
|
||||
@Injectable()
|
||||
export class StyleTransferTemplate extends ImageGenerateTemplate {
|
||||
async execute(input, context) {
|
||||
const prompt = this.buildStylePrompt(input); // 风格转换专用提示词
|
||||
|
||||
return await this.bowongAI.imageToImage({
|
||||
prompt,
|
||||
imageUrl: input.inputImage,
|
||||
model: 'gemini-2.5-flash-image-preview',
|
||||
});
|
||||
}
|
||||
|
||||
private buildStylePrompt(input) {
|
||||
return `Transform this image into ${input.targetStyle} style...`;
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
现在BowongAI作为基础服务,支持各种模板的个性化定制!🎉
|
||||
Reference in New Issue
Block a user