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.
 

7.5 KiB

OpenAIProvider 重命名为 AIHubMixProvider

日期: 2026-01-30
类型: 架构优化
影响范围: AI Provider 层

背景

在之前的实现中,OpenAIProvider 这个命名存在误导性:

  1. 命名不准确OpenAIProvider 实际上通过 AIHubMixClient 调用 AIHubMix 代理服务
  2. 职责不清:它不仅支持 OpenAI 模型,还支持 Stability AI、Veo、Sora、Wan 等多个厂商的模型
  3. 架构不一致:Client 层叫 AIHubMixClient,Provider 层却叫 OpenAIProvider

问题

命名误导

# ❌ 误导性命名
class OpenAIProvider(BaseAIProvider):
    """OpenAI 提供商(通过 AIHubMix 代理)"""
    
    def __init__(self, model_name: str, config: Optional[Dict[str, Any]] = None):
        # 实际上使用 AIHubMixClient
        self.client = AIHubMixClient(...)

问题

  • 新开发者会认为这是直连 OpenAI 官方 API
  • 实际上是通过 AIHubMix 代理服务
  • 支持的模型远不止 OpenAI

架构不一致

Client 层: AIHubMixClient
    ↓
Provider 层: OpenAIProvider  ❌ 命名不匹配

解决方案

重命名为 AIHubMixProvider

# ✅ 准确的命名
class AIHubMixProvider(BaseAIProvider):
    """AIHubMix 提供商(通过 AIHubMix 代理服务调用多个 AI 厂商)"""
    
    def __init__(self, model_name: str, config: Optional[Dict[str, Any]] = None):
        # 使用 AIHubMixClient
        self.client = AIHubMixClient(...)

架构一致性

Client 层: AIHubMixClient
    ↓
Provider 层: AIHubMixProvider  ✅ 命名一致

实施内容

1. 重命名文件

server/app/services/ai_providers/openai_provider.py
    ↓
server/app/services/ai_providers/aihubmix_provider.py

2. 重命名类

# 旧代码
class OpenAIProvider(BaseAIProvider):
    """OpenAI 提供商(通过 AIHubMix 代理)"""

# 新代码
class AIHubMixProvider(BaseAIProvider):
    """AIHubMix 提供商(通过 AIHubMix 代理服务调用多个 AI 厂商)"""

3. 更新 Factory

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

# 旧代码
from app.services.ai_providers.openai_provider import OpenAIProvider

class AIProviderFactory:
    OPENAI_MODELS = [...]
    
    if model_name in AIProviderFactory.OPENAI_MODELS:
        return OpenAIProvider(model_name, config)

# 新代码
from app.services.ai_providers.aihubmix_provider import AIHubMixProvider

class AIProviderFactory:
    AIHUBMIX_MODELS = [...]
    
    if model_name in AIProviderFactory.AIHUBMIX_MODELS:
        return AIHubMixProvider(model_name, config)

4. 更新 init.py

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

# 新增导出
from app.services.ai_providers.aihubmix_provider import AIHubMixProvider
from app.services.ai_providers.stability_provider import StabilityProvider
from app.services.ai_providers.runway_provider import RunwayProvider

__all__ = [
    'BaseAIProvider',
    'MockAIProvider',
    'AIHubMixProvider',
    'StabilityProvider',
    'RunwayProvider',
    'AIProviderFactory',
]

5. 重命名测试脚本

server/scripts/test_openai_provider.py
    ↓
server/scripts/test_aihubmix_provider.py

支持的模型

AIHubMixProvider 支持的模型

通过 AIHubMix 代理服务,支持以下厂商的模型:

OpenAI 模型

  • 图片生成: dall-e-3, dall-e-2
  • 文本处理: gpt-4, gpt-4-turbo, gpt-3.5-turbo
  • 配音生成: tts-1, tts-1-hd
  • 字幕生成: whisper-1

Stability AI 模型(通过代理)

  • stable-diffusion-xl
  • stable-diffusion-3-5-large

视频生成模型

  • Veo 系列: veo-3.1-generate-preview, veo-3.0-generate-preview
  • Sora 系列: sora-2, sora-2-pro
  • Wan 系列: wan2.2-i2v-plus, wan2.2-t2v-plus, wan2.5-i2v-preview, wan2.5-t2v-preview

其他 Provider

  • StabilityProvider: 直连 Stability AI 官方 API
  • RunwayProvider: 直连 Runway 官方 API

优势

1. 命名准确

  • AIHubMixProvider 清晰表明是通过 AIHubMix 代理
  • AIHubMixClient 命名一致
  • 避免误导新开发者

2. 职责清晰

# 清晰的职责划分
AIHubMixProvider   通过 AIHubMix 代理调用多个厂商
StabilityProvider  直连 Stability AI 官方 API
RunwayProvider     直连 Runway 官方 API

3. 架构一致

Client 层              Provider 层
─────────────────────  ─────────────────────
AIHubMixClient    →    AIHubMixProvider
StabilityClient   →    StabilityProvider
RunwayClient      →    RunwayProvider

4. 易于理解

新开发者一看就知道:

  • AIHubMixProvider = 使用 AIHubMix 代理服务
  • StabilityProvider = 直连 Stability AI
  • RunwayProvider = 直连 Runway

影响范围

修改的文件

  • server/app/services/ai_providers/openai_provider.pyaihubmix_provider.py
  • server/app/services/ai_providers/factory.py
  • server/app/services/ai_providers/__init__.py
  • server/scripts/test_openai_provider.pytest_aihubmix_provider.py

不受影响的文件

  • server/app/services/ai_service.py (Service 层接口不变)
  • server/app/api/v1/ai.py (API 层接口不变)
  • server/app/tasks/ai_tasks.py (Celery 任务接口不变)
  • server/app/clients/aihubmix_client.py (Client 层不变)

文档更新

需要更新以下文档中的引用(可选):

  • docs/server/AI_SERVICE_FLOW_DIAGRAM.md
  • docs/server/changelogs/2026-01-30-openai-integration-final-summary.md
  • docs/server/changelogs/2026-01-30-openai-api-integration-summary.md
  • docs/server/changelogs/2026-01-30-openai-provider-integration.md
  • docs/server/rfcs/134-ai-service-implementation.md

测试

验证重命名

# 1. 检查语法
docker exec jointo-server-app python -m py_compile app/services/ai_providers/aihubmix_provider.py

# 2. 运行测试脚本
docker exec jointo-server-app python scripts/test_aihubmix_provider.py

# 3. 测试 Factory
docker exec jointo-server-app python -c "
from app.services.ai_providers.factory import AIProviderFactory
provider = AIProviderFactory.create_provider('dall-e-3')
print(f'Provider: {provider.__class__.__name__}')
"

预期结果

Provider: AIHubMixProvider

向后兼容

代码层面

  • 完全兼容:Factory 接口不变,外部调用无需修改
  • 透明升级:Service 层和 API 层无感知

配置层面

  • 配置不变:仍然使用 OPENAI_API_KEYOPENAI_BASE_URL
  • ℹ️ 说明:虽然 Provider 改名,但配置名称保持不变(因为 AIHubMix 兼容 OpenAI API)

后续优化

可选:配置名称优化

如果需要更准确的配置名称,可以考虑:

# 当前配置(保持不变)
OPENAI_API_KEY: str = ""
OPENAI_BASE_URL: str = "https://api.openai.com/v1"

# 可选:更准确的配置名称
AIHUBMIX_API_KEY: str = ""
AIHUBMIX_BASE_URL: str = "https://aihubmix.com/v1"

建议:暂时保持现有配置名称,避免破坏性变更。

总结

本次重命名解决了命名不准确和架构不一致的问题,使代码更易理解和维护。重命名对外部接口无影响,是一次安全的内部重构。

核心改进

  • 命名准确:AIHubMixProvider 清晰表明职责
  • 架构一致:Client 和 Provider 命名对应
  • 易于理解:新开发者一目了然
  • 向后兼容:外部接口无变化