42 lines
1.8 KiB
Python
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
|