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
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
影响范围
修改文件
-
server/scripts/sync_all_models.py- 新增
load_model_whitelist()函数 - 修改
sync_all()函数,新增sync_all参数 - 新增白名单过滤逻辑
- 修改
main()函数,新增--sync-all参数
- 新增
-
server/scripts/sync_models/base.py- 拆分
sync()方法为公共接口和内部方法 - 新增
_sync_models()内部方法
- 拆分
行为变更
之前:
- 默认同步所有 Provider 的所有模型
之后:
- 默认仅同步
model_localization.json中配置的模型 - 使用
--sync-all可恢复原有全量同步行为
优势
- 减少数据库冗余:仅存储实际使用的模型
- 提升同步速度:减少 API 请求和数据库写入
- 配置即真理:模型配置与同步逻辑一致
- 保留灵活性:
--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
后续优化
- 考虑在
model_localization.json中添加模型分组(如video,image,tts) - 支持从配置文件中读取 Provider 过滤规则
- 添加模型同步日志记录(记录每次同步的模型列表)