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)