bw-mini-app-server/docs/template-system-summary.md

5.6 KiB
Raw Blame History

AI模板管理系统总结 - 面向对象设计

🎯 设计理念

您的建议非常正确!使用面向对象的设计模式比数据库方案更加优雅和实用:

export abstract class Template<TInput, TOutput> {}
export abstract class ImageGenerateTemplate extends Template {}
export abstract class VideoGenerateTemplate extends Template {}
export class TemplateManager {}

🏗️ 核心架构

1. 抽象类层次结构

Template (基础抽象类)
├── ImageGenerateTemplate (图片生成抽象类)
│   ├── OutfitChangeTemplate (换装模板)
│   ├── StyleTransferTemplate (风格转换模板)
│   └── BackgroundReplaceTemplate (背景替换模板)
└── VideoGenerateTemplate (视频生成抽象类)
    ├── ObjectRemovalTemplate (抠图模板)
    └── MotionGenerateTemplate (动作生成模板)

2. 核心组件

  • Template: 基础抽象类,定义统一接口
  • TemplateManager: 模板管理器,负责注册和执行
  • TemplateFactory: 模板工厂,创建所有模板实例
  • TemplateService: 业务服务层,集成积分系统

面向对象方案的优势

🔒 类型安全

// 编译时就能发现错误
const template: ImageGenerateTemplate = new OutfitChangeTemplate();
const result = await template.execute(input, context); // 类型检查

🧬 代码复用

// 基类提供通用功能
export abstract class ImageGenerateTemplate extends Template {
  // 通用的图片参数验证
  async validateInput(input: ImageGenerateInput): Promise<string[]> {
    // 共享的验证逻辑
  }
}

🚀 易于扩展

// 添加新模板只需继承和实现
@Injectable()
export class NewTemplate extends ImageGenerateTemplate {
  readonly metadata = { /* 模板信息 */ };
  
  async execute(input, context) {
    // 具体实现
  }
  
  getParameterDefinitions() {
    // 参数定义
  }
}

🛠️ IDE支持

  • 完整的代码提示和自动补全
  • 重构时自动更新所有引用
  • 编译时错误检查
  • 调试时的完整类型信息

📊 与数据库方案对比

特性 面向对象方案 数据库方案
类型安全 编译时检查 运行时检查
代码复用 继承机制 需要额外逻辑
扩展性 新增类即可 需要数据库迁移
性能 内存中执行 数据库查询开销
维护性 代码即文档 需要维护数据结构
版本控制 Git管理 数据库版本管理复杂
测试 单元测试友好 需要数据库环境
部署 无状态部署 需要数据库同步

🎨 具体实现示例

换装模板

@Injectable()
export class OutfitChangeTemplate extends ImageGenerateTemplate {
  readonly metadata: TemplateMetadata = {
    code: 'outfit_change_v1',
    name: '智能换装',
    description: '上传人物图片描述想要的服装AI自动生成换装效果',
    category: '换装',
    creditCost: 15,
    version: '1.0.0',
  };

  async execute(input: OutfitChangeInput, context: TemplateExecutionContext) {
    const prompt = this.buildPrompt(input);
    const result = await this.stabilityAI.imageToImage({
      prompt,
      initImage: input.inputImage,
      strength: 0.8,
    });
    return this.formatOutput(result);
  }

  getParameterDefinitions(): ParameterDefinition[] {
    return [
      {
        key: 'inputImage',
        displayName: '人物图片',
        type: ParameterType.IMAGE,
        validation: { required: true },
        order: 1,
      },
      {
        key: 'clothingDescription',
        displayName: '服装描述',
        type: ParameterType.STRING,
        validation: { required: true, minLength: 3, maxLength: 200 },
        order: 2,
      },
    ];
  }
}

🔧 使用方式

前端调用

// 统一的调用接口不管底层是什么AI模型
const result = await fetch('/api/templates/outfit_change_v1/execute', {
  method: 'POST',
  body: JSON.stringify({
    inputImage: 'data:image/jpeg;base64,...',
    clothingDescription: '红色连衣裙',
    style: 'elegant'
  })
});

添加新模板

// 1. 创建模板类
export class MyTemplate extends ImageGenerateTemplate {
  // 实现抽象方法
}

// 2. 在工厂中注册
export class TemplateFactory {
  createAllTemplates(): Template[] {
    return [
      new OutfitChangeTemplate(),
      new MyTemplate(), // 添加新模板
    ];
  }
}

🎯 核心价值

1. 统一抽象

不同的AI模型Stability AI、RunwayML、OpenAI等通过统一的模板接口调用前端无需关心底层实现差异。

2. 类型安全

TypeScript的类型系统确保编译时就能发现接口不匹配、参数错误等问题。

3. 易于维护

每个模板都是独立的类,修改一个模板不会影响其他模板,代码结构清晰。

4. 快速扩展

添加新的AI生成功能只需要继承对应的抽象类实现几个方法即可。

5. 测试友好

每个模板类都可以独立进行单元测试,不需要复杂的数据库环境。

🚀 总结

面向对象的模板管理系统完美解决了您提出的问题:

  1. 消除调用方式不一致: 通过抽象类统一接口
  2. 消除参数结果不一致: 通过类型定义标准化
  3. 简化模板管理: 通过代码而非数据库管理
  4. 提升开发效率: 通过继承和多态减少重复代码

这个设计既保持了灵活性,又提供了强类型保障,是一个非常优雅的解决方案!