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.
 

4.5 KiB

OpenAI API 集成与测试总结

日期: 2026-01-30
状态: 部分完成,需要进一步修复 Event Loop 问题

完成的工作

1. OpenAI API 配置

  • 配置了代理服务:https://aihubmix.com/v1
  • API Key 已配置并验证可用
  • 查询到 594 个可用模型

2. 模型支持

  • 验证了可用的图片生成模型:
    • DALL-E: dall-e-2, dall-e-3
    • FLUX: FLUX-1.1-pro, flux-2-pro, flux-2-flex
    • Imagen: imagen-3.0-generate-002, imagen-4.0-generate-001
  • 注意: 代理服务不支持 Stable Diffusion 模型

3. OpenAI Provider 实现

  • 实现了 OpenAIProvider
  • 支持 DALL-E 图片生成
  • 支持 TTS 配音生成
  • 支持 Whisper 字幕生成
  • 支持 GPT 文本处理

4. 文件存储集成

  • 实现了 _download_and_upload_file() 函数
  • 成功下载 AI 生成的文件
  • 成功上传到 MinIO
  • 返回完整的文件元数据

5. 端到端测试 ⚠️

  • API 调用成功
  • DALL-E 3 图片生成成功
  • 文件下载成功
  • 文件上传到 MinIO 成功(在某些测试中)
  • Event Loop 冲突导致部分任务失败

当前问题

Event Loop 冲突 🔴

问题描述:

RuntimeError: Task got Future attached to a different loop

根本原因:

  • Celery ForkPoolWorker 中,每个任务在独立的进程中运行
  • 全局的 async_session_maker 和数据库引擎在不同的 event loop 之间共享
  • asyncpg 连接池与 event loop 绑定,导致冲突

已尝试的修复:

  1. 创建 run_async_task() 函数,为每个任务创建新的 event loop
  2. ⚠️ 部分修复了数据库连接(_update_job_status, _confirm_or_refund_credits, _download_and_upload_file
  3. 还有多处数据库连接未修复(所有任务函数中的 async with async_session_maker()

需要的修复:

  • 将所有 async with async_session_maker() 替换为独立的数据库连接
  • 每次数据库操作都创建新的 engine 和 session_maker
  • 操作完成后 dispose engine

测试结果

成功的测试(早期)

Job ID: 019c0df4-fde6-7d73-8ec6-f9c799504219
Status: COMPLETED (3)
Progress: 100%
File Size: 3,163,291 bytes
Storage: MinIO
File URL: http://localhost:6185/jointo/ai-generated/images/...

失败的测试(最近)

Job ID: 019c0e05-10b8-7322-84b2-c0d4b6d8e5e7
Status: COMPLETED (2)
Progress: 30%
Output Data: null
Error: Event loop conflict

后续工作

优先级 1: 修复 Event Loop 问题 🔴

  1. 批量替换 ai_tasks.py 中所有的 async with async_session_maker()
  2. 为每个数据库操作创建独立的连接
  3. 确保所有 engine 都被正确 dispose

优先级 2: 完善测试 🟡

  1. 修复测试脚本,正确读取 output_data
  2. 增加重试逻辑
  3. 添加文件验证(下载 MinIO 文件并验证)

优先级 3: 添加更多模型支持 🟢

  1. 添加 FLUX 模型支持
  2. 添加 Imagen 模型支持
  3. 创建专门的 Stability AI Provider(如果需要)

优先级 4: 性能优化 🟢

  1. 使用连接池(解决 event loop 问题后)
  2. 并发下载和上传
  3. 添加缓存机制

相关文件

核心文件

  • server/app/tasks/ai_tasks.py - AI 任务实现(需要修复)
  • server/app/services/ai_providers/openai_provider.py - OpenAI Provider
  • server/app/services/ai_providers/factory.py - Provider 工厂
  • server/app/services/file_storage_service.py - 文件存储服务

测试文件

  • server/scripts/test_ai_image_generation_e2e.py - 端到端测试
  • server/scripts/test_sd_api.py - API 格式测试
  • server/scripts/list_image_models.py - 模型列表查询

文档

  • docs/server/guides/openai-api-configuration.md - 配置指南
  • docs/server/changelogs/2026-01-30-openai-provider-integration.md - 集成文档
  • docs/server/changelogs/2026-01-30-ai-tasks-event-loop-fix.md - Event Loop 修复文档

建议

  1. 短期: 使用 Mock Provider 进行功能测试,避免 Event Loop 问题
  2. 中期: 完全重写 ai_tasks.py,使用更好的异步模式
  3. 长期: 考虑使用 Celery 的 geventeventlet worker 替代 prefork

结论

OpenAI API 集成的核心功能已经实现并验证可用:

  • API 连接正常
  • 图片生成成功
  • 文件存储集成成功

但由于 Celery + asyncpg + event loop 的复杂性,需要进一步修复数据库连接管理才能稳定运行。

建议优先修复 Event Loop 问题,然后再进行更多功能开发。