|  | 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 | 
					
						
						|  |  | 
					
						
						|  |  | 
					
						
						|  |  | 
					
						
						|  | 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, | 
					
						
						|  | 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.") | 
					
						
						|  |  | 
					
						
						|  | selected_lora_index = selected_state.index | 
					
						
						|  | selected_lora = loras[selected_lora_index] | 
					
						
						|  | api_url = f"https://api-inference.huggingface.co/models/{selected_lora['repo']}" | 
					
						
						|  | trigger_word = selected_lora["trigger_word"] | 
					
						
						|  |  | 
					
						
						|  | payload = { | 
					
						
						|  | "inputs": f"{prompt} {trigger_word}", | 
					
						
						|  | "parameters":{"negative_prompt": "bad art, ugly, watermark, deformed"}, | 
					
						
						|  | } | 
					
						
						|  |  | 
					
						
						|  |  | 
					
						
						|  |  | 
					
						
						|  | print(f"API Request: {api_url}") | 
					
						
						|  |  | 
					
						
						|  | 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: | 
					
						
						|  |  | 
					
						
						|  | 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.") | 
					
						
						|  |  | 
					
						
						|  |  | 
					
						
						|  |  | 
					
						
						|  | 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("") | 
					
						
						|  | 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] | 
					
						
						|  | ) | 
					
						
						|  | 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() |