Files

42 lines
1.8 KiB
Python

"""Provider 模型发现结果到用户模型目录的同步。"""
from __future__ import annotations
from sqlmodel import Session, select
from .models import ModelCatalog, ModelProvider, now
def sync_provider_catalog(session: Session, provider: ModelProvider) -> list[ModelCatalog]:
"""幂等同步模型清单;下线旧模型但保留历史目录记录。"""
names = list(dict.fromkeys(str(item).strip() for item in (provider.models or []) if str(item).strip()))
existing = {
item.model_name: item
for item in session.exec(select(ModelCatalog).where(ModelCatalog.provider_id == provider.id)).all()
}
for name in names:
item = existing.get(name)
if not item:
item = ModelCatalog(provider_id=provider.id or 0, model_name=name,
display_name=name, builtin=provider.builtin)
item.enabled = bool(provider.enabled)
item.builtin = bool(provider.builtin)
item.updated_at = now()
session.add(item)
active_names = set(names)
for item in existing.values():
if item.model_name not in active_names:
item.enabled = False
item.updated_at = now()
session.add(item)
return list(existing.values()) + [item for item in session.new if isinstance(item, ModelCatalog)]
def resolve_catalog_model(session: Session, catalog_id: int) -> tuple[ModelCatalog, ModelProvider]:
catalog = session.get(ModelCatalog, catalog_id)
if not catalog or not catalog.enabled:
raise ValueError("模型目录不存在或已停用")
provider = session.get(ModelProvider, catalog.provider_id)
if not provider or not provider.enabled or catalog.model_name not in (provider.models or []):
raise ValueError("模型对应的 Provider 不可用")
return catalog, provider