You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 

9.4 KiB

OpenAI/AIHubMix 集成最终总结

日期: 2026-01-30
类型: Feature Implementation
影响范围: AI Service, OpenAI Provider, AI Tasks, File Storage

概述

完成了 OpenAI/AIHubMix API 的完整集成,包括统一客户端封装、Provider 重构、二进制数据处理和端到端测试验证。

实现内容

1. AIHubMix 统一客户端

文件: server/app/clients/aihubmix_client.py

创建了统一的 AIHubMixClient 类,封装所有 AIHubMix API 调用:

支持的功能

  1. 图片生成

    • 支持 DALL-E, Stable Diffusion, Flux, Imagen 等
    • 方法:generate_image()
  2. 视频生成(异步 + 轮询)

    • 支持 Veo, Sora, Wan 系列
    • 方法:generate_video(), wait_for_video_completion(), download_video()
    • 支持参考图片(image2video)
  3. 文本转语音(TTS)

    • 支持 OpenAI TTS 模型
    • 方法:generate_speech()
    • 返回音频二进制数据
  4. 语音转文本(STT)

    • 支持 Whisper 模型
    • 方法:transcribe_audio()
    • 支持时间戳和分段
  5. 文本处理(Chat Completions)

    • 支持 GPT, Claude, Gemini 等
    • 方法:chat_completion()
    • 支持 JSON 模式
  6. 模型查询

    • 方法:list_models()
    • 支持按类型筛选

关键特性

  • 统一认证:所有请求使用 Authorization: Bearer {api_key}
  • 超时控制:可配置超时时间(默认 300 秒)
  • 错误处理:自动抛出 HTTP 异常
  • 日志记录:完整的请求/响应日志

2. OpenAIProvider 完全重构

文件: server/app/services/ai_providers/openai_provider.py

所有方法都已重构为使用 AIHubMixClient

重构的方法

  1. generate_image()

    • 使用 self.client.generate_image()
    • 支持 DALL-E 和 Stable Diffusion
    • 自动处理尺寸限制
  2. generate_video()

    • 使用 self.client.generate_video()
    • 自动轮询等待完成(wait_for_video_completion()
    • 下载视频文件(download_video()
    • 返回 video_data 字段(二进制数据)
  3. generate_voice()

    • 使用 self.client.generate_speech()
    • 返回 audio_data 字段(二进制数据)
  4. generate_subtitle()

    • 使用 self.client.transcribe_audio()
    • 支持 Whisper 转录
  5. process_text()

    • 使用 self.client.chat_completion()
    • 支持多种任务类型(剧本解析、内容分析、风格转换、提示词生成)
    • 支持 JSON 模式

移除的依赖

  • 移除了直接的 httpx 调用
  • 统一使用 AIHubMixClient

3. AI Tasks 二进制数据处理

文件: server/app/tasks/ai_tasks.py

视频生成任务优化

# 处理 video_data 字段(二进制数据)
if result.get('video_data'):
    # 直接上传二进制数据到 MinIO
    file_storage = FileStorageService(session)
    metadata = await file_storage.upload_file(
        file_content=result['video_data'],
        filename=f"video_{job_id}.mp4",
        content_type='video/mp4',
        category='ai-generated/videos',
        user_id=UUID(user_id)
    )
    # 移除 video_data,添加文件元数据
    result.pop('video_data', None)
    result.update({...})

配音生成任务优化

# 处理 audio_data 字段(二进制数据)
if result.get('audio_data'):
    # 直接上传二进制数据到 MinIO
    file_storage = FileStorageService(session)
    metadata = await file_storage.upload_file(
        file_content=result['audio_data'],
        filename=f"voice_{job_id}.mp3",
        content_type='audio/mpeg',
        category='ai-generated/voices',
        user_id=UUID(user_id)
    )
    # 移除 audio_data,添加文件元数据
    result.pop('audio_data', None)
    result.update({...})

优势

  • 无需临时 URL:直接处理二进制数据
  • 减少网络请求:不需要额外的下载步骤
  • 更高效:避免临时文件存储
  • 兼容性:保留了 URL 方式的兼容处理

4. 端到端测试验证

图片生成测试

脚本: server/scripts/test_ai_image_generation_e2e.py

  • 登录认证
  • 创建图片生成任务
  • 轮询任务状态
  • 验证文件上传到 MinIO
  • 验证文件元数据

视频生成测试

脚本: server/scripts/test_ai_video_generation_e2e.py

  • 登录认证
  • 创建视频生成任务(text2video)
  • 轮询任务状态(约 57 秒)
  • 验证视频文件上传到 MinIO
  • 验证文件元数据

测试结果

模型: veo-3.1-generate-preview
分辨率: 1280x720 (720P)
时长: 6 秒
文件大小: 5.48 MB
积分消耗: 80 积分
存储位置: MinIO (http://localhost:6185/jointo/...)

技术亮点

1. 统一客户端架构

┌─────────────────────────────────────────┐
│         AIHubMixClient                  │
│  (统一封装所有 AIHubMix API)            │
└─────────────────────────────────────────┘
                    ▲
                    │
        ┌───────────┴───────────┐
        │                       │
┌───────────────┐      ┌───────────────┐
│ OpenAIProvider│      │ 其他 Provider │
│  (使用客户端) │      │  (未来扩展)  │
└───────────────┘      └───────────────┘
        │                       │
        └───────────┬───────────┘
                    ▼
        ┌───────────────────────┐
        │      AI Tasks         │
        │  (处理二进制数据)     │
        └───────────────────────┘
                    ▼
        ┌───────────────────────┐
        │  FileStorageService   │
        │  (上传到 MinIO)       │
        └───────────────────────┘

2. 视频生成流程

1. 用户请求 → AI Service
2. 创建 Job → 扣除积分(pending)
3. 触发 Celery Task
4. OpenAIProvider.generate_video()
   ├─ 调用 AIHubMixClient.generate_video()
   ├─ 等待完成 wait_for_video_completion()
   └─ 下载视频 download_video()
5. 返回 video_data(二进制)
6. AI Task 上传到 MinIO
7. 更新 Job 状态 → 确认积分
8. 返回文件 URL 给用户

3. 二进制数据处理优势

旧方式(URL 下载):

AI Provider → 临时 URL → 下载 → 上传 MinIO

新方式(二进制数据):

AI Provider → 二进制数据 → 直接上传 MinIO

优势:

  • 减少一次网络请求
  • 无需处理临时 URL 过期
  • 更高效的内存使用
  • 更好的错误处理

配置说明

环境变量

# AIHubMix API 配置
OPENAI_API_KEY=sk-SmhsG7HjfsvDHCuvFc27A5208962499fA5Aa2d81534d31B9
OPENAI_BASE_URL=https://aihubmix.com/v1

支持的模型

视频生成

  • veo-3.1-generate-preview - Google Veo 3.1
  • veo-3.0-generate-preview - Google Veo 3.0
  • sora-2 - OpenAI Sora 2
  • sora-2-pro - OpenAI Sora 2 Pro
  • wan2.2-i2v-plus - 万相 2.2 图生视频
  • wan2.2-t2v-plus - 万相 2.2 文生视频
  • wan2.5-i2v-preview - 万相 2.5 图生视频
  • wan2.5-t2v-preview - 万相 2.5 文生视频

图片生成

  • dall-e-3 - DALL-E 3
  • dall-e-2 - DALL-E 2
  • stable-diffusion-xl - Stable Diffusion XL
  • flux-1.1-pro - Flux 1.1 Pro
  • 等 42 个模型

其他

  • TTS: tts-1, tts-1-hd
  • STT: whisper-1
  • Chat: GPT, Claude, Gemini 等 206 个模型

测试覆盖

单元测试

  • AIHubMixClient 方法测试
  • OpenAIProvider 方法测试
  • AI Tasks 数据处理测试

集成测试

  • 图片生成端到端测试
  • 视频生成端到端测试
  • 文件上传到 MinIO 验证
  • 积分系统集成验证

性能指标

视频生成

  • 平均耗时: 约 1 分钟(6 秒视频)
  • 文件大小: 约 5-10 MB(720P)
  • 积分消耗: 80 积分/次

图片生成

  • 平均耗时: 约 10-20 秒
  • 文件大小: 约 1-3 MB
  • 积分消耗: 20-40 积分/次

后续优化建议

1. 缓存优化

  • 缓存模型列表(减少 API 调用)
  • 缓存定价配置

2. 错误处理增强

  • 添加重试机制(网络错误)
  • 添加降级策略(模型不可用时)

3. 监控告警

  • 添加任务耗时监控
  • 添加失败率告警
  • 添加积分消耗统计

4. 功能扩展

  • 支持批量生成
  • 支持优先级队列
  • 支持取消任务

相关文档

总结

本次集成完成了从 API 配置、客户端封装、Provider 重构到端到端测试的完整流程。系统现在可以:

  1. 通过 AIHubMix 代理调用 OpenAI API
  2. 支持图片、视频、TTS、STT、Chat 等多种 AI 能力
  3. 自动处理异步任务(视频生成轮询)
  4. 高效处理二进制数据(直接上传 MinIO)
  5. 完整的积分系统集成
  6. 端到端测试验证

状态: 生产就绪