"""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