File size: 6,932 Bytes
e547b24
 
 
 
 
 
 
 
 
95e45b2
 
e547b24
95e45b2
e547b24
 
919ba89
e547b24
 
 
 
4d6cbec
 
 
e547b24
 
 
 
9be63af
e547b24
 
4d6cbec
e547b24
6f5a32e
e547b24
4d6cbec
e547b24
6f5a32e
e547b24
4d6cbec
e547b24
 
 
 
 
 
4d6cbec
 
 
 
 
e547b24
 
4d6cbec
e547b24
 
6f5a32e
 
e547b24
 
 
 
 
4d6cbec
e547b24
 
6f5a32e
e547b24
 
6f5a32e
e547b24
 
4d6cbec
e547b24
30e73aa
 
02f8cfa
30e73aa
02f8cfa
 
73f7edc
e547b24
 
a2abc5c
 
 
 
 
 
4d6cbec
30e73aa
4d6cbec
bc84ac0
ff548ac
 
 
 
 
02f8cfa
ff548ac
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
4d6cbec
ff548ac
02f8cfa
27ad521
2392de1
 
 
 
ff548ac
 
 
 
 
 
 
 
e547b24
a2abc5c
 
 
 
 
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
import gradio as gr
import requests
import io
import random
import os
import time
from PIL import Image
from deep_translator import GoogleTranslator
import json
from theme import theme
from fastapi import FastAPI

app = FastAPI()
# Project by Nymbo

API_URL = "https://api-inference.huggingface.co/models/black-forest-labs/FLUX.1-dev"
API_TOKEN = os.getenv("HF_READ_TOKEN")
headers = {"Authorization": f"Bearer {API_TOKEN}"}
timeout = 100

# Function to query the API and return the generated image
def query(prompt, is_negative=False, steps=35, cfg_scale=7, sampler="DPM++ 2M Karras", seed=-1, strength=0.7, width=1024, height=1024):
    if prompt == "" or prompt is None:
        return None

    key = random.randint(0, 999)
    
    API_TOKEN = random.choice([os.getenv("HF_READ_TOKEN")])
    headers = {"Authorization": f"Bearer {API_TOKEN}"}
    
    # Translate the prompt from Russian to English if necessary
    prompt = GoogleTranslator(source='ru', target='en').translate(prompt)
    print(f'\033[1mGeneration {key} translation:\033[0m {prompt}')

    # Add some extra flair to the prompt
    prompt = f"{prompt} | ultra detail, ultra elaboration, ultra quality, perfect."
    print(f'\033[1mGeneration {key}:\033[0m {prompt}')
    
    # Prepare the payload for the API call, including width and height
    payload = {
        "inputs": prompt,
        "is_negative": is_negative,
        "steps": steps,
        "cfg_scale": cfg_scale,
        "seed": seed if seed != -1 else random.randint(1, 1000000000),
        "strength": strength,
        "parameters": {
            "width": width,  # Pass the width to the API
            "height": height  # Pass the height to the API
        }
    }

    # Send the request to the API and handle the response
    response = requests.post(API_URL, headers=headers, json=payload, timeout=timeout)
    if response.status_code != 200:
        print(f"Error: Failed to get image. Response status: {response.status_code}")
        print(f"Response content: {response.text}")
        if response.status_code == 503:
            raise gr.Error(f"{response.status_code} : The model is being loaded")
        raise gr.Error(f"{response.status_code}")
    
    try:
        # Convert the response content into an image
        image_bytes = response.content
        image = Image.open(io.BytesIO(image_bytes))
        print(f'\033[1mGeneration {key} completed!\033[0m ({prompt})')
        return image
    except Exception as e:
        print(f"Error when trying to open the image: {e}")
        return None

# CSS to style the app
css = """
.gradio-container {background-color: MediumAquaMarine}
footer{display:none !important}
#app-container {
    max-width: 930px;
    margin-left: auto;
    margin-right: auto;
}
"""

examples = [
    "a beautiful woman with blonde hair and blue eyes",
    "a beautiful woman with brown hair and grey eyes",
    "a beautiful woman with black hair and brown eyes",
]

# Build the Gradio UI with Blocks
with gr.Blocks(theme=theme, css=css) as app:
    # Add a title to the app
    gr.HTML("<center><h1>FLUX.1-Dev</h1></center>")
    with gr.Tabs() as tabs:
        with gr.TabItem("✍️ Text to Image 🖼", visible=True):
            # Container for all the UI elements
            with gr.Column(elem_id="app-container"):
                # Add a text input for the main prompt
                with gr.Row():
                    with gr.Column(elem_id="prompt-container"):
                        with gr.Row():
                            text_prompt = gr.Textbox(label="Prompt", placeholder="Enter a prompt here", lines=2, elem_id="prompt-text-input")
                        
                        # Accordion for advanced settings
                        with gr.Row():
                            with gr.Accordion("Advanced Settings", open=False):
                                negative_prompt = gr.Textbox(label="Negative Prompt", placeholder="What should not be in the image", value="(deformed, distorted, disfigured), poorly drawn, bad anatomy, wrong anatomy, extra limb, missing limb, floating limbs, (mutated hands and fingers), disconnected limbs, mutation, mutated, ugly, disgusting, blurry, amputation, misspellings, typos", lines=3, elem_id="negative-prompt-text-input")
                                with gr.Row():
                                    width = gr.Slider(label="Width", value=1024, minimum=64, maximum=1216, step=32)
                                    height = gr.Slider(label="Height", value=1024, minimum=64, maximum=1216, step=32)
                                steps = gr.Slider(label="Sampling steps", value=35, minimum=1, maximum=100, step=1)
                                cfg = gr.Slider(label="CFG Scale", value=7, minimum=1, maximum=20, step=1)
                                strength = gr.Slider(label="Strength", value=0.7, minimum=0, maximum=1, step=0.001)
                                seed = gr.Slider(label="Seed", value=-1, minimum=-1, maximum=1000000000, step=1) # Setting the seed to -1 will make it random
                                method = gr.Radio(label="Sampling method", value="DPM++ 2M Karras", choices=["DPM++ 2M Karras", "DPM++ 2S a Karras", "DPM2 a Karras", "DPM2 Karras", "DPM++ SDE Karras", "DEIS", "LMS", "DPM Adaptive", "DPM++ 2M", "DPM2 Ancestral", "DPM++ S", "DPM++ SDE", "DDPM", "DPM Fast", "dpmpp_2s_ancestral", "Euler", "Euler CFG PP", "Euler a", "Euler Ancestral", "Euler+beta", "Heun", "Heun PP2", "DDIM", "LMS Karras", "PLMS", "UniPC", "UniPC BH2"])
                            
                # Add a button to trigger the image generation
                with gr.Row():
                    text_button = gr.Button("Run", variant='primary', elem_id="gen-button")
                
                # Image output area to display the generated image
                with gr.Row():
                    image_output = gr.Image(type="pil", label="Image Output", show_share_button=False, elem_id="gallery")
                with gr.Row():    
                    clear_prompt =gr.Button("Clear 🗑️",variant="primary", elem_id="clear_button")
                    clear_prompt.click(lambda: (None, None), None, [text_prompt, image_output], queue=False, show_api=False)
                    
                with gr.Row():        
                    gr.Examples(
                        examples = examples,    
                        inputs = [text_prompt],    
                    )            
                
                # Bind the button to the query function with the added width and height inputs
                text_button.click(query, inputs=[text_prompt, negative_prompt, steps, cfg, method, seed, strength, width, height], outputs=image_output)

app.queue(default_concurrency_limit=200, max_size=200)  # <-- Sets up a queue with default parameters
if __name__ == "__main__":
    # Launch the Gradio app
    app.launch(show_api=False, share=True)