Spaces:
Running
Running
File size: 1,478 Bytes
4bce2e7 205a862 4bce2e7 205a862 4bce2e7 205a862 4bce2e7 9c102f5 4bce2e7 154fd8f 205a862 154fd8f 205a862 4bce2e7 9c102f5 4bce2e7 205a862 4bce2e7 205a862 9c102f5 205a862 4bce2e7 205a862 4bce2e7 205a862 | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 | from datetime import datetime
from pathlib import Path
from urllib.parse import quote
import re
from fastapi import FastAPI, Request
from fastapi.staticfiles import StaticFiles
from pydantic import BaseModel
from app.model import generate_image
from app.schemas import GenerateRequest, GenerateResponse
app = FastAPI(
title="Tiny SD API",
docs_url="/docs",
redoc_url="/redoc",
openapi_url="/openapi.json",
swagger_ui_parameters={"tryItOutEnabled": True},
)
# Persistent folder inside HF Space workspace
OUTPUT_DIR = Path("/workspace/persistent_outputs")
OUTPUT_DIR.mkdir(parents=True, exist_ok=True)
# Serve generated files publicly
app.mount("/outputs", StaticFiles(directory=str(OUTPUT_DIR)), name="outputs")
@app.get("/")
def root():
return {"message": "Tiny SD API is running"}
@app.post("/generate", response_model=GenerateResponse)
def generate(req: GenerateRequest, request: Request):
prompt = req.prompt
image = generate_image(prompt)
# Sanitize filename
safe_prompt = re.sub(r'[\\/*?:"<>|]', "_", prompt)[:40]
filename = f"{safe_prompt}-{datetime.now().strftime('%Y%m%d_%H%M%S')}.png"
path = OUTPUT_DIR / filename
# Save image locally
image.save(path)
# URL-encode filename for safe HTTP URL
encoded_filename = quote(filename, safe="")
base_url = str(request.base_url).rstrip("/")
return GenerateResponse(
filename=filename, url=f"{base_url}/outputs/{encoded_filename}"
)
|