| import platform |
|
|
| import uvicorn |
| from fastapi import FastAPI |
| from fastapi.middleware.cors import CORSMiddleware |
|
|
| from backend.api.models.response import StableDiffusionResponse |
| from backend.base64_image import base64_image_to_pil, pil_image_to_base64_str |
| from backend.device import get_device_name |
| from backend.models.device import DeviceInfo |
| from backend.models.lcmdiffusion_setting import DiffusionTask, LCMDiffusionSetting |
| from constants import APP_VERSION, DEVICE |
| from context import Context |
| from models.interface_types import InterfaceType |
| from state import get_settings |
|
|
| app_settings = get_settings() |
| app = FastAPI( |
| title="FastSD CPU", |
| description="Fast stable diffusion on CPU", |
| version=APP_VERSION, |
| license_info={ |
| "name": "MIT", |
| "identifier": "MIT", |
| }, |
| docs_url="/api/docs", |
| redoc_url="/api/redoc", |
| openapi_url="/api/openapi.json", |
| ) |
| print(app_settings.settings.lcm_diffusion_setting) |
| origins = ["*"] |
| app.add_middleware( |
| CORSMiddleware, |
| allow_origins=origins, |
| allow_credentials=True, |
| allow_methods=["*"], |
| allow_headers=["*"], |
| ) |
| context = Context(InterfaceType.API_SERVER) |
|
|
|
|
| @app.get("/api/") |
| async def root(): |
| return {"message": "Welcome to FastSD CPU API"} |
|
|
|
|
| @app.get( |
| "/api/info", |
| description="Get system information", |
| summary="Get system information", |
| ) |
| async def info(): |
| device_info = DeviceInfo( |
| device_type=DEVICE, |
| device_name=get_device_name(), |
| os=platform.system(), |
| platform=platform.platform(), |
| processor=platform.processor(), |
| ) |
| return device_info.model_dump() |
|
|
|
|
| @app.get( |
| "/api/config", |
| description="Get current configuration", |
| summary="Get configurations", |
| ) |
| async def config(): |
| return app_settings.settings |
|
|
|
|
| @app.get( |
| "/api/models", |
| description="Get available models", |
| summary="Get available models", |
| ) |
| async def models(): |
| return { |
| "lcm_lora_models": app_settings.lcm_lora_models, |
| "stable_diffusion": app_settings.stable_diffsuion_models, |
| "openvino_models": app_settings.openvino_lcm_models, |
| "lcm_models": app_settings.lcm_models, |
| } |
|
|
|
|
| @app.post( |
| "/api/generate", |
| description="Generate image(Text to image,Image to Image)", |
| summary="Generate image(Text to image,Image to Image)", |
| ) |
| async def generate(diffusion_config: LCMDiffusionSetting) -> StableDiffusionResponse: |
| app_settings.settings.lcm_diffusion_setting = diffusion_config |
| if diffusion_config.diffusion_task == DiffusionTask.image_to_image: |
| app_settings.settings.lcm_diffusion_setting.init_image = base64_image_to_pil( |
| diffusion_config.init_image |
| ) |
|
|
| images = context.generate_text_to_image(app_settings.settings) |
|
|
| if images: |
| images_base64 = [pil_image_to_base64_str(img) for img in images] |
| else: |
| images_base64 = [] |
| return StableDiffusionResponse( |
| latency=round(context.latency, 2), |
| images=images_base64, |
| error=context.error, |
| ) |
|
|
|
|
| def start_web_server(port: int = 8000): |
| uvicorn.run( |
| app, |
| host="0.0.0.0", |
| port=port, |
| ) |
|
|