From a834fc4b3063eaf3426f0daed6e4cd34c1ad152a Mon Sep 17 00:00:00 2001 From: Will Miao <13051207myq@gmail.com> Date: Wed, 23 Jul 2025 17:26:06 +0800 Subject: [PATCH] feat: Update API routes for LoRA management and enhance folder handling --- py/routes/base_model_routes.py | 17 +++++++++++- py/routes/checkpoint_routes.py | 2 +- py/routes/lora_routes.py | 31 +--------------------- static/js/managers/DownloadManager.js | 6 ++--- static/js/managers/MoveManager.js | 6 ++--- static/js/managers/SettingsManager.js | 2 +- static/js/managers/import/FolderBrowser.js | 4 +-- 7 files changed, 27 insertions(+), 41 deletions(-) diff --git a/py/routes/base_model_routes.py b/py/routes/base_model_routes.py index fc512d0c..d438d69e 100644 --- a/py/routes/base_model_routes.py +++ b/py/routes/base_model_routes.py @@ -55,6 +55,7 @@ class BaseModelRoutes(ABC): app.router.add_get(f'/api/{prefix}/base-models', self.get_base_models) app.router.add_get(f'/api/{prefix}/scan', self.scan_models) app.router.add_get(f'/api/{prefix}/roots', self.get_model_roots) + app.router.add_get(f'/api/{prefix}/folders', self.get_folders) app.router.add_get(f'/api/{prefix}/find-duplicates', self.find_duplicate_models) app.router.add_get(f'/api/{prefix}/find-filename-conflicts', self.find_filename_conflicts) @@ -66,7 +67,7 @@ class BaseModelRoutes(ABC): # CivitAI integration routes app.router.add_post(f'/api/{prefix}/fetch-all-civitai', self.fetch_all_civitai) - app.router.add_get(f'/api/civitai/versions/{{model_id}}', self.get_civitai_versions) + # app.router.add_get(f'/api/civitai/versions/{{model_id}}', self.get_civitai_versions) # Add generic page route app.router.add_get(f'/{prefix}', self.handle_models_page) @@ -328,6 +329,20 @@ class BaseModelRoutes(ABC): "success": False, "error": str(e) }, status=500) + + async def get_folders(self, request: web.Request) -> web.Response: + """Get all folders in the cache""" + try: + cache = await self.service.scanner.get_cached_data() + return web.json_response({ + 'folders': cache.folders + }) + except Exception as e: + logger.error(f"Error getting folders: {e}") + return web.json_response({ + 'success': False, + 'error': str(e) + }, status=500) async def find_duplicate_models(self, request: web.Request) -> web.Response: """Find models with duplicate SHA256 hashes""" diff --git a/py/routes/checkpoint_routes.py b/py/routes/checkpoint_routes.py index 6ba550a6..4f27115e 100644 --- a/py/routes/checkpoint_routes.py +++ b/py/routes/checkpoint_routes.py @@ -37,7 +37,7 @@ class CheckpointRoutes(BaseModelRoutes): def setup_specific_routes(self, app: web.Application, prefix: str): """Setup Checkpoint-specific routes""" # Checkpoint-specific CivitAI integration - app.router.add_get(f'/api/civitai/versions/{{model_id}}', self.get_civitai_versions_checkpoint) + app.router.add_get(f'/api/{prefix}/civitai/versions/{{model_id}}', self.get_civitai_versions_checkpoint) # Checkpoint info by name app.router.add_get(f'/api/{prefix}/info/{{name}}', self.get_checkpoint_info) diff --git a/py/routes/lora_routes.py b/py/routes/lora_routes.py index fde5586b..ac7dc4ed 100644 --- a/py/routes/lora_routes.py +++ b/py/routes/lora_routes.py @@ -48,15 +48,13 @@ class LoraRoutes(BaseModelRoutes): app.router.add_get(f'/api/lora-preview-url', self.get_lora_preview_url) app.router.add_get(f'/api/lora-civitai-url', self.get_lora_civitai_url) app.router.add_get(f'/api/lora-model-description', self.get_lora_model_description) - app.router.add_get(f'/api/folders', self.get_folders) - app.router.add_get(f'/api/lora-roots', self.get_lora_roots) # LoRA-specific management routes app.router.add_post(f'/api/move_model', self.move_model) app.router.add_post(f'/api/move_models_bulk', self.move_models_bulk) # CivitAI integration with LoRA-specific validation - app.router.add_get(f'/api/civitai/versions/{{model_id}}', self.get_civitai_versions_lora) + app.router.add_get(f'/api/{prefix}/civitai/versions/{{model_id}}', self.get_civitai_versions_lora) app.router.add_get(f'/api/civitai/model/version/{{modelVersionId}}', self.get_civitai_model_by_version) app.router.add_get(f'/api/civitai/model/hash/{{hash}}', self.get_civitai_model_by_hash) @@ -201,33 +199,6 @@ class LoraRoutes(BaseModelRoutes): 'error': str(e) }, status=500) - async def get_folders(self, request: web.Request) -> web.Response: - """Get all folders in the cache""" - try: - cache = await self.service.scanner.get_cached_data() - return web.json_response({ - 'folders': cache.folders - }) - except Exception as e: - logger.error(f"Error getting folders: {e}") - return web.json_response({ - 'success': False, - 'error': str(e) - }, status=500) - - async def get_lora_roots(self, request: web.Request) -> web.Response: - """Get all configured LoRA root directories""" - try: - return web.json_response({ - 'roots': self.service.get_model_roots() - }) - except Exception as e: - logger.error(f"Error getting LoRA roots: {e}") - return web.json_response({ - 'success': False, - 'error': str(e) - }, status=500) - # Override get_models to add LoRA-specific response data async def get_models(self, request: web.Request) -> web.Response: """Get paginated LoRA data with LoRA-specific fields""" diff --git a/static/js/managers/DownloadManager.js b/static/js/managers/DownloadManager.js index 7584bf0f..b3d0433e 100644 --- a/static/js/managers/DownloadManager.js +++ b/static/js/managers/DownloadManager.js @@ -87,7 +87,7 @@ export class DownloadManager { throw new Error('Invalid Civitai URL format'); } - const response = await fetch(`/api/civitai/versions/${this.modelId}`); + const response = await fetch(`/api/loras/civitai/versions/${this.modelId}`); if (!response.ok) { const errorData = await response.json().catch(() => ({})); if (errorData && errorData.error && errorData.error.includes('Model type mismatch')) { @@ -254,7 +254,7 @@ export class DownloadManager { try { // Fetch LoRA roots - const rootsResponse = await fetch('/api/lora-roots'); + const rootsResponse = await fetch('/api/loras/roots'); if (!rootsResponse.ok) { throw new Error('Failed to fetch LoRA roots'); } @@ -272,7 +272,7 @@ export class DownloadManager { } // Fetch folders dynamically - const foldersResponse = await fetch('/api/folders'); + const foldersResponse = await fetch('/api/loras/folders'); if (!foldersResponse.ok) { throw new Error('Failed to fetch folders'); } diff --git a/static/js/managers/MoveManager.js b/static/js/managers/MoveManager.js index 45e6a011..e72c8274 100644 --- a/static/js/managers/MoveManager.js +++ b/static/js/managers/MoveManager.js @@ -74,7 +74,7 @@ class MoveManager { try { // Fetch LoRA roots - const rootsResponse = await fetch('/api/lora-roots'); + const rootsResponse = await fetch('/api/loras/roots'); if (!rootsResponse.ok) { throw new Error('Failed to fetch LoRA roots'); } @@ -96,7 +96,7 @@ class MoveManager { } // Fetch folders dynamically - const foldersResponse = await fetch('/api/folders'); + const foldersResponse = await fetch('/api/loras/folders'); if (!foldersResponse.ok) { throw new Error('Failed to fetch folders'); } @@ -190,7 +190,7 @@ class MoveManager { // Refresh folder tags after successful move try { - const foldersResponse = await fetch('/api/folders'); + const foldersResponse = await fetch('/api/loras/folders'); if (foldersResponse.ok) { const foldersData = await foldersResponse.json(); updateFolderTags(foldersData.folders); diff --git a/static/js/managers/SettingsManager.js b/static/js/managers/SettingsManager.js index 828cb461..c0f0f662 100644 --- a/static/js/managers/SettingsManager.js +++ b/static/js/managers/SettingsManager.js @@ -161,7 +161,7 @@ export class SettingsManager { if (!defaultLoraRootSelect) return; // Fetch lora roots - const response = await fetch('/api/lora-roots'); + const response = await fetch('/api/loras/roots'); if (!response.ok) { throw new Error('Failed to fetch LoRA roots'); } diff --git a/static/js/managers/import/FolderBrowser.js b/static/js/managers/import/FolderBrowser.js index 33504ee8..edd4d6a4 100644 --- a/static/js/managers/import/FolderBrowser.js +++ b/static/js/managers/import/FolderBrowser.js @@ -99,7 +99,7 @@ export class FolderBrowser { } // Fetch LoRA roots - const rootsResponse = await fetch('/api/lora-roots'); + const rootsResponse = await fetch('/api/loras/roots'); if (!rootsResponse.ok) { throw new Error(`Failed to fetch LoRA roots: ${rootsResponse.status}`); } @@ -119,7 +119,7 @@ export class FolderBrowser { } // Fetch folders - const foldersResponse = await fetch('/api/folders'); + const foldersResponse = await fetch('/api/loras/folders'); if (!foldersResponse.ok) { throw new Error(`Failed to fetch folders: ${foldersResponse.status}`); }