Spaces:
Sleeping
Sleeping
| from fastapi import FastAPI | |
| from fastapi.responses import FileResponse | |
| from pydantic import BaseModel | |
| from diffusers import AutoPipelineForText2Image | |
| import torch | |
| import uuid | |
| import os | |
| # -------------------------------------------------- | |
| # 1. Create FastAPI app | |
| # -------------------------------------------------- | |
| app = FastAPI(title="Text to Image API (SDXL Turbo)") | |
| # -------------------------------------------------- | |
| # 2. Device & dtype | |
| # -------------------------------------------------- | |
| DEVICE = "cuda" if torch.cuda.is_available() else "cpu" | |
| DTYPE = torch.float16 if DEVICE == "cuda" else torch.float32 | |
| MODEL_ID = "stabilityai/sdxl-turbo" | |
| # -------------------------------------------------- | |
| # 3. Load model once | |
| # -------------------------------------------------- | |
| pipe = AutoPipelineForText2Image.from_pretrained( | |
| MODEL_ID, | |
| torch_dtype=DTYPE, | |
| variant="fp16" if DEVICE == "cuda" else None | |
| ) | |
| pipe = pipe.to(DEVICE) | |
| # -------------------------------------------------- | |
| # 4. Output directory | |
| # -------------------------------------------------- | |
| OUTPUT_DIR = "outputs" | |
| os.makedirs(OUTPUT_DIR, exist_ok=True) | |
| # -------------------------------------------------- | |
| # 5. Request schema | |
| # -------------------------------------------------- | |
| class PromptRequest(BaseModel): | |
| prompt: str | |
| # -------------------------------------------------- | |
| # 6. Health check | |
| # -------------------------------------------------- | |
| def root(): | |
| return {"status": "ok", "message": "SDXL Turbo API is running"} | |
| # -------------------------------------------------- | |
| # 7. Image generation endpoint | |
| # -------------------------------------------------- | |
| def generate_image(request: PromptRequest): | |
| result = pipe( | |
| prompt=request.prompt, | |
| num_inference_steps=4, | |
| guidance_scale=0.0 | |
| ) | |
| image = result.images[0] | |
| filename = f"{uuid.uuid4()}.png" | |
| filepath = os.path.join(OUTPUT_DIR, filename) | |
| image.save(filepath) | |
| return FileResponse( | |
| filepath, | |
| media_type="image/png", | |
| filename="generated.png" | |
| ) | |