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.7 KiB

模型同步白名单优化

日期: 2026-02-13
类型: 优化
影响范围: 模型同步脚本

变更概述

优化 sync_all_models.py 脚本,默认仅同步 model_localization.json 中配置的模型(白名单模式),减少数据库冗余数据。

变更动机

问题

  • sync_all_models.py 会从 Provider API 同步所有模型(可能数百个)
  • 实际只需要 model_localization.json 中配置的约 20 个模型
  • 导致数据库存储大量未使用的模型记录

解决方案

  • 默认启用白名单模式,仅同步配置文件中的模型
  • 保留 --sync-all 参数支持全量同步(用于探索新模型)

技术实现

1. 新增白名单加载函数

def load_model_whitelist() -> set[str]:
    """加载模型白名单(从 model_localization.json)"""
    config_file = Path(__file__).parent / 'model_localization.json'
    
    try:
        if not config_file.exists():
            logger.warning("配置文件不存在: %s,将同步所有模型", config_file)
            return set()
        
        with open(config_file, 'r', encoding='utf-8') as f:
            config = json.load(f)
            whitelist = set(config.keys())
            logger.info("从配置文件加载 %d 个模型白名单", len(whitelist))
            return whitelist
    except Exception as e:
        logger.error("加载配置文件失败: %s,将同步所有模型", str(e))
        return set()

2. 修改 sync_all 函数

新增参数

  • sync_all: bool = False - 是否同步所有模型(默认 False)

白名单过滤逻辑

# 加载白名单
whitelist = set() if sync_all else load_model_whitelist()

# 获取所有模型
api_models = await syncer.fetch_models(model_type, model_name)

# 应用白名单过滤
if whitelist:
    original_count = len(api_models)
    api_models = [
        m for m in api_models
        if m.get('model_id') in whitelist
    ]
    filtered_count = len(api_models)
    logger.info("白名单过滤: %d -> %d 个模型", original_count, filtered_count)

3. 重构 BaseSyncer

拆分 sync 方法

  • sync() - 公共接口,获取模型并调用内部方法
  • _sync_models() - 内部方法,同步已获取的模型列表

目的:允许 sync_all_models.py 在获取模型后应用白名单过滤,再调用内部同步方法。

4. 新增命令行参数

--sync-all    # 同步所有模型(全量模式)

使用方法

默认模式(白名单)

# 仅同步 model_localization.json 中配置的模型
docker exec jointo-server-app python scripts/sync_all_models.py

全量同步模式

# 同步所有模型(用于探索新模型)
docker exec jointo-server-app python scripts/sync_all_models.py --sync-all

其他参数组合

# 白名单 + 预览模式
docker exec jointo-server-app python scripts/sync_all_models.py --dry-run

# 白名单 + 仅同步 AIHubMix
docker exec jointo-server-app python scripts/sync_all_models.py --provider aihubmix

# 全量 + 仅同步视频模型
docker exec jointo-server-app python scripts/sync_all_models.py --sync-all --type video

影响范围

修改文件

  1. server/scripts/sync_all_models.py

    • 新增 load_model_whitelist() 函数
    • 修改 sync_all() 函数,新增 sync_all 参数
    • 新增白名单过滤逻辑
    • 修改 main() 函数,新增 --sync-all 参数
  2. server/scripts/sync_models/base.py

    • 拆分 sync() 方法为公共接口和内部方法
    • 新增 _sync_models() 内部方法

行为变更

之前

  • 默认同步所有 Provider 的所有模型

之后

  • 默认仅同步 model_localization.json 中配置的模型
  • 使用 --sync-all 可恢复原有全量同步行为

优势

  1. 减少数据库冗余:仅存储实际使用的模型
  2. 提升同步速度:减少 API 请求和数据库写入
  3. 配置即真理:模型配置与同步逻辑一致
  4. 保留灵活性--sync-all 支持探索新模型

测试建议

# 1. 预览白名单模式
docker exec jointo-server-app python scripts/sync_all_models.py --dry-run

# 2. 执行白名单同步
docker exec jointo-server-app python scripts/sync_all_models.py

# 3. 验证数据库中的模型数量
docker exec jointo-server-postgres psql -U jointoAI -d jointo -c "SELECT COUNT(*) FROM ai_models;"

# 4. 更新本地化配置
docker exec jointo-server-app python scripts/update_model_localization.py

后续优化

  1. 考虑在 model_localization.json 中添加模型分组(如 video, image, tts
  2. 支持从配置文件中读取 Provider 过滤规则
  3. 添加模型同步日志记录(记录每次同步的模型列表)