| 
							 | 
						import gradio as gr | 
					
					
						
						| 
							 | 
						from random import randint | 
					
					
						
						| 
							 | 
						from all_models import models | 
					
					
						
						| 
							 | 
						from datetime import datetime | 
					
					
						
						| 
							 | 
						
 | 
					
					
						
						| 
							 | 
						def get_current_time(): | 
					
					
						
						| 
							 | 
						    now = datetime.now() | 
					
					
						
						| 
							 | 
						    now2 = now | 
					
					
						
						| 
							 | 
						    current_time = now2.strftime("%Y-%m-%d %H:%M:%S") | 
					
					
						
						| 
							 | 
						    ki = f'{current_time}' | 
					
					
						
						| 
							 | 
						    return ki | 
					
					
						
						| 
							 | 
						
 | 
					
					
						
						| 
							 | 
						def load_fn(models): | 
					
					
						
						| 
							 | 
						    global models_load | 
					
					
						
						| 
							 | 
						    models_load = {} | 
					
					
						
						| 
							 | 
						    for model in models: | 
					
					
						
						| 
							 | 
						        if model not in models_load.keys(): | 
					
					
						
						| 
							 | 
						            try: | 
					
					
						
						| 
							 | 
						                m = gr.load(f'models/{model}') | 
					
					
						
						| 
							 | 
						                print(f"Loaded model {model} with interface: {m}") | 
					
					
						
						| 
							 | 
						            except Exception as error: | 
					
					
						
						| 
							 | 
						                m = gr.Interface(lambda txt: None, ['text'], ['image']) | 
					
					
						
						| 
							 | 
						                print(f"Failed to load model {model}: {error}") | 
					
					
						
						| 
							 | 
						            models_load.update({model: m}) | 
					
					
						
						| 
							 | 
						
 | 
					
					
						
						| 
							 | 
						load_fn(models) | 
					
					
						
						| 
							 | 
						
 | 
					
					
						
						| 
							 | 
						num_models = len(models) | 
					
					
						
						| 
							 | 
						default_models = models[:num_models] | 
					
					
						
						| 
							 | 
						
 | 
					
					
						
						| 
							 | 
						def extend_choices(choices): | 
					
					
						
						| 
							 | 
						    return choices + (num_models - len(choices)) * ['NA'] | 
					
					
						
						| 
							 | 
						
 | 
					
					
						
						| 
							 | 
						def update_imgbox(choices): | 
					
					
						
						| 
							 | 
						    choices_plus = extend_choices(choices) | 
					
					
						
						| 
							 | 
						    return [gr.Image(None, label=m, visible=(m != 'NA'), elem_id="custom_image") for m in choices_plus] | 
					
					
						
						| 
							 | 
						
 | 
					
					
						
						| 
							 | 
						def gen_fn(model_str, prompt, negative_prompt, guidance_scale, seed, clip_skip, scheduler, randomize_seed): | 
					
					
						
						| 
							 | 
						    if model_str == 'NA': | 
					
					
						
						| 
							 | 
						        return None | 
					
					
						
						| 
							 | 
						     | 
					
					
						
						| 
							 | 
						    if randomize_seed: | 
					
					
						
						| 
							 | 
						        seed = randint(0, 99999999) | 
					
					
						
						| 
							 | 
						     | 
					
					
						
						| 
							 | 
						    retries = 0 | 
					
					
						
						| 
							 | 
						    while retries < 10: | 
					
					
						
						| 
							 | 
						        try: | 
					
					
						
						| 
							 | 
						            noise = str(seed) | 
					
					
						
						| 
							 | 
						            full_prompt = f"{prompt} {noise}" | 
					
					
						
						| 
							 | 
						             | 
					
					
						
						| 
							 | 
						            if negative_prompt: | 
					
					
						
						| 
							 | 
						                full_prompt += f" --negative_prompt {negative_prompt}" | 
					
					
						
						| 
							 | 
						             | 
					
					
						
						| 
							 | 
						            if guidance_scale: | 
					
					
						
						| 
							 | 
						                full_prompt += f" --guidance_scale {guidance_scale}" | 
					
					
						
						| 
							 | 
						             | 
					
					
						
						| 
							 | 
						            if clip_skip: | 
					
					
						
						| 
							 | 
						                full_prompt += f" --clip_skip {clip_skip}" | 
					
					
						
						| 
							 | 
						             | 
					
					
						
						| 
							 | 
						            if scheduler: | 
					
					
						
						| 
							 | 
						                full_prompt += f" --scheduler {scheduler}" | 
					
					
						
						| 
							 | 
						             | 
					
					
						
						| 
							 | 
						            result = models_load[model_str](full_prompt) | 
					
					
						
						| 
							 | 
						            return result | 
					
					
						
						| 
							 | 
						        except Exception as e: | 
					
					
						
						| 
							 | 
						             | 
					
					
						
						| 
							 | 
						            if "CUDA out of memory" in str(e) or "500" in str(e): | 
					
					
						
						| 
							 | 
						                print(f"CUDA out of memory or server error: {e}") | 
					
					
						
						| 
							 | 
						            else: | 
					
					
						
						| 
							 | 
						                print(f"Error generating image: {e}") | 
					
					
						
						| 
							 | 
						             | 
					
					
						
						| 
							 | 
						            retries += 1 | 
					
					
						
						| 
							 | 
						            if retries >= 10: | 
					
					
						
						| 
							 | 
						                raise Exception(f"Failed to generate image after 10 retries.") | 
					
					
						
						| 
							 | 
						     | 
					
					
						
						| 
							 | 
						    return None | 
					
					
						
						| 
							 | 
						
 | 
					
					
						
						| 
							 | 
						def make_me(): | 
					
					
						
						| 
							 | 
						    with gr.Row(): | 
					
					
						
						| 
							 | 
						        with gr.Column(scale=1): | 
					
					
						
						| 
							 | 
						            txt_input = gr.Textbox(label='Your prompt:', lines=3, container=False, elem_id="custom_textbox", placeholder="Prompt") | 
					
					
						
						| 
							 | 
						            negative_txt_input = gr.Textbox(label='Negative prompt:', lines=3, container=False, elem_id="custom_negative_textbox", placeholder="Negative Prompt") | 
					
					
						
						| 
							 | 
						            with gr.Row(): | 
					
					
						
						| 
							 | 
						                gen_button = gr.Button('Generate images', elem_id="custom_gen_button") | 
					
					
						
						| 
							 | 
						                stop_button = gr.Button('Stop', variant='secondary', interactive=False, elem_id="custom_stop_button") | 
					
					
						
						| 
							 | 
						                 | 
					
					
						
						| 
							 | 
						                def on_generate_click(): | 
					
					
						
						| 
							 | 
						                    return gr.Button('Generate images', elem_id="custom_gen_button"), gr.Button('Stop', variant='secondary', interactive=True, elem_id="custom_stop_button") | 
					
					
						
						| 
							 | 
						                 | 
					
					
						
						| 
							 | 
						                def on_stop_click(): | 
					
					
						
						| 
							 | 
						                    return gr.Button('Generate images', elem_id="custom_gen_button"), gr.Button('Stop', variant='secondary', interactive=False, elem_id="custom_stop_button") | 
					
					
						
						| 
							 | 
						                 | 
					
					
						
						| 
							 | 
						                gen_button.click(on_generate_click, inputs=None, outputs=[gen_button, stop_button]) | 
					
					
						
						| 
							 | 
						                stop_button.click(on_stop_click, inputs=None, outputs=[gen_button, stop_button]) | 
					
					
						
						| 
							 | 
						     | 
					
					
						
						| 
							 | 
						    with gr.Row(): | 
					
					
						
						| 
							 | 
						        guidance_scale = gr.Slider(minimum=0, maximum=20, step=0.1, label='Guidance Scale', value=7.5) | 
					
					
						
						| 
							 | 
						        seed = gr.Slider(minimum=0, maximum=99999999, step=1, label='Seed', value=randint(0, 99999999)) | 
					
					
						
						| 
							 | 
						        clip_skip = gr.Slider(minimum=0, maximum=5, step=1, label='CLIP Skip', value=1) | 
					
					
						
						| 
							 | 
						        scheduler = gr.Dropdown(['DDIM', 'PNDM', 'LMSDiscrete', 'EulerAncestralDiscrete', 'DPMSolverMultistep', 'HeunDiscrete', 'EulerDiscrete', 'DPMSolverSinglestep', 'DEISMultistep', 'UniPCMultistep'], label='Scheduler', value='DDIM') | 
					
					
						
						| 
							 | 
						        randomize_seed = gr.Checkbox(label='Randomize Seed', value=False) | 
					
					
						
						| 
							 | 
						     | 
					
					
						
						| 
							 | 
						    with gr.Row(): | 
					
					
						
						| 
							 | 
						        output = [gr.Image(label=m, min_width=250, height=250, elem_id="custom_image") for m in default_models] | 
					
					
						
						| 
							 | 
						        current_models = [gr.Textbox(m, visible=False) for m in default_models] | 
					
					
						
						| 
							 | 
						        for m, o in zip(current_models, output): | 
					
					
						
						| 
							 | 
						            gen_event = gen_button.click(gen_fn, [m, txt_input, negative_txt_input, guidance_scale, seed, clip_skip, scheduler, randomize_seed], o) | 
					
					
						
						| 
							 | 
						            stop_button.click(on_stop_click, inputs=None, outputs=[gen_button, stop_button], cancels=[gen_event]) | 
					
					
						
						| 
							 | 
						     | 
					
					
						
						| 
							 | 
						    with gr.Accordion('Model selection', elem_id="custom_accordion"): | 
					
					
						
						| 
							 | 
						        model_choice = gr.CheckboxGroup(models, label=f'{num_models} different models selected', value=default_models, interactive=True, elem_id="custom_checkbox_group") | 
					
					
						
						| 
							 | 
						        model_choice.change(update_imgbox, model_choice, output) | 
					
					
						
						| 
							 | 
						        model_choice.change(extend_choices, model_choice, current_models) | 
					
					
						
						| 
							 | 
						     | 
					
					
						
						| 
							 | 
						    with gr.Row(): | 
					
					
						
						| 
							 | 
						        gr.HTML("") | 
					
					
						
						| 
							 | 
						
 | 
					
					
						
						| 
							 | 
						custom_css = """ | 
					
					
						
						| 
							 | 
						:root { | 
					
					
						
						| 
							 | 
						    --body-background-fill: #2d3d4f; | 
					
					
						
						| 
							 | 
						} | 
					
					
						
						| 
							 | 
						body { | 
					
					
						
						| 
							 | 
						    background-color: var(--body-background-fill) !important; | 
					
					
						
						| 
							 | 
						    color: #2d3d4f; | 
					
					
						
						| 
							 | 
						    margin: 0; | 
					
					
						
						| 
							 | 
						    padding: 0; | 
					
					
						
						| 
							 | 
						    font-family: Arial, sans-serif; | 
					
					
						
						| 
							 | 
						    height: 100vh; | 
					
					
						
						| 
							 | 
						    overflow-y: auto; | 
					
					
						
						| 
							 | 
						} | 
					
					
						
						| 
							 | 
						.gradio-container { | 
					
					
						
						| 
							 | 
						    background-color: #2d3d4f; | 
					
					
						
						| 
							 | 
						    color: #c5c6c7; | 
					
					
						
						| 
							 | 
						    padding: 20px; | 
					
					
						
						| 
							 | 
						    border-radius: 8px; | 
					
					
						
						| 
							 | 
						    box-shadow: 0 4px 8px rgba(0, 0, 0, 0.2); | 
					
					
						
						| 
							 | 
						    width: 100%; | 
					
					
						
						| 
							 | 
						    max-width: 1200px; | 
					
					
						
						| 
							 | 
						    margin: 20px auto; | 
					
					
						
						| 
							 | 
						    display: block; | 
					
					
						
						| 
							 | 
						    min-height: 100vh; | 
					
					
						
						| 
							 | 
						} | 
					
					
						
						| 
							 | 
						.app_title { | 
					
					
						
						| 
							 | 
						    background-color: #2d3d4f; | 
					
					
						
						| 
							 | 
						    color: #c5c6c7; | 
					
					
						
						| 
							 | 
						    padding: 10px 20px; | 
					
					
						
						| 
							 | 
						    border-bottom: 1px solid #3b4252; | 
					
					
						
						| 
							 | 
						    text-align: center; | 
					
					
						
						| 
							 | 
						    font-size: 24px; | 
					
					
						
						| 
							 | 
						    font-weight: bold; | 
					
					
						
						| 
							 | 
						    width: 100%; | 
					
					
						
						| 
							 | 
						    box-sizing: border-box; | 
					
					
						
						| 
							 | 
						    margin-bottom: 20px; | 
					
					
						
						| 
							 | 
						} | 
					
					
						
						| 
							 | 
						.custom_textbox, .custom_negative_textbox { | 
					
					
						
						| 
							 | 
						    background-color: #2d343f; | 
					
					
						
						| 
							 | 
						    border: 1px solid #3b4252; | 
					
					
						
						| 
							 | 
						    color: #7f8184; | 
					
					
						
						| 
							 | 
						    padding: 10px; | 
					
					
						
						| 
							 | 
						    border-radius: 4px; | 
					
					
						
						| 
							 | 
						    margin-bottom: 10px; | 
					
					
						
						| 
							 | 
						    width: 100%; | 
					
					
						
						| 
							 | 
						    box-sizing: border-box; | 
					
					
						
						| 
							 | 
						} | 
					
					
						
						| 
							 | 
						.custom_gen_button { | 
					
					
						
						| 
							 | 
						    background-color: #8b38ff; | 
					
					
						
						| 
							 | 
						    border: 1px solid #ffffff; | 
					
					
						
						| 
							 | 
						    color: blue; | 
					
					
						
						| 
							 | 
						    padding: 15px 32px; | 
					
					
						
						| 
							 | 
						    text-align: center; | 
					
					
						
						| 
							 | 
						    text-decoration: none; | 
					
					
						
						| 
							 | 
						    display: inline-block; | 
					
					
						
						| 
							 | 
						    font-size: 16px; | 
					
					
						
						| 
							 | 
						    margin: 4px 2px; | 
					
					
						
						| 
							 | 
						    cursor: pointer; | 
					
					
						
						| 
							 | 
						    box-shadow: 0 4px 8px rgba(0, 0, 0, 0.2); | 
					
					
						
						| 
							 | 
						    transition: transform 0.2s, box-shadow 0.2s; | 
					
					
						
						| 
							 | 
						    border-radius: 4px; | 
					
					
						
						| 
							 | 
						} | 
					
					
						
						| 
							 | 
						.custom_gen_button:hover { | 
					
					
						
						| 
							 | 
						    transform: translateY(-2px); | 
					
					
						
						| 
							 | 
						    box-shadow: 0 6px 10px rgba(0, 0, 0, 0.3); | 
					
					
						
						| 
							 | 
						} | 
					
					
						
						| 
							 | 
						.custom_stop_button { | 
					
					
						
						| 
							 | 
						    background-color: #6200ea; | 
					
					
						
						| 
							 | 
						    border: 1px solid #ffffff; | 
					
					
						
						| 
							 | 
						    color: blue; | 
					
					
						
						| 
							 | 
						    padding: 15px 32px; | 
					
					
						
						| 
							 | 
						    text-align: center; | 
					
					
						
						| 
							 | 
						    text-decoration: none; | 
					
					
						
						| 
							 | 
						    display: inline-block; | 
					
					
						
						| 
							 | 
						    font-size: 16px; | 
					
					
						
						| 
							 | 
						    margin: 4px 2px; | 
					
					
						
						| 
							 | 
						    cursor: pointer; | 
					
					
						
						| 
							 | 
						    box-shadow: 0 4px 8px rgba(0, 0, 0, 0.2); | 
					
					
						
						| 
							 | 
						    transition: transform 0.2s, box-shadow 0.2s; | 
					
					
						
						| 
							 | 
						    border-radius: 4px; | 
					
					
						
						| 
							 | 
						} | 
					
					
						
						| 
							 | 
						.custom_stop_button:hover { | 
					
					
						
						| 
							 | 
						    transform: translateY(-2px); | 
					
					
						
						| 
							 | 
						    box-shadow: 0 6px 10px rgba(0, 0, 0, 0.3); | 
					
					
						
						| 
							 | 
						} | 
					
					
						
						| 
							 | 
						.custom_image { | 
					
					
						
						| 
							 | 
						    border: 1px solid #3b4252; | 
					
					
						
						| 
							 | 
						    background-color: #2d343f; | 
					
					
						
						| 
							 | 
						    border-radius: 4px; | 
					
					
						
						| 
							 | 
						    margin: 10px; | 
					
					
						
						| 
							 | 
						    max-width: 100%; | 
					
					
						
						| 
							 | 
						    box-sizing: border-box; | 
					
					
						
						| 
							 | 
						} | 
					
					
						
						| 
							 | 
						.custom_accordion { | 
					
					
						
						| 
							 | 
						    background-color: #2d3d4f; | 
					
					
						
						| 
							 | 
						    color: #7f8184; | 
					
					
						
						| 
							 | 
						    border: 1px solid #3b4252; | 
					
					
						
						| 
							 | 
						    border-radius: 4px; | 
					
					
						
						| 
							 | 
						    margin-top: 20px; | 
					
					
						
						| 
							 | 
						    width: 100%; | 
					
					
						
						| 
							 | 
						    box-sizing: border-box; | 
					
					
						
						| 
							 | 
						    transition: margin 0.2s ease; | 
					
					
						
						| 
							 | 
						} | 
					
					
						
						| 
							 | 
						.custom_accordion .gr-accordion-header { | 
					
					
						
						| 
							 | 
						    background-color: #2d3d4f; | 
					
					
						
						| 
							 | 
						    color: #7f8184; | 
					
					
						
						| 
							 | 
						    padding: 10px 20px; | 
					
					
						
						| 
							 | 
						    border-bottom: 1px solid #5b6270; | 
					
					
						
						| 
							 | 
						    cursor: pointer; | 
					
					
						
						| 
							 | 
						    font-size: 18px; | 
					
					
						
						| 
							 | 
						    font-weight: bold; | 
					
					
						
						| 
							 | 
						    height: 40px; | 
					
					
						
						| 
							 | 
						    display: flex; | 
					
					
						
						| 
							 | 
						    align-items: center; | 
					
					
						
						| 
							 | 
						} | 
					
					
						
						| 
							 | 
						.custom_accordion .gr-accordion-header:hover { | 
					
					
						
						| 
							 | 
						    background-color: #2d3d4f; | 
					
					
						
						| 
							 | 
						} | 
					
					
						
						| 
							 | 
						.custom_accordion .gr-accordion-content { | 
					
					
						
						| 
							 | 
						    padding: 10px 20px; | 
					
					
						
						| 
							 | 
						    background-color: #2d3d4f; | 
					
					
						
						| 
							 | 
						    border-top: 1px solid #5b6270; | 
					
					
						
						| 
							 | 
						    max-height: 0; | 
					
					
						
						| 
							 | 
						    overflow: hidden; | 
					
					
						
						| 
							 | 
						    transition: max-height 0.2s ease; | 
					
					
						
						| 
							 | 
						} | 
					
					
						
						| 
							 | 
						.custom_accordion .gr-accordion-content.open { | 
					
					
						
						| 
							 | 
						    max-height: 500px; | 
					
					
						
						| 
							 | 
						} | 
					
					
						
						| 
							 | 
						.custom_checkbox_group { | 
					
					
						
						| 
							 | 
						    background-color: #2d343f; | 
					
					
						
						| 
							 | 
						    border: 1px solid #3b4252; | 
					
					
						
						| 
							 | 
						    color: #7f8184; | 
					
					
						
						| 
							 | 
						    border-radius: 4px; | 
					
					
						
						| 
							 | 
						    padding: 10px; | 
					
					
						
						| 
							 | 
						    width: 100%; | 
					
					
						
						| 
							 | 
						    box-sizing: border-box; | 
					
					
						
						| 
							 | 
						} | 
					
					
						
						| 
							 | 
						@media (max-width: 768px) { | 
					
					
						
						| 
							 | 
						   .gradio-container { | 
					
					
						
						| 
							 | 
						        width: 100%; | 
					
					
						
						| 
							 | 
						        margin: 0; | 
					
					
						
						| 
							 | 
						        padding: 10px; | 
					
					
						
						| 
							 | 
						    } | 
					
					
						
						| 
							 | 
						   .custom_textbox, .custom_negative_textbox, .custom_image, .custom_checkbox_group { | 
					
					
						
						| 
							 | 
						        width: 100%; | 
					
					
						
						| 
							 | 
						        box-sizing: border-box; | 
					
					
						
						| 
							 | 
						    } | 
					
					
						
						| 
							 | 
						} | 
					
					
						
						| 
							 | 
						""" | 
					
					
						
						| 
							 | 
						
 | 
					
					
						
						| 
							 | 
						with gr.Blocks(css=custom_css) as demo:  | 
					
					
						
						| 
							 | 
						    make_me() | 
					
					
						
						| 
							 | 
						
 | 
					
					
						
						| 
							 | 
						demo.queue(concurrency_count=500) | 
					
					
						
						| 
							 | 
						demo.launch() |