Spaces:
Running
Running
File size: 9,937 Bytes
d1cdee2 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 |
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) |