tejani commited on
Commit
2a7cfa4
·
verified ·
1 Parent(s): 3bed927

Upload 3 files

Browse files
backend/api/mcp_server.py ADDED
@@ -0,0 +1,95 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import platform
2
+
3
+ import uvicorn
4
+ from backend.device import get_device_name
5
+ from backend.models.device import DeviceInfo
6
+ from constants import APP_VERSION, DEVICE
7
+ from context import Context
8
+ from fastapi import FastAPI, Request
9
+ from fastapi_mcp import FastApiMCP
10
+ from state import get_settings
11
+ from fastapi.middleware.cors import CORSMiddleware
12
+ from models.interface_types import InterfaceType
13
+ from fastapi.staticfiles import StaticFiles
14
+
15
+ app_settings = get_settings()
16
+ app = FastAPI(
17
+ title="FastSD CPU",
18
+ description="Fast stable diffusion on CPU",
19
+ version=APP_VERSION,
20
+ license_info={
21
+ "name": "MIT",
22
+ "identifier": "MIT",
23
+ },
24
+ describe_all_responses=True,
25
+ describe_full_response_schema=True,
26
+ )
27
+ origins = ["*"]
28
+
29
+ app.add_middleware(
30
+ CORSMiddleware,
31
+ allow_origins=origins,
32
+ allow_credentials=True,
33
+ allow_methods=["*"],
34
+ allow_headers=["*"],
35
+ )
36
+
37
+ context = Context(InterfaceType.API_SERVER)
38
+ app.mount("/results", StaticFiles(directory="results"), name="results")
39
+
40
+
41
+ @app.get(
42
+ "/info",
43
+ description="Get system information",
44
+ summary="Get system information",
45
+ operation_id="get_system_info",
46
+ )
47
+ async def info() -> dict:
48
+ device_info = DeviceInfo(
49
+ device_type=DEVICE,
50
+ device_name=get_device_name(),
51
+ os=platform.system(),
52
+ platform=platform.platform(),
53
+ processor=platform.processor(),
54
+ )
55
+ return device_info.model_dump()
56
+
57
+
58
+ @app.post(
59
+ "/generate",
60
+ description="Generate image from text prompt",
61
+ summary="Text to image generation",
62
+ operation_id="generate",
63
+ )
64
+ async def generate(
65
+ prompt: str,
66
+ request: Request,
67
+ ) -> str:
68
+ """
69
+ Returns URL of the generated image for text prompt
70
+ """
71
+ app_settings.settings.lcm_diffusion_setting.prompt = prompt
72
+ images = context.generate_text_to_image(app_settings.settings)
73
+ image_names = context.save_images(
74
+ images,
75
+ app_settings.settings,
76
+ )
77
+ url = request.url_for("results", path=image_names[0])
78
+ image_url = f"The generated image available at the URL {url}"
79
+ return image_url
80
+
81
+
82
+ def start_mcp_server(port: int = 8000):
83
+ print(f"Starting MCP server on port {port}...")
84
+ mcp = FastApiMCP(
85
+ app,
86
+ name="FastSDCPU MCP",
87
+ description="MCP server for FastSD CPU API",
88
+ )
89
+
90
+ mcp.mount()
91
+ uvicorn.run(
92
+ app,
93
+ host="0.0.0.0",
94
+ port=port,
95
+ )
backend/api/models/response.py ADDED
@@ -0,0 +1,18 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ from typing import List
2
+
3
+ from pydantic import BaseModel
4
+
5
+
6
+ class StableDiffusionResponse(BaseModel):
7
+ """
8
+ Stable diffusion response model
9
+
10
+ Attributes:
11
+ images (List[str]): List of JPEG image as base64 encoded
12
+ latency (float): Latency in seconds
13
+ error (str): Error message if any
14
+ """
15
+
16
+ images: List[str]
17
+ latency: float
18
+ error: str = ""
backend/api/web.py ADDED
@@ -0,0 +1,116 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import platform
2
+
3
+ import uvicorn
4
+ from fastapi import FastAPI
5
+ from fastapi.middleware.cors import CORSMiddleware
6
+
7
+ from backend.api.models.response import StableDiffusionResponse
8
+ from backend.base64_image import base64_image_to_pil, pil_image_to_base64_str
9
+ from backend.device import get_device_name
10
+ from backend.models.device import DeviceInfo
11
+ from backend.models.lcmdiffusion_setting import DiffusionTask, LCMDiffusionSetting
12
+ from constants import APP_VERSION, DEVICE
13
+ from context import Context
14
+ from models.interface_types import InterfaceType
15
+ from state import get_settings
16
+
17
+ app_settings = get_settings()
18
+ app = FastAPI(
19
+ title="FastSD CPU",
20
+ description="Fast stable diffusion on CPU",
21
+ version=APP_VERSION,
22
+ license_info={
23
+ "name": "MIT",
24
+ "identifier": "MIT",
25
+ },
26
+ docs_url="/api/docs",
27
+ redoc_url="/api/redoc",
28
+ openapi_url="/api/openapi.json",
29
+ )
30
+ print(app_settings.settings.lcm_diffusion_setting)
31
+ origins = ["*"]
32
+ app.add_middleware(
33
+ CORSMiddleware,
34
+ allow_origins=origins,
35
+ allow_credentials=True,
36
+ allow_methods=["*"],
37
+ allow_headers=["*"],
38
+ )
39
+ context = Context(InterfaceType.API_SERVER)
40
+
41
+
42
+ @app.get("/api/")
43
+ async def root():
44
+ return {"message": "Welcome to FastSD CPU API"}
45
+
46
+
47
+ @app.get(
48
+ "/api/info",
49
+ description="Get system information",
50
+ summary="Get system information",
51
+ )
52
+ async def info():
53
+ device_info = DeviceInfo(
54
+ device_type=DEVICE,
55
+ device_name=get_device_name(),
56
+ os=platform.system(),
57
+ platform=platform.platform(),
58
+ processor=platform.processor(),
59
+ )
60
+ return device_info.model_dump()
61
+
62
+
63
+ @app.get(
64
+ "/api/config",
65
+ description="Get current configuration",
66
+ summary="Get configurations",
67
+ )
68
+ async def config():
69
+ return app_settings.settings
70
+
71
+
72
+ @app.get(
73
+ "/api/models",
74
+ description="Get available models",
75
+ summary="Get available models",
76
+ )
77
+ async def models():
78
+ return {
79
+ "lcm_lora_models": app_settings.lcm_lora_models,
80
+ "stable_diffusion": app_settings.stable_diffsuion_models,
81
+ "openvino_models": app_settings.openvino_lcm_models,
82
+ "lcm_models": app_settings.lcm_models,
83
+ }
84
+
85
+
86
+ @app.post(
87
+ "/api/generate",
88
+ description="Generate image(Text to image,Image to Image)",
89
+ summary="Generate image(Text to image,Image to Image)",
90
+ )
91
+ async def generate(diffusion_config: LCMDiffusionSetting) -> StableDiffusionResponse:
92
+ app_settings.settings.lcm_diffusion_setting = diffusion_config
93
+ if diffusion_config.diffusion_task == DiffusionTask.image_to_image:
94
+ app_settings.settings.lcm_diffusion_setting.init_image = base64_image_to_pil(
95
+ diffusion_config.init_image
96
+ )
97
+
98
+ images = context.generate_text_to_image(app_settings.settings)
99
+
100
+ if images:
101
+ images_base64 = [pil_image_to_base64_str(img) for img in images]
102
+ else:
103
+ images_base64 = []
104
+ return StableDiffusionResponse(
105
+ latency=round(context.latency, 2),
106
+ images=images_base64,
107
+ error=context.error,
108
+ )
109
+
110
+
111
+ def start_web_server(port: int = 8000):
112
+ uvicorn.run(
113
+ app,
114
+ host="0.0.0.0",
115
+ port=port,
116
+ )