import logging from typing import List from fastapi import APIRouter, HTTPException from app.schemas.system import ModelInfo, ProcessorInfo from app.services import facefusion_bridge, file_manager logger = logging.getLogger(__name__) router = APIRouter(prefix='/api/v1', tags=['processors']) @router.get('/processors', response_model=List[ProcessorInfo]) async def list_processors(): """List available processors and their models.""" try: processor_names = facefusion_bridge.get_available_processors() result = [] for name in processor_names: result.append(ProcessorInfo(name=name, models=[])) return result except Exception as e: logger.error(f'Failed to list processors: {e}') raise HTTPException(status_code=500, detail=str(e)) @router.get('/models', response_model=List[ModelInfo]) async def list_models(): """List downloaded model files.""" models = file_manager.list_model_files() return [ModelInfo(name=name, path=path, size_bytes=size) for name, path, size in models] @router.post('/models/download') async def download_models(processors: List[str] = None): """Trigger model download for specified processors.""" try: success = facefusion_bridge.force_download_models(processors) if success: return {'status': 'ok', 'message': 'Models downloaded successfully'} raise HTTPException(status_code=500, detail='Some models failed to download') except HTTPException: raise except Exception as e: logger.error(f'Model download failed: {e}') raise HTTPException(status_code=500, detail=str(e))