"""供应商与模型 API。""" from __future__ import annotations from fastapi import APIRouter, HTTPException from ..providers import ProviderError from ..schemas import DiscoverIn, ModelUpsertIn, ProviderIn from ..services import providers as svc router = APIRouter(prefix="/api/providers", tags=["providers"]) @router.get("") def list_providers(): return svc.list_providers() @router.post("") def save_provider(payload: ProviderIn): try: return svc.save_provider(payload.model_dump()) except ProviderError as exc: raise HTTPException(status_code=exc.status, detail=exc.message) @router.delete("/{provider_id}") def delete_provider(provider_id: str): svc.delete_provider(provider_id) return {"ok": True} @router.post("/discover") def discover_with_credentials(payload: DiscoverIn): """尚未保存供应商时,用手填的 Base URL + Key 临时拉取模型清单。""" try: return svc.discover_with_credentials( payload.adapter, payload.base_url.rstrip("/"), payload.api_key ) except ProviderError as exc: raise HTTPException(status_code=exc.status, detail=exc.message) @router.post("/{provider_id}/discover") def discover_provider_models(provider_id: str): """按已保存的供应商拉取上游模型(命中规则:模型 ID 含 image)。""" try: return svc.discover(provider_id) except ProviderError as exc: raise HTTPException(status_code=exc.status, detail=exc.message) @router.post("/{provider_id}/models") def upsert_provider_models(provider_id: str, payload: ModelUpsertIn): """保存勾选的模型,并设置启用状态(未勾选的自动停用)。""" try: return svc.upsert_models( provider_id, payload.model_ids, enabled=payload.enabled, note=payload.note or "自动发现", exclusive=True, ) except ProviderError as exc: raise HTTPException(status_code=exc.status, detail=exc.message)