一、项目概述

本文将深入剖析一个多Provider AI图片生成服务的后端架构设计。该项目采用经典的Adapter设计模式,实现了对阿里云百炼、OpenAI DALL-E、Google Gemini、Minimax、火山引擎等多种AI图片生成服务的统一接入和管理。

核心特性:

  • 支持5+主流AI图片生成平台

  • 同步/异步模式自适应

  • 统一接口抽象,业务层无感知

  • 灵活的配置扩展能力


二、架构设计

2.1 整体架构图

┌─────────────────────────────────────────────────────────────────┐
│                      业务层 (Business Layer)                    │
│                    ImageGenerationService                       │
└──────────────────────────────┬──────────────────────────────────┘
                               │
                               ▼
┌─────────────────────────────────────────────────────────────────┐
│                      适配器层 (Adapter Layer)                   │
│  ┌─────────┐ ┌─────────┐ ┌─────────┐ ┌─────────┐ ┌─────────┐  │
│  │  Ali    │ │ OpenAI  │ │ Gemini  │ │ MiniMax │ │ Volc    │  │
│  │ Adapter │ │ Adapter │ │ Adapter │ │ Adapter │ │ Adapter │  │
│  └────┬────┘ └────┬────┘ └────┬────┘ └────┬────┘ └────┬────┘  │
│       │           │           │           │           │        │
└───────┼───────────┼───────────┼───────────┼───────────┼────────┘
        │           │           │           │           │
        ▼           ▼           ▼           ▼           ▼
┌─────────────────────────────────────────────────────────────────┐
│                    第三方API (Third-party APIs)                 │
│   阿里云百炼    OpenAI DALL-E   Google Gemini   MiniMax  火山引擎│
└─────────────────────────────────────────────────────────────────┘

2.2 核心接口定义

项目通过TypeScript接口定义了统一的适配器契约:

export interface ImageProviderAdapter {
  provider: string
  
  buildGenerateRequest(config: AIConfig, record: ImageGenerationRecord): ProviderRequest
  
  parseGenerateResponse(result: any): ImageGenResponse
  
  buildPollRequest(config: AIConfig, task_id: string): ProviderRequest
  
  parsePollResponse(result: any): ImagePollResponse
  
  extractImageUrl(result: any): string | null
  
  extractImageBase64(result: any): { data: string; mimeType: string } | null
}

接口职责分析:

方法

职责

设计意图

buildGenerateRequest

构建API请求参数

适配不同平台的参数格式差异

parseGenerateResponse

解析同步响应

统一响应格式,屏蔽平台差异

buildPollRequest

构建异步轮询请求

支持异步生成场景

parsePollResponse

解析轮询响应

统一异步状态管理

extractImageUrl

提取图片URL

处理不同平台的响应结构


三、核心实现剖析

3.1 阿里云百炼适配器深度解析

AliImageAdapter 为例,分析其核心实现逻辑:

3.1.1 模型管理策略
private readonly supportedModels = [
  'wan2.7-image-pro',
  'wan2.7-image',
  'wan2.6-image',
  'wan2.6-t2i',
  'wan2.5-t2i-preview',
  'wan2.2-t2i-flash',
  'wan2.2-t2i-plus',
  'wanx2.1-t2i-turbo',
  'wanx2.1-t2i-plus',
]

private readonly syncSupportedModels = [
  'wan2.7-image-pro',
  'wan2.7-image',
  'wan2.6-image',
  'wan2.6-t2i',
]

设计亮点:

  • 区分支持的模型列表和同步模式支持列表

  • 万相2.7系列支持同步返回,旧版本仅支持异步

  • 通过 supportsSync() 方法动态判断调用模式

3.1.2 请求构建核心逻辑
buildGenerateRequest(config: AIConfig, record: ImageGenerationRecord): ProviderRequest {
  const model = validateModel(
    record.model || config.model || 'wan2.7-image',
    this.supportedModels,
    'wan2.7-image'
  )
  
  const isPro = this.isProModel(model)
  const useSync = this.supportsSync(model)
  const isWan27 = model.startsWith('wan2.7')
  
  // 尺寸规范化处理
  const size = this.normalizeSize(record.size, record.aspect_ratio, model)
  
  // Prompt处理:质量前缀 + 原始prompt + 风格提示 + 角色一致性约束
  let prompt = sanitizePrompt(record.prompt || '', maxPromptLen)
  const qualityPrefix = buildImageQualityPrefix(record.imageType)
  if (qualityPrefix) {
    prompt = `${qualityPrefix}${prompt}`
  }
  
  // 参考图处理
  if (hasReferenceImages) {
    prompt = `${prompt}\n\n${buildCharacterConsistencyPrompt(true)}`
    // 构建多模态输入
    contentItems.push({ image: referenceUrls[i] })
  }
  
  // 参数差异化配置
  if (isWan27) {
    body.parameters.thinking_mode = true  // 万相2.7思考模式
  } else {
    body.parameters.negative_prompt = buildImageNegativePrompt(...)
    body.parameters.prompt_extend = true  // 旧版本prompt扩展
  }
}

关键技术点:

  1. 多模态输入支持:同时支持文本prompt和参考图片

  2. 模型版本适配:万相2.7系列使用 thinking_mode,旧版本使用 prompt_extend

  3. 同步/异步自适应:通过请求头 X-DashScope-Async: enable 控制

3.1.3 响应解析策略
parseGenerateResponse(result: any): ImageGenResponse {
  if (result.error) {
    throw new Error(`阿里云百炼API错误: ${result.error.message}`)
  }
  
  // 异步任务处理
  if (result.output?.task_status === 'PENDING' && result.output?.task_id) {
    return { isAsync: true, task_id: result.output.task_id }
  }
  
  // 同步结果提取
  const image_url = this.extractImageUrl(result)
  if (image_url) {
    return { isAsync: false, image_url }
  }
}

3.2 尺寸规范化算法

private normalizeSize(size?: string | null, aspect_ratio?: string | null, model?: string): string {
  const isPro = model ? this.isProModel(model) : false
  const maxDim = isPro ? 4096 : 2048  // Pro模型支持更高分辨率
  const minDim = 768
  
  const resolutionPresets: Record<string, string> = {
    '1:1': `${Math.min(2048, maxDim)}*${Math.min(2048, maxDim)}`,
    '16:9': `${Math.min(2560, maxDim)}*${Math.min(1440, maxDim)}`,
    '9:16': `${Math.min(1440, maxDim)}*${Math.min(2560, maxDim)}`,
    // ... 更多预设比例
  }
  
  // 自定义尺寸处理
  if (size) {
    const dims = size.split(/[x*]/).map(Number)
    if (dims.length === 2 && dims[0] && dims[1]) {
      const w = Math.max(minDim, Math.min(Math.round(dims[0]), maxDim))
      const h = Math.max(minDim, Math.min(Math.round(dims[1]), maxDim))
      return `${w}*${h}`
    }
  }
}

算法特点:

  • Pro模型支持最高4096px分辨率,普通模型2048px

  • 自动边界裁剪,确保尺寸在合法范围内

  • 支持自定义尺寸和预设比例两种模式


四、注册表模式实现

4.1 适配器注册与获取

export const imageAdapters: Record<string, ImageProviderAdapter> = {
  minimax: new MiniMaxImageAdapter(),
  openai: new OpenAIImageAdapter(),
  gemini: new GeminiImageAdapter(),
  volcengine: new VolcEngineImageAdapter(),
  ali: new AliImageAdapter(),
  chatfire: new OpenAIImageAdapter(),  // 兼容别名
}

export function getImageAdapter(provider: string): ImageProviderAdapter {
  return imageAdapters[provider.toLowerCase()] || imageAdapters['minimax']
}

设计优势:

  • 单一职责:注册表负责管理所有适配器实例

  • 松耦合:业务层通过provider名称动态获取适配器

  • 容错机制:未找到时返回默认适配器


五、共享工具模块

5.1 Prompt构建体系

项目通过 shared.ts 提供统一的Prompt构建工具:

// 图片质量前缀
export function buildImageQualityPrefix(imageType?: string | null): string {
  const base = 'masterpiece, best quality, highly detailed, '
  switch (imageType) {
    case 'character':
      return base + 'professional character design, clean lines, '
    case 'scene':
      return base + 'cinematic environment, atmospheric lighting, '
    case 'shot':
      return base + 'cinematic shot, professional photography, '
    default:
      return base
  }
}

// 角色一致性约束
export function buildCharacterConsistencyPrompt(hasReferenceImages: boolean): string {
  if (!hasReferenceImages) {
    return '【角色一致性】同一角色在所有画面中必须保持完全相同的外貌...'
  }
  return '【角色一致性:最高优先级约束】严格复制参考图中人物的以下特征...'
}

5.2 艺术风格映射

export const ART_STYLE_MAP: Record<string, string> = {
  'xianxia': '仙侠风格,古风长袍,飘逸长发,网剧级写实CG人物特写镜头...',
  'xuanhuan': '东方玄幻修炼风格,神秘能量,飘逸长袍,魔法符文...',
  'realphoto_modern': '现代真人实拍风格,现代都市场景,真实人物,高清摄影...',
  // ... 40+种风格定义
}

六、URL路径拼接工具

export function joinProviderUrl(base_url: string, requiredPrefix: string, path: string) {
  const normalizedBase = (base_url || '').replace(/\/+$/, '')
  const normalizedPrefix = normalizeSegment(requiredPrefix)
  const normalizedPath = normalizeSegment(path)
  
  try {
    const url = new URL(normalizedBase)
    const currentPath = url.pathname.replace(/\/+$/, '')
    const mergedPrefix = currentPath.endsWith(normalizedPrefix)
      ? currentPath
      : `${currentPath}${normalizedPrefix}`
    
    url.pathname = `${mergedPrefix}${normalizedPath}`.replace(/\/{2,}/g, '/')
    return url.toString()
  } catch {
    // 降级处理:简单字符串拼接
    const basePath = normalizedBase.endsWith(normalizedPrefix)
      ? normalizedBase
      : `${normalizedBase}${normalizedPrefix}`
    return `${basePath}${normalizedPath}`
  }
}

设计亮点:

  • 使用 URL API进行标准化处理

  • 自动处理路径重复斜杠问题

  • 支持自定义base_url扩展


七、架构优势总结

特性

实现方式

价值

扩展性

Adapter模式 + 注册表

新增provider只需实现接口并注册

解耦性

统一接口抽象

业务层与具体平台解耦

容错性

默认适配器回退

避免provider不存在导致的错误

灵活性

同步/异步自适应

根据模型能力动态选择调用模式

可维护性

共享工具模块

避免重复代码,统一处理逻辑


八、应用场景

该架构适用于以下场景:

  1. 多平台容灾:某平台故障时自动切换到其他平台

  2. 成本优化:根据不同场景选择性价比最高的平台

  3. 能力互补:不同平台在特定风格上各有优势

  4. 私有化部署:支持自定义base_url对接私有化服务


九、总结

本文深入剖析了一个基于Adapter模式的多Provider AI图片生成服务架构。核心设计理念包括:

  1. 接口抽象:通过统一接口屏蔽平台差异

  2. 策略模式:根据模型特性动态选择处理策略

  3. 注册表模式:集中管理适配器实例,实现动态切换

  4. 工具封装:提取共享逻辑,提升代码复用率

该架构具有良好的扩展性和可维护性,是企业级AI服务集成的典型实践方案。


参考代码位置:

  • 适配器接口定义:/backend/src/services/adapters/types.ts

  • 阿里云适配器:/backend/src/services/adapters/ali-image.ts

  • 适配器注册表:/backend/src/services/adapters/registry.ts

  • 共享工具模块:/backend/src/services/adapters/shared.ts

Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐