Spaces:
Paused
Paused
| from fastapi import FastAPI, HTTPException | |
| from pydantic import BaseModel | |
| import requests | |
| import random | |
| import os | |
| from fastapi.responses import Response | |
| app = FastAPI() | |
| API_URL = f'https://api-inference.huggingface.co/models/{os.getenv("HF_MODEL")}' | |
| headers = {'Authorization': f'Bearer {os.getenv("HF_TOKEN")}'} | |
| timeout = 100 | |
| class ImageRequest(BaseModel): | |
| prompt: str | |
| negative_prompt: str = "(deformed, distorted, disfigured), poorly drawn, bad anatomy" | |
| steps: int = 4 | |
| cfg_scale: float = 7.0 | |
| sampler: str = "DPM++ 2M Karras" | |
| seed: int = -1 | |
| strength: float = 0.7 | |
| def query(prompt: str, negative_prompt: str, steps: int, cfg_scale: float, | |
| sampler: str, seed: int, strength: float): | |
| if not prompt: | |
| raise HTTPException(status_code=400, detail="Prompt is required") | |
| payload = { | |
| "inputs": prompt, | |
| "is_negative": bool(negative_prompt), | |
| "steps": steps, | |
| "cfg_scale": cfg_scale, | |
| "seed": seed if seed != -1 else random.randint(1, 1000000000), | |
| "strength": strength | |
| } | |
| if negative_prompt: | |
| payload["negative_prompt"] = negative_prompt | |
| response = requests.post(API_URL, headers=headers, json=payload, timeout=timeout) | |
| if response.status_code != 200: | |
| raise HTTPException(status_code=response.status_code, detail=response.text) | |
| return response.content | |
| async def generate_image(request: ImageRequest): | |
| try: | |
| raw_data = query( | |
| prompt=request.prompt, | |
| negative_prompt=request.negative_prompt, | |
| steps=request.steps, | |
| cfg_scale=request.cfg_scale, | |
| sampler=request.sampler, | |
| seed=request.seed, | |
| strength=request.strength | |
| ) | |
| return Response(content=raw_data, media_type="application/octet-stream") | |
| except HTTPException as e: | |
| raise e | |
| except Exception as e: | |
| raise HTTPException(status_code=500, detail=str(e)) |