Spaces:
Running
on
Zero
Running
on
Zero
Upload 6 files
Browse files- app.py +7 -3
- dc.py +101 -41
- env.py +5 -0
- llmdolphin.py +40 -0
- modutils.py +63 -35
- requirements.txt +0 -1
app.py
CHANGED
|
@@ -138,9 +138,13 @@ with gr.Blocks(fill_width=True, elem_id="container", css=css, delete_cache=(60,
|
|
| 138 |
lora5_copy = gr.Button(value="Copy example to prompt", visible=False)
|
| 139 |
lora5_md = gr.Markdown(value="", visible=False)
|
| 140 |
with gr.Accordion("From URL", open=True, visible=True):
|
|
|
|
|
|
|
|
|
|
|
|
|
| 141 |
with gr.Row():
|
| 142 |
lora_search_civitai_query = gr.Textbox(label="Query", placeholder="oomuro sakurako...", lines=1)
|
| 143 |
-
|
| 144 |
lora_search_civitai_submit = gr.Button("Search on Civitai")
|
| 145 |
with gr.Row():
|
| 146 |
lora_search_civitai_result = gr.Dropdown(label="Search Results", choices=[("", "")], value="", allow_custom_value=True, visible=False)
|
|
@@ -247,9 +251,9 @@ with gr.Blocks(fill_width=True, elem_id="container", css=css, delete_cache=(60,
|
|
| 247 |
lora5_copy.click(apply_lora_prompt, [prompt, lora5_info], [prompt], queue=False, show_api=False)
|
| 248 |
|
| 249 |
gr.on(
|
| 250 |
-
triggers=[lora_search_civitai_submit.click, lora_search_civitai_query.submit],
|
| 251 |
fn=search_civitai_lora,
|
| 252 |
-
inputs=[lora_search_civitai_query, lora_search_civitai_basemodel],
|
| 253 |
outputs=[lora_search_civitai_result, lora_search_civitai_desc, lora_search_civitai_submit, lora_search_civitai_query],
|
| 254 |
scroll_to_output=True,
|
| 255 |
queue=True,
|
|
|
|
| 138 |
lora5_copy = gr.Button(value="Copy example to prompt", visible=False)
|
| 139 |
lora5_md = gr.Markdown(value="", visible=False)
|
| 140 |
with gr.Accordion("From URL", open=True, visible=True):
|
| 141 |
+
with gr.Row():
|
| 142 |
+
lora_search_civitai_basemodel = gr.CheckboxGroup(label="Search LoRA for", choices=["Pony", "SD 1.5", "SDXL 1.0", "Flux.1 D", "Flux.1 S"], value=["Pony", "SDXL 1.0"])
|
| 143 |
+
lora_search_civitai_sort = gr.Radio(label="Sort", choices=["Highest Rated", "Most Downloaded", "Newest"], value="Highest Rated")
|
| 144 |
+
lora_search_civitai_period = gr.Radio(label="Period", choices=["AllTime", "Year", "Month", "Week", "Day"], value="AllTime")
|
| 145 |
with gr.Row():
|
| 146 |
lora_search_civitai_query = gr.Textbox(label="Query", placeholder="oomuro sakurako...", lines=1)
|
| 147 |
+
lora_search_civitai_tag = gr.Textbox(label="Tag", lines=1)
|
| 148 |
lora_search_civitai_submit = gr.Button("Search on Civitai")
|
| 149 |
with gr.Row():
|
| 150 |
lora_search_civitai_result = gr.Dropdown(label="Search Results", choices=[("", "")], value="", allow_custom_value=True, visible=False)
|
|
|
|
| 251 |
lora5_copy.click(apply_lora_prompt, [prompt, lora5_info], [prompt], queue=False, show_api=False)
|
| 252 |
|
| 253 |
gr.on(
|
| 254 |
+
triggers=[lora_search_civitai_submit.click, lora_search_civitai_query.submit, lora_search_civitai_tag.submit],
|
| 255 |
fn=search_civitai_lora,
|
| 256 |
+
inputs=[lora_search_civitai_query, lora_search_civitai_basemodel, lora_search_civitai_sort, lora_search_civitai_period, lora_search_civitai_tag],
|
| 257 |
outputs=[lora_search_civitai_result, lora_search_civitai_desc, lora_search_civitai_submit, lora_search_civitai_query],
|
| 258 |
scroll_to_output=True,
|
| 259 |
queue=True,
|
dc.py
CHANGED
|
@@ -21,12 +21,9 @@ from stablepy import (
|
|
| 21 |
SD15_TASKS,
|
| 22 |
SDXL_TASKS,
|
| 23 |
)
|
|
|
|
| 24 |
#import urllib.parse
|
| 25 |
import gradio as gr
|
| 26 |
-
from PIL import Image
|
| 27 |
-
import IPython.display
|
| 28 |
-
import time, json
|
| 29 |
-
from IPython.utils import capture
|
| 30 |
import logging
|
| 31 |
logging.getLogger("diffusers").setLevel(logging.ERROR)
|
| 32 |
import diffusers
|
|
@@ -381,7 +378,7 @@ class GuiSD:
|
|
| 381 |
if vae_model:
|
| 382 |
vae_type = "SDXL" if "sdxl" in vae_model.lower() else "SD 1.5"
|
| 383 |
if model_type != vae_type:
|
| 384 |
-
gr.
|
| 385 |
|
| 386 |
self.model.device = torch.device("cpu")
|
| 387 |
dtype_model = torch.bfloat16 if model_type == "FLUX" else torch.float16
|
|
@@ -395,7 +392,7 @@ class GuiSD:
|
|
| 395 |
)
|
| 396 |
#yield f"Model loaded: {model_name}"
|
| 397 |
|
| 398 |
-
|
| 399 |
@torch.inference_mode()
|
| 400 |
def generate_pipeline(
|
| 401 |
self,
|
|
@@ -508,7 +505,7 @@ class GuiSD:
|
|
| 508 |
vae_model = vae_model if vae_model != "None" else None
|
| 509 |
loras_list = [lora1, lora2, lora3, lora4, lora5]
|
| 510 |
vae_msg = f"VAE: {vae_model}" if vae_model else ""
|
| 511 |
-
msg_lora =
|
| 512 |
|
| 513 |
print("Config model:", model_name, vae_model, loras_list)
|
| 514 |
|
|
@@ -679,35 +676,94 @@ class GuiSD:
|
|
| 679 |
return self.infer_short(self.model, pipe_params, progress), info_state
|
| 680 |
## END MOD
|
| 681 |
|
| 682 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 683 |
|
| 684 |
-
|
| 685 |
-
|
| 686 |
-
|
| 687 |
-
# lora_B=args[9] if args[9] != "None" else None, lora_scale_B=args[10],
|
| 688 |
-
# lora_C=args[11] if args[11] != "None" else None, lora_scale_C=args[12],
|
| 689 |
-
# lora_D=args[13] if args[13] != "None" else None, lora_scale_D=args[14],
|
| 690 |
-
# lora_E=args[15] if args[15] != "None" else None, lora_scale_E=args[16],
|
| 691 |
-
# )
|
| 692 |
|
| 693 |
-
#
|
| 694 |
-
# print(status_lora)
|
| 695 |
-
# for status, lora in zip(status_lora, lora_list):
|
| 696 |
-
# if status:
|
| 697 |
-
# gr.Info(f"LoRA loaded: {lora}")
|
| 698 |
-
# elif status is not None:
|
| 699 |
-
# gr.Warning(f"Failed to load LoRA: {lora}")
|
| 700 |
|
| 701 |
-
|
| 702 |
-
# # gr.Info(f"LoRAs in cache: {", ".join(str(x) for x in self.model.lora_memory if x is not None)}")
|
| 703 |
|
| 704 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 705 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 706 |
|
| 707 |
-
|
|
|
|
|
|
|
| 708 |
|
| 709 |
from pathlib import Path
|
| 710 |
-
import
|
|
|
|
| 711 |
from modutils import (safe_float, escape_lora_basename, to_lora_key, to_lora_path,
|
| 712 |
get_local_model_list, get_private_lora_model_lists, get_valid_lora_name,
|
| 713 |
get_valid_lora_path, get_valid_lora_wt, get_lora_info,
|
|
@@ -723,6 +779,10 @@ def infer(prompt, negative_prompt, seed, randomize_seed, width, height, guidance
|
|
| 723 |
import numpy as np
|
| 724 |
MAX_SEED = np.iinfo(np.int32).max
|
| 725 |
|
|
|
|
|
|
|
|
|
|
|
|
|
| 726 |
images: list[tuple[PIL.Image.Image, str | None]] = []
|
| 727 |
info: str = ""
|
| 728 |
progress(0, desc="Preparing...")
|
|
@@ -739,7 +799,7 @@ def infer(prompt, negative_prompt, seed, randomize_seed, width, height, guidance
|
|
| 739 |
prompt, negative_prompt = insert_model_recom_prompt(prompt, negative_prompt, model_name)
|
| 740 |
progress(0.5, desc="Preparing...")
|
| 741 |
lora1, lora1_wt, lora2, lora2_wt, lora3, lora3_wt, lora4, lora4_wt, lora5, lora5_wt = \
|
| 742 |
-
set_prompt_loras(prompt, lora1, lora1_wt, lora2, lora2_wt, lora3, lora3_wt, lora4, lora4_wt, lora5, lora5_wt)
|
| 743 |
lora1 = get_valid_lora_path(lora1)
|
| 744 |
lora2 = get_valid_lora_path(lora2)
|
| 745 |
lora3 = get_valid_lora_path(lora3)
|
|
@@ -748,7 +808,7 @@ def infer(prompt, negative_prompt, seed, randomize_seed, width, height, guidance
|
|
| 748 |
progress(1, desc="Preparation completed. Starting inference preparation...")
|
| 749 |
|
| 750 |
sd_gen.load_new_model(model_name, vae, TASK_MODEL_LIST[0], progress)
|
| 751 |
-
images, info =
|
| 752 |
guidance_scale, True, generator, lora1, lora1_wt, lora2, lora2_wt, lora3, lora3_wt,
|
| 753 |
lora4, lora4_wt, lora5, lora5_wt, sampler,
|
| 754 |
height, width, model_name, vae, TASK_MODEL_LIST[0], None, "Canny", 512, 1024,
|
|
@@ -757,7 +817,8 @@ def infer(prompt, negative_prompt, seed, randomize_seed, width, height, guidance
|
|
| 757 |
False, True, 1, True, False, False, False, False, "./images", False, False, False, True, 1, 0.55,
|
| 758 |
False, False, False, True, False, "Use same sampler", False, "", "", 0.35, True, True, False, 4, 4, 32,
|
| 759 |
False, "", "", 0.35, True, True, False, 4, 4, 32,
|
| 760 |
-
True, None, None, "plus_face", "original", 0.7, None, None, "base", "style", 0.7, 0.0,
|
|
|
|
| 761 |
)
|
| 762 |
|
| 763 |
progress(1, desc="Inference completed.")
|
|
@@ -820,7 +881,7 @@ def get_t2i_model_info(repo_id: str):
|
|
| 820 |
if " " in repo_id or not api.repo_exists(repo_id): return ""
|
| 821 |
model = api.model_info(repo_id=repo_id)
|
| 822 |
except Exception as e:
|
| 823 |
-
print(f"Error: Failed to get {repo_id}'s info. ")
|
| 824 |
return ""
|
| 825 |
if model.private or model.gated: return ""
|
| 826 |
tags = model.tags
|
|
@@ -1013,13 +1074,13 @@ def download_my_lora(dl_urls: str, lora1: str, lora2: str, lora3: str, lora4: st
|
|
| 1013 |
gr.update(value=lora4, choices=choices), gr.update(value=lora5, choices=choices)
|
| 1014 |
|
| 1015 |
|
| 1016 |
-
def set_prompt_loras(prompt, lora1, lora1_wt, lora2, lora2_wt, lora3, lora3_wt, lora4, lora4_wt, lora5, lora5_wt):
|
| 1017 |
import re
|
| 1018 |
-
lora1 = get_valid_lora_name(lora1)
|
| 1019 |
-
lora2 = get_valid_lora_name(lora2)
|
| 1020 |
-
lora3 = get_valid_lora_name(lora3)
|
| 1021 |
-
lora4 = get_valid_lora_name(lora4)
|
| 1022 |
-
lora5 = get_valid_lora_name(lora5)
|
| 1023 |
if not "<lora" in prompt: return lora1, lora1_wt, lora2, lora2_wt, lora3, lora3_wt, lora4, lora4_wt, lora5, lora5_wt
|
| 1024 |
lora1_wt = get_valid_lora_wt(prompt, lora1, lora1_wt)
|
| 1025 |
lora2_wt = get_valid_lora_wt(prompt, lora2, lora2_wt)
|
|
@@ -1129,9 +1190,9 @@ def update_loras(prompt, lora1, lora1_wt, lora2, lora2_wt, lora3, lora3_wt, lora
|
|
| 1129 |
gr.update(value=tag5, label=label5, visible=on5), gr.update(visible=on5), gr.update(value=md5, visible=on5)
|
| 1130 |
|
| 1131 |
|
| 1132 |
-
def search_civitai_lora(query, base_model):
|
| 1133 |
global civitai_lora_last_results
|
| 1134 |
-
items = search_lora_on_civitai(query, base_model)
|
| 1135 |
if not items: return gr.update(choices=[("", "")], value="", visible=False),\
|
| 1136 |
gr.update(value="", visible=False), gr.update(visible=True), gr.update(visible=True)
|
| 1137 |
civitai_lora_last_results = {}
|
|
@@ -1324,7 +1385,6 @@ def process_style_prompt(prompt: str, neg_prompt: str, styles_key: str = "None",
|
|
| 1324 |
return gr.update(value=prompt), gr.update(value=neg_prompt)
|
| 1325 |
|
| 1326 |
|
| 1327 |
-
from PIL import Image
|
| 1328 |
def save_images(images: list[Image.Image], metadatas: list[str]):
|
| 1329 |
from PIL import PngImagePlugin
|
| 1330 |
try:
|
|
|
|
| 21 |
SD15_TASKS,
|
| 22 |
SDXL_TASKS,
|
| 23 |
)
|
| 24 |
+
import time
|
| 25 |
#import urllib.parse
|
| 26 |
import gradio as gr
|
|
|
|
|
|
|
|
|
|
|
|
|
| 27 |
import logging
|
| 28 |
logging.getLogger("diffusers").setLevel(logging.ERROR)
|
| 29 |
import diffusers
|
|
|
|
| 378 |
if vae_model:
|
| 379 |
vae_type = "SDXL" if "sdxl" in vae_model.lower() else "SD 1.5"
|
| 380 |
if model_type != vae_type:
|
| 381 |
+
gr.Warning(msg_inc_vae)
|
| 382 |
|
| 383 |
self.model.device = torch.device("cpu")
|
| 384 |
dtype_model = torch.bfloat16 if model_type == "FLUX" else torch.float16
|
|
|
|
| 392 |
)
|
| 393 |
#yield f"Model loaded: {model_name}"
|
| 394 |
|
| 395 |
+
#@spaces.GPU
|
| 396 |
@torch.inference_mode()
|
| 397 |
def generate_pipeline(
|
| 398 |
self,
|
|
|
|
| 505 |
vae_model = vae_model if vae_model != "None" else None
|
| 506 |
loras_list = [lora1, lora2, lora3, lora4, lora5]
|
| 507 |
vae_msg = f"VAE: {vae_model}" if vae_model else ""
|
| 508 |
+
msg_lora = ""
|
| 509 |
|
| 510 |
print("Config model:", model_name, vae_model, loras_list)
|
| 511 |
|
|
|
|
| 676 |
return self.infer_short(self.model, pipe_params, progress), info_state
|
| 677 |
## END MOD
|
| 678 |
|
| 679 |
+
def dynamic_gpu_duration(func, duration, *args):
|
| 680 |
+
|
| 681 |
+
@spaces.GPU(duration=duration)
|
| 682 |
+
def wrapped_func():
|
| 683 |
+
yield from func(*args)
|
| 684 |
+
|
| 685 |
+
return wrapped_func()
|
| 686 |
+
|
| 687 |
+
|
| 688 |
+
@spaces.GPU
|
| 689 |
+
def dummy_gpu():
|
| 690 |
+
return None
|
| 691 |
+
|
| 692 |
+
|
| 693 |
+
def sd_gen_generate_pipeline(*args):
|
| 694 |
+
|
| 695 |
+
gpu_duration_arg = int(args[-1]) if args[-1] else 59
|
| 696 |
+
verbose_arg = int(args[-2])
|
| 697 |
+
load_lora_cpu = args[-3]
|
| 698 |
+
generation_args = args[:-3]
|
| 699 |
+
lora_list = [
|
| 700 |
+
None if item == "None" or item == "" else item
|
| 701 |
+
for item in [args[7], args[9], args[11], args[13], args[15]]
|
| 702 |
+
]
|
| 703 |
+
lora_status = [None] * 5
|
| 704 |
+
|
| 705 |
+
msg_load_lora = "Updating LoRAs in GPU..."
|
| 706 |
+
if load_lora_cpu:
|
| 707 |
+
msg_load_lora = "Updating LoRAs in CPU (Slow but saves GPU usage)..."
|
| 708 |
+
|
| 709 |
+
if lora_list != sd_gen.model.lora_memory and lora_list != [None] * 5:
|
| 710 |
+
yield None, msg_load_lora
|
| 711 |
+
|
| 712 |
+
# Load lora in CPU
|
| 713 |
+
if load_lora_cpu:
|
| 714 |
+
lora_status = sd_gen.model.lora_merge(
|
| 715 |
+
lora_A=lora_list[0], lora_scale_A=args[8],
|
| 716 |
+
lora_B=lora_list[1], lora_scale_B=args[10],
|
| 717 |
+
lora_C=lora_list[2], lora_scale_C=args[12],
|
| 718 |
+
lora_D=lora_list[3], lora_scale_D=args[14],
|
| 719 |
+
lora_E=lora_list[4], lora_scale_E=args[16],
|
| 720 |
+
)
|
| 721 |
+
print(lora_status)
|
| 722 |
+
|
| 723 |
+
if verbose_arg:
|
| 724 |
+
for status, lora in zip(lora_status, lora_list):
|
| 725 |
+
if status:
|
| 726 |
+
gr.Info(f"LoRA loaded in CPU: {lora}")
|
| 727 |
+
elif status is not None:
|
| 728 |
+
gr.Warning(f"Failed to load LoRA: {lora}")
|
| 729 |
+
|
| 730 |
+
if lora_status == [None] * 5 and sd_gen.model.lora_memory != [None] * 5 and load_lora_cpu:
|
| 731 |
+
lora_cache_msg = ", ".join(
|
| 732 |
+
str(x) for x in sd_gen.model.lora_memory if x is not None
|
| 733 |
+
)
|
| 734 |
+
gr.Info(f"LoRAs in cache: {lora_cache_msg}")
|
| 735 |
|
| 736 |
+
msg_request = f"Requesting {gpu_duration_arg}s. of GPU time"
|
| 737 |
+
gr.Info(msg_request)
|
| 738 |
+
print(msg_request)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 739 |
|
| 740 |
+
# yield from sd_gen.generate_pipeline(*generation_args)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 741 |
|
| 742 |
+
start_time = time.time()
|
|
|
|
| 743 |
|
| 744 |
+
yield from dynamic_gpu_duration(
|
| 745 |
+
sd_gen.generate_pipeline,
|
| 746 |
+
gpu_duration_arg,
|
| 747 |
+
*generation_args,
|
| 748 |
+
)
|
| 749 |
+
|
| 750 |
+
end_time = time.time()
|
| 751 |
|
| 752 |
+
if verbose_arg:
|
| 753 |
+
execution_time = end_time - start_time
|
| 754 |
+
msg_task_complete = (
|
| 755 |
+
f"GPU task complete in: {round(execution_time, 0) + 1} seconds"
|
| 756 |
+
)
|
| 757 |
+
gr.Info(msg_task_complete)
|
| 758 |
+
print(msg_task_complete)
|
| 759 |
|
| 760 |
+
|
| 761 |
+
dynamic_gpu_duration.zerogpu = True
|
| 762 |
+
sd_gen_generate_pipeline.zerogpu = True
|
| 763 |
|
| 764 |
from pathlib import Path
|
| 765 |
+
from PIL import Image
|
| 766 |
+
import random, json
|
| 767 |
from modutils import (safe_float, escape_lora_basename, to_lora_key, to_lora_path,
|
| 768 |
get_local_model_list, get_private_lora_model_lists, get_valid_lora_name,
|
| 769 |
get_valid_lora_path, get_valid_lora_wt, get_lora_info,
|
|
|
|
| 779 |
import numpy as np
|
| 780 |
MAX_SEED = np.iinfo(np.int32).max
|
| 781 |
|
| 782 |
+
load_lora_cpu = False
|
| 783 |
+
verbose_info = False
|
| 784 |
+
gpu_duration = 59
|
| 785 |
+
|
| 786 |
images: list[tuple[PIL.Image.Image, str | None]] = []
|
| 787 |
info: str = ""
|
| 788 |
progress(0, desc="Preparing...")
|
|
|
|
| 799 |
prompt, negative_prompt = insert_model_recom_prompt(prompt, negative_prompt, model_name)
|
| 800 |
progress(0.5, desc="Preparing...")
|
| 801 |
lora1, lora1_wt, lora2, lora2_wt, lora3, lora3_wt, lora4, lora4_wt, lora5, lora5_wt = \
|
| 802 |
+
set_prompt_loras(prompt, model_name, lora1, lora1_wt, lora2, lora2_wt, lora3, lora3_wt, lora4, lora4_wt, lora5, lora5_wt)
|
| 803 |
lora1 = get_valid_lora_path(lora1)
|
| 804 |
lora2 = get_valid_lora_path(lora2)
|
| 805 |
lora3 = get_valid_lora_path(lora3)
|
|
|
|
| 808 |
progress(1, desc="Preparation completed. Starting inference preparation...")
|
| 809 |
|
| 810 |
sd_gen.load_new_model(model_name, vae, TASK_MODEL_LIST[0], progress)
|
| 811 |
+
images, info = sd_gen_generate_pipeline(prompt, negative_prompt, 1, num_inference_steps,
|
| 812 |
guidance_scale, True, generator, lora1, lora1_wt, lora2, lora2_wt, lora3, lora3_wt,
|
| 813 |
lora4, lora4_wt, lora5, lora5_wt, sampler,
|
| 814 |
height, width, model_name, vae, TASK_MODEL_LIST[0], None, "Canny", 512, 1024,
|
|
|
|
| 817 |
False, True, 1, True, False, False, False, False, "./images", False, False, False, True, 1, 0.55,
|
| 818 |
False, False, False, True, False, "Use same sampler", False, "", "", 0.35, True, True, False, 4, 4, 32,
|
| 819 |
False, "", "", 0.35, True, True, False, 4, 4, 32,
|
| 820 |
+
True, None, None, "plus_face", "original", 0.7, None, None, "base", "style", 0.7, 0.0,
|
| 821 |
+
load_lora_cpu, verbose_info, gpu_duration
|
| 822 |
)
|
| 823 |
|
| 824 |
progress(1, desc="Inference completed.")
|
|
|
|
| 881 |
if " " in repo_id or not api.repo_exists(repo_id): return ""
|
| 882 |
model = api.model_info(repo_id=repo_id)
|
| 883 |
except Exception as e:
|
| 884 |
+
print(f"Error: Failed to get {repo_id}'s info. {e}")
|
| 885 |
return ""
|
| 886 |
if model.private or model.gated: return ""
|
| 887 |
tags = model.tags
|
|
|
|
| 1074 |
gr.update(value=lora4, choices=choices), gr.update(value=lora5, choices=choices)
|
| 1075 |
|
| 1076 |
|
| 1077 |
+
def set_prompt_loras(prompt, model_name, lora1, lora1_wt, lora2, lora2_wt, lora3, lora3_wt, lora4, lora4_wt, lora5, lora5_wt):
|
| 1078 |
import re
|
| 1079 |
+
lora1 = get_valid_lora_name(lora1, model_name)
|
| 1080 |
+
lora2 = get_valid_lora_name(lora2, model_name)
|
| 1081 |
+
lora3 = get_valid_lora_name(lora3, model_name)
|
| 1082 |
+
lora4 = get_valid_lora_name(lora4, model_name)
|
| 1083 |
+
lora5 = get_valid_lora_name(lora5, model_name)
|
| 1084 |
if not "<lora" in prompt: return lora1, lora1_wt, lora2, lora2_wt, lora3, lora3_wt, lora4, lora4_wt, lora5, lora5_wt
|
| 1085 |
lora1_wt = get_valid_lora_wt(prompt, lora1, lora1_wt)
|
| 1086 |
lora2_wt = get_valid_lora_wt(prompt, lora2, lora2_wt)
|
|
|
|
| 1190 |
gr.update(value=tag5, label=label5, visible=on5), gr.update(visible=on5), gr.update(value=md5, visible=on5)
|
| 1191 |
|
| 1192 |
|
| 1193 |
+
def search_civitai_lora(query, base_model, sort="Highest Rated", period="AllTime", tag=""):
|
| 1194 |
global civitai_lora_last_results
|
| 1195 |
+
items = search_lora_on_civitai(query, base_model, 100, sort, period, tag)
|
| 1196 |
if not items: return gr.update(choices=[("", "")], value="", visible=False),\
|
| 1197 |
gr.update(value="", visible=False), gr.update(visible=True), gr.update(visible=True)
|
| 1198 |
civitai_lora_last_results = {}
|
|
|
|
| 1385 |
return gr.update(value=prompt), gr.update(value=neg_prompt)
|
| 1386 |
|
| 1387 |
|
|
|
|
| 1388 |
def save_images(images: list[Image.Image], metadatas: list[str]):
|
| 1389 |
from PIL import PngImagePlugin
|
| 1390 |
try:
|
env.py
CHANGED
|
@@ -102,6 +102,11 @@ load_diffusers_format_model = [
|
|
| 102 |
"Raelina/Raemu-Flux",
|
| 103 |
]
|
| 104 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 105 |
# List all Models for specified user
|
| 106 |
HF_MODEL_USER_LIKES = ["votepurchase"] # sorted by number of likes
|
| 107 |
HF_MODEL_USER_EX = ["John6666"] # sorted by a special rule
|
|
|
|
| 102 |
"Raelina/Raemu-Flux",
|
| 103 |
]
|
| 104 |
|
| 105 |
+
DIFFUSERS_FORMAT_LORAS = [
|
| 106 |
+
"nerijs/animation2k-flux",
|
| 107 |
+
"XLabs-AI/flux-RealismLora",
|
| 108 |
+
]
|
| 109 |
+
|
| 110 |
# List all Models for specified user
|
| 111 |
HF_MODEL_USER_LIKES = ["votepurchase"] # sorted by number of likes
|
| 112 |
HF_MODEL_USER_EX = ["John6666"] # sorted by a special rule
|
llmdolphin.py
CHANGED
|
@@ -56,8 +56,46 @@ llm_models = {
|
|
| 56 |
"qwen2.5-lumen-14b-q4_k_m.gguf": ["Lambent/Qwen2.5-Lumen-14B-Q4_K_M-GGUF", MessagesFormatterType.OPEN_CHAT],
|
| 57 |
"Qwen2.5-14B_Uncensored_Instruct.Q4_K_M.gguf": ["mradermacher/Qwen2.5-14B_Uncensored_Instruct-GGUF", MessagesFormatterType.OPEN_CHAT],
|
| 58 |
"Trinas_Nectar-8B-model_stock.i1-Q4_K_M.gguf": ["mradermacher/Trinas_Nectar-8B-model_stock-i1-GGUF", MessagesFormatterType.MISTRAL],
|
|
|
|
| 59 |
"ChatWaifu_v1.4.Q5_K_M.gguf": ["mradermacher/ChatWaifu_v1.4-GGUF", MessagesFormatterType.MISTRAL],
|
| 60 |
"ChatWaifu_v1.3.1.Q4_K_M.gguf": ["mradermacher/ChatWaifu_v1.3.1-GGUF", MessagesFormatterType.MISTRAL],
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 61 |
"Collaiborator-MEDLLM-Llama-3-8B-v1.i1-Q5_K_M.gguf": ["mradermacher/Collaiborator-MEDLLM-Llama-3-8B-v1-i1-GGUF", MessagesFormatterType.LLAMA_3],
|
| 62 |
"Chili_Dog_8B.i1-Q4_K_M.gguf": ["mradermacher/Chili_Dog_8B-i1-GGUF", MessagesFormatterType.CHATML],
|
| 63 |
"astra-v1-12b-q5_k_m.gguf": ["P0x0/Astra-v1-12B-GGUF", MessagesFormatterType.MISTRAL],
|
|
@@ -585,6 +623,8 @@ llm_models = {
|
|
| 585 |
"tifa-7b-qwen2-v0.1.q4_k_m.gguf": ["Tifa-RP/Tifa-7B-Qwen2-v0.1-GGUF", MessagesFormatterType.OPEN_CHAT],
|
| 586 |
"Holland-Magnum-Merge-R2.i1-Q5_K_M.gguf": ["mradermacher/Holland-Magnum-Merge-R2-i1-GGUF", MessagesFormatterType.LLAMA_3],
|
| 587 |
"Oumuamua-7b-RP_Q5_K_M.gguf": ["Aratako/Oumuamua-7b-RP-GGUF", MessagesFormatterType.MISTRAL],
|
|
|
|
|
|
|
| 588 |
"Berghof-NSFW-7B.Q5_K_M.gguf": ["QuantFactory/Berghof-NSFW-7B-GGUF", MessagesFormatterType.MISTRAL],
|
| 589 |
"Japanese-TextGen-Kage-v0.1.2-2x7B-NSFW_iMat_Ch200_IQ4_XS.gguf": ["dddump/Japanese-TextGen-Kage-v0.1.2-2x7B-NSFW-gguf", MessagesFormatterType.VICUNA],
|
| 590 |
"ChatWaifu_v1.2.1.Q5_K_M.gguf": ["mradermacher/ChatWaifu_v1.2.1-GGUF", MessagesFormatterType.MISTRAL],
|
|
|
|
| 56 |
"qwen2.5-lumen-14b-q4_k_m.gguf": ["Lambent/Qwen2.5-Lumen-14B-Q4_K_M-GGUF", MessagesFormatterType.OPEN_CHAT],
|
| 57 |
"Qwen2.5-14B_Uncensored_Instruct.Q4_K_M.gguf": ["mradermacher/Qwen2.5-14B_Uncensored_Instruct-GGUF", MessagesFormatterType.OPEN_CHAT],
|
| 58 |
"Trinas_Nectar-8B-model_stock.i1-Q4_K_M.gguf": ["mradermacher/Trinas_Nectar-8B-model_stock-i1-GGUF", MessagesFormatterType.MISTRAL],
|
| 59 |
+
"ChatWaifu_22B_v2.0_preview.Q4_K_S.gguf": ["mradermacher/ChatWaifu_22B_v2.0_preview-GGUF", MessagesFormatterType.MISTRAL],
|
| 60 |
"ChatWaifu_v1.4.Q5_K_M.gguf": ["mradermacher/ChatWaifu_v1.4-GGUF", MessagesFormatterType.MISTRAL],
|
| 61 |
"ChatWaifu_v1.3.1.Q4_K_M.gguf": ["mradermacher/ChatWaifu_v1.3.1-GGUF", MessagesFormatterType.MISTRAL],
|
| 62 |
+
"Llama-3.2-3B-Instruct-uncensored.i1-Q5_K_S.gguf": ["mradermacher/Llama-3.2-3B-Instruct-uncensored-i1-GGUF", MessagesFormatterType.LLAMA_3],
|
| 63 |
+
"L3-SthenoMaid-8B-V1-Q5_K_M.gguf": ["bartowski/L3-SthenoMaid-8B-V1-GGUF", MessagesFormatterType.LLAMA_3],
|
| 64 |
+
"Magot-v2-Gemma2-8k-9B.Q5_K_M.gguf": ["grimjim/Magot-v2-Gemma2-8k-9B-GGUF", MessagesFormatterType.ALPACA],
|
| 65 |
+
"Dante_9B.i1-Q4_K_M.gguf": ["mradermacher/Dante_9B-i1-GGUF", MessagesFormatterType.ALPACA],
|
| 66 |
+
"L3.1-Artemis-faustus-8B.i1-Q5_K_M.gguf": ["mradermacher/L3.1-Artemis-faustus-8B-i1-GGUF", MessagesFormatterType.LLAMA_3],
|
| 67 |
+
"EdgeRunner-Command-Nested-FC-v3.i1-Q4_K_M.gguf": ["mradermacher/EdgeRunner-Command-Nested-FC-v3-i1-GGUF", MessagesFormatterType.OPEN_CHAT],
|
| 68 |
+
"Virgil_9B.i1-Q4_K_M.gguf": ["mradermacher/Virgil_9B-i1-GGUF", MessagesFormatterType.ALPACA],
|
| 69 |
+
"L3.1-Noraian.i1-Q5_K_M.gguf": ["mradermacher/L3.1-Noraian-i1-GGUF", MessagesFormatterType.LLAMA_3],
|
| 70 |
+
"DARKER-PLANET-Broken-Land-12.15B-D_AU-Q4_k_m.gguf": ["DavidAU/DARKER-PLANET-Broken-Land-12.15B-GGUF", MessagesFormatterType.LLAMA_3],
|
| 71 |
+
"L3.1-Purosani.i1-Q4_K_M.gguf": ["mradermacher/L3.1-Purosani-i1-GGUF", MessagesFormatterType.LLAMA_3],
|
| 72 |
+
"L3-Darker-Planet-12.15B.i1-Q4_K_S.gguf": ["mradermacher/L3-Darker-Planet-12.15B-i1-GGUF", MessagesFormatterType.LLAMA_3],
|
| 73 |
+
"MFANN-llama3.1-Abliterated-SLERP.i1-Q5_K_M.gguf": ["mradermacher/MFANN-llama3.1-Abliterated-SLERP-i1-GGUF", MessagesFormatterType.LLAMA_3],
|
| 74 |
+
"arsenic-v1-qwen2.5-14B.Q4_K_M.gguf": ["mradermacher/arsenic-v1-qwen2.5-14B-GGUF", MessagesFormatterType.OPEN_CHAT],
|
| 75 |
+
"Mistral-Nemo-Gutenberg-Doppel-12B.Q4_K_M.gguf": ["mradermacher/Mistral-Nemo-Gutenberg-Doppel-12B-GGUF", MessagesFormatterType.MISTRAL],
|
| 76 |
+
"Gemma-The-Writer-9B.Q4_K_M.gguf": ["mradermacher/Gemma-The-Writer-9B-GGUF", MessagesFormatterType.ALPACA],
|
| 77 |
+
"Qwen2.5-14B-Instruct-abliterated.i1-Q4_K_M.gguf": ["mradermacher/Qwen2.5-14B-Instruct-abliterated-i1-GGUF", MessagesFormatterType.OPEN_CHAT],
|
| 78 |
+
"LongCite-llama3.1-8B-Q5_K_M.gguf": ["LPN64/LongCite-llama3.1-8b-GGUF", MessagesFormatterType.LLAMA_3],
|
| 79 |
+
"IceDrinkNameGoesHereV0RP-7b-Model_Stock.Q4_K_M.gguf": ["mradermacher/IceDrinkNameGoesHereV0RP-7b-Model_Stock-GGUF", MessagesFormatterType.MISTRAL],
|
| 80 |
+
"Magnum-Picaro-0.7-v2-12b.i1-Q4_K_M.gguf": ["mradermacher/Magnum-Picaro-0.7-v2-12b-i1-GGUF", MessagesFormatterType.CHATML],
|
| 81 |
+
"arsenic-v1-qwen2.5-14b-q4_k_m.gguf": ["Lambent/arsenic-v1-qwen2.5-14B-Q4_K_M-GGUF", MessagesFormatterType.OPEN_CHAT],
|
| 82 |
+
"magnum-v3-9b-chatml.i1-Q4_K_M.gguf": ["mradermacher/magnum-v3-9b-chatml-i1-GGUF", MessagesFormatterType.CHATML],
|
| 83 |
+
"Aether-12b.Q4_K_M.gguf": ["mradermacher/Aether-12b-GGUF", MessagesFormatterType.MISTRAL],
|
| 84 |
+
"Magnum-Picaro-0.7-v2-12b.Q4_K_M.gguf": ["mradermacher/Magnum-Picaro-0.7-v2-12b-GGUF", MessagesFormatterType.CHATML],
|
| 85 |
+
"IceMartiniV1RP-7b.i1-Q4_K_M.gguf": ["mradermacher/IceMartiniV1RP-7b-i1-GGUF", MessagesFormatterType.MISTRAL],
|
| 86 |
+
"L3-Darker-Planet-12.15B-D_AU-Q4_k_s.gguf": ["DavidAU/L3-Darker-Planet-12.15B-GGUF", MessagesFormatterType.LLAMA_3],
|
| 87 |
+
"Llama-3-8B-Stroganoff-4.0-Version-B.i1-Q4_K_M.gguf": ["mradermacher/Llama-3-8B-Stroganoff-4.0-Version-B-i1-GGUF", MessagesFormatterType.LLAMA_3],
|
| 88 |
+
"IceDrunkCherryV1RP-7b.Q5_K_S.gguf": ["mradermacher/IceDrunkCherryV1RP-7b-GGUF", MessagesFormatterType.MISTRAL],
|
| 89 |
+
"Llama-3-8B-Stroganoff-4.0-Version-A.i1-Q4_K_M.gguf": ["mradermacher/Llama-3-8B-Stroganoff-4.0-Version-A-i1-GGUF", MessagesFormatterType.LLAMA_3],
|
| 90 |
+
"vulca-reshapetesting-006.q8_0.gguf": ["kromquant/vulca-reshapetesting-006-GGUFs", MessagesFormatterType.MISTRAL],
|
| 91 |
+
"FatGirl_v2_DPO_v2_8B.Q4_K_M.gguf": ["mradermacher/FatGirl_v2_DPO_v2_8B-GGUF", MessagesFormatterType.MISTRAL],
|
| 92 |
+
"NemonsterExtreme-12b.Q4_K_M.gguf": ["mradermacher/NemonsterExtreme-12b-GGUF", MessagesFormatterType.MISTRAL],
|
| 93 |
+
"Magnum-Instruct-DPO-18B.Q4_K_M.gguf": ["mradermacher/Magnum-Instruct-DPO-18B-GGUF", MessagesFormatterType.MISTRAL],
|
| 94 |
+
"qwen2.5-reinstruct-alternate-lumen-14B.Q4_K_M.gguf": ["mradermacher/qwen2.5-reinstruct-alternate-lumen-14B-GGUF", MessagesFormatterType.OPEN_CHAT],
|
| 95 |
+
"SuperHeart.i1-Q5_K_M.gguf": ["mradermacher/SuperHeart-i1-GGUF", MessagesFormatterType.LLAMA_3],
|
| 96 |
+
"SuperHeartBerg.i1-Q4_K_M.gguf": ["mradermacher/SuperHeartBerg-i1-GGUF", MessagesFormatterType.LLAMA_3],
|
| 97 |
+
"gemma-2-9B-it-function-calling-Q5_K_M.gguf": ["DiTy/gemma-2-9b-it-function-calling-GGUF", MessagesFormatterType.ALPACA],
|
| 98 |
+
"Qwen2.5-7B-TitanFusion.Q5_K_M.gguf": ["mradermacher/Qwen2.5-7B-TitanFusion-GGUF", MessagesFormatterType.OPEN_CHAT],
|
| 99 |
"Collaiborator-MEDLLM-Llama-3-8B-v1.i1-Q5_K_M.gguf": ["mradermacher/Collaiborator-MEDLLM-Llama-3-8B-v1-i1-GGUF", MessagesFormatterType.LLAMA_3],
|
| 100 |
"Chili_Dog_8B.i1-Q4_K_M.gguf": ["mradermacher/Chili_Dog_8B-i1-GGUF", MessagesFormatterType.CHATML],
|
| 101 |
"astra-v1-12b-q5_k_m.gguf": ["P0x0/Astra-v1-12B-GGUF", MessagesFormatterType.MISTRAL],
|
|
|
|
| 623 |
"tifa-7b-qwen2-v0.1.q4_k_m.gguf": ["Tifa-RP/Tifa-7B-Qwen2-v0.1-GGUF", MessagesFormatterType.OPEN_CHAT],
|
| 624 |
"Holland-Magnum-Merge-R2.i1-Q5_K_M.gguf": ["mradermacher/Holland-Magnum-Merge-R2-i1-GGUF", MessagesFormatterType.LLAMA_3],
|
| 625 |
"Oumuamua-7b-RP_Q5_K_M.gguf": ["Aratako/Oumuamua-7b-RP-GGUF", MessagesFormatterType.MISTRAL],
|
| 626 |
+
"ContextualKunoichi_KTO-7B.Q5_K_M.gguf": ["mradermacher/ContextualKunoichi_KTO-7B-GGUF", MessagesFormatterType.MISTRAL],
|
| 627 |
+
"ContextualToppy_KTO-7B.Q5_K_M.gguf": ["mradermacher/ContextualToppy_KTO-7B-GGUF", MessagesFormatterType.MISTRAL],
|
| 628 |
"Berghof-NSFW-7B.Q5_K_M.gguf": ["QuantFactory/Berghof-NSFW-7B-GGUF", MessagesFormatterType.MISTRAL],
|
| 629 |
"Japanese-TextGen-Kage-v0.1.2-2x7B-NSFW_iMat_Ch200_IQ4_XS.gguf": ["dddump/Japanese-TextGen-Kage-v0.1.2-2x7B-NSFW-gguf", MessagesFormatterType.VICUNA],
|
| 630 |
"ChatWaifu_v1.2.1.Q5_K_M.gguf": ["mradermacher/ChatWaifu_v1.2.1-GGUF", MessagesFormatterType.MISTRAL],
|
modutils.py
CHANGED
|
@@ -4,13 +4,21 @@ import gradio as gr
|
|
| 4 |
from huggingface_hub import HfApi
|
| 5 |
import os
|
| 6 |
from pathlib import Path
|
|
|
|
| 7 |
|
| 8 |
|
| 9 |
from env import (HF_LORA_PRIVATE_REPOS1, HF_LORA_PRIVATE_REPOS2,
|
| 10 |
-
HF_MODEL_USER_EX, HF_MODEL_USER_LIKES,
|
| 11 |
directory_loras, hf_read_token, HF_TOKEN, CIVITAI_API_KEY)
|
| 12 |
|
| 13 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 14 |
def get_user_agent():
|
| 15 |
return 'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:127.0) Gecko/20100101 Firefox/127.0'
|
| 16 |
|
|
@@ -27,6 +35,11 @@ def list_sub(a, b):
|
|
| 27 |
return [e for e in a if e not in b]
|
| 28 |
|
| 29 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 30 |
from translatepy import Translator
|
| 31 |
translator = Translator()
|
| 32 |
def translate_to_en(input: str):
|
|
@@ -64,7 +77,7 @@ def download_things(directory, url, hf_token="", civitai_api_key=""):
|
|
| 64 |
if hf_token:
|
| 65 |
os.system(f"aria2c --console-log-level=error --summary-interval=10 --header={user_header} -c -x 16 -k 1M -s 16 {url} -d {directory} -o {url.split('/')[-1]}")
|
| 66 |
else:
|
| 67 |
-
os.system
|
| 68 |
elif "civitai.com" in url:
|
| 69 |
if "?" in url:
|
| 70 |
url = url.split("?")[0]
|
|
@@ -100,7 +113,6 @@ def safe_float(input):
|
|
| 100 |
return output
|
| 101 |
|
| 102 |
|
| 103 |
-
from PIL import Image
|
| 104 |
def save_images(images: list[Image.Image], metadatas: list[str]):
|
| 105 |
from PIL import PngImagePlugin
|
| 106 |
import uuid
|
|
@@ -245,10 +257,10 @@ model_id_list = get_model_id_list()
|
|
| 245 |
|
| 246 |
|
| 247 |
def get_t2i_model_info(repo_id: str):
|
| 248 |
-
api = HfApi()
|
| 249 |
try:
|
| 250 |
-
if
|
| 251 |
-
model = api.model_info(repo_id=repo_id)
|
| 252 |
except Exception as e:
|
| 253 |
print(f"Error: Failed to get {repo_id}'s info.")
|
| 254 |
print(e)
|
|
@@ -258,9 +270,8 @@ def get_t2i_model_info(repo_id: str):
|
|
| 258 |
info = []
|
| 259 |
url = f"https://huggingface.co/{repo_id}/"
|
| 260 |
if not 'diffusers' in tags: return ""
|
| 261 |
-
|
| 262 |
-
|
| 263 |
-
elif 'diffusers:StableDiffusionPipeline' in tags: info.append("SD1.5")
|
| 264 |
if model.card_data and model.card_data.tags:
|
| 265 |
info.extend(list_sub(model.card_data.tags, ['text-to-image', 'stable-diffusion', 'stable-diffusion-api', 'safetensors', 'stable-diffusion-xl']))
|
| 266 |
info.append(f"DLs: {model.downloads}")
|
|
@@ -285,12 +296,8 @@ def get_tupled_model_list(model_list):
|
|
| 285 |
tags = model.tags
|
| 286 |
info = []
|
| 287 |
if not 'diffusers' in tags: continue
|
| 288 |
-
|
| 289 |
-
info.append(
|
| 290 |
-
if 'diffusers:StableDiffusionXLPipeline' in tags:
|
| 291 |
-
info.append("SDXL")
|
| 292 |
-
elif 'diffusers:StableDiffusionPipeline' in tags:
|
| 293 |
-
info.append("SD1.5")
|
| 294 |
if model.card_data and model.card_data.tags:
|
| 295 |
info.extend(list_sub(model.card_data.tags, ['text-to-image', 'stable-diffusion', 'stable-diffusion-api', 'safetensors', 'stable-diffusion-xl']))
|
| 296 |
if "pony" in info:
|
|
@@ -374,7 +381,7 @@ def get_civitai_info(path):
|
|
| 374 |
|
| 375 |
|
| 376 |
def get_lora_model_list():
|
| 377 |
-
loras = list_uniq(get_private_lora_model_lists() + get_local_model_list(directory_loras))
|
| 378 |
loras.insert(0, "None")
|
| 379 |
loras.insert(0, "")
|
| 380 |
return loras
|
|
@@ -483,7 +490,7 @@ def download_my_lora(dl_urls: str, lora1: str, lora2: str, lora3: str, lora4: st
|
|
| 483 |
gr.update(value=lora4, choices=choices), gr.update(value=lora5, choices=choices)
|
| 484 |
|
| 485 |
|
| 486 |
-
def get_valid_lora_name(query: str):
|
| 487 |
path = "None"
|
| 488 |
if not query or query == "None": return "None"
|
| 489 |
if to_lora_key(query) in loras_dict.keys(): return query
|
|
@@ -497,7 +504,7 @@ def get_valid_lora_name(query: str):
|
|
| 497 |
dl_file = download_lora(query)
|
| 498 |
if dl_file and Path(dl_file).exists(): return dl_file
|
| 499 |
else:
|
| 500 |
-
dl_file = find_similar_lora(query)
|
| 501 |
if dl_file and Path(dl_file).exists(): return dl_file
|
| 502 |
return "None"
|
| 503 |
|
|
@@ -521,14 +528,14 @@ def get_valid_lora_wt(prompt: str, lora_path: str, lora_wt: float):
|
|
| 521 |
return wt
|
| 522 |
|
| 523 |
|
| 524 |
-
def set_prompt_loras(prompt, prompt_syntax, lora1, lora1_wt, lora2, lora2_wt, lora3, lora3_wt, lora4, lora4_wt, lora5, lora5_wt):
|
| 525 |
import re
|
| 526 |
if not "Classic" in str(prompt_syntax): return lora1, lora1_wt, lora2, lora2_wt, lora3, lora3_wt, lora4, lora4_wt, lora5, lora5_wt
|
| 527 |
-
lora1 = get_valid_lora_name(lora1)
|
| 528 |
-
lora2 = get_valid_lora_name(lora2)
|
| 529 |
-
lora3 = get_valid_lora_name(lora3)
|
| 530 |
-
lora4 = get_valid_lora_name(lora4)
|
| 531 |
-
lora5 = get_valid_lora_name(lora5)
|
| 532 |
if not "<lora" in prompt: return lora1, lora1_wt, lora2, lora2_wt, lora3, lora3_wt, lora4, lora4_wt, lora5, lora5_wt
|
| 533 |
lora1_wt = get_valid_lora_wt(prompt, lora1, lora1_wt)
|
| 534 |
lora2_wt = get_valid_lora_wt(prompt, lora2, lora2_wt)
|
|
@@ -790,16 +797,17 @@ def get_civitai_info(path):
|
|
| 790 |
return items
|
| 791 |
|
| 792 |
|
| 793 |
-
def search_lora_on_civitai(query: str, allow_model: list[str] = ["Pony", "SDXL 1.0"], limit: int = 100
|
|
|
|
| 794 |
import requests
|
| 795 |
from requests.adapters import HTTPAdapter
|
| 796 |
from urllib3.util import Retry
|
| 797 |
-
if not query: return None
|
| 798 |
user_agent = get_user_agent()
|
| 799 |
headers = {'User-Agent': user_agent, 'content-type': 'application/json'}
|
| 800 |
base_url = 'https://civitai.com/api/v1/models'
|
| 801 |
-
params = {'
|
| 802 |
-
|
|
|
|
| 803 |
session = requests.Session()
|
| 804 |
retries = Retry(total=5, backoff_factor=1, status_forcelist=[500, 502, 503, 504])
|
| 805 |
session.mount("https://", HTTPAdapter(max_retries=retries))
|
|
@@ -828,9 +836,9 @@ def search_lora_on_civitai(query: str, allow_model: list[str] = ["Pony", "SDXL 1
|
|
| 828 |
return items
|
| 829 |
|
| 830 |
|
| 831 |
-
def search_civitai_lora(query, base_model):
|
| 832 |
global civitai_lora_last_results
|
| 833 |
-
items = search_lora_on_civitai(query, base_model)
|
| 834 |
if not items: return gr.update(choices=[("", "")], value="", visible=False),\
|
| 835 |
gr.update(value="", visible=False), gr.update(visible=True), gr.update(visible=True)
|
| 836 |
civitai_lora_last_results = {}
|
|
@@ -856,7 +864,27 @@ def select_civitai_lora(search_result):
|
|
| 856 |
return gr.update(value=search_result), gr.update(value=md, visible=True)
|
| 857 |
|
| 858 |
|
| 859 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 860 |
from rapidfuzz.process import extractOne
|
| 861 |
from rapidfuzz.utils import default_process
|
| 862 |
query = to_lora_key(q)
|
|
@@ -879,7 +907,7 @@ def find_similar_lora(q: str):
|
|
| 879 |
print(f"Finding <lora:{query}:...> on Civitai...")
|
| 880 |
civitai_query = Path(query).stem if Path(query).is_file() else query
|
| 881 |
civitai_query = civitai_query.replace("_", " ").replace("-", " ")
|
| 882 |
-
base_model =
|
| 883 |
items = search_lora_on_civitai(civitai_query, base_model, 1)
|
| 884 |
if items:
|
| 885 |
item = items[0]
|
|
@@ -1241,11 +1269,11 @@ def set_textual_inversion_prompt(textual_inversion_gui, prompt_gui, neg_prompt_g
|
|
| 1241 |
|
| 1242 |
def get_model_pipeline(repo_id: str):
|
| 1243 |
from huggingface_hub import HfApi
|
| 1244 |
-
api = HfApi()
|
| 1245 |
default = "StableDiffusionPipeline"
|
| 1246 |
try:
|
| 1247 |
-
if
|
| 1248 |
-
model = api.model_info(repo_id=repo_id)
|
| 1249 |
except Exception:
|
| 1250 |
return default
|
| 1251 |
if model.private or model.gated: return default
|
|
|
|
| 4 |
from huggingface_hub import HfApi
|
| 5 |
import os
|
| 6 |
from pathlib import Path
|
| 7 |
+
from PIL import Image
|
| 8 |
|
| 9 |
|
| 10 |
from env import (HF_LORA_PRIVATE_REPOS1, HF_LORA_PRIVATE_REPOS2,
|
| 11 |
+
HF_MODEL_USER_EX, HF_MODEL_USER_LIKES, DIFFUSERS_FORMAT_LORAS,
|
| 12 |
directory_loras, hf_read_token, HF_TOKEN, CIVITAI_API_KEY)
|
| 13 |
|
| 14 |
|
| 15 |
+
MODEL_TYPE_DICT = {
|
| 16 |
+
"diffusers:StableDiffusionPipeline": "SD 1.5",
|
| 17 |
+
"diffusers:StableDiffusionXLPipeline": "SDXL",
|
| 18 |
+
"diffusers:FluxPipeline": "FLUX",
|
| 19 |
+
}
|
| 20 |
+
|
| 21 |
+
|
| 22 |
def get_user_agent():
|
| 23 |
return 'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:127.0) Gecko/20100101 Firefox/127.0'
|
| 24 |
|
|
|
|
| 35 |
return [e for e in a if e not in b]
|
| 36 |
|
| 37 |
|
| 38 |
+
def is_repo_name(s):
|
| 39 |
+
import re
|
| 40 |
+
return re.fullmatch(r'^[^/]+?/[^/]+?$', s)
|
| 41 |
+
|
| 42 |
+
|
| 43 |
from translatepy import Translator
|
| 44 |
translator = Translator()
|
| 45 |
def translate_to_en(input: str):
|
|
|
|
| 77 |
if hf_token:
|
| 78 |
os.system(f"aria2c --console-log-level=error --summary-interval=10 --header={user_header} -c -x 16 -k 1M -s 16 {url} -d {directory} -o {url.split('/')[-1]}")
|
| 79 |
else:
|
| 80 |
+
os.system(f"aria2c --optimize-concurrent-downloads --console-log-level=error --summary-interval=10 -c -x 16 -k 1M -s 16 {url} -d {directory} -o {url.split('/')[-1]}")
|
| 81 |
elif "civitai.com" in url:
|
| 82 |
if "?" in url:
|
| 83 |
url = url.split("?")[0]
|
|
|
|
| 113 |
return output
|
| 114 |
|
| 115 |
|
|
|
|
| 116 |
def save_images(images: list[Image.Image], metadatas: list[str]):
|
| 117 |
from PIL import PngImagePlugin
|
| 118 |
import uuid
|
|
|
|
| 257 |
|
| 258 |
|
| 259 |
def get_t2i_model_info(repo_id: str):
|
| 260 |
+
api = HfApi(token=HF_TOKEN)
|
| 261 |
try:
|
| 262 |
+
if not is_repo_name(repo_id): return ""
|
| 263 |
+
model = api.model_info(repo_id=repo_id, timeout=5.0)
|
| 264 |
except Exception as e:
|
| 265 |
print(f"Error: Failed to get {repo_id}'s info.")
|
| 266 |
print(e)
|
|
|
|
| 270 |
info = []
|
| 271 |
url = f"https://huggingface.co/{repo_id}/"
|
| 272 |
if not 'diffusers' in tags: return ""
|
| 273 |
+
for k, v in MODEL_TYPE_DICT.items():
|
| 274 |
+
if k in tags: info.append(v)
|
|
|
|
| 275 |
if model.card_data and model.card_data.tags:
|
| 276 |
info.extend(list_sub(model.card_data.tags, ['text-to-image', 'stable-diffusion', 'stable-diffusion-api', 'safetensors', 'stable-diffusion-xl']))
|
| 277 |
info.append(f"DLs: {model.downloads}")
|
|
|
|
| 296 |
tags = model.tags
|
| 297 |
info = []
|
| 298 |
if not 'diffusers' in tags: continue
|
| 299 |
+
for k, v in MODEL_TYPE_DICT.items():
|
| 300 |
+
if k in tags: info.append(v)
|
|
|
|
|
|
|
|
|
|
|
|
|
| 301 |
if model.card_data and model.card_data.tags:
|
| 302 |
info.extend(list_sub(model.card_data.tags, ['text-to-image', 'stable-diffusion', 'stable-diffusion-api', 'safetensors', 'stable-diffusion-xl']))
|
| 303 |
if "pony" in info:
|
|
|
|
| 381 |
|
| 382 |
|
| 383 |
def get_lora_model_list():
|
| 384 |
+
loras = list_uniq(get_private_lora_model_lists() + get_local_model_list(directory_loras) + DIFFUSERS_FORMAT_LORAS)
|
| 385 |
loras.insert(0, "None")
|
| 386 |
loras.insert(0, "")
|
| 387 |
return loras
|
|
|
|
| 490 |
gr.update(value=lora4, choices=choices), gr.update(value=lora5, choices=choices)
|
| 491 |
|
| 492 |
|
| 493 |
+
def get_valid_lora_name(query: str, model_name: str):
|
| 494 |
path = "None"
|
| 495 |
if not query or query == "None": return "None"
|
| 496 |
if to_lora_key(query) in loras_dict.keys(): return query
|
|
|
|
| 504 |
dl_file = download_lora(query)
|
| 505 |
if dl_file and Path(dl_file).exists(): return dl_file
|
| 506 |
else:
|
| 507 |
+
dl_file = find_similar_lora(query, model_name)
|
| 508 |
if dl_file and Path(dl_file).exists(): return dl_file
|
| 509 |
return "None"
|
| 510 |
|
|
|
|
| 528 |
return wt
|
| 529 |
|
| 530 |
|
| 531 |
+
def set_prompt_loras(prompt, prompt_syntax, model_name, lora1, lora1_wt, lora2, lora2_wt, lora3, lora3_wt, lora4, lora4_wt, lora5, lora5_wt):
|
| 532 |
import re
|
| 533 |
if not "Classic" in str(prompt_syntax): return lora1, lora1_wt, lora2, lora2_wt, lora3, lora3_wt, lora4, lora4_wt, lora5, lora5_wt
|
| 534 |
+
lora1 = get_valid_lora_name(lora1, model_name)
|
| 535 |
+
lora2 = get_valid_lora_name(lora2, model_name)
|
| 536 |
+
lora3 = get_valid_lora_name(lora3, model_name)
|
| 537 |
+
lora4 = get_valid_lora_name(lora4, model_name)
|
| 538 |
+
lora5 = get_valid_lora_name(lora5, model_name)
|
| 539 |
if not "<lora" in prompt: return lora1, lora1_wt, lora2, lora2_wt, lora3, lora3_wt, lora4, lora4_wt, lora5, lora5_wt
|
| 540 |
lora1_wt = get_valid_lora_wt(prompt, lora1, lora1_wt)
|
| 541 |
lora2_wt = get_valid_lora_wt(prompt, lora2, lora2_wt)
|
|
|
|
| 797 |
return items
|
| 798 |
|
| 799 |
|
| 800 |
+
def search_lora_on_civitai(query: str, allow_model: list[str] = ["Pony", "SDXL 1.0"], limit: int = 100,
|
| 801 |
+
sort: str = "Highest Rated", period: str = "AllTime", tag: str = ""):
|
| 802 |
import requests
|
| 803 |
from requests.adapters import HTTPAdapter
|
| 804 |
from urllib3.util import Retry
|
|
|
|
| 805 |
user_agent = get_user_agent()
|
| 806 |
headers = {'User-Agent': user_agent, 'content-type': 'application/json'}
|
| 807 |
base_url = 'https://civitai.com/api/v1/models'
|
| 808 |
+
params = {'types': ['LORA'], 'sort': sort, 'period': period, 'limit': limit, 'nsfw': 'true'}
|
| 809 |
+
if query: params["query"] = query
|
| 810 |
+
if tag: params["tag"] = tag
|
| 811 |
session = requests.Session()
|
| 812 |
retries = Retry(total=5, backoff_factor=1, status_forcelist=[500, 502, 503, 504])
|
| 813 |
session.mount("https://", HTTPAdapter(max_retries=retries))
|
|
|
|
| 836 |
return items
|
| 837 |
|
| 838 |
|
| 839 |
+
def search_civitai_lora(query, base_model, sort="Highest Rated", period="AllTime", tag=""):
|
| 840 |
global civitai_lora_last_results
|
| 841 |
+
items = search_lora_on_civitai(query, base_model, 100, sort, period, tag)
|
| 842 |
if not items: return gr.update(choices=[("", "")], value="", visible=False),\
|
| 843 |
gr.update(value="", visible=False), gr.update(visible=True), gr.update(visible=True)
|
| 844 |
civitai_lora_last_results = {}
|
|
|
|
| 864 |
return gr.update(value=search_result), gr.update(value=md, visible=True)
|
| 865 |
|
| 866 |
|
| 867 |
+
LORA_BASE_MODEL_DICT = {
|
| 868 |
+
"diffusers:StableDiffusionPipeline": ["SD 1.5"],
|
| 869 |
+
"diffusers:StableDiffusionXLPipeline": ["Pony", "SDXL 1.0"],
|
| 870 |
+
"diffusers:FluxPipeline": ["Flux.1 D", "Flux.1 S"],
|
| 871 |
+
}
|
| 872 |
+
|
| 873 |
+
|
| 874 |
+
def get_lora_base_model(model_name: str):
|
| 875 |
+
api = HfApi(token=HF_TOKEN)
|
| 876 |
+
default = ["Pony", "SDXL 1.0"]
|
| 877 |
+
try:
|
| 878 |
+
model = api.model_info(repo_id=model_name, timeout=5.0)
|
| 879 |
+
tags = model.tags
|
| 880 |
+
for tag in tags:
|
| 881 |
+
if tag in LORA_BASE_MODEL_DICT.keys(): return LORA_BASE_MODEL_DICT.get(tag, default)
|
| 882 |
+
except Exception:
|
| 883 |
+
return default
|
| 884 |
+
return default
|
| 885 |
+
|
| 886 |
+
|
| 887 |
+
def find_similar_lora(q: str, model_name: str):
|
| 888 |
from rapidfuzz.process import extractOne
|
| 889 |
from rapidfuzz.utils import default_process
|
| 890 |
query = to_lora_key(q)
|
|
|
|
| 907 |
print(f"Finding <lora:{query}:...> on Civitai...")
|
| 908 |
civitai_query = Path(query).stem if Path(query).is_file() else query
|
| 909 |
civitai_query = civitai_query.replace("_", " ").replace("-", " ")
|
| 910 |
+
base_model = get_lora_base_model(model_name)
|
| 911 |
items = search_lora_on_civitai(civitai_query, base_model, 1)
|
| 912 |
if items:
|
| 913 |
item = items[0]
|
|
|
|
| 1269 |
|
| 1270 |
def get_model_pipeline(repo_id: str):
|
| 1271 |
from huggingface_hub import HfApi
|
| 1272 |
+
api = HfApi(token=HF_TOKEN)
|
| 1273 |
default = "StableDiffusionPipeline"
|
| 1274 |
try:
|
| 1275 |
+
if not is_repo_name(repo_id): return default
|
| 1276 |
+
model = api.model_info(repo_id=repo_id, timeout=5.0)
|
| 1277 |
except Exception:
|
| 1278 |
return default
|
| 1279 |
if model.private or model.gated: return default
|
requirements.txt
CHANGED
|
@@ -8,7 +8,6 @@ git+https://github.com/R3gm/stablepy.git@flux_beta
|
|
| 8 |
torch==2.2.0
|
| 9 |
gdown
|
| 10 |
opencv-python
|
| 11 |
-
yt-dlp
|
| 12 |
huggingface_hub
|
| 13 |
scikit-build-core
|
| 14 |
https://github.com/abetlen/llama-cpp-python/releases/download/v0.2.90-cu124/llama_cpp_python-0.2.90-cp310-cp310-linux_x86_64.whl
|
|
|
|
| 8 |
torch==2.2.0
|
| 9 |
gdown
|
| 10 |
opencv-python
|
|
|
|
| 11 |
huggingface_hub
|
| 12 |
scikit-build-core
|
| 13 |
https://github.com/abetlen/llama-cpp-python/releases/download/v0.2.90-cu124/llama_cpp_python-0.2.90-cp310-cp310-linux_x86_64.whl
|