Spaces:
Sleeping
Sleeping
| from fastapi import APIRouter, UploadFile, File, HTTPException | |
| from models.loader import ModelLoader | |
| from request_queue.queue_manager import RequestQueue | |
| from queue import Full | |
| router = APIRouter(prefix="/predict/pest", tags=["Pest"]) | |
| model_loader = ModelLoader(config_dir="models/configs") | |
| request_queue = RequestQueue(maxsize=10) | |
| async def predict_pest(file: UploadFile = File(...)): | |
| if not file or not file.filename: | |
| raise HTTPException(status_code=400, detail="No file uploaded or file is invalid.") | |
| try: | |
| image_bytes = await file.read() | |
| if not image_bytes: | |
| raise HTTPException(status_code=400, detail="Uploaded file is empty.") | |
| def process_request(): | |
| try: | |
| model = model_loader.load_model("pest") | |
| except Exception: | |
| raise HTTPException(status_code=503, detail="Pest model not loaded or unavailable.") | |
| result = model.predict(image_bytes) | |
| return {"filename": file.filename, **result} | |
| try: | |
| request_queue.add_request(process_request) | |
| except Full: | |
| raise HTTPException(status_code=429, detail="Request queue is full. Please try again later.") | |
| response = request_queue.get_request()() | |
| return response | |
| except HTTPException as e: | |
| raise e | |
| except Exception as e: | |
| raise HTTPException(status_code=500, detail=str(e)) | |