Spaces:
Running
Running
import gradio as gr | |
import random | |
import time | |
# Define dummy loras list for the gallery | |
loras = [ | |
{"repo": "stabilityai/stable-diffusion-xl-base-1.0", "image": "https://huggingface.co/spaces/reach-vb/Blazingly-fast-LoRA/resolve/main/flux_lora.png", "title": "SDXL Base 1.0"}, | |
{"repo": "stabilityai/sdxl-turbo", "image": "https://huggingface.co/stabilityai/sdxl-turbo/resolve/main/banner.png", "title": "SDXL Turbo"}, | |
{"repo": "runwayml/stable-diffusion-v1-5", "image": "https://huggingface.co/runwayml/stable-diffusion-v1-5/resolve/main/sd-v1-5.png", "title": "SD 1.5"}, | |
{"repo": "SG161222/Realistic_Vision_V5.1_noVAE", "image": "https://huggingface.co/SG161222/Realistic_Vision_V5.1_noVAE/resolve/main/realistic_vision_v5.1.png", "title": "Realistic Vision V5.1"}, | |
{"repo": "gsdf/Counterfeit-V3.0", "image": "https://huggingface.co/gsdf/Counterfeit-V3.0/resolve/main/cf3.jpg", "title": "Counterfeit V3.0"}, | |
{"repo": "digiplay/AbsoluteReality_v1.8.1", "image": "https://huggingface.co/digiplay/AbsoluteReality_v1.8.1/resolve/main/ar.jpg", "title": "Absolute Reality v1.8.1"} | |
] | |
# Custom CSS | |
css = """ | |
#title { text-align: center; margin-bottom: 10px; } | |
#gallery {min-height: 450px; max-height: 650px; overflow-y: auto;} | |
#gen_column {display: flex; align-items: flex-end; margin-bottom: 0.5rem;} | |
#gen_btn {margin-bottom: 0.5rem; max-width: 100%;} | |
#lora_list {font-size: 0.8em; margin-top: 0.5rem;} | |
#progress {text-align: center; margin-top: 0.8rem;} | |
""" | |
font = "Montserrat" | |
# Dummy function to update selection | |
def update_selection(evt: gr.SelectData): | |
"""Update the UI when a model is selected from the gallery""" | |
selected_index = evt.index | |
selected_lora = loras[selected_index] | |
# Get the model name to display | |
model_title = selected_lora.get("title", selected_lora["repo"].split('/')[-1]) | |
# Create an informative text about the selected model | |
info_text = f"Selected model: **{model_title}**\n\nModel ID: `{selected_lora['repo']}`" | |
# Return with appropriate placeholder text for the prompt | |
return ( | |
gr.update(placeholder=f"Enter your prompt for {model_title}..."), | |
info_text, | |
selected_index, | |
1024, # Default width | |
1024 # Default height | |
) | |
# Dummy function to add a custom model | |
def add_custom_lora(lora_id): | |
"""Add a custom model from a Hugging Face ID or URL""" | |
if not lora_id or lora_id.strip() == "": | |
return gr.update(), gr.update(visible=False), gr.update(), gr.update(), None, gr.update() | |
# Create a dummy entry for the custom model | |
custom_entry = { | |
"repo": lora_id, | |
"image": "https://huggingface.co/spaces/reach-vb/Blazingly-fast-LoRA/resolve/main/flux_lora.png", # Placeholder image | |
"title": f"Custom: {lora_id.split('/')[-1]}" | |
} | |
# Add the custom entry to the gallery list | |
updated_loras = loras.copy() | |
updated_loras.append(custom_entry) | |
# Create info HTML for the custom model | |
info_html = f""" | |
<div style="padding: 10px; border: 1px solid #ddd; border-radius: 5px; margin-top: 10px;"> | |
<p><b>Custom model added:</b> {lora_id}</p> | |
</div> | |
""" | |
# Create info text for selection | |
info_text = f"Using custom model: **{lora_id}**" | |
# Return with updates | |
return ( | |
gr.update(value=info_html, visible=True), | |
gr.update(visible=True), | |
gr.update(value=[(item.get("image"), item.get("title", item["repo"].split('/')[-1])) for item in updated_loras]), | |
info_text, | |
len(updated_loras) - 1, # Index of the newly added model | |
gr.update(placeholder=f"Enter your prompt for custom model {lora_id.split('/')[-1]}...") | |
) | |
# Dummy function to remove custom model info | |
def remove_custom_lora(): | |
"""Remove custom model information and reset UI""" | |
return ( | |
gr.update(visible=False), | |
gr.update(visible=False), | |
gr.update(value=[(item.get("image"), item.get("title", item["repo"].split('/')[-1])) for item in loras]), | |
"Select a base model or add a custom one below.", | |
None, | |
gr.update(value="") | |
) | |
# Dummy function to generate images | |
def run_lora(prompt, selected_index, seed, width, height): | |
"""Simulate image generation with the selected model""" | |
if selected_index is None: | |
return gr.update(value=None), seed, gr.update(value="Please select a model first.", visible=True) | |
if not prompt or prompt.strip() == "": | |
return gr.update(value=None), seed, gr.update(value="Please enter a prompt.", visible=True) | |
# Show progress bar | |
progress = gr.update(value="Generating your image...", visible=True) | |
# Simulate generation delay | |
time.sleep(2) | |
# If seed is 0, randomize it | |
if seed == 0: | |
seed = random.randint(1, 2147483647) | |
# Get the selected model info | |
model_info = loras[selected_index] if selected_index < len(loras) else {"repo": "custom_model", "title": "Custom Model"} | |
# For dummy purposes, we'll just return the model's image or a placeholder | |
# In a real implementation, you would call an API to generate the image | |
result_image = model_info.get("image", "https://huggingface.co/spaces/reach-vb/Blazingly-fast-LoRA/resolve/main/flux_lora.png") | |
# Hide progress bar | |
progress = gr.update(visible=False) | |
return result_image, seed, progress | |
# Now you can run the app with this code: | |
if __name__ == "__main__": | |
with gr.Blocks(theme=gr.themes.Soft(font=font), css=css) as app: | |
title = gr.HTML( | |
"""<h1><a href="https://huggingface.co/docs/inference-providers/en/index">Blazingly Fast LoRA by Fal & HF (this is a dummy app)</a> 🤗</h1>""", | |
elem_id="title", | |
) | |
title = gr.HTML( | |
"""<h3>This is just a dummy app</h3>""", | |
elem_id="subtitle", | |
) | |
# --- States for parameters previously in Advanced Settings --- | |
selected_index = gr.State(None) | |
width = gr.State(1024) # Default width | |
height = gr.State(1024) # Default height | |
seed = gr.State(0) # Default seed (will be randomized by run_lora) | |
with gr.Row(): | |
with gr.Column(scale=3): | |
prompt = gr.Textbox(label="Prompt", lines=1, placeholder="Type a prompt after selecting a LoRA/Model") | |
with gr.Column(scale=1, elem_id="gen_column"): | |
generate_button = gr.Button("Generate", variant="primary", elem_id="gen_btn") | |
with gr.Row(): | |
with gr.Column(): | |
selected_info = gr.Markdown("Select a base model or add a custom one below.") # Updated initial text | |
gallery = gr.Gallery( | |
# Ensure items have 'image' and 'title' keys, provide fallbacks if needed | |
[(item.get("image"), item.get("title", item["repo"].split('/')[-1])) for item in loras], | |
label="Model Gallery", # Changed label | |
allow_preview=False, | |
columns=3, | |
elem_id="gallery", | |
show_share_button=False | |
) | |
with gr.Group(): | |
custom_lora = gr.Textbox(label="Custom Model", info="Hugging Face model ID (e.g., user/model-name) or URL", placeholder="stabilityai/stable-diffusion-xl-base-1.0") # Updated label/placeholder | |
gr.Markdown("[Check Hugging Face Models](https://huggingface.co/models?inference_provider=fal-ai&pipeline_tag=text-to-image&sort=trending)", elem_id="lora_list") # Updated link/text | |
custom_lora_info = gr.HTML(visible=False) | |
custom_lora_button = gr.Button("Clear custom model info", visible=False) # Changed button text | |
with gr.Column(): | |
# Keep progress bar element, but it will only be shown briefly if API is slow, then hidden by run_lora return | |
progress_bar = gr.Markdown(elem_id="progress", visible=False, value="Generating...") | |
result = gr.Image(label="Generated Image") | |
# Display the seed used for the generation | |
used_seed_display = gr.Textbox(label="Seed Used", value=0, interactive=False) # Display seed used | |
gallery.select( | |
update_selection, | |
inputs=[], # No direct inputs needed, uses evt | |
# Update prompt placeholder, selection text, selected index state, and width/height states | |
outputs=[prompt, selected_info, selected_index, width, height], | |
api_name=False, | |
) | |
# Use submit event for Textbox to trigger add_custom_lora | |
custom_lora.submit( | |
add_custom_lora, | |
inputs=[custom_lora], | |
# Outputs: info card, remove button, gallery, selection text, selected index state, prompt placeholder | |
outputs=[custom_lora_info, custom_lora_button, gallery, selected_info, selected_index, prompt], | |
api_name=False, | |
) | |
custom_lora_button.click( | |
remove_custom_lora, | |
outputs=[custom_lora_info, custom_lora_button, gallery, selected_info, selected_index, custom_lora], # Clear textbox too | |
api_name=False, | |
) | |
gr.on( | |
triggers=[generate_button.click, prompt.submit], | |
fn=run_lora, | |
# Inputs now use state variables for width, height, seed | |
inputs=[prompt, selected_index, seed, width, height], | |
# Outputs: result image, seed state (updated with used seed), progress bar update | |
outputs=[result, seed, progress_bar], | |
api_name=False, | |
).then( | |
# Update the displayed seed value after run_lora completes | |
lambda s: gr.update(value=s), | |
inputs=[seed], | |
outputs=[used_seed_display], | |
api_name=False, | |
) | |
app.queue() | |
app.launch(debug=True, show_api=False) |