Surn's picture
Add MCP Server
f71c416
#!/usr/bin/env python
import json
import pathlib
import tempfile
from pathlib import Path
import numpy as np
import gradio as gr
import src.gradio_user_history as gr_user_history
from modules.version_info import versions_html
from gradio_client import Client
#from gradio_space_ci import enable_space_ci
#enable_space_ci()
client = Client("multimodalart/stable-diffusion-3.5-large-turboX")
def generate(prompt: str, negprompt: str, seed: int, randomize_seed: bool, profile: gr.OAuthProfile | None) -> list[str | None]:
# API call to the new endpoint
# The result is a tuple, where the first element is a dictionary containing image information
# and the second element is the seed.
if randomize_seed:
actual_seed = np.random.randint(0, 2147483647 + 1) # Use 2147483647 as MAX_SEED, +1 because randint is exclusive for the upper bound
else:
actual_seed = seed
result = client.predict(
prompt=prompt, # str in 'Prompt' Textbox component
negative_prompt=negprompt, # str in 'Negative prompt' Textbox component
seed=actual_seed, # float (numeric value between 0 and 2147483647) in 'Seed' Slider component
randomize_seed=randomize_seed, # bool in 'Randomize seed' Checkbox component
width=1024, # float (numeric value between 1024 and 1536) in 'Width' Slider component
height=1024, # float (numeric value between 1024 and 1536) in 'Height' Slider component
guidance_scale=1.5, # float (numeric value between 0 and 20) in 'Guidance scale' Slider component
num_inference_steps=8, # float (numeric value between 4 and 12) in 'Number of inference steps' Slider component
api_name="/infer"
)
generated_img_path: str | None = result[0] # Extracting the image path safely
returned_seed = result[1] # Extracting the seed from the result
metadata = {
"prompt": prompt,
"negative_prompt": negprompt,
"seed": returned_seed, # Using the seed returned by the API
"randomize_seed": randomize_seed,
"width": 1024,
"height": 1024,
"guidance_scale": 1.5,
"num_inference_steps": 8,
"timestamp": str(datetime.datetime.now()),
}
with tempfile.NamedTemporaryFile(mode="w", suffix=".json", delete=False) as metadata_file:
json.dump(metadata, metadata_file)
# Saving user history
# Ensure generated_img_path is not None if save_image expects a valid path
if generated_img_path:
gr_user_history.save_image(label=prompt, image=generated_img_path, profile=profile, metadata=metadata)
return [generated_img_path]
with gr.Blocks(css="style.css") as demo:
with gr.Group():
prompt = gr.Text(show_label=False, placeholder="Prompt")
negprompt = gr.Text(show_label=False, placeholder="Negative Prompt")
# Add Seed Slider and Randomize Seed Checkbox
with gr.Row():
seed_slider = gr.Slider(minimum=0, maximum=2147483647, step=1, label="Seed", value=0, scale=4)
randomize_checkbox = gr.Checkbox(label="Randomize seed", value=True, scale=1)
gallery = gr.Gallery(
show_label=False,
columns=2,
rows=2,
height="600px",
object_fit="scale-down",
)
submit_button = gr.Button("Generate")
submit_button.click(fn=generate, inputs=[prompt, negprompt, seed_slider, randomize_checkbox], outputs=gallery)
prompt.submit(fn=generate, inputs=[prompt, negprompt, seed_slider, randomize_checkbox], outputs=gallery)
with gr.Blocks(theme='Surn/beeuty@==0.5.25') as demo_with_history:
with gr.Tab("README"):
gr.Markdown(Path("README.md").read_text(encoding="utf-8").split("---")[-1])
with gr.Tab("Demo"):
demo.render()
with gr.Tab("Past generations"):
gr_user_history.setup(display_type="image_path") # optional, this is where you would set the display type = "video_path" if you want to display videos
gr_user_history.render()
with gr.Row("Versions") as versions_row:
gr.HTML(value=versions_html(), visible=True, elem_id="versions")
if __name__ == "__main__":
launch_args = {}
launch_kwargs = {}
launch_kwargs['allowed_paths'] = ["assets/", "data/_user_history", "/data/_user_history/Surn"]
launch_kwargs['favicon_path'] = "assets/favicon.ico"
launch_kwargs['mcp_server'] = True # Enable MCP server
#launch_kwargs['inbrowser'] = True
demo_with_history.queue().launch(**launch_kwargs)