Spaces:
Running
Running
from fastapi import FastAPI, UploadFile, Form, Request, File | |
from fastapi.middleware.cors import CORSMiddleware | |
from fastapi.responses import HTMLResponse, JSONResponse, FileResponse | |
from fastapi.staticfiles import StaticFiles | |
from fastapi.templating import Jinja2Templates | |
import os | |
import tempfile | |
from typing import Optional | |
app = FastAPI() | |
# CORS Configuration | |
app.add_middleware( | |
CORSMiddleware, | |
allow_origins=["*"], | |
allow_credentials=True, | |
allow_methods=["*"], | |
allow_headers=["*"], | |
) | |
# Static assets | |
app.mount("/static", StaticFiles(directory="static"), name="static") | |
app.mount("/resources", StaticFiles(directory="resources"), name="resources") | |
# Templates | |
templates = Jinja2Templates(directory="templates") | |
async def serve_home(request: Request): | |
return templates.TemplateResponse("HomeS.html", {"request": request}) | |
async def summarize_document(file: UploadFile = File(...), length: str = Form("medium")): | |
try: | |
from app import summarize_api | |
return await summarize_api(file, length) | |
except ImportError as e: | |
return JSONResponse( | |
{"error": f"Summarization module not available: {str(e)}"}, | |
status_code=501 | |
) | |
except Exception as e: | |
return JSONResponse( | |
{"error": f"Summarization failed: {str(e)}"}, | |
status_code=500 | |
) | |
async def caption_image(file: UploadFile = File(...)): | |
try: | |
from appImage import caption_from_frontend | |
return await caption_from_frontend(file) | |
except ImportError as e: | |
return JSONResponse( | |
{"error": f"Image captioning module not available: {str(e)}"}, | |
status_code=501 | |
) | |
except Exception as e: | |
return JSONResponse( | |
{"error": f"Image captioning failed: {str(e)}"}, | |
status_code=500 | |
) | |
async def serve_file(filename: str): | |
file_path = os.path.join(tempfile.gettempdir(), filename) | |
if os.path.exists(file_path): | |
return FileResponse(file_path) | |
return JSONResponse({"error": "File not found"}, status_code=404) | |
# Optional unified endpoint | |
async def predict( | |
file: UploadFile = File(...), | |
option: str = Form(...), # "Summarize" or "Captioning" | |
length: Optional[str] = Form(None) # Only for summarize | |
): | |
try: | |
if option == "Summarize": | |
return await summarize_document(file, length or "medium") | |
elif option == "Captioning": | |
return await caption_image(file) | |
else: | |
return JSONResponse( | |
{"error": "Invalid option - must be 'Summarize' or 'Captioning'"}, | |
status_code=400 | |
) | |
except Exception as e: | |
return JSONResponse( | |
{"error": f"Prediction failed: {str(e)}"}, | |
status_code=500 | |
) |