import gradio as gr from utils import generate_images_simulated # --- Constants --- ANYCODER_LINK = "https://huggingface.co/spaces/akhaliq/anycoder" MODEL_CHOICES = { "Stable Diffusion v1.4 (CompVis)": "CompVis/stable-diffusion-v1-4", "Stable Diffusion 2.1 Base (Manojb)": "Manojb/stable-diffusion-2-1-base" } DEFAULT_MODEL_KEY = list(MODEL_CHOICES.keys())[0] # --- Gradio Logic Wrapper --- def process_generation(prompt: str, negative_prompt: str, model_key: str, steps: float, guidance_scale: float, num_images: float): """ Wrapper function to call the simulated generation logic, translating model key. Args: prompt: The text prompt for generation. negative_prompt: Text prompt to guide the model away from. model_key: The user-friendly name of the selected model. steps: Inference steps. guidance_scale: CFG scale. num_images: Number of images to generate (1-4). Returns: A list of PIL Images for the Gradio Gallery. """ model_name_id = MODEL_CHOICES[model_key] # Note: steps and guidance_scale are floats from the slider, cast to appropriate types results = generate_images_simulated( prompt=prompt, negative_prompt=negative_prompt, model_name=model_name_id, steps=int(steps), guidance_scale=guidance_scale, num_images=int(num_images) ) return results # --- Gradio UI Definition --- with gr.Blocks(title="Stable Diffusion Model Comparison Demo") as demo: # Custom Header gr.HTML( f"""

Stable Diffusion Model Comparison Demo

Compare outputs from Stable Diffusion v1.4 and 2.1 Base. The application handles empty prompts by using a default prompt internally.

Built with anycoder

""" ) with gr.Row(): with gr.Column(scale=2): # --- Inputs --- prompt = gr.Textbox( label="Prompt", placeholder="e.g., A photorealistic image of a vintage robot reading a book in a cozy library, cinematic lighting", value="A majestic portrait of a futuristic cyborg cat, digital art, highly detailed", lines=3 ) negative_prompt = gr.Textbox( label="Negative Prompt (Optional)", placeholder="e.g., blurry, low quality, distorted, bad anatomy, text", lines=2 ) model_selector = gr.Radio( label="Select Model", choices=list(MODEL_CHOICES.keys()), value=DEFAULT_MODEL_KEY, interactive=True ) with gr.Accordion("Generation Parameters", open=True): steps = gr.Slider( minimum=10, maximum=100, step=5, value=50, label="Inference Steps" ) guidance_scale = gr.Slider( minimum=1.0, maximum=15.0, step=0.5, value=7.5, label="Guidance Scale (CFG)" ) num_images = gr.Slider( minimum=1, maximum=4, step=1, value=4, label="Number of Images to Generate", info="Uploads up to 4 images." ) generate_btn = gr.Button("Generate Images", variant="primary") with gr.Column(scale=3): # --- Outputs --- output_gallery = gr.Gallery( label="Generated Images (512x512)", columns=2, rows=2, height="auto", preview=True ) gr.Examples( examples=[ ["A hyper-detailed oil painting of a lighthouse during a storm", "ugly, blurry, low resolution", DEFAULT_MODEL_KEY], ["", "text, watermark, poor rendering", "Stable Diffusion 2.1 Base (Manojb)"], # Empty prompt example ["A 1950s sci-fi movie poster featuring a giant insect attacking Paris", "modern, photorealistic, color photo", DEFAULT_MODEL_KEY] ], inputs=[prompt, negative_prompt, model_selector], label="Examples (Note the second example uses an empty prompt)" ) # --- Logic Binding --- generate_btn.click( fn=process_generation, inputs=[prompt, negative_prompt, model_selector, steps, guidance_scale, num_images], outputs=[output_gallery] ) # Run initial generation on load to populate the gallery immediately demo.load( fn=process_generation, inputs=[prompt, negative_prompt, model_selector, steps, guidance_scale, num_images], outputs=[output_gallery] ) if __name__ == "__main__": demo.launch()