File size: 4,484 Bytes
dddb041
 
 
 
 
 
b8a701a
7ce51a2
 
 
b8a701a
34fdbfd
dddb041
 
 
 
223f8b4
 
a166abf
a146eda
 
a166abf
3733cf2
ccde57b
 
3733cf2
a146eda
ccde57b
b8a701a
7ea1b80
b8a701a
 
0347515
b8a701a
2a5f183
a146eda
49f145b
0347515
 
 
7ce51a2
9f29ad9
 
390be1f
baeab79
7ce51a2
322db57
 
 
7ce51a2
322db57
7ce51a2
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
db08793
a146eda
322db57
bf71179
7ce51a2
2a5f183
 
 
f0850f3
a166abf
2a5f183
9f29ad9
 
538d554
057bc07
 
 
 
 
 
 
 
3733cf2
a200bb2
 
1b088a5
057bc07
c133494
057bc07
c49f67b
a166abf
057bc07
7ce51a2
 
 
 
 
a200bb2
057bc07
c49f67b
057bc07
 
c03b3ba
7ce51a2
 
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
import gradio as gr
import requests
import io
from PIL import Image
import json
import os
import logging
import math 
from tqdm import tqdm
import time

#logging.basicConfig(level=logging.DEBUG)

with open('loras.json', 'r') as f:
    loras = json.load(f)

def update_selection(selected_state: gr.SelectData):
    logging.debug(f"Inside update_selection, selected_state: {selected_state}")
    selected_lora_index = selected_state.index
    selected_lora = loras[selected_lora_index]
    new_placeholder = f"Type a prompt for {selected_lora['title']}"
    lora_repo = selected_lora["repo"]
    updated_text = f"### Selected: [{lora_repo}](https://huggingface.co/{lora_repo}) ✨"
    return (
        gr.update(placeholder=new_placeholder),
        updated_text,  # Retorna o texto Markdown atualizado
        selected_state
    )


def run_lora(prompt, selected_state, progress=gr.Progress(track_tqdm=True)):
    logging.debug(f"Inside run_lora, selected_state: {selected_state}")
    if not selected_state:
        logging.error("selected_state is None or empty.")
        raise gr.Error("You must select a LoRA before proceeding.")  # Popup error when no LoRA is selected

    selected_lora_index = selected_state.index  # Changed this line
    selected_lora = loras[selected_lora_index]
    api_url = f"https://api-inference.huggingface.co/models/{selected_lora['repo']}"
    trigger_word = selected_lora["trigger_word"]
    #token = os.getenv("API_TOKEN")
    payload = {
        "inputs": f"{prompt} {trigger_word}",
        "parameters":{"negative_prompt": "bad art, ugly, watermark, deformed", "num_inference_steps": 30, "scheduler":"DPMSolverMultistepScheduler"},
    }
    #headers = {"Authorization": f"Bearer {token}"}
    
    # Add a print statement to display the API request
    print(f"API Request: {api_url}")
    #print(f"API Headers: {headers}")
    print(f"API Payload: {payload}")

    error_count = 0
    pbar = tqdm(total=None, desc="Loading model")
    while(True):
        response = requests.post(api_url, json=payload)
        if response.status_code == 200:
            return Image.open(io.BytesIO(response.content))
        elif response.status_code == 503:
            #503 is triggered when the model is doing cold boot. It also gives you a time estimate from when the model is loaded but it is not super precise
            time.sleep(1)
            pbar.update(1)
        elif response.status_code == 500 and error_count < 5:
            print(response.content)
            time.sleep(1)
            error_count += 1
            continue
        else:
            logging.error(f"API Error: {response.status_code}")
            raise gr.Error("API Error: Unable to fetch the image.")  # Raise a Gradio error here



with gr.Blocks(css="custom.css") as app:
    title = gr.Markdown("# artificialguybr LoRA portfolio")
    description = gr.Markdown(
        "### This is my portfolio. Follow me on Twitter [@artificialguybr](https://twitter.com/artificialguybr). \n"
        "**Note**: The speed and generation quality are for demonstration purposes. "
        "For best quality, use Auto or Comfy or Diffusers. \n"
        "**Warning**: The API might take some time to deliver the image. \n"
        "Special thanks to Hugging Face for their free inference API."
    )
    selected_state = gr.State()
    with gr.Row():
        gallery = gr.Gallery(
            [(item["image"], item["title"]) for item in loras],
            label="LoRA Gallery",
            allow_preview=False,
            columns=3
        )
        with gr.Column():
            prompt_title = gr.Markdown("### Click on a LoRA in the gallery to select it")
            selected_info = gr.Markdown("")  # Novo componente Markdown para exibir o texto da LoRA selecionada
            with gr.Row():
                prompt = gr.Textbox(label="Prompt", show_label=False, lines=1, max_lines=1, placeholder="Type a prompt after selecting a LoRA")
                button = gr.Button("Run")
            result = gr.Image(interactive=False, label="Generated Image")

    gallery.select(
        update_selection,
        outputs=[prompt, selected_info, selected_state]  # Adicionado selected_info aqui
    )
    prompt.submit(
        fn=run_lora,
        inputs=[prompt, selected_state],
        outputs=[result]
    )
    button.click(
        fn=run_lora,
        inputs=[prompt, selected_state],
        outputs=[result]
    )

app.queue(max_size=20, concurrency_count=5)
app.launch()