Spaces:
Running
on
CPU Upgrade
Running
on
CPU Upgrade
import gradio as gr | |
import requests | |
import io | |
import random | |
import os | |
import time | |
from PIL import Image | |
import json | |
# Base API URL for Hugging Face inference | |
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 | |
def query(prompt, model, custom_lora, is_negative=False, steps=35, cfg_scale=7, sampler="DPM++ 2M Karras", seed=-1, strength=0.7, width=1024, height=1024): | |
# Debug log to indicate function start | |
print("Starting query function...") | |
# Print the parameters for debugging purposes | |
print(f"Prompt: {prompt}") | |
print(f"Model: {model}") | |
print(f"Custom LoRA: {custom_lora}") | |
print(f"Parameters - Steps: {steps}, CFG Scale: {cfg_scale}, Seed: {seed}, Strength: {strength}, Width: {width}, Height: {height}") | |
# Check if the prompt is empty or None | |
if prompt == "" or prompt is None: | |
print("Prompt is empty or None. Exiting query function.") # Debug log | |
return None | |
# Generate a unique key for tracking the generation process | |
key = random.randint(0, 999) | |
print(f"Generated key: {key}") # Debug log | |
# Randomly select an API token from available options to distribute the load | |
API_TOKEN = random.choice([os.getenv("HF_READ_TOKEN"), os.getenv("HF_READ_TOKEN_2"), os.getenv("HF_READ_TOKEN_3"), os.getenv("HF_READ_TOKEN_4"), os.getenv("HF_READ_TOKEN_5")]) | |
headers = {"Authorization": f"Bearer {API_TOKEN}"} | |
print(f"Selected API token: {API_TOKEN}") # Debug log | |
# Enhance the prompt with additional details for better quality | |
prompt = f"{prompt} | ultra detail, ultra elaboration, ultra quality, perfect." | |
print(f'Generation {key}: {prompt}') # Debug log | |
# Set the API URL based on the selected model or custom LoRA | |
if custom_lora.strip() != "": | |
API_URL = f"https://api-inference.huggingface.co/models/{custom_lora.strip()}" | |
else: | |
if model == 'Stable Diffusion XL': | |
API_URL = "https://api-inference.huggingface.co/models/stabilityai/stable-diffusion-xl-base-1.0" | |
if model == 'FLUX.1 [Dev]': | |
API_URL = "https://api-inference.huggingface.co/models/black-forest-labs/FLUX.1-dev" | |
if model == 'FLUX.1 [Schnell]': | |
API_URL = "https://api-inference.huggingface.co/models/black-forest-labs/FLUX.1-schnell" | |
if model == 'Flux Logo Design': | |
API_URL = "https://api-inference.huggingface.co/models/Shakker-Labs/FLUX.1-dev-LoRA-Logo-Design" | |
prompt = f"wablogo, logo, Minimalist, {prompt}" | |
if model == 'Flux Uncensored': | |
API_URL = "https://api-inference.huggingface.co/models/enhanceaiteam/Flux-uncensored" | |
if model == 'Flux Uncensored V2': | |
API_URL = "https://api-inference.huggingface.co/models/enhanceaiteam/Flux-Uncensored-V2" | |
if model == 'Flux Tarot Cards': | |
API_URL = "https://api-inference.huggingface.co/models/prithivMLmods/Ton618-Tarot-Cards-Flux-LoRA" | |
prompt = f"Tarot card, {prompt}" | |
if model == 'Pixel Art Sprites': | |
API_URL = "https://api-inference.huggingface.co/models/sWizad/pokemon-trainer-sprites-pixelart-flux" | |
prompt = f"a pixel image, {prompt}" | |
if model == '3D Sketchfab': | |
API_URL = "https://api-inference.huggingface.co/models/prithivMLmods/Castor-3D-Sketchfab-Flux-LoRA" | |
prompt = f"3D Sketchfab, {prompt}" | |
if model == 'Retro Comic Flux': | |
API_URL = "https://api-inference.huggingface.co/models/renderartist/retrocomicflux" | |
prompt = f"c0m1c, comic book panel, {prompt}" | |
if model == 'Caricature': | |
API_URL = "https://api-inference.huggingface.co/models/TheAwakenOne/caricature" | |
prompt = f"CCTUR3, {prompt}" | |
if model == 'Huggieverse': | |
API_URL = "https://api-inference.huggingface.co/models/Chunte/flux-lora-Huggieverse" | |
prompt = f"HGGRE, {prompt}" | |
if model == 'Propaganda Poster': | |
API_URL = "https://api-inference.huggingface.co/models/AlekseyCalvin/Propaganda_Poster_Schnell_by_doctor_diffusion" | |
prompt = f"propaganda poster, {prompt}" | |
if model == 'Flux Game Assets V2': | |
API_URL = "https://api-inference.huggingface.co/models/gokaygokay/Flux-Game-Assets-LoRA-v2" | |
prompt = f"wbgmsst, white background, {prompt}" | |
if model == 'SoftPasty Flux': | |
API_URL = "https://api-inference.huggingface.co/models/alvdansen/softpasty-flux-dev" | |
prompt = f"araminta_illus illustration style, {prompt}" | |
if model == 'Flux Stickers': | |
API_URL = "https://api-inference.huggingface.co/models/diabolic6045/Flux_Sticker_Lora" | |
prompt = f"5t1cker 5ty1e, {prompt}" | |
if model == 'Flux Animex V2': | |
API_URL = "https://api-inference.huggingface.co/models/strangerzonehf/Flux-Animex-v2-LoRA" | |
prompt = f"Animex, {prompt}" | |
if model == 'Flux Animeo V1': | |
API_URL = "https://api-inference.huggingface.co/models/strangerzonehf/Flux-Animeo-v1-LoRA" | |
prompt = f"Animeo, {prompt}" | |
if model == 'Movie Board': | |
API_URL = "https://api-inference.huggingface.co/models/prithivMLmods/Flux.1-Dev-Movie-Boards-LoRA" | |
prompt = f"movieboard, {prompt}" | |
if model == 'Purple Dreamy': | |
API_URL = "https://api-inference.huggingface.co/models/prithivMLmods/Purple-Dreamy-Flux-LoRA" | |
prompt = f"Purple Dreamy, {prompt}" | |
if model == 'PS1 Style Flux': | |
API_URL = "https://api-inference.huggingface.co/models/veryVANYA/ps1-style-flux" | |
prompt = f"ps1 game screenshot, {prompt}" | |
if model == 'Softserve Anime': | |
API_URL = "https://api-inference.huggingface.co/models/alvdansen/softserve_anime" | |
prompt = f"sftsrv style illustration, {prompt}" | |
if model == 'Flux Tarot v1': | |
API_URL = "https://api-inference.huggingface.co/models/multimodalart/flux-tarot-v1" | |
prompt = f"in the style of TOK a trtcrd tarot style, {prompt}" | |
if model == 'Half Illustration': | |
API_URL = "https://api-inference.huggingface.co/models/davisbro/half_illustration" | |
prompt = f"in the style of TOK, {prompt}" | |
if model == 'OpenDalle v1.1': | |
API_URL = "https://api-inference.huggingface.co/models/dataautogpt3/OpenDalleV1.1" | |
if model == 'Flux Ghibsky Illustration': | |
API_URL = "https://api-inference.huggingface.co/models/aleksa-codes/flux-ghibsky-illustration" | |
prompt = f"GHIBSKY style, {prompt}" | |
if model == 'Flux Koda': | |
API_URL = "https://api-inference.huggingface.co/models/alvdansen/flux-koda" | |
prompt = f"flmft style, {prompt}" | |
if model == 'Soviet Diffusion XL': | |
API_URL = "https://api-inference.huggingface.co/models/openskyml/soviet-diffusion-xl" | |
prompt = f"soviet poster, {prompt}" | |
if model == 'Flux Realism LoRA': | |
API_URL = "https://api-inference.huggingface.co/models/XLabs-AI/flux-RealismLora" | |
if model == 'Frosting Lane Flux': | |
API_URL = "https://api-inference.huggingface.co/models/alvdansen/frosting_lane_flux" | |
prompt = f"frstingln illustration, {prompt}" | |
if model == 'Phantasma Anime': | |
API_URL = "https://api-inference.huggingface.co/models/alvdansen/phantasma-anime" | |
if model == 'Boreal': | |
API_URL = "https://api-inference.huggingface.co/models/kudzueye/Boreal" | |
prompt = f"photo, {prompt}" | |
if model == 'How2Draw': | |
API_URL = "https://api-inference.huggingface.co/models/glif/how2draw" | |
prompt = f"How2Draw, {prompt}" | |
if model == 'Flux AestheticAnime': | |
API_URL = "https://api-inference.huggingface.co/models/dataautogpt3/FLUX-AestheticAnime" | |
if model == 'Fashion Hut Modeling LoRA': | |
API_URL = "https://api-inference.huggingface.co/models/prithivMLmods/Fashion-Hut-Modeling-LoRA" | |
prompt = f"Modeling of, {prompt}" | |
if model == 'Flux SyntheticAnime': | |
API_URL = "https://api-inference.huggingface.co/models/dataautogpt3/FLUX-SyntheticAnime" | |
prompt = f"1980s anime screengrab, VHS quality, syntheticanime, {prompt}" | |
if model == 'Flux Midjourney Anime': | |
API_URL = "https://api-inference.huggingface.co/models/brushpenbob/flux-midjourney-anime" | |
prompt = f"egmid, {prompt}" | |
if model == 'Coloring Book Generator': | |
API_URL = "https://api-inference.huggingface.co/models/robert123231/coloringbookgenerator" | |
if model == 'Collage Flux': | |
API_URL = "https://api-inference.huggingface.co/models/prithivMLmods/Castor-Collage-Dim-Flux-LoRA" | |
prompt = f"collage, {prompt}" | |
if model == 'Flux Product Ad Backdrop': | |
API_URL = "https://api-inference.huggingface.co/models/prithivMLmods/Flux-Product-Ad-Backdrop" | |
prompt = f"Product Ad, {prompt}" | |
if model == 'Product Design': | |
API_URL = "https://api-inference.huggingface.co/models/multimodalart/product-design" | |
prompt = f"product designed by prdsgn, {prompt}" | |
if model == '90s Anime Art': | |
API_URL = "https://api-inference.huggingface.co/models/glif/90s-anime-art" | |
if model == 'Brain Melt Acid Art': | |
API_URL = "https://api-inference.huggingface.co/models/glif/Brain-Melt-Acid-Art" | |
prompt = f"maximalism, in an acid surrealism style, {prompt}" | |
if model == 'Lustly Flux Uncensored v1': | |
API_URL = "https://api-inference.huggingface.co/models/lustlyai/Flux_Lustly.ai_Uncensored_nsfw_v1" | |
if model == 'NSFW Master Flux': | |
API_URL = "https://api-inference.huggingface.co/models/Keltezaa/NSFW_MASTER_FLUX" | |
prompt = f"NSFW, {prompt}" | |
if model == 'Flux Outfit Generator': | |
API_URL = "https://api-inference.huggingface.co/models/tryonlabs/FLUX.1-dev-LoRA-Outfit-Generator" | |
if model == 'Midjourney': | |
API_URL = "https://api-inference.huggingface.co/models/Jovie/Midjourney" | |
if model == 'DreamPhotoGASM': | |
API_URL = "https://api-inference.huggingface.co/models/Yntec/DreamPhotoGASM" | |
if model == 'Flux Super Realism LoRA': | |
API_URL = "https://api-inference.huggingface.co/models/strangerzonehf/Flux-Super-Realism-LoRA" | |
if model == 'Stable Diffusion 2-1': | |
API_URL = "https://api-inference.huggingface.co/models/stabilityai/stable-diffusion-2-1-base" | |
if model == 'Stable Diffusion 3.5 Large': | |
API_URL = "https://api-inference.huggingface.co/models/stabilityai/stable-diffusion-3.5-large" | |
if model == 'Stable Diffusion 3.5 Large Turbo': | |
API_URL = "https://api-inference.huggingface.co/models/stabilityai/stable-diffusion-3.5-large-turbo" | |
if model == 'Stable Diffusion 3 Medium': | |
API_URL = "https://api-inference.huggingface.co/models/stabilityai/stable-diffusion-3-medium-diffusers" | |
prompt = f"A, {prompt}" | |
if model == 'Duchaiten Real3D NSFW XL': | |
API_URL = "https://api-inference.huggingface.co/models/stablediffusionapi/duchaiten-real3d-nsfw-xl" | |
if model == 'Pixel Art XL': | |
API_URL = "https://api-inference.huggingface.co/models/nerijs/pixel-art-xl" | |
prompt = f"pixel art, {prompt}" | |
if model == 'Character Design': | |
API_URL = "https://api-inference.huggingface.co/models/KappaNeuro/character-design" | |
prompt = f"Character Design, {prompt}" | |
if model == 'Sketched Out Manga': | |
API_URL = "https://api-inference.huggingface.co/models/alvdansen/sketchedoutmanga" | |
prompt = f"daiton, {prompt}" | |
if model == 'Archfey Anime': | |
API_URL = "https://api-inference.huggingface.co/models/alvdansen/archfey_anime" | |
if model == 'Lofi Cuties': | |
API_URL = "https://api-inference.huggingface.co/models/alvdansen/lofi-cuties" | |
if model == 'YiffyMix': | |
API_URL = "https://api-inference.huggingface.co/models/Yntec/YiffyMix" | |
if model == 'Analog Madness Realistic v7': | |
API_URL = "https://api-inference.huggingface.co/models/digiplay/AnalogMadness-realistic-model-v7" | |
if model == 'Selfie Photography': | |
API_URL = "https://api-inference.huggingface.co/models/artificialguybr/selfiephotographyredmond-selfie-photography-lora-for-sdxl" | |
prompt = f"instagram model, discord profile picture, {prompt}" | |
if model == 'Filmgrain': | |
API_URL = "https://api-inference.huggingface.co/models/artificialguybr/filmgrain-redmond-filmgrain-lora-for-sdxl" | |
prompt = f"Film Grain, FilmGrainAF, {prompt}" | |
if model == 'Leonardo AI Style Illustration': | |
API_URL = "https://api-inference.huggingface.co/models/goofyai/Leonardo_Ai_Style_Illustration" | |
prompt = f"leonardo style, illustration, vector art, {prompt}" | |
if model == 'Cyborg Style XL': | |
API_URL = "https://api-inference.huggingface.co/models/goofyai/cyborg_style_xl" | |
prompt = f"cyborg style, {prompt}" | |
if model == 'Little Tinies': | |
API_URL = "https://api-inference.huggingface.co/models/alvdansen/littletinies" | |
if model == 'NSFW XL': | |
API_URL = "https://api-inference.huggingface.co/models/Dremmar/nsfw-xl" | |
if model == 'Analog Redmond': | |
API_URL = "https://api-inference.huggingface.co/models/artificialguybr/analogredmond" | |
prompt = f"timeless style, {prompt}" | |
if model == 'Pixel Art Redmond': | |
API_URL = "https://api-inference.huggingface.co/models/artificialguybr/PixelArtRedmond" | |
prompt = f"Pixel Art, {prompt}" | |
if model == 'Ascii Art': | |
API_URL = "https://api-inference.huggingface.co/models/CiroN2022/ascii-art" | |
prompt = f"ascii art, {prompt}" | |
if model == 'Analog': | |
API_URL = "https://api-inference.huggingface.co/models/Yntec/Analog" | |
if model == 'Maple Syrup': | |
API_URL = "https://api-inference.huggingface.co/models/Yntec/MapleSyrup" | |
if model == 'Perfect Lewd Fantasy': | |
API_URL = "https://api-inference.huggingface.co/models/digiplay/perfectLewdFantasy_v1.01" | |
if model == 'AbsoluteReality 1.8.1': | |
API_URL = "https://api-inference.huggingface.co/models/digiplay/AbsoluteReality_v1.8.1" | |
if model == 'Disney': | |
API_URL = "https://api-inference.huggingface.co/models/goofyai/disney_style_xl" | |
prompt = f"Disney style, {prompt}" | |
if model == 'Redmond SDXL': | |
API_URL = "https://api-inference.huggingface.co/models/artificialguybr/LogoRedmond-LogoLoraForSDXL-V2" | |
if model == 'epiCPhotoGasm': | |
API_URL = "https://api-inference.huggingface.co/models/Yntec/epiCPhotoGasm" | |
print(f"API URL set to: {API_URL}") # Debug log | |
# Define the payload for the request | |
payload = { | |
"inputs": prompt, | |
"is_negative": is_negative, # Whether to use a negative prompt | |
"steps": steps, # Number of sampling steps | |
"cfg_scale": cfg_scale, # Scale for controlling adherence to prompt | |
"seed": seed if seed != -1 else random.randint(1, 1000000000), # Random seed for reproducibility | |
"strength": strength, # How strongly the model should transform the image | |
"parameters": { | |
"width": width, # Width of the generated image | |
"height": height # Height of the generated image | |
} | |
} | |
print(f"Payload: {json.dumps(payload, indent=2)}") # Debug log | |
# Make a request to the API to generate the image | |
try: | |
response = requests.post(API_URL, headers=headers, json=payload, timeout=timeout) | |
print(f"Response status code: {response.status_code}") # Debug log | |
except requests.exceptions.RequestException as e: | |
# Log any request exceptions and raise an error for the user | |
print(f"Request failed: {e}") # Debug log | |
raise gr.Error(f"Request failed: {e}") | |
# Check if the response status is not successful | |
if response.status_code != 200: | |
print(f"Error: Failed to retrieve image. Response status: {response.status_code}") # Debug log | |
print(f"Response content: {response.text}") # Debug log | |
if response.status_code == 400: | |
raise gr.Error(f"{response.status_code}: Bad Request - There might be an issue with the input parameters.") | |
elif response.status_code == 401: | |
raise gr.Error(f"{response.status_code}: Unauthorized - Please check your API token.") | |
elif response.status_code == 403: | |
raise gr.Error(f"{response.status_code}: Forbidden - You do not have permission to access this model.") | |
elif response.status_code == 404: | |
raise gr.Error(f"{response.status_code}: Not Found - The requested model could not be found.") | |
elif response.status_code == 503: | |
raise gr.Error(f"{response.status_code}: The model is being loaded. Please try again later.") | |
else: | |
raise gr.Error(f"{response.status_code}: An unexpected error occurred.") | |
try: | |
# Attempt to read the image from the response content | |
image_bytes = response.content | |
image = Image.open(io.BytesIO(image_bytes)) | |
print(f'Generation {key} completed! ({prompt})') # Debug log | |
return image | |
except Exception as e: | |
# Handle any errors that occur when opening the image | |
print(f"Error while trying to open image: {e}") # Debug log | |
return None | |
css = """ | |
footer { | |
visibility: hidden; | |
} | |
""" | |
print("Initializing Gradio interface...") | |
# Define the Gradio interface | |
with gr.Blocks(theme="Yntec/HaleyCH_Theme_Orange", css=css) as dalle: | |
gr.Markdown("# AI Image Generator") | |
with gr.Row(): | |
with gr.Column(scale=2): | |
# Main prompt input | |
text_prompt = gr.Textbox( | |
label="Prompt", | |
placeholder="Describe what you want to create...", | |
lines=3 | |
) | |
# Negative prompt | |
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", | |
lines=2 | |
) | |
# Custom LoRA input | |
custom_lora = gr.Textbox( | |
label="Custom LoRA Path (Optional)", | |
placeholder="e.g., multimodalart/vintage-ads-flux", | |
lines=1 | |
) | |
with gr.Column(scale=1): | |
# Image dimensions | |
with gr.Group(): | |
gr.Markdown("### Image Settings") | |
width = gr.Slider(label="Width", value=1024, minimum=512, maximum=1216, step=64) | |
height = gr.Slider(label="Height", value=1024, minimum=512, maximum=1216, step=64) | |
# Generation parameters | |
with gr.Group(): | |
gr.Markdown("### Generation Parameters") | |
steps = gr.Slider(label="Steps", value=35, minimum=1, maximum=100, step=1) | |
cfg = gr.Slider(label="CFG Scale", value=7, minimum=1, maximum=20, step=0.5) | |
strength = gr.Slider(label="Strength", value=0.7, minimum=0, maximum=1, step=0.1) | |
seed = gr.Slider(label="Seed (-1 for random)", value=-1, minimum=-1, maximum=1000000000, step=1) | |
# Model selection | |
with gr.Group(): | |
gr.Markdown("### Model Selection") | |
model_search = gr.Textbox( | |
label="Search Models", | |
placeholder="Type to filter models...", | |
lines=1 | |
) | |
# Updated model list (reordered by popularity/recency) | |
models_list = [ | |
"Stable Diffusion 3.5 Large", | |
"Stable Diffusion 3.5 Large Turbo", | |
"Stable Diffusion XL", | |
"FLUX.1 [Schnell]", | |
"FLUX.1 [Dev]", | |
"Midjourney", | |
"DreamPhotoGASM", | |
"Disney", | |
"Leonardo AI Style Illustration", | |
"AbsoluteReality 1.8.1", | |
"Analog Redmond", | |
"Stable Diffusion 3 Medium", | |
"Flux Super Realism LoRA", | |
"Flux Realism LoRA", | |
"Selfie Photography", | |
"Character Design", | |
"Pixel Art XL", | |
"3D Sketchfab", | |
"Anime Collection", # Group of anime-related models | |
"Flux Animex V2", | |
"Flux Animeo V1", | |
"Flux AestheticAnime", | |
"90s Anime Art", | |
"Softserve Anime", | |
"Artistic Styles", # Group of artistic style models | |
"Brain Melt Acid Art", | |
"Retro Comic Flux", | |
"Purple Dreamy", | |
"SoftPasty Flux", | |
"Specialized", # Group of specialized models | |
"Flux Logo Design", | |
"Product Design", | |
"Propaganda Poster", | |
"Movie Board", | |
"Collage Flux", | |
# Additional models... | |
] | |
model = gr.Radio( | |
label="Select Model", | |
choices=models_list, | |
value="Stable Diffusion 3.5 Large", | |
interactive=True | |
) | |
def filter_models(search_term): | |
filtered_models = [m for m in models_list if search_term.lower() in m.lower()] | |
return gr.update(choices=filtered_models) | |
model_search.change(filter_models, inputs=model_search, outputs=model) | |
# Generate button and output | |
with gr.Row(): | |
generate_btn = gr.Button("Generate Image", variant="primary", size="lg") | |
with gr.Row(): | |
image_output = gr.Image( | |
type="pil", | |
label="Generated Image", | |
show_label=True | |
) | |
# Set up the generation event | |
generate_btn.click( | |
fn=query, | |
inputs=[ | |
text_prompt, | |
model, | |
custom_lora, | |
negative_prompt, | |
steps, | |
cfg, | |
method, | |
seed, | |
strength, | |
width, | |
height | |
], | |
outputs=image_output | |
) | |
print("Launching Gradio interface...") | |
dalle.launch(show_api=False, share=False) |