├── scripts ├── assistant │ ├── __init__.py │ ├── widget.py │ └── miaoshou.py ├── msai_logging │ ├── __init__.py │ └── msai_logger.py ├── download │ ├── __init__.py │ ├── resume_checkpoint.py │ ├── msai_downloader_manager.py │ └── msai_file_downloader.py ├── msai_utils │ ├── __init__.py │ ├── msai_singleton.py │ └── msai_toolkit.py ├── runtime │ ├── __init__.py │ └── msai_prelude.py └── main.py ├── configs ├── webui-user-launch.bat ├── settings.json ├── webui-macos-env.sh ├── webui-user.sh ├── hugging_face.json ├── official_models.json └── model_hash.json ├── .gitmodules ├── requirements.txt ├── .gitignore ├── install.py ├── README_CN.md ├── README.md └── LICENSE /scripts/assistant/__init__.py: -------------------------------------------------------------------------------- 1 | __all__ = ["miaoshou"] 2 | -------------------------------------------------------------------------------- /scripts/msai_logging/__init__.py: -------------------------------------------------------------------------------- 1 | __all__ = ["msai_logger"] 2 | -------------------------------------------------------------------------------- /scripts/download/__init__.py: -------------------------------------------------------------------------------- 1 | __all__ = ["msai_downloader_manager"] 2 | -------------------------------------------------------------------------------- /scripts/msai_utils/__init__.py: -------------------------------------------------------------------------------- 1 | __all__ = ["msai_singleton", "msai_toolkit"] 2 | -------------------------------------------------------------------------------- /configs/webui-user-launch.bat: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/miaoshouai/miaoshouai-assistant/HEAD/configs/webui-user-launch.bat -------------------------------------------------------------------------------- /.gitmodules: -------------------------------------------------------------------------------- 1 | [submodule "assets"] 2 | path = assets 3 | url = https://e.coding.net/miaoshouai/miaoshou-stable-diffusion-webui/assets.git 4 | -------------------------------------------------------------------------------- /scripts/runtime/__init__.py: -------------------------------------------------------------------------------- 1 | __all__ = ["msai_prelude", "msai_runtime"] 2 | 3 | from . import msai_prelude as prelude 4 | 5 | prelude.MiaoshouPrelude().load() 6 | -------------------------------------------------------------------------------- /requirements.txt: -------------------------------------------------------------------------------- 1 | psutil 2 | openai 3 | numba 4 | BeautifulSoup4 5 | gpt_index==0.4.24 6 | langchain==0.0.132 7 | gradio_client==0.5.0 8 | requests==2.31.0 9 | urllib3==2.0.6 10 | tqdm==4.64.0 11 | 12 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # for vim 2 | .~ 3 | .*.swp 4 | *~ 5 | 6 | # for MacOS 7 | .DS_Store 8 | 9 | __pycache__/ 10 | 11 | .idea/ 12 | 13 | logs/ 14 | flagged/ 15 | 16 | configs/civitai_models.json 17 | configs/liandange_models.json 18 | configs/gpt_index.json 19 | configs/model_hash.json 20 | covers/* 21 | cache/* 22 | assets 23 | -------------------------------------------------------------------------------- /scripts/msai_utils/msai_singleton.py: -------------------------------------------------------------------------------- 1 | class MiaoshouSingleton(type): 2 | _instances = {} 3 | 4 | def __call__(cls, *args, **kwargs): 5 | if cls not in cls._instances: 6 | cls._instances[cls] = super(MiaoshouSingleton, cls).__call__(*args, **kwargs) 7 | cls._instances[cls].__init__(*args, **kwargs) 8 | return cls._instances[cls] 9 | -------------------------------------------------------------------------------- /scripts/main.py: -------------------------------------------------------------------------------- 1 | import modules 2 | import modules.scripts as scripts 3 | 4 | from scripts.assistant.miaoshou import MiaoShouAssistant 5 | 6 | assistant = MiaoShouAssistant() 7 | 8 | class MiaoshouScript(scripts.Script): 9 | def __init__(self) -> None: 10 | super().__init__() 11 | 12 | def title(self): 13 | return "Miaoshou Assistant" 14 | 15 | def show(self, is_img2img): 16 | return scripts.AlwaysVisible 17 | 18 | def ui(self, is_img2img): 19 | return () 20 | 21 | def postprocess(self, p, processed): 22 | assistant.release_mem() 23 | return None 24 | 25 | 26 | modules.script_callbacks.on_ui_tabs(assistant.on_event_ui_tabs_opened) 27 | -------------------------------------------------------------------------------- /configs/settings.json: -------------------------------------------------------------------------------- 1 | { 2 | "boot_settings": { 3 | "drp_args_vram": "CPU Only", 4 | "drp_args_theme": "Dark Mode", 5 | "txt_args_listen_port": "7860", 6 | "Enable xFormers": "--xformers", 7 | "No Half": "--no-half", 8 | "No Half VAE": "False", 9 | "Enable API": "--api", 10 | "Auto Launch": "--autolaunch", 11 | "Allow Local Network Access": "False", 12 | "drp_choose_version": "Official Release", 13 | "txt_args_more": "", 14 | "auto_vram": true, 15 | "disable_log_console_output": true, 16 | "model_source": "miaoshouai.com", 17 | "my_model_source": "civitai.com", 18 | "openai_api": "", 19 | "civitai_api": "" 20 | } 21 | } -------------------------------------------------------------------------------- /configs/webui-macos-env.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | #################################################################### 3 | # macOS defaults # 4 | # Please modify webui-user.sh to change these instead of this file # 5 | #################################################################### 6 | 7 | if [[ -x "$(command -v python3.10)" ]] 8 | then 9 | python_cmd="python3.10" 10 | fi 11 | 12 | export install_dir="$HOME" 13 | export COMMANDLINE_ARGS="--skip-torch-cuda-test --upcast-sampling --no-half-vae --use-cpu interrogate" 14 | export TORCH_COMMAND="pip install torch==1.12.1 torchvision==0.13.1" 15 | export K_DIFFUSION_REPO="https://github.com/brkirch/k-diffusion.git" 16 | export K_DIFFUSION_COMMIT_HASH="51c9778f269cedb55a4d88c79c0246d35bdadb71" 17 | export PYTORCH_ENABLE_MPS_FALLBACK=1 18 | 19 | #################################################################### 20 | -------------------------------------------------------------------------------- /install.py: -------------------------------------------------------------------------------- 1 | import launch 2 | import os 3 | import gzip 4 | import io 5 | import git 6 | import shutil 7 | 8 | def install_preset_models_if_needed(): 9 | assets_folder = os.path.join(os.path.dirname(os.path.realpath(__file__)), "assets") 10 | configs_folder = os.path.join(os.path.dirname(os.path.realpath(__file__)), "configs") 11 | 12 | for model_filename in ["civitai_models.json", "liandange_models.json", "gpt_index.json"]: 13 | try: 14 | gzip_file = os.path.join(assets_folder, f"{model_filename}.gz") 15 | target_file = os.path.join(configs_folder, f"{model_filename}") 16 | if not os.path.exists(target_file): 17 | with gzip.open(gzip_file, "rb") as compressed_file: 18 | with io.TextIOWrapper(compressed_file, encoding="utf-8") as decoder: 19 | content = decoder.read() 20 | with open(target_file, "w", encoding="utf-8") as model_file: 21 | model_file.write(content) 22 | except Exception as e: 23 | print(f"failed to find out {model_filename} under assets directory: {e}") 24 | 25 | req_file = os.path.join(os.path.dirname(os.path.realpath(__file__)), "requirements.txt") 26 | 27 | with open(req_file) as file: 28 | for lib in file: 29 | lib = lib.strip() 30 | if not launch.is_installed(lib): 31 | launch.run_pip(f"install {lib}", f"Miaoshou assistant requirement: {lib}") 32 | 33 | install_preset_models_if_needed() 34 | 35 | -------------------------------------------------------------------------------- /configs/webui-user.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | ######################################################### 3 | # Uncomment and change the variables below to your need:# 4 | ######################################################### 5 | 6 | # Install directory without trailing slash 7 | #install_dir="/home/$(whoami)" 8 | 9 | # Name of the subdirectory 10 | #clone_dir="stable-diffusion-webui" 11 | 12 | # Commandline arguments for webui.py, for example: export COMMANDLINE_ARGS="--medvram --opt-split-attention" 13 | # uncomment the line below based on https://github.com/AUTOMATIC1111/stable-diffusion-webui/wiki/Installation-on-Apple-Silicon 14 | export COMMANDLINE_ARGS="--skip-torch-cuda-test --no-half --use-cpu all" 15 | 16 | # python3 executable 17 | #python_cmd="python3" 18 | 19 | # git executable 20 | #export GIT="git" 21 | 22 | # python3 venv without trailing slash (defaults to ${install_dir}/${clone_dir}/venv) 23 | #venv_dir="venv" 24 | 25 | # script to launch to start the app 26 | #export LAUNCH_SCRIPT="launch.py" 27 | 28 | # install command for torch 29 | #export TORCH_COMMAND="pip install torch==1.12.1+cu113 --extra-index-url https://download.pytorch.org/whl/cu113" 30 | 31 | # Requirements file to use for stable-diffusion-webui 32 | #export REQS_FILE="requirements_versions.txt" 33 | 34 | # Fixed git repos 35 | #export K_DIFFUSION_PACKAGE="" 36 | #export GFPGAN_PACKAGE="" 37 | 38 | # Fixed git commits 39 | #export STABLE_DIFFUSION_COMMIT_HASH="" 40 | #export TAMING_TRANSFORMERS_COMMIT_HASH="" 41 | #export CODEFORMER_COMMIT_HASH="" 42 | #export BLIP_COMMIT_HASH="" 43 | 44 | # Uncomment to enable accelerated launch 45 | #export ACCELERATE="True" 46 | 47 | ########################################### 48 | -------------------------------------------------------------------------------- /scripts/assistant/widget.py: -------------------------------------------------------------------------------- 1 | import gradio as gr 2 | 3 | 4 | # After the Gradio v3.40.0+, the constructor signature changes, in order to keep backward compatibility, 5 | # we use try...catch syntax to archive this purpose. 6 | 7 | def Dataset(**kwargs) -> gr.Dataset: 8 | try: 9 | return gr.Dataset(**kwargs) 10 | except: 11 | constructor_args = {} 12 | style_args = {} 13 | 14 | for k, v in kwargs.items(): 15 | if k == "elem_classes": 16 | style_args["type"] = v 17 | elif k == "container": 18 | style_args["container"] = v 19 | else: 20 | constructor_args[k] = v 21 | return gr.Dataset(**constructor_args).style(**style_args) 22 | 23 | 24 | def Row(**kwargs) -> gr.Row: 25 | try: 26 | return gr.Row(**kwargs) 27 | except: 28 | return gr.Row().style(**kwargs) 29 | 30 | 31 | def Dropdown(**kwargs) -> gr.Dropdown: 32 | try: 33 | return gr.Dropdown(**kwargs) 34 | except: 35 | constructor_args = {} 36 | style_args = {} 37 | 38 | for k, v in kwargs.items(): 39 | if k == "show_progress": 40 | style_args["full_width"] = v == "full" 41 | else: 42 | constructor_args[k] = v 43 | 44 | return gr.Dropdown(**constructor_args).style(**style_args) 45 | 46 | 47 | def Radio(**kwargs) -> gr.Radio: 48 | try: 49 | return gr.Radio(**kwargs) 50 | except: 51 | constructor_args = {} 52 | style_args = {} 53 | 54 | for k, v in kwargs.items(): 55 | if k == "elem_classes": 56 | style_args["full_width"] = v == "full" 57 | else: 58 | constructor_args[k] = v 59 | 60 | return gr.Radio(**constructor_args).style(**style_args) -------------------------------------------------------------------------------- /scripts/msai_utils/msai_toolkit.py: -------------------------------------------------------------------------------- 1 | import json 2 | import os 3 | import platform 4 | import shutil 5 | import typing as t 6 | from datetime import datetime 7 | from pathlib import Path 8 | 9 | 10 | def read_json(file) -> t.Any: 11 | try: 12 | with open(file, "r", encoding="utf-8-sig") as f: 13 | return json.load(f) 14 | except Exception as e: 15 | print(e) 16 | return None 17 | 18 | 19 | def write_json(file, content) -> None: 20 | try: 21 | with open(file, 'w') as f: 22 | json.dump(content, f, indent=4) 23 | except Exception as e: 24 | print(e) 25 | 26 | 27 | def get_args(args) -> t.List[str]: 28 | parameters = [] 29 | idx = 0 30 | for arg in args: 31 | if idx == 0 and '--' not in arg: 32 | pass 33 | elif '--' in arg: 34 | parameters.append(rf'{arg}') 35 | idx += 1 36 | else: 37 | parameters[idx - 1] = parameters[idx - 1] + ' ' + rf'{arg}' 38 | 39 | return parameters 40 | 41 | 42 | def get_readable_size(size: int, precision=2) -> str: 43 | if size is None: 44 | return "" 45 | 46 | suffixes = ['B', 'KB', 'MB', 'GB', 'TB'] 47 | suffixIndex = 0 48 | while size >= 1024 and suffixIndex < len(suffixes): 49 | suffixIndex += 1 # increment the index of the suffix 50 | size = size / 1024.0 # apply the division 51 | return "%.*f%s" % (precision, size, suffixes[suffixIndex]) 52 | 53 | 54 | def get_file_last_modified_time(path_to_file: str) -> datetime: 55 | if path_to_file is None: 56 | return datetime.now() 57 | 58 | if platform.system() == "Windows": 59 | return datetime.fromtimestamp(os.path.getmtime(path_to_file)) 60 | else: 61 | stat = os.stat(path_to_file) 62 | return datetime.fromtimestamp(stat.st_mtime) 63 | 64 | 65 | def get_not_found_image_url() -> str: 66 | return "https://msdn.miaoshouai.com/msdn/userimage/not-found.svg" 67 | 68 | 69 | def get_user_temp_dir() -> str: 70 | return os.path.join(Path.home().absolute(), ".miaoshou_assistant_download") 71 | 72 | 73 | def assert_user_temp_dir() -> None: 74 | os.makedirs(get_user_temp_dir(), exist_ok=True) 75 | 76 | 77 | def move_file(src: str, dst: str) -> None: 78 | if not src or not dst: 79 | return 80 | 81 | if not os.path.exists(src): 82 | return 83 | 84 | if os.path.exists(dst): 85 | os.remove(dst) 86 | 87 | os.makedirs(os.path.dirname(dst), exist_ok=True) 88 | shutil.move(src, dst) 89 | -------------------------------------------------------------------------------- /README_CN.md: -------------------------------------------------------------------------------- 1 | # 喵手助理 2 | [English](README.md) / [中文](README_CN.md) 3 | 4 | 喵手助理 [Automatic1111 WebUI](https://github.com/AUTOMATIC1111/stable-diffusion-webui) 5 | 6 | 7 | #### 此版本的注意事项 8 | 如果你想在[Forge WebUI](https://github.com/lllyasviel/stable-diffusion-webui-forge)中使用喵手助理, 你可以安装[MiaoshouAI Assistant Forge](https://github.com/miaoshouai/miaoshouai-assistant-forge) 版本 9 | 10 | 如果下载模型时出现失败,可能是因为模型作者对该模型设置了登录要求。 11 | 您需要前往 civitai 的[账户设置](https://civitai.com/user/account)页面,申请一个 Civitai API 密钥,并通过 ```Setting & Update``` 选项卡保存该密钥。 12 | 13 | ### 版本历史 14 | 15 | 1.90 一个支持 Forge WebUI 的新版本。新增对 Civitai 密钥的支持,并更新了基础模型类型。
16 | 1.81 增加了喵手AI作为模型源,让不能访问C站的人可以通过喵手AI源作为下载站点;增加了部分controlnet模型和官方模型的下载源。
17 | 1.80 修复了webui 1.60中的下载问题;增加了对模型排序,子文件夹下载,模型版本等功能的支持。
18 | 1.70 优化了Civitai的模型文件名关键词搜索,SDXL模型搜索(需要更新数据源),支持tag筛选。修复了在1.6下的模型加载问题。
19 | 1.60 增加了显存自动清理功能。在启动助手中启用后可以在每次生图后自动清理显存。
20 | 1.50 重构了assets的读取方式,大幅减少了下载时间和插件大小(使用1.5+版本需要重新安装); 增加了一键下载封面功能。
21 | 1.40 添加了使用GPT来生成咒语的功能; 修复了模型管理中对子文件夹的支持。
22 | 1.30 增加了模型下载和管理功能中对LyCoris的支持(你需要将LoCoris模型放置在Lora目录下, 需要安装 LyCoris插件 )
23 | 1.20 增加了模型搜索功能,可以直接在模型管理下load模型,增加了插件和模型源更新功能。
24 | 1.10 模型管理下增加了对Lora, embedding and hypernetwork等模型的支持。修复了启动时与秋叶启动器的冲突。 25 | 26 | ### 安装 27 | 在 Automatic1111 WebUI 中,前往 `扩展插件`-> `从URL安装`,在`扩展插件的git仓库网址`中复制以下地址。 28 | 29 | ```sh 30 | https://github.com/miaoshouai/miaoshouai-assistant.git 31 | ``` 32 | 33 | 点击`安装`,等待安装完成。然后前往`设置` -> `重新加载界面` 34 | 35 | ### 翻译 36 | 从以下百度网盘下载翻译文件 37 | https://pan.baidu.com/s/1Hu_ppXdlr_hFm5spCA520w?pwd=jjsf 38 | 秋叶版WebUI可以下载stable-diffusion-webui-localization-zh_Hans 翻译插件 39 | 将翻译的json文件替换localization的文件夹内的同名json文件 40 | 41 | ### 使用方法 42 | ##### 启动助手 43 | 44 |

45 | 46 |

47 | 48 | - 允许您更改 WebUI 启动设置,包括: 49 | GPU 优化、UI 主题、启用端口监听、xformers、自动启动等。 50 | 51 | - 允许您将所有设置保存到 webui-user.bat/其他启动脚本。 52 | 53 | ##### 模型管理 54 | 55 |

56 | 57 |

58 | 59 | - 允许您查看所有模型,并从封面查看模型 civitai 提示和参数。 60 | 您可以非常容易的将 civitai 提示词发送到 txt2img/img2img/inpainting/extra 61 | 62 | ##### 模型下载器 63 | 64 |

65 | 66 |

67 | 68 | - 允许您从 civitai.com 或 miaoshouai.com 搜索和下载模型,找到您想要的模型类型 69 | 70 |

71 | 72 |

73 | 74 | - 喵手助理还能让您找到 1.5, 2.1 的官方模型、controlnet 模型以及不同的 vae 模型。 75 | -------------------------------------------------------------------------------- /scripts/download/resume_checkpoint.py: -------------------------------------------------------------------------------- 1 | import os 2 | import pathlib 3 | import glob 4 | import pickle 5 | import typing as t 6 | from hashlib import sha256 7 | 8 | from scripts.msai_logging.msai_logger import Logger 9 | 10 | logger = Logger() 11 | 12 | 13 | class ResumeCheckpoint(object): 14 | VERSION_FILENAME = ".version" 15 | VERSION = "version 2.0" 16 | 17 | @staticmethod 18 | def load_resume_checkpoint(filename: str) -> int: 19 | resume_point = 0 20 | try: 21 | # get resume_point from foobar.downloading file 22 | with open(filename, "rb") as file: 23 | resume_point = pickle.load(file) 24 | except Exception as ex: 25 | logger.error(f"load_resume_checkpoint err: {ex}") 26 | finally: 27 | return resume_point 28 | 29 | @staticmethod 30 | def store_resume_checkpoint(resume_point: int, filename: str) -> bool: 31 | try: 32 | with open(filename, "wb") as file: 33 | pickle.dump(resume_point, file) 34 | return True 35 | except Exception as ex: 36 | logger.error(f"store_resume_checkpoint err: {ex}") 37 | return False 38 | 39 | @staticmethod 40 | def cleanup_checkpoints_if_needed(checkpoint_folder: str) -> None: 41 | version_file = os.path.join(checkpoint_folder, ResumeCheckpoint.VERSION_FILENAME) 42 | if os.path.isfile(version_file): 43 | logger.info(f"already {ResumeCheckpoint.VERSION}") 44 | return 45 | 46 | for file in glob.glob(os.path.join(checkpoint_folder, "*.downloading")): 47 | print(f"delete checkpoint file with old version: {file}") 48 | os.remove(file) 49 | 50 | @staticmethod 51 | def store_version_info(checkpoint_folder: str) -> bool: 52 | try: 53 | with open(os.path.join(checkpoint_folder, ResumeCheckpoint.VERSION_FILENAME), "wb") as file: 54 | footprint = ''' "version": "{}" '''.format(ResumeCheckpoint.VERSION) 55 | footprint = "{ " + footprint + " }" 56 | file.write(footprint.encode()) 57 | return True 58 | except Exception as ex: 59 | logger.error(f"store_version_info err: {ex}") 60 | 61 | @staticmethod 62 | def calculate_hash_of_file(filepath: str) -> t.Optional[str]: 63 | chunk_size = 1024 64 | 65 | try: 66 | hasher = sha256() 67 | with open(filepath, "rb") as file: 68 | while True: 69 | data = file.read(chunk_size) 70 | if not data: 71 | break 72 | hasher.update(data) 73 | 74 | return hasher.hexdigest() 75 | except Exception: 76 | return None 77 | 78 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # miaoshouai-assistant 2 | 3 | [English](README.md) / [中文](README_CN.md) 4 | 5 | MiaoshouAI Assistant for [Automatic1111 WebUI](https://github.com/AUTOMATIC1111/stable-diffusion-webui) 6 | 7 | 8 | #### Some Notice for this version 9 | If you want to use MiaoshouAI Assistant in [Forge WebUI](https://github.com/lllyasviel/stable-diffusion-webui-forge), you can install [MiaoshouAI Assistant Forge Version](https://github.com/miaoshouai/miaoshouai-assistant-forge) 10 | 11 | If you had download failures for when downloading models, it is likely because model auther has restricted a login requirement for the model. 12 | You need to go to civitai, under your [Account Settings](https://civitai.com/user/account) to apply for a civitai api key and save it through the ```Setting & Update``` tab. 13 | 14 | ### Version History 15 | 16 | -1.90 Add support for civitai key and updated base model types.
17 | -1.81 Added MiaoshouAI as a model download source for people who can't access civitai; added a few sdxl controlnet and official downloads. 18 | -1.80 Fixed download problem in webui 1.60; Added support for model sorting; Model version, sub-folder support for download; Other bug fixes and improvements
19 | -1.70 Improved search capability for Civitai to include keyword search in model names; Now supports SDXL model search (Data source update and full of restart webui update required) and filter model by tags. Fixed model loading error.
20 | -1.60 Add VRAM garbage collection for image generation so that VRAM is freed up after every run; if your run into out of memory, just go to Boot Assistant and click "VRAM Release" to free up the memory.
21 | -1.50 Rewrote how assets are loaded to largely reduce the size and installation time for the extension. (extension reinstall is needed for this version and up). Added download covers for all models.
22 | -1.40 Add new feature for using GPT to generate prompts. Fixed sub folder support for model management
23 | -1.30 Add support for LyCoris(just put them in the lora folder, LyCoris extension is needed.); Cleanup work for git to reduce project size
24 | -1.20 Add support for model search. Allow model to load directly from model management. Now you can update model source directly under update tab.
25 | -1.10 Add support for Lora, embedding and hypernetwork models under model manangement. bug fixes. 26 | 27 | ### Installation 28 | In Automatic1111 WebUI, go to `Extensions Tab`->`Install from URL`, copy the following address in "**URL for extension's git repository**". 29 | 30 | ```sh 31 | https://github.com/miaoshouai/miaoshouai-assistant.git 32 | ``` 33 | 34 | Click `Install`, wait until it's done. Go to `Settings`-> `Reload UI` 35 | 36 | ### Usage 37 | 38 | ##### Boot Assistant 39 | 40 |

41 | 42 |

43 | 44 | - Allows you to change your webui boot settings including: 45 | GPU optimization, UI Theme, enable port listening, xformers, auto launch, etc. 46 | 47 | - Allows you to save all your settings to your webui-user.bat/other boot script for your webui. 48 | 49 | ##### Model Management 50 | 51 |

52 | 53 |

54 | 55 | - Allows you to view all your models and view the model civitai prompts and parameters from the covers. 56 | You can easily send these civitai prompts to txt2img/img2img/inpainting/extra 57 | 58 | ##### Model Downloader 59 | 60 |

61 | 62 |

63 | 64 | - Allows you to search and download models from civitai.com or miaoshouai.com, find the model type you want 65 | 66 |

67 | 68 |

69 | 70 | - It also allows you to find 1.5, 2.1 official models, controlnet models or different vae models. 71 | 72 | -------------------------------------------------------------------------------- /scripts/msai_logging/msai_logger.py: -------------------------------------------------------------------------------- 1 | import datetime 2 | import logging 3 | import logging.handlers 4 | import os 5 | import typing as t 6 | 7 | from scripts.msai_utils.msai_singleton import MiaoshouSingleton 8 | 9 | 10 | class Logger(metaclass=MiaoshouSingleton): 11 | _dataset = None 12 | 13 | KEY_TRACE_PATH = "trace_path" 14 | KEY_INFO = "info" 15 | KEY_ERROR = "error" 16 | KEY_JOB = "job" 17 | 18 | def _do_init(self, log_folder: str, disable_console_output: bool = False) -> None: 19 | # Setup trace_path with empty string by default, it will be assigned with valid content if needed 20 | self._dataset = {Logger.KEY_TRACE_PATH: ""} 21 | 22 | print(f"logs_location: {log_folder}") 23 | os.makedirs(log_folder, exist_ok=True) 24 | 25 | # Setup basic logging configuration 26 | logging.basicConfig(level=logging.INFO, 27 | filemode='w', 28 | format='%(asctime)s - %(filename)s [line:%(lineno)d] - %(levelname)s: %(message)s') 29 | 30 | # Setup info logging 31 | self._dataset[Logger.KEY_INFO] = logging.getLogger(Logger.KEY_INFO) 32 | msg_handler = logging.FileHandler(os.path.join(log_folder, "info.log"), 33 | "a", 34 | encoding="UTF-8") 35 | msg_handler.setLevel(logging.INFO) 36 | msg_handler.setFormatter( 37 | logging.Formatter(fmt='%(asctime)s - %(filename)s [line:%(lineno)d] - %(levelname)s: %(message)s')) 38 | self._dataset[Logger.KEY_INFO].addHandler(msg_handler) 39 | 40 | # Setup error logging 41 | self._dataset[Logger.KEY_ERROR] = logging.getLogger(Logger.KEY_ERROR) 42 | error_handler = logging.FileHandler( 43 | os.path.join(log_folder, f'error_{datetime.date.today().strftime("%Y%m%d")}.log'), 44 | mode="a", 45 | encoding='UTF-8') 46 | error_handler.setLevel(logging.ERROR) 47 | error_handler.setFormatter( 48 | logging.Formatter( 49 | fmt=f"{self._dataset.get('trace_path')}:\n " 50 | f"%(asctime)s - %(filename)s [line:%(lineno)d] - %(levelname)s: %(message)s")) 51 | self._dataset[Logger.KEY_ERROR].addHandler(error_handler) 52 | 53 | # Setup job logging 54 | self._dataset[Logger.KEY_JOB] = logging.getLogger(Logger.KEY_JOB) 55 | job_handler = logging.FileHandler(os.path.join(log_folder, "jobs.log"), 56 | mode="a", 57 | encoding="UTF-8") 58 | self._dataset[Logger.KEY_JOB].addHandler(job_handler) 59 | 60 | for k in [Logger.KEY_INFO, Logger.KEY_JOB, Logger.KEY_ERROR]: 61 | l: logging.Logger = self._dataset[k] 62 | l.propagate = not disable_console_output 63 | 64 | def __init__(self, log_folder: str = None, disable_console_output: bool = False) -> None: 65 | if self._dataset is None: 66 | try: 67 | self._do_init(log_folder=log_folder, disable_console_output=disable_console_output) 68 | except Exception as e: 69 | print(e) 70 | 71 | def update_path_info(self, current_path: str) -> None: 72 | self._dataset[Logger.KEY_TRACE_PATH] = current_path 73 | 74 | def callback_func(self, exc_type: t.Any, exc_value: t.Any, exc_tracback: t.Any) -> None: 75 | self._dataset[Logger.KEY_JOB].error(f"job failed for {self._dataset[Logger.KEY_TRACE_PATH]}") 76 | self._dataset[Logger.KEY_INFO].error(f"{self._dataset[Logger.KEY_TRACE_PATH]}\n, callback_func: ", 77 | exc_info=(exc_type, exc_value, exc_tracback)) 78 | 79 | def debug(self, fmt, *args, **kwargs) -> None: 80 | l: logging.Logger = self._dataset[Logger.KEY_INFO] 81 | l.debug(fmt, *args, **kwargs, stacklevel=2) 82 | 83 | def info(self, fmt, *args, **kwargs) -> None: 84 | l: logging.Logger = self._dataset[Logger.KEY_INFO] 85 | l.info(fmt, *args, **kwargs, stacklevel=2) 86 | 87 | def warn(self, fmt, *args, **kwargs) -> None: 88 | l: logging.Logger = self._dataset[Logger.KEY_INFO] 89 | l.warn(fmt, *args, **kwargs, stacklevel=2) 90 | 91 | def error(self, fmt, *args, **kwargs) -> None: 92 | l: logging.Logger = self._dataset[Logger.KEY_ERROR] 93 | l.error(fmt, *args, **kwargs, stacklevel=2) 94 | 95 | def job(self, fmt, *args, **kwargs) -> None: 96 | l: logging.Logger = self._dataset[Logger.KEY_JOB] 97 | l.info(fmt, *args, **kwargs, stacklevel=2) 98 | 99 | 100 | -------------------------------------------------------------------------------- /scripts/runtime/msai_prelude.py: -------------------------------------------------------------------------------- 1 | import launch 2 | import modules 3 | import os 4 | import platform 5 | import psutil 6 | import sys 7 | import torch 8 | import typing as t 9 | from modules import shared 10 | 11 | from scripts.msai_logging.msai_logger import Logger 12 | from scripts.msai_utils import msai_toolkit as toolkit 13 | from scripts.msai_utils.msai_singleton import MiaoshouSingleton 14 | 15 | 16 | class MiaoshouPrelude(metaclass=MiaoshouSingleton): 17 | _dataset = None 18 | 19 | def __init__(self) -> None: 20 | # Potential race condition, not call in multithread environment 21 | if MiaoshouPrelude._dataset is None: 22 | self._init_constants() 23 | 24 | MiaoshouPrelude._dataset = { 25 | "log_folder": os.path.join(self.ext_folder, "logs") 26 | } 27 | 28 | disable_log_console_output: bool = False 29 | if self.all_settings.get("boot_settings"): 30 | if self.all_settings["boot_settings"].get("disable_log_console_output") is not None: 31 | disable_log_console_output = self.all_settings["boot_settings"].get("disable_log_console_output") 32 | 33 | self._logger = Logger(self._dataset["log_folder"], disable_console_output=disable_log_console_output) 34 | 35 | def _init_constants(self) -> None: 36 | self._api_url = { 37 | "civitai.com": "https://model-share.com/v1/models", 38 | "miaoshouai.com": "http://api.miaoshouai.com/model/api/models", 39 | } 40 | self._ext_folder = os.path.abspath(os.path.join(os.path.dirname(os.path.abspath(__file__)), "..", "..")) 41 | self._setting_file = os.path.join(self.ext_folder, "configs", "settings.json") 42 | self._model_hash_file = os.path.join(self.ext_folder, "configs", "model_hash.json") 43 | self._gpt_index = os.path.join(self.ext_folder, "configs", "gpt_index.json") 44 | self._assets_folder = os.path.join(self.ext_folder, "assets") 45 | self._cache_folder = os.path.join(self.ext_folder, "cache") 46 | self._cover_folder = os.path.join(self.ext_folder, "covers") 47 | self._no_preview_img = os.path.join(modules.paths.script_path, "html", "card-no-preview.png") 48 | self._model_json = { 49 | 'civitai.com': os.path.join(self.ext_folder, 'configs', 'civitai_models.json'), 50 | 'miaoshouai.com': os.path.join(self.ext_folder, 'configs', 'liandange_models.json'), 51 | 'official_models': os.path.join(self.ext_folder, 'configs', 'official_models.json'), 52 | 'hugging_face': os.path.join(self.ext_folder, 'configs', 'hugging_face.json'), 53 | 'controlnet': os.path.join(self.ext_folder, 'configs', 'controlnet.json') 54 | } 55 | self._checkboxes = { 56 | 'Enable xFormers': '--xformers', 57 | 'No Half': '--no-half', 58 | 'No Half VAE': '--no-half-vae', 59 | 'Enable API': '--api', 60 | 'Auto Launch': '--autolaunch', 61 | 'Allow Local Network Access': '--listen', 62 | } 63 | 64 | self._gpu_setting = { 65 | 'CPU Only': '--precision full --no-half --use-cpu SD GFPGAN BSRGAN ESRGAN SCUNet CodeFormer --all', 66 | 'GTX 16xx': '--lowvram --xformers --precision full --no-half', 67 | 'Low: 4-6G VRAM': '--xformers --lowvram', 68 | 'Med: 6-8G VRAM': '--xformers --medvram', 69 | 'Normal: 8+G VRAM': '', 70 | } 71 | 72 | self._theme_setting = { 73 | 'Auto': '', 74 | 'Light Mode': '--theme light', 75 | 'Dark Mode': '--theme dark', 76 | } 77 | self._ENV_EXCLUSION = ['COLAB_GPU', 'RUNPOD_POD_ID'] 78 | self._model_type = {'Checkpoint': f'{os.path.join(shared.models_path,"Stable-diffusion")}', 79 | 'LORA': f'{os.path.join(shared.models_path,"Lora")}', 80 | 'LoCon': f'{os.path.join(shared.models_path, "LyCORIS")}', 81 | "TextualInversion": f'{os.path.join(shared.script_path,"embeddings")}', 82 | "Hypernetwork": f'{os.path.join(shared.models_path,"hypernetworks")}', 83 | "Controlnet": f'{os.path.join(shared.models_path, "ControlNet")}', 84 | "VAE": f'{os.path.join(shared.models_path, "VAE")}', 85 | } 86 | 87 | self._gpt_type = ['gpt-3.5-turbo', 'gpt-4o-mini'] 88 | self._model_tags = ['Character', 'Style', 'Anime', 'Celebrity', 'Photorealistic', 'Concept', 'Clothing', 'Base Model', 'Poses', 'Background', 'Tool', 'Buildings', 'Vehicle', 'Objects', 'Animal', 'Action'] 89 | self._base_model_group = ['SD 1.4', 'SD 1.5', 'SD 1.5 LCM', 'SD 1.5 Hyper', 'SD 2.0', 'SD 2.0 768', 'SD 2.1', 'Stable Cascade', 'SDXL 1.0', 'SDXL 1.0 LCM', 'SDXL Turbo', 'SDXL Lightning', 'SDXL Hyper', 'Pony', 'SD 3', 'Playground v2', 'Aura Flow', 'PixArt a', 'PixArt E', 'Hunyuan 1', 'Lumina', 'Kolors', 'Flux.1 D', 'Other'] 90 | 91 | @property 92 | def ext_folder(self) -> str: 93 | return self._ext_folder 94 | 95 | @property 96 | def log_folder(self) -> str: 97 | return self._dataset.get("log_folder") 98 | 99 | @property 100 | def all_settings(self) -> t.Any: 101 | return toolkit.read_json(self._setting_file) 102 | 103 | @property 104 | def boot_settings(self) -> t.Any: 105 | all_setting = self.all_settings 106 | if all_setting: 107 | return all_setting['boot_settings'] 108 | else: 109 | return None 110 | 111 | def api_url(self, model_source: str) -> t.Optional[str]: 112 | return self._api_url.get(model_source) 113 | 114 | @property 115 | def setting_file(self) -> str: 116 | return self._setting_file 117 | 118 | @property 119 | def ENV_EXCLUSION(self) -> list[str]: 120 | return self._ENV_EXCLUSION 121 | 122 | @property 123 | def model_hash_file(self) -> str: 124 | return self._model_hash_file 125 | 126 | @property 127 | def gpt_index(self) -> str: 128 | return self._gpt_index 129 | 130 | @property 131 | def cache_folder(self) -> str: 132 | return self._cache_folder 133 | 134 | @property 135 | def assets_folder(self) -> str: 136 | return self._assets_folder 137 | 138 | @property 139 | def cover_folder(self) -> str: 140 | return self._cover_folder 141 | 142 | @property 143 | def no_preview_img(self) -> str: 144 | return self._no_preview_img 145 | 146 | @property 147 | def checkboxes(self) -> t.Dict[str, str]: 148 | return self._checkboxes 149 | 150 | @property 151 | def gpu_setting(self) -> t.Dict[str, str]: 152 | return self._gpu_setting 153 | 154 | @property 155 | def theme_setting(self) -> t.Dict[str, str]: 156 | return self._theme_setting 157 | 158 | @property 159 | def model_type(self) -> t.Dict[str, str]: 160 | return self._model_type 161 | 162 | @property 163 | def gpt_type(self) -> t.List[str]: 164 | return self._gpt_type 165 | 166 | @property 167 | def model_tags(self) -> t.List[str]: 168 | return self._model_tags 169 | 170 | @property 171 | def base_model_group(self) -> t.List[str]: 172 | return self._base_model_group 173 | 174 | @property 175 | def model_json(self) -> t.Dict[str, t.Any]: 176 | return self._model_json 177 | 178 | def update_model_json(self, site: str, models: t.Dict[str, t.Any]) -> None: 179 | if self._model_json.get(site) is None: 180 | self._logger.error(f"cannot save model info for {site}") 181 | return 182 | 183 | self._logger.info(f"{self._model_json[site]} updated") 184 | toolkit.write_json(self._model_json[site], models) 185 | 186 | def load(self) -> None: 187 | self._logger.info("start to do prelude") 188 | self._logger.info(f"cmdline args: {' '.join(sys.argv[1:])}") 189 | 190 | @classmethod 191 | def get_sys_info(cls) -> str: 192 | sys_info = 'System Information\n\n' 193 | 194 | sys_info += r'OS Name: {0} {1}'.format(platform.system(), platform.release()) + '\n' 195 | sys_info += r'OS Version: {0}'.format(platform.version()) + '\n' 196 | sys_info += r'WebUI Version: {0}'.format( 197 | f'https://github.com/AUTOMATIC1111/stable-diffusion-webui/commit/{launch.commit_hash()}') + '\n' 198 | sys_info += r'Torch Version: {0}'.format(getattr(torch, '__long_version__', torch.__version__)) + '\n' 199 | sys_info += r'Python Version: {0}'.format(sys.version) + '\n\n' 200 | sys_info += r'CPU: {0}'.format(platform.processor()) + '\n' 201 | sys_info += r'CPU Cores: {0}/{1}'.format(psutil.cpu_count(logical=False), psutil.cpu_count(logical=True)) + '\n' 202 | 203 | try: 204 | sys_info += r'CPU Frequency: {0} GHz'.format(round(psutil.cpu_freq().max/1000,2)) + '\n' 205 | except Exception as e: 206 | sys_info += r'CPU Frequency: N/A GHz' + '\n' 207 | 208 | sys_info += r'CPU Usage: {0}%'.format(psutil.cpu_percent()) + '\n\n' 209 | sys_info += r'RAM: {0}'.format(toolkit.get_readable_size(psutil.virtual_memory().total)) + '\n' 210 | sys_info += r'Memory Usage: {0}%'.format(psutil.virtual_memory().percent) + '\n\n' 211 | for i in range(torch.cuda.device_count()): 212 | sys_info += r'Graphics Card{0}: {1} ({2})'.format(i, torch.cuda.get_device_properties(i).name, 213 | toolkit.get_readable_size( 214 | torch.cuda.get_device_properties( 215 | i).total_memory)) + '\n' 216 | sys_info += r'Available VRAM: {0}'.format(toolkit.get_readable_size(torch.cuda.mem_get_info(i)[0])) + '\n' 217 | 218 | return sys_info 219 | 220 | 221 | -------------------------------------------------------------------------------- /scripts/download/msai_downloader_manager.py: -------------------------------------------------------------------------------- 1 | import asyncio 2 | import os.path 3 | import queue 4 | import requests 5 | import time 6 | import typing as t 7 | from threading import Thread, Lock 8 | from urllib.request import Request, urlopen 9 | 10 | import scripts.msai_utils.msai_toolkit as toolkit 11 | from scripts.download.msai_file_downloader import MiaoshouFileDownloader 12 | from scripts.download.resume_checkpoint import ResumeCheckpoint 13 | from scripts.msai_logging.msai_logger import Logger 14 | from scripts.msai_utils.msai_singleton import MiaoshouSingleton 15 | 16 | 17 | class DownloadingEntry(object): 18 | def __init__(self, target_url: str = None, local_file: str = None, 19 | local_directory: str = None, estimated_total_size: float = 0., expected_checksum: str = None): 20 | self._target_url = target_url 21 | self._local_file = local_file 22 | self._local_directory = local_directory 23 | self._expected_checksum = expected_checksum 24 | 25 | self._estimated_total_size = estimated_total_size 26 | self._total_size = 0 27 | self._downloaded_size = 0 28 | 29 | self._downloading = False 30 | self._failure = False 31 | 32 | @property 33 | def target_url(self) -> str: 34 | return self._target_url 35 | 36 | @property 37 | def local_file(self) -> str: 38 | return self._local_file 39 | 40 | @property 41 | def local_directory(self) -> str: 42 | return self._local_directory 43 | 44 | @property 45 | def expected_checksum(self) -> str: 46 | return self._expected_checksum 47 | 48 | @property 49 | def total_size(self) -> int: 50 | return self._total_size 51 | 52 | @total_size.setter 53 | def total_size(self, sz: int) -> None: 54 | self._total_size = sz 55 | 56 | @property 57 | def downloaded_size(self) -> int: 58 | return self._downloaded_size 59 | 60 | @downloaded_size.setter 61 | def downloaded_size(self, sz: int) -> None: 62 | self._downloaded_size = sz 63 | 64 | @property 65 | def estimated_size(self) -> float: 66 | return self._estimated_total_size 67 | 68 | def is_downloading(self) -> bool: 69 | return self._downloading 70 | 71 | def start_download(self) -> None: 72 | self._downloading = True 73 | 74 | def update_final_status(self, result: bool) -> None: 75 | self._failure = (result is False) 76 | self._downloading = False 77 | 78 | def is_failure(self) -> bool: 79 | return self._failure 80 | 81 | 82 | class AsyncLoopThread(Thread): 83 | def __init__(self): 84 | super(AsyncLoopThread, self).__init__(daemon=True) 85 | self.loop = asyncio.new_event_loop() 86 | self.logger = Logger() 87 | self.logger.info("looper thread is created") 88 | 89 | def run(self): 90 | asyncio.set_event_loop(self.loop) 91 | self.logger.info("looper thread is running") 92 | self.loop.run_forever() 93 | 94 | 95 | class MiaoshouDownloaderManager(metaclass=MiaoshouSingleton): 96 | _downloading_entries: t.Dict[str, DownloadingEntry] = None 97 | 98 | def __init__(self): 99 | if self._downloading_entries is None: 100 | self._downloading_entries = {} 101 | self.message_queue = queue.Queue() 102 | 103 | self.logger = Logger() 104 | self.looper = AsyncLoopThread() 105 | self.looper.start() 106 | self.logger.info("download manager is ready") 107 | self._mutex = Lock() 108 | 109 | ResumeCheckpoint.cleanup_checkpoints_if_needed(toolkit.get_user_temp_dir()) 110 | ResumeCheckpoint.store_version_info(toolkit.get_user_temp_dir()) 111 | 112 | def consume_all_ready_messages(self) -> None: 113 | """ 114 | capture all enqueued messages, this method should not be used if you are iterating over the message queue 115 | :return: 116 | None 117 | :side-effect: 118 | update downloading entries' status 119 | """ 120 | while True: 121 | # self.logger.info("fetching the enqueued message") 122 | try: 123 | (aurl, finished_size, total_size) = self.message_queue.get(block=False, timeout=0.2) 124 | # self.logger.info(f"[+] message ([{finished_size}/{total_size}] {aurl}") 125 | try: 126 | self._mutex.acquire(blocking=True) 127 | self._downloading_entries[aurl].total_size = total_size 128 | self._downloading_entries[aurl].downloaded_size = finished_size 129 | finally: 130 | self._mutex.release() 131 | except queue.Empty: 132 | break 133 | 134 | def iterator(self) -> t.Tuple[float, float]: 135 | 136 | while True: 137 | self.logger.info("waiting for incoming message") 138 | 139 | try: 140 | (aurl, finished_size, total_size) = self.message_queue.get(block=True) 141 | self.logger.info(f"[+] message ([{finished_size}/{total_size}] {aurl}") 142 | try: 143 | self._mutex.acquire(blocking=True) 144 | self._downloading_entries[aurl].total_size = total_size 145 | self._downloading_entries[aurl].downloaded_size = finished_size 146 | 147 | tasks_total_size = 0. 148 | tasks_finished_size = 0. 149 | 150 | for e in self._downloading_entries.values(): 151 | tasks_total_size += e.total_size 152 | tasks_finished_size += e.downloaded_size 153 | 154 | yield tasks_finished_size, tasks_total_size 155 | finally: 156 | self._mutex.release() 157 | except queue.Empty: 158 | if len(asyncio.all_tasks(self.looper.loop)) == 0: 159 | self.logger.info("all downloading tasks finished") 160 | break 161 | 162 | async def _submit_task(self, download_entry: DownloadingEntry) -> None: 163 | try: 164 | self._mutex.acquire(blocking=True) 165 | if download_entry.target_url in self._downloading_entries: 166 | self.logger.warn(f"{download_entry.target_url} is already downloading") 167 | return 168 | else: 169 | download_entry.start_download() 170 | self._downloading_entries[download_entry.target_url] = download_entry 171 | finally: 172 | self._mutex.release() 173 | 174 | file_downloader = MiaoshouFileDownloader( 175 | target_url=download_entry.target_url, 176 | local_file=download_entry.local_file, 177 | local_directory=download_entry.local_directory, 178 | channel=self.message_queue if download_entry.estimated_size else None, 179 | estimated_total_length=download_entry.estimated_size, 180 | expected_checksum=download_entry.expected_checksum, 181 | ) 182 | 183 | result: bool = await self.looper.loop.run_in_executor(None, file_downloader.download_file) 184 | 185 | try: 186 | self._mutex.acquire(blocking=True) 187 | self._downloading_entries[download_entry.target_url].update_final_status(result) 188 | finally: 189 | self._mutex.release() 190 | 191 | def download(self, source_url: str, target_file: str, estimated_total_size: float, 192 | expected_checksum: str = None) -> None: 193 | self.logger.info(f"start to download '{source_url}'") 194 | 195 | target_dir = os.path.dirname(target_file) 196 | target_filename = os.path.basename(target_file) 197 | download_entry = DownloadingEntry( 198 | target_url=source_url, 199 | local_file=target_filename, 200 | local_directory=target_dir, 201 | estimated_total_size=estimated_total_size, 202 | expected_checksum=expected_checksum 203 | ) 204 | 205 | asyncio.run_coroutine_threadsafe(self._submit_task(download_entry), self.looper.loop) 206 | 207 | def tasks_summary(self) -> t.Tuple[int, int, str]: 208 | self.consume_all_ready_messages() 209 | 210 | total_tasks_num = 0 211 | ongoing_tasks_num = 0 212 | failed_tasks_num = 0 213 | 214 | try: 215 | description = "
" 216 | self._mutex.acquire(blocking=True) 217 | for name, entry in self._downloading_entries.items(): 218 | if entry.estimated_size is None: 219 | continue 220 | 221 | total_tasks_num += 1 222 | 223 | if entry.total_size > 0.: 224 | description += f"

{entry.local_file} ({toolkit.get_readable_size(entry.total_size)}) : " 225 | else: 226 | description += f"

{entry.local_file} ({toolkit.get_readable_size(entry.estimated_size)}) : " 227 | 228 | if entry.is_downloading(): 229 | ongoing_tasks_num += 1 230 | finished_percent = entry.downloaded_size/entry.estimated_size * 100 231 | description += f'{round(finished_percent, 2)} %' 232 | elif entry.is_failure(): 233 | failed_tasks_num += 1 234 | description += 'failed!' 235 | else: 236 | description += 'finished' 237 | description += "


" 238 | finally: 239 | self._mutex.release() 240 | pass 241 | 242 | description += "
" 243 | overall = f""" 244 |

245 | {ongoing_tasks_num} ongoing, 246 | {total_tasks_num - ongoing_tasks_num - failed_tasks_num} finished, 247 | {failed_tasks_num} failed. 248 |

249 |
250 |
251 | """ 252 | 253 | return ongoing_tasks_num, total_tasks_num, overall + description 254 | 255 | 256 | -------------------------------------------------------------------------------- /configs/hugging_face.json: -------------------------------------------------------------------------------- 1 | [ 2 | { 3 | "id": 1, 4 | "name": "Negative Embeddings", 5 | "description": "

This is a collection of negative embeddings for Stable Diffusion negative prompts

", 6 | "type": "TextualInversion", 7 | "poi": false, 8 | "nsfw": false, 9 | "allowNoCredit": true, 10 | "allowCommercialUse": "Rent", 11 | "allowDerivatives": true, 12 | "allowDifferentLicense": true, 13 | "stats": { 14 | "downloadCount": 865, 15 | "favoriteCount": 190, 16 | "commentCount": 7, 17 | "ratingCount": 2, 18 | "rating": 5 19 | }, 20 | "creator": { 21 | "username": "multiple authors", 22 | "image": "" 23 | }, 24 | "tags": [], 25 | "modelVersions": [ 26 | { 27 | "id": 1, 28 | "modelId": 7019, 29 | "name": "Neg Embedding", 30 | "createdAt": "2023-02-06T13:52:34.605Z", 31 | "updatedAt": "2023-02-06T13:52:34.605Z", 32 | "trainedWords": [], 33 | "baseModel": "SD 1.5", 34 | "earlyAccessTimeFrame": 0, 35 | "description": "

", 36 | "files": [ 37 | { 38 | "name": "EasyNegative.safetensors", 39 | "id": 1, 40 | "sizeKB": 25261.130859375, 41 | "type": "Model", 42 | "format": "Safetensors", 43 | "pickleScanResult": "Success", 44 | "pickleScanMessage": "No Pickle imports", 45 | "virusScanResult": "Success", 46 | "scannedAt": "2023-02-06T13:55:58.281Z", 47 | "hashes": { 48 | "AutoV2": "833E816807", 49 | "SHA256": "833E816807E8D3658EBC65436908F690603A8E0E8D26143A90050F32958C9E4E", 50 | "CRC32": "87F68C12", 51 | "BLAKE3": "7A28D3D22520D61B58338791522A14B7B33A6A9CE552FF7D68D7E2688CAB3266" 52 | }, 53 | "downloadUrl": "https://huggingface.co/datasets/gsdf/EasyNegative/resolve/main/EasyNegative.safetensors", 54 | "primary": false 55 | }, 56 | { 57 | "name": "EasyNegativeV2.safetensors", 58 | "id": 2, 59 | "sizeKB": 50261.130859375, 60 | "type": "Model", 61 | "format": "Safetensors", 62 | "pickleScanResult": "Success", 63 | "pickleScanMessage": "No Pickle imports", 64 | "virusScanResult": "Success", 65 | "scannedAt": "2023-02-06T13:55:58.281Z", 66 | "hashes": { 67 | "AutoV2": "833E816807", 68 | "SHA256": "833E816807E8D3658EBC65436908F690603A8E0E8D26143A90050F32958C9E4E", 69 | "CRC32": "87F68C12", 70 | "BLAKE3": "7A28D3D22520D61B58338791522A14B7B33A6A9CE552FF7D68D7E2688CAB3266" 71 | }, 72 | "downloadUrl": "https://huggingface.co/gsdf/Counterfeit-V3.0/resolve/main/embedding/EasyNegativeV2.safetensors", 73 | "primary": true 74 | }, 75 | { 76 | "name": "bad-hands-5.pt", 77 | "id": 3, 78 | "sizeKB": 7261.130859375, 79 | "type": "Model", 80 | "format": "Pth", 81 | "pickleScanResult": "Success", 82 | "pickleScanMessage": "No Pickle imports", 83 | "virusScanResult": "Success", 84 | "scannedAt": "2023-02-06T13:55:58.281Z", 85 | "hashes": { 86 | "AutoV2": "833E816807", 87 | "SHA256": "833E816807E8D3658EBC65436908F690603A8E0E8D26143A90050F32958C9E4E", 88 | "CRC32": "87F68C12", 89 | "BLAKE3": "7A28D3D22520D61B58338791522A14B7B33A6A9CE552FF7D68D7E2688CAB3266" 90 | }, 91 | "downloadUrl": "https://huggingface.co/yesyeahvh/bad-hands-5/resolve/main/bad-hands-5.pt", 92 | "primary": false 93 | }, 94 | { 95 | "name": "bad_prompt.pt", 96 | "id": 4, 97 | "sizeKB": 51261.130859375, 98 | "type": "Model", 99 | "format": "Pth", 100 | "pickleScanResult": "Success", 101 | "pickleScanMessage": "No Pickle imports", 102 | "virusScanResult": "Success", 103 | "scannedAt": "2023-02-06T13:55:58.281Z", 104 | "hashes": { 105 | "AutoV2": "833E816807", 106 | "SHA256": "833E816807E8D3658EBC65436908F690603A8E0E8D26143A90050F32958C9E4E", 107 | "CRC32": "87F68C12", 108 | "BLAKE3": "7A28D3D22520D61B58338791522A14B7B33A6A9CE552FF7D68D7E2688CAB3266" 109 | }, 110 | "downloadUrl": "https://huggingface.co/datasets/Nerfgun3/bad_prompt/blob/main/bad_prompt.pt", 111 | "primary": false 112 | }, 113 | { 114 | "name": "bad_prompt_version2.pt", 115 | "id": 5, 116 | "sizeKB": 25261.130859375, 117 | "type": "Model", 118 | "format": "Pth", 119 | "pickleScanResult": "Success", 120 | "pickleScanMessage": "No Pickle imports", 121 | "virusScanResult": "Success", 122 | "scannedAt": "2023-02-06T13:55:58.281Z", 123 | "hashes": { 124 | "AutoV2": "833E816807", 125 | "SHA256": "833E816807E8D3658EBC65436908F690603A8E0E8D26143A90050F32958C9E4E", 126 | "CRC32": "87F68C12", 127 | "BLAKE3": "7A28D3D22520D61B58338791522A14B7B33A6A9CE552FF7D68D7E2688CAB3266" 128 | }, 129 | "downloadUrl": "https://huggingface.co/datasets/Nerfgun3/bad_prompt/resolve/main/bad_prompt_version2.pt", 130 | "primary": false 131 | }, 132 | { 133 | "name": "badquality.pt", 134 | "id": 6, 135 | "sizeKB": 34261.130859375, 136 | "type": "Model", 137 | "format": "Pth", 138 | "pickleScanResult": "Success", 139 | "pickleScanMessage": "No Pickle imports", 140 | "virusScanResult": "Success", 141 | "scannedAt": "2023-02-06T13:55:58.281Z", 142 | "hashes": { 143 | "AutoV2": "833E816807", 144 | "SHA256": "833E816807E8D3658EBC65436908F690603A8E0E8D26143A90050F32958C9E4E", 145 | "CRC32": "87F68C12", 146 | "BLAKE3": "7A28D3D22520D61B58338791522A14B7B33A6A9CE552FF7D68D7E2688CAB3266" 147 | }, 148 | "downloadUrl": "https://huggingface.co/p1atdev/badquality/resolve/main/badquality.pt", 149 | "primary": false 150 | }, 151 | { 152 | "name": "bad-artist-anime.pt", 153 | "id": 7, 154 | "sizeKB": 7261.130859375, 155 | "type": "Model", 156 | "format": "Pth", 157 | "pickleScanResult": "Success", 158 | "pickleScanMessage": "No Pickle imports", 159 | "virusScanResult": "Success", 160 | "scannedAt": "2023-02-06T13:55:58.281Z", 161 | "hashes": { 162 | "AutoV2": "833E816807", 163 | "SHA256": "833E816807E8D3658EBC65436908F690603A8E0E8D26143A90050F32958C9E4E", 164 | "CRC32": "87F68C12", 165 | "BLAKE3": "7A28D3D22520D61B58338791522A14B7B33A6A9CE552FF7D68D7E2688CAB3266" 166 | }, 167 | "downloadUrl": "https://huggingface.co/nick-x-hacker/bad-artist/resolve/main/bad-artist-anime.pt", 168 | "primary": false 169 | }, 170 | { 171 | "name": "bad-artist.pt", 172 | "id": 8, 173 | "sizeKB": 7261.130859375, 174 | "type": "Model", 175 | "format": "Pth", 176 | "pickleScanResult": "Success", 177 | "pickleScanMessage": "No Pickle imports", 178 | "virusScanResult": "Success", 179 | "scannedAt": "2023-02-06T13:55:58.281Z", 180 | "hashes": { 181 | "AutoV2": "833E816807", 182 | "SHA256": "833E816807E8D3658EBC65436908F690603A8E0E8D26143A90050F32958C9E4E", 183 | "CRC32": "87F68C12", 184 | "BLAKE3": "7A28D3D22520D61B58338791522A14B7B33A6A9CE552FF7D68D7E2688CAB3266" 185 | }, 186 | "downloadUrl": "https://huggingface.co/nick-x-hacker/bad-artist/resolve/main/bad-artist.pt", 187 | "primary": false 188 | } 189 | ], 190 | "images": [ 191 | { 192 | "url": "https://msdn.miaoshouai.com/msai/kt/ez/9900922.png" 193 | } 194 | ] 195 | } 196 | ] 197 | } 198 | ] -------------------------------------------------------------------------------- /scripts/download/msai_file_downloader.py: -------------------------------------------------------------------------------- 1 | import os 2 | import pickle 3 | import queue 4 | import requests 5 | import time 6 | import typing as t 7 | from pathlib import Path 8 | from requests.adapters import HTTPAdapter 9 | from tqdm import tqdm 10 | from urllib.parse import urlparse 11 | from urllib3.util import Retry 12 | 13 | import scripts.msai_utils.msai_toolkit as toolkit 14 | from scripts.download.resume_checkpoint import ResumeCheckpoint 15 | from scripts.msai_logging.msai_logger import Logger 16 | 17 | 18 | class MiaoshouFileDownloader(object): 19 | CHUNK_SIZE = 1024 * 1024 20 | 21 | def __init__(self, target_url: str = None, 22 | local_file: str = None, local_directory: str = None, estimated_total_length: float = 0., 23 | expected_checksum: str = None, 24 | channel: queue.Queue = None, 25 | max_retries=5) -> None: 26 | self.logger = Logger() 27 | 28 | self.target_url: str = target_url 29 | self.local_file: str = local_file 30 | self.local_directory = local_directory 31 | self.expected_checksum = expected_checksum 32 | self.max_retries = max_retries 33 | 34 | self.accept_ranges: bool = False 35 | self.estimated_content_length = estimated_total_length 36 | self.content_length: int = -1 37 | self.finished_chunk_size: int = 0 38 | 39 | self.channel = channel # for communication 40 | 41 | # Support 3 retries and backoff 42 | retry_strategy = Retry( 43 | total=3, 44 | backoff_factor=1, 45 | status_forcelist=[429, 500, 502, 503, 504], 46 | allowed_methods=["HEAD", "GET", "OPTIONS"] 47 | ) 48 | adapter = HTTPAdapter(max_retries=retry_strategy) 49 | self.session = requests.Session() 50 | self.session.mount("https://", adapter) 51 | self.session.mount("http://", adapter) 52 | 53 | # inform message receiver at once 54 | if self.channel: 55 | self.channel.put_nowait(( 56 | self.target_url, 57 | self.finished_chunk_size, 58 | self.estimated_content_length, 59 | )) 60 | 61 | # Head request to get file-length and check whether it supports ranges. 62 | def get_file_info_from_server(self, target_url: str) -> t.Tuple[bool, float]: 63 | try: 64 | headers = {"Accept-Encoding": "identity"} # Avoid dealing with gzip 65 | response = requests.head(target_url, headers=headers, allow_redirects=True, timeout=10) 66 | response.raise_for_status() 67 | content_length = None 68 | if "Content-Length" in response.headers: 69 | content_length = int(response.headers['Content-Length']) 70 | accept_ranges = (response.headers.get("Accept-Ranges") == "bytes") 71 | return accept_ranges, float(content_length) 72 | except Exception as ex: 73 | self.logger.error(f"HEAD Request Error: {ex}") 74 | return False, self.estimated_content_length 75 | 76 | def download_file_full(self, target_url: str, local_filepath: str) -> t.Optional[str]: 77 | try: 78 | headers = {"Accept-Encoding": "identity"} # Avoid dealing with gzip 79 | 80 | with tqdm(total=self.content_length, unit="byte", unit_scale=1, colour="GREEN", 81 | desc=os.path.basename(self.local_file)) as progressbar, \ 82 | self.session.get(target_url, headers=headers, stream=True, timeout=5) as response, \ 83 | open(local_filepath, 'wb') as file_out: 84 | response.raise_for_status() 85 | 86 | for chunk in response.iter_content(MiaoshouFileDownloader.CHUNK_SIZE): 87 | file_out.write(chunk) 88 | progressbar.update(len(chunk)) 89 | self.update_progress(len(chunk)) 90 | except Exception as ex: 91 | self.logger.error(f"Download error: {ex}") 92 | return None 93 | 94 | # it's time to start to calculate hash since the file is downloaded successfully 95 | return ResumeCheckpoint.calculate_hash_of_file(local_filepath) 96 | 97 | def download_file_resumable(self, target_url: str, local_filepath: str) -> t.Optional[str]: 98 | # Always go off the checkpoint as the file was flushed before writing. 99 | download_checkpoint = local_filepath + ".downloading" 100 | try: 101 | assert os.path.exists(local_filepath) # catch checkpoint without file 102 | 103 | resume_point = ResumeCheckpoint.load_resume_checkpoint(download_checkpoint) 104 | self.logger.info("File already exists, resuming download.") 105 | except Exception as e: 106 | self.logger.warn(f"failed to load downloading checkpoint - {download_checkpoint} {e}") 107 | resume_point = 0 108 | if os.path.exists(local_filepath): 109 | os.remove(local_filepath) 110 | Path(local_filepath).touch() 111 | 112 | assert (resume_point < self.content_length) 113 | 114 | self.finished_chunk_size = resume_point 115 | 116 | # Support resuming 117 | headers = {"Range": f"bytes={resume_point}-", "Accept-Encoding": "identity"} 118 | try: 119 | with tqdm(total=self.content_length, unit="byte", unit_scale=1, colour="GREEN", 120 | desc=os.path.basename(self.local_file)) as progressbar, \ 121 | self.session.get(target_url, headers=headers, stream=True, timeout=5) as response, \ 122 | open(local_filepath, 'r+b') as file_out: 123 | response.raise_for_status() 124 | self.update_progress(resume_point) 125 | file_out.seek(resume_point) 126 | 127 | for chunk in response.iter_content(MiaoshouFileDownloader.CHUNK_SIZE): 128 | file_out.write(chunk) 129 | file_out.flush() 130 | resume_point += len(chunk) 131 | progressbar.update(len(chunk)) 132 | self.update_progress(len(chunk)) 133 | ResumeCheckpoint.store_resume_checkpoint(resume_point, download_checkpoint) 134 | 135 | # Only remove checkpoint at full size in case connection cut 136 | if os.path.getsize(local_filepath) == self.content_length: 137 | os.remove(download_checkpoint) 138 | else: 139 | return None 140 | 141 | except Exception as ex: 142 | self.logger.error(f"Download error: {ex}") 143 | return None 144 | 145 | return ResumeCheckpoint.calculate_hash_of_file(local_filepath) 146 | 147 | def update_progress(self, finished_chunk_size: int) -> None: 148 | self.finished_chunk_size += finished_chunk_size 149 | 150 | if self.channel: 151 | self.channel.put_nowait(( 152 | self.target_url, 153 | self.finished_chunk_size, 154 | self.content_length, 155 | )) 156 | 157 | # In order to avoid leaving extra garbage meta files behind this 158 | # will overwrite any existing files found at local_file. If you don't want this 159 | # behaviour you can handle this externally. 160 | # local_file and local_directory could write to unexpected places if the source 161 | # is untrusted, be careful! 162 | def download_file(self) -> bool: 163 | success = False 164 | try: 165 | print(f"\n\n🚀 miaoshou-assistant downloader: start to download {self.target_url}") 166 | self.logger.info(f"miaoshou-assistant downloader: start to download {self.target_url}") 167 | 168 | # Need to rebuild local_file_final each time in case of different urls 169 | if not self.local_file: 170 | specific_local_file = os.path.basename(urlparse(self.target_url).path) 171 | else: 172 | specific_local_file = self.local_file 173 | 174 | download_temp_dir = toolkit.get_user_temp_dir() 175 | toolkit.assert_user_temp_dir() 176 | 177 | if self.local_directory: 178 | os.makedirs(self.local_directory, exist_ok=True) 179 | 180 | specific_local_file = os.path.join(download_temp_dir, specific_local_file) 181 | 182 | self.accept_ranges, self.content_length = self.get_file_info_from_server(self.target_url) 183 | self.logger.info(f"Accept-Ranges: {self.accept_ranges}. content length: {self.content_length}") 184 | if self.accept_ranges and self.content_length: 185 | download_method = self.download_file_resumable 186 | self.logger.info("Server supports resume") 187 | else: 188 | download_method = self.download_file_full 189 | self.logger.info(f"Server doesn't support resume.") 190 | 191 | for i in range(self.max_retries): 192 | self.logger.info(f"Download Attempt {i + 1}") 193 | checksum = download_method(self.target_url, specific_local_file) 194 | if checksum: 195 | if self.expected_checksum and self.expected_checksum != checksum: 196 | self.logger.info(f"Checksum doesn't match. Calculated {checksum} " 197 | f"Expecting: {self.expected_checksum}") 198 | else: 199 | self.logger.info(f"Download successful, Checksum Matched. Checksum {checksum}") 200 | success = True 201 | break 202 | time.sleep(1) 203 | 204 | if success: 205 | print(f"\n\n🎉 miaoshou-assistant downloader: {self.target_url} [download completed]") 206 | self.logger.info(f"{self.target_url} [DOWNLOADED COMPLETELY]") 207 | if self.local_directory: 208 | target_local_file = os.path.join(self.local_directory, self.local_file) 209 | else: 210 | target_local_file = self.local_file 211 | toolkit.move_file(specific_local_file, target_local_file) 212 | else: 213 | print(f"\n\n😭 miaoshou-assistant downloader: {self.target_url} [download failed]") 214 | self.logger.info(f"{self.target_url} [ FAILED ]") 215 | 216 | except Exception as ex: 217 | print(f"\n\n😭 miaoshou-assistant downloader: download failed with unexpected error: {ex}") 218 | self.logger.error(f"Unexpected Error: {ex}") # Only from block above 219 | 220 | 221 | return success 222 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | Apache License 2 | Version 2.0, January 2004 3 | http://www.apache.org/licenses/ 4 | 5 | TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION 6 | 7 | 1. Definitions. 8 | 9 | "License" shall mean the terms and conditions for use, reproduction, 10 | and distribution as defined by Sections 1 through 9 of this document. 11 | 12 | "Licensor" shall mean the copyright owner or entity authorized by 13 | the copyright owner that is granting the License. 14 | 15 | "Legal Entity" shall mean the union of the acting entity and all 16 | other entities that control, are controlled by, or are under common 17 | control with that entity. For the purposes of this definition, 18 | "control" means (i) the power, direct or indirect, to cause the 19 | direction or management of such entity, whether by contract or 20 | otherwise, or (ii) ownership of fifty percent (50%) or more of the 21 | outstanding shares, or (iii) beneficial ownership of such entity. 22 | 23 | "You" (or "Your") shall mean an individual or Legal Entity 24 | exercising permissions granted by this License. 25 | 26 | "Source" form shall mean the preferred form for making modifications, 27 | including but not limited to software source code, documentation 28 | source, and configuration files. 29 | 30 | "Object" form shall mean any form resulting from mechanical 31 | transformation or translation of a Source form, including but 32 | not limited to compiled object code, generated documentation, 33 | and conversions to other media types. 34 | 35 | "Work" shall mean the work of authorship, whether in Source or 36 | Object form, made available under the License, as indicated by a 37 | copyright notice that is included in or attached to the work 38 | (an example is provided in the Appendix below). 39 | 40 | "Derivative Works" shall mean any work, whether in Source or Object 41 | form, that is based on (or derived from) the Work and for which the 42 | editorial revisions, annotations, elaborations, or other modifications 43 | represent, as a whole, an original work of authorship. For the purposes 44 | of this License, Derivative Works shall not include works that remain 45 | separable from, or merely link (or bind by name) to the interfaces of, 46 | the Work and Derivative Works thereof. 47 | 48 | "Contribution" shall mean any work of authorship, including 49 | the original version of the Work and any modifications or additions 50 | to that Work or Derivative Works thereof, that is intentionally 51 | submitted to Licensor for inclusion in the Work by the copyright owner 52 | or by an individual or Legal Entity authorized to submit on behalf of 53 | the copyright owner. For the purposes of this definition, "submitted" 54 | means any form of electronic, verbal, or written communication sent 55 | to the Licensor or its representatives, including but not limited to 56 | communication on electronic mailing lists, source code control systems, 57 | and issue tracking systems that are managed by, or on behalf of, the 58 | Licensor for the purpose of discussing and improving the Work, but 59 | excluding communication that is conspicuously marked or otherwise 60 | designated in writing by the copyright owner as "Not a Contribution." 61 | 62 | "Contributor" shall mean Licensor and any individual or Legal Entity 63 | on behalf of whom a Contribution has been received by Licensor and 64 | subsequently incorporated within the Work. 65 | 66 | 2. Grant of Copyright License. Subject to the terms and conditions of 67 | this License, each Contributor hereby grants to You a perpetual, 68 | worldwide, non-exclusive, no-charge, royalty-free, irrevocable 69 | copyright license to reproduce, prepare Derivative Works of, 70 | publicly display, publicly perform, sublicense, and distribute the 71 | Work and such Derivative Works in Source or Object form. 72 | 73 | 3. Grant of Patent License. Subject to the terms and conditions of 74 | this License, each Contributor hereby grants to You a perpetual, 75 | worldwide, non-exclusive, no-charge, royalty-free, irrevocable 76 | (except as stated in this section) patent license to make, have made, 77 | use, offer to sell, sell, import, and otherwise transfer the Work, 78 | where such license applies only to those patent claims licensable 79 | by such Contributor that are necessarily infringed by their 80 | Contribution(s) alone or by combination of their Contribution(s) 81 | with the Work to which such Contribution(s) was submitted. If You 82 | institute patent litigation against any entity (including a 83 | cross-claim or counterclaim in a lawsuit) alleging that the Work 84 | or a Contribution incorporated within the Work constitutes direct 85 | or contributory patent infringement, then any patent licenses 86 | granted to You under this License for that Work shall terminate 87 | as of the date such litigation is filed. 88 | 89 | 4. Redistribution. You may reproduce and distribute copies of the 90 | Work or Derivative Works thereof in any medium, with or without 91 | modifications, and in Source or Object form, provided that You 92 | meet the following conditions: 93 | 94 | (a) You must give any other recipients of the Work or 95 | Derivative Works a copy of this License; and 96 | 97 | (b) You must cause any modified files to carry prominent notices 98 | stating that You changed the files; and 99 | 100 | (c) You must retain, in the Source form of any Derivative Works 101 | that You distribute, all copyright, patent, trademark, and 102 | attribution notices from the Source form of the Work, 103 | excluding those notices that do not pertain to any part of 104 | the Derivative Works; and 105 | 106 | (d) If the Work includes a "NOTICE" text file as part of its 107 | distribution, then any Derivative Works that You distribute must 108 | include a readable copy of the attribution notices contained 109 | within such NOTICE file, excluding those notices that do not 110 | pertain to any part of the Derivative Works, in at least one 111 | of the following places: within a NOTICE text file distributed 112 | as part of the Derivative Works; within the Source form or 113 | documentation, if provided along with the Derivative Works; or, 114 | within a display generated by the Derivative Works, if and 115 | wherever such third-party notices normally appear. The contents 116 | of the NOTICE file are for informational purposes only and 117 | do not modify the License. You may add Your own attribution 118 | notices within Derivative Works that You distribute, alongside 119 | or as an addendum to the NOTICE text from the Work, provided 120 | that such additional attribution notices cannot be construed 121 | as modifying the License. 122 | 123 | You may add Your own copyright statement to Your modifications and 124 | may provide additional or different license terms and conditions 125 | for use, reproduction, or distribution of Your modifications, or 126 | for any such Derivative Works as a whole, provided Your use, 127 | reproduction, and distribution of the Work otherwise complies with 128 | the conditions stated in this License. 129 | 130 | 5. Submission of Contributions. Unless You explicitly state otherwise, 131 | any Contribution intentionally submitted for inclusion in the Work 132 | by You to the Licensor shall be under the terms and conditions of 133 | this License, without any additional terms or conditions. 134 | Notwithstanding the above, nothing herein shall supersede or modify 135 | the terms of any separate license agreement you may have executed 136 | with Licensor regarding such Contributions. 137 | 138 | 6. Trademarks. This License does not grant permission to use the trade 139 | names, trademarks, service marks, or product names of the Licensor, 140 | except as required for reasonable and customary use in describing the 141 | origin of the Work and reproducing the content of the NOTICE file. 142 | 143 | 7. Disclaimer of Warranty. Unless required by applicable law or 144 | agreed to in writing, Licensor provides the Work (and each 145 | Contributor provides its Contributions) on an "AS IS" BASIS, 146 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or 147 | implied, including, without limitation, any warranties or conditions 148 | of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A 149 | PARTICULAR PURPOSE. You are solely responsible for determining the 150 | appropriateness of using or redistributing the Work and assume any 151 | risks associated with Your exercise of permissions under this License. 152 | 153 | 8. Limitation of Liability. In no event and under no legal theory, 154 | whether in tort (including negligence), contract, or otherwise, 155 | unless required by applicable law (such as deliberate and grossly 156 | negligent acts) or agreed to in writing, shall any Contributor be 157 | liable to You for damages, including any direct, indirect, special, 158 | incidental, or consequential damages of any character arising as a 159 | result of this License or out of the use or inability to use the 160 | Work (including but not limited to damages for loss of goodwill, 161 | work stoppage, computer failure or malfunction, or any and all 162 | other commercial damages or losses), even if such Contributor 163 | has been advised of the possibility of such damages. 164 | 165 | 9. Accepting Warranty or Additional Liability. While redistributing 166 | the Work or Derivative Works thereof, You may choose to offer, 167 | and charge a fee for, acceptance of support, warranty, indemnity, 168 | or other liability obligations and/or rights consistent with this 169 | License. However, in accepting such obligations, You may act only 170 | on Your own behalf and on Your sole responsibility, not on behalf 171 | of any other Contributor, and only if You agree to indemnify, 172 | defend, and hold each Contributor harmless for any liability 173 | incurred by, or claims asserted against, such Contributor by reason 174 | of your accepting any such warranty or additional liability. 175 | 176 | END OF TERMS AND CONDITIONS 177 | 178 | APPENDIX: How to apply the Apache License to your work. 179 | 180 | To apply the Apache License to your work, attach the following 181 | boilerplate notice, with the fields enclosed by brackets "[]" 182 | replaced with your own identifying information. (Don't include 183 | the brackets!) The text should be enclosed in the appropriate 184 | comment syntax for the file format. We also recommend that a 185 | file or class name and description of purpose be included on the 186 | same "printed page" as the copyright notice for easier 187 | identification within third-party archives. 188 | 189 | Copyright [2023] [miaoshou ai] 190 | 191 | Licensed under the Apache License, Version 2.0 (the "License"); 192 | you may not use this file except in compliance with the License. 193 | You may obtain a copy of the License at 194 | 195 | http://www.apache.org/licenses/LICENSE-2.0 196 | 197 | Unless required by applicable law or agreed to in writing, software 198 | distributed under the License is distributed on an "AS IS" BASIS, 199 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 200 | See the License for the specific language governing permissions and 201 | limitations under the License. 202 | -------------------------------------------------------------------------------- /scripts/assistant/miaoshou.py: -------------------------------------------------------------------------------- 1 | import gradio as gr 2 | import launch 3 | import modules 4 | import modules.generation_parameters_copypaste as parameters_copypaste 5 | import os 6 | import sys 7 | import typing as t 8 | from modules import shared 9 | from modules.call_queue import wrap_queued_call 10 | from modules.sd_models import CheckpointInfo 11 | from modules.ui_components import ToolButton 12 | 13 | from scripts.msai_logging.msai_logger import Logger 14 | from scripts.runtime.msai_prelude import MiaoshouPrelude 15 | from scripts.runtime.msai_runtime import MiaoshouRuntime 16 | from . import widget 17 | 18 | 19 | class MiaoShouAssistant(object): 20 | # default css definition 21 | default_css = '#my_model_cover{width: 100px;} #my_model_trigger_words{width: 200px;}' 22 | 23 | def __init__(self) -> None: 24 | self.logger = Logger() 25 | self.prelude = MiaoshouPrelude() 26 | self.runtime = MiaoshouRuntime() 27 | self.refresh_symbol = '\U0001f504' 28 | self.coffee_symbol = '\U0001f9cb' # 🧋 29 | self.folder_symbol = '\U0001f4c2' # 📂 30 | 31 | def on_event_ui_tabs_opened(self) -> t.List[t.Optional[t.Tuple[t.Any, str, str]]]: 32 | with gr.Blocks(analytics_enabled=False, css=MiaoShouAssistant.default_css) as miaoshou_assistant: 33 | self.create_subtab_boot_assistant() 34 | self.create_subtab_model_management() 35 | self.create_subtab_model_download() 36 | self.create_subtab_update() 37 | 38 | return [(miaoshou_assistant.queue(), "Miaoshou Assistant", "miaoshou_assistant")] 39 | 40 | def create_subtab_boot_assistant(self) -> None: 41 | with gr.TabItem('Boot Assistant', elem_id="boot_assistant_tab") as boot_assistant: 42 | with gr.Row(): 43 | with gr.Column(elem_id="col_model_list"): 44 | gpu, theme, port, chk_args, txt_args, webui_ver = self.runtime.get_default_args() 45 | gr.Markdown(value="Argument settings") 46 | with gr.Row(): 47 | self.drp_gpu = gr.Dropdown(label="VRAM Size", elem_id="drp_args_vram", 48 | choices=list(self.prelude.gpu_setting.keys()), 49 | value=gpu, interactive=True) 50 | self.drp_theme = gr.Dropdown(label="UI Theme", choices=list(self.prelude.theme_setting.keys()), 51 | value=theme, 52 | elem_id="drp_args_theme", interactive=True) 53 | self.txt_listen_port = gr.Text(label='Listen Port', value=port, elem_id="txt_args_listen_port", 54 | interactive=True) 55 | 56 | with gr.Row(): 57 | 58 | self.chk_group_args = gr.CheckboxGroup(choices=list(self.prelude.checkboxes.keys()), value=chk_args, 59 | show_label=False) 60 | self.additional_args = gr.Text(label='COMMANDLINE_ARGS (Divide by space)', value=txt_args, 61 | elem_id="txt_args_more", interactive=True) 62 | 63 | with gr.Row(): 64 | with gr.Column(): 65 | txt_save_status = gr.Markdown(visible=False, interactive=False, show_label=False) 66 | drp_choose_version = gr.Dropdown(label="WebUI Version", 67 | choices=['Official Release', 'Python Integrated'], 68 | value=webui_ver, elem_id="drp_args_version", 69 | interactive=True) 70 | gr.HTML( 71 | '

*Save your settings to webui-user.bat file. Use Python Integrated only if your' 72 | ' WebUI is extracted from a zip file and does not need python installation

') 73 | save_settings = gr.Button(value="Save Boot Settings", elem_id="btn_arg_save_setting") 74 | 75 | with gr.Row(): 76 | # with gr.Column(): 77 | # settings_submit = gr.Button(value="Apply settings", variant='primary', elem_id="ms_settings_submit") 78 | # with gr.Column(): 79 | btn_apply = gr.Button(value='Apply Settings', variant='primary', 80 | elem_id="ms_settings_restart_gradio") 81 | restart_gradio = gr.Button(value='Restart WebUI', variant='primary', 82 | elem_id="ms_settings_restart_gradio") 83 | 84 | '''def mod_args(drp_gpu, drp_theme, txt_listen_port, chk_group_args, additional_args): 85 | global commandline_args 86 | 87 | get_final_args(drp_gpu, drp_theme, txt_listen_port, hk_group_args, additional_args) 88 | 89 | print(commandline_args) 90 | print(sys.argv) 91 | #if '--xformers' not in sys.argv: 92 | #sys.argv.append('--xformers') 93 | 94 | settings_submit.click(mod_args, inputs=[drp_gpu, drp_theme, txt_listen_port, chk_group_args, additional_args], outputs=[])''' 95 | 96 | save_settings.click(self.runtime.change_boot_setting, 97 | inputs=[drp_choose_version, self.drp_gpu, self.drp_theme, self.txt_listen_port, self.chk_group_args, 98 | self.additional_args], outputs=[txt_save_status]) 99 | btn_apply.click( 100 | self.save_cmdline_args, 101 | inputs=[self.drp_gpu, self.drp_theme, self.txt_listen_port, self.chk_group_args, 102 | self.additional_args], 103 | outputs=[txt_save_status], 104 | ) 105 | 106 | def request_restart(): 107 | shared.state.interrupt() 108 | shared.state.need_restart = True 109 | launch.prepare_environment() 110 | #launch.start() 111 | 112 | restart_gradio.click( 113 | request_restart, 114 | _js='restart_reload', 115 | inputs=[], 116 | outputs=[], 117 | ) 118 | 119 | with gr.Column(): 120 | with gr.Row(): 121 | machine_settings = self.prelude.get_sys_info() 122 | txt_sys_info = gr.TextArea(value=machine_settings, lines=20, max_lines=20, 123 | label="System Info", 124 | show_label=False, interactive=False) 125 | with gr.Row(): 126 | sys_info_refbtn = gr.Button(value="Refresh") 127 | 128 | with gr.Row(): 129 | md_vram_release = gr.Markdown(visible=False, interactive=False, value='Memory Released', show_label=False) 130 | with gr.Row(): 131 | chk_auto_release = gr.Checkbox(value=self.prelude.boot_settings['auto_vram'], label='Enable Auto Memory Release') 132 | reload_button = gr.Button('Forc VRAM Release') 133 | 134 | 135 | self.drp_gpu.change(self.runtime.update_xformers, inputs=[self.drp_gpu, self.chk_group_args], outputs=[self.chk_group_args]) 136 | sys_info_refbtn.click(self.prelude.get_sys_info, None, txt_sys_info) 137 | chk_auto_release.change(self.runtime.change_auto_vram, inputs=[chk_auto_release]) 138 | reload_button.click(self.runtime.force_mem_release, outputs=[md_vram_release]) 139 | 140 | def create_subtab_model_management(self) -> None: 141 | with gr.TabItem('Model Management', elem_id="model_management_tab") as tab_model_manager: 142 | with gr.Row(): 143 | with gr.Column(): 144 | with gr.Row(): 145 | gr.Markdown(value="If you want your model directory to be other than [your_webui_dir]\\models, select a new directory down below. " 146 | "Your default models directory needs to be removed first before you apply. Make sure do your backups!") 147 | md_result = gr.Markdown(visible=False, value="") 148 | with gr.Row(): 149 | model_folder_path = gr.Textbox("", label="Model path", placeholder="Copy & paste your model destination folder here", interactive=True) 150 | #open_folder_button = ToolButton(value=self.folder_symbol, elem_id="hidden_element" if shared.cmd_opts.hide_ui_dir_config else "open_folder_metadata_editor") 151 | refresh_models_button = ToolButton(value=self.refresh_symbol, elem_id="hidden_element") 152 | with gr.Row(): 153 | btn_connect_modeldir = gr.Button(value="Apply Virtual Model Folder") 154 | 155 | with widget.Row(equal_height=True): 156 | my_search_text = gr.Textbox( 157 | label="Model name", 158 | show_label=False, 159 | max_lines=1, 160 | placeholder="Enter model name", 161 | ) 162 | btn_my_search = gr.Button("Search") 163 | 164 | with gr.Row(): 165 | ms, my_model_source = self.runtime.get_default_model_source() 166 | my_model_source_dropdown = widget.Dropdown( 167 | choices=["civitai.com", "miaoshouai.com"], 168 | value=my_model_source, 169 | label="Select Model Source", 170 | type="value", 171 | show_label=True, 172 | elem_id="my_model_source", 173 | show_progress="full") 174 | 175 | mtypes = list(self.prelude.model_type.keys()) 176 | my_model_type = widget.Radio(choices=mtypes, 177 | show_label=False, value='Checkpoint', elem_id="my_model_type", 178 | interactive=True, elem_classes="full") 179 | 180 | with gr.Row(): 181 | my_models = self.runtime.get_local_models('', my_model_type.value) 182 | self.runtime.ds_my_models = gr.Dataset( 183 | components=[gr.Image(visible=False, label='Cover', elem_id='my_model_cover'), 184 | gr.Textbox(visible=False, label='ModelId'), 185 | gr.Textbox(visible=False, label='Name/Version'), 186 | gr.Textbox(visible=False, label='File Name')], 187 | elem_id='my_model_lib', 188 | label="My Models", 189 | headers=None, 190 | samples=my_models, 191 | samples_per_page=50) 192 | with gr.Column(): 193 | self.runtime.ds_my_model_covers = gr.Dataset(components=[gr.HTML(visible=False)], 194 | elem_id='my_model_covers', 195 | label="Model Cover", 196 | headers=None, 197 | samples=[], 198 | samples_per_page=10) 199 | with gr.Row(variant='panel'): 200 | c_image = gr.Image(elem_id="pnginfo_image", label="Source", source="upload", interactive=True, 201 | type="pil", visible=True) 202 | 203 | with gr.Row(variant='panel'): 204 | with gr.Column(): 205 | 206 | btn_load_model = gr.HTML( 207 | value=f'
Load Model
', 209 | visible=True) 210 | with gr.Column(): 211 | btn_delete_model = gr.Button(visible=True, value='Delete Model') 212 | with gr.Column(): 213 | with gr.Row(): 214 | btn_set_all_covers = gr.Button(visible=True, value='Download Cover for Listed Models') 215 | with gr.Row(): 216 | btn_set_cover = gr.Button(visible=False, value='Set as Cover') 217 | 218 | with gr.Row(variant='panel'): 219 | generation_info = gr.Textbox(label='prompt', interactive=False, visible=True, elem_id="imginfo_generation_info") 220 | with gr.Row(variant='panel'): 221 | display_text = 'Select a model and type some text here, ChatGPT will generate prompt for you. Supports different text in different languages.' 222 | display_value = '' 223 | 224 | if self.prelude.boot_settings['openai_api'] == '': 225 | display_text = 'Set your OpenAI api key in Setting & Update first: https://platform.openai.com/account/api-keys' 226 | display_value = display_text 227 | 228 | self.txt_main_prompt = gr.Textbox(label='Let ChatGPT write your prompt', placeholder=display_text, value=display_value, interactive=True, visible=True, elem_id="txt_main_prompt") 229 | with gr.Row(variant='panel'): 230 | with gr.Row(): 231 | btn_generate_prompt = gr.Button(value="Use GPT to Generate Prompt") 232 | with gr.Row(): 233 | buttons = parameters_copypaste.create_buttons(["txt2img", "img2img", "inpaint", "extras"]) 234 | 235 | for tabname, button in buttons.items(): 236 | parameters_copypaste.register_paste_params_button(parameters_copypaste.ParamBinding( 237 | paste_button=button, tabname=tabname, source_text_component=generation_info, 238 | source_image_component=c_image, 239 | )) 240 | 241 | with gr.Row(variant='panel'): 242 | html_my_model = gr.HTML(visible=False) 243 | 244 | btn_delete_model.click(self.runtime.delete_model, inputs=[self.runtime.ds_my_models, my_search_text, my_model_type], outputs=[self.runtime.ds_my_models]) 245 | btn_set_all_covers.click(self.runtime.set_all_covers, inputs=[my_search_text, my_model_type], outputs=[self.runtime.ds_my_models]) 246 | btn_set_cover.click(self.runtime.set_cover, inputs=[self.runtime.ds_my_models, c_image, my_search_text, my_model_type], outputs=[self.runtime.ds_my_models]) 247 | #open_folder_button.click(self.runtime.open_folder, inputs=[model_folder_path], outputs=[model_folder_path]) 248 | btn_connect_modeldir.click(self.runtime.change_model_folder, inputs=[model_folder_path], outputs=[md_result]) 249 | refresh_models_button.click(self.runtime.refresh_local_models, inputs=[my_search_text, my_model_type], outputs=[self.runtime.ds_my_models]) 250 | my_model_source_dropdown.change(self.switch_my_model_source, 251 | inputs=[my_model_source_dropdown, my_model_type], 252 | outputs=[self.runtime.ds_my_models]) 253 | 254 | btn_my_search.click(self.runtime.search_my_model, inputs=[my_search_text, my_model_type], outputs=[self.runtime.ds_my_models]) 255 | my_model_type.change(self.runtime.update_my_model_type, inputs=[my_search_text, my_model_type], outputs=[self.runtime.ds_my_models]) 256 | btn_generate_prompt.click(self.runtime.get_gpt_prompt, inputs=[self.runtime.ds_my_models, my_model_type, self.txt_main_prompt], outputs=[generation_info]) 257 | 258 | self.runtime.ds_my_models.click(self.runtime.get_my_model_covers, 259 | inputs=[self.runtime.ds_my_models, my_model_type], 260 | outputs=[self.runtime.ds_my_model_covers, html_my_model, btn_load_model]) 261 | 262 | self.runtime.ds_my_model_covers.click(self.runtime.update_cover_info, 263 | inputs=[self.runtime.ds_my_models, self.runtime.ds_my_model_covers], 264 | outputs=[btn_set_cover, generation_info, c_image]) 265 | 266 | 267 | 268 | def tab_model_manager_select(): 269 | self.runtime.active_model_set = 'my_model_set' 270 | 271 | tab_model_manager.select(tab_model_manager_select, inputs=[], outputs=[]) 272 | 273 | 274 | def create_subtab_model_download(self) -> None: 275 | with gr.TabItem('Model Download', elem_id="model_download_tab") as tab_downloads: 276 | with gr.Row(): 277 | with gr.Column(elem_id="col_model_list"): 278 | with widget.Row(equal_height=True): 279 | model_source, mms = self.runtime.get_default_model_source() 280 | model_source_dropdown = widget.Dropdown(choices=["civitai.com", "miaoshouai.com", "official_models", 'hugging_face', "controlnet"], 281 | value=model_source, 282 | label="Select Model Source", 283 | type="value", 284 | show_label=True, 285 | elem_id="model_source", 286 | show_progress="full") 287 | 288 | #btn_fetch = gr.Button("Fetch") 289 | 290 | with widget.Row(equal_height=True): 291 | search_text = gr.Textbox( 292 | label="Model name", 293 | show_label=False, 294 | max_lines=1, 295 | placeholder="Search keywords in model name, description or file name", 296 | ) 297 | btn_search = gr.Button("Search") 298 | 299 | with widget.Row(equal_height=True): 300 | rad_model_tags = widget.Radio(choices=['All'] + self.prelude.model_tags, 301 | show_label=False, value='All', elem_id="rad_model_tags", 302 | interactive=True, elem_classes="full") 303 | 304 | with widget.Row(equal_height=True): 305 | with gr.Accordion(label="Base Model", open=False): 306 | rad_all_none = gr.Radio(label='', choices=['All', 'None'], default='All', value='All', interactive=True) 307 | ckg_base_model = gr.CheckboxGroup(label='', choices=self.prelude.base_model_group, 308 | default=self.prelude.base_model_group, 309 | value=self.prelude.base_model_group, 310 | elem_id="ckg_base_model", interactive=True) 311 | btn_bm_apply = gr.Button(value="Apply fiter") 312 | 313 | with widget.Row(equal_height=True): 314 | nsfw_checker = gr.Checkbox(label='NSFW', value=False, elem_id="chk_nsfw", interactive=True) 315 | with gr.Accordion(label="Model Type", open=False): 316 | model_type = gr.Radio(choices=["All"] + list(self.prelude.model_type.keys()), 317 | show_label=False, value='All', elem_id="rad_model_type", 318 | interactive=True, elem_classes="full") 319 | with gr.Accordion(label="Sort", open=False): 320 | rad_sort = gr.Radio(choices=['Default', 'downloadCount', 'favoriteCount', 'commentCount', 'rating'], 321 | show_label=False, value='Default', elem_id="rad_sort", 322 | interactive=True, elem_classes="full") 323 | 324 | images = self.runtime.get_images_html(base_model=self.prelude.base_model_group) 325 | self.runtime.ds_models = widget.Dataset( 326 | components=[gr.HTML(visible=False)], 327 | headers=None, 328 | type="values", 329 | label="Models", 330 | samples=images, 331 | samples_per_page=45, 332 | elem_id="model_dataset", 333 | elem_classes="gallery", 334 | container=True) 335 | 336 | 337 | 338 | with gr.Column(elem_id="col_model_info"): 339 | with gr.Row(): 340 | self.runtime.ds_cover_gallery = widget.Dataset( 341 | components=[gr.HTML(visible=False)], 342 | headers=None, 343 | type="values", 344 | label="Cover", 345 | samples=[], 346 | samples_per_page=10, 347 | elem_id="ds_cover_gallery", 348 | elem_classes="gallery", 349 | container=True) 350 | 351 | with gr.Row(): 352 | with gr.Column(): 353 | download_summary = gr.HTML('
No downloading tasks ongoing
') 354 | downloading_status = gr.Button(value=f"{self.refresh_symbol} Refresh Downloading Status", 355 | elem_id="ms_dwn_status") 356 | with gr.Row(): 357 | model_version = gr.Dropdown(choices=['Select Version'], label="Version", show_label=False, 358 | value='Select Version', elem_id='dwn_vname', 359 | interactive=True) 360 | model_dropdown = gr.Dropdown(choices=['Select Model'], label="Models", show_label=False, 361 | value='Select Model', elem_id='dwn_mname', 362 | interactive=True) 363 | model_des_folder = gr.Dropdown(choices=[], lable='Destination Folder', show_label=False, 364 | value='', elem_id='dwn_des_folder', interactive=True) 365 | 366 | is_civitai_model_source_active = self.runtime.model_source == "civitai.com" 367 | with gr.Row(variant="panel"): 368 | dwn_button = gr.Button(value='Download', 369 | visible=is_civitai_model_source_active, elem_id='ms_dwn_button') 370 | open_url_in_browser_newtab_button = gr.HTML( 371 | value='
' 372 | 'Download
', 374 | visible=not is_civitai_model_source_active) 375 | with gr.Row(): 376 | model_info = gr.HTML(visible=True) 377 | 378 | rad_all_none.change(self.runtime.set_basemodel, inputs=[rad_all_none], outputs=[ckg_base_model]) 379 | rad_model_tags.change(self.runtime.search_model, inputs=[search_text, nsfw_checker, ckg_base_model, model_type, rad_model_tags], outputs=self.runtime.ds_models) 380 | nsfw_checker.change(self.runtime.set_nsfw, inputs=[search_text, nsfw_checker, ckg_base_model, model_type, rad_model_tags], 381 | outputs=self.runtime.ds_models) 382 | btn_bm_apply.click(self.runtime.search_model, inputs=[search_text, nsfw_checker, ckg_base_model, model_type, rad_model_tags], outputs=self.runtime.ds_models) 383 | model_type.change(self.runtime.search_model, inputs=[search_text, nsfw_checker, ckg_base_model, model_type, rad_model_tags], outputs=self.runtime.ds_models) 384 | 385 | #btn_fetch.click(self.runtime.refresh_all_models, inputs=[], outputs=self.runtime.ds_models) 386 | rad_sort.change(self.runtime.sort_dataset, inputs=[search_text, nsfw_checker, ckg_base_model, model_type, rad_model_tags, rad_sort], outputs=self.runtime.ds_models) 387 | btn_search.click(self.runtime.search_model, inputs=[search_text, nsfw_checker, ckg_base_model, model_type, rad_model_tags], outputs=self.runtime.ds_models) 388 | 389 | self.runtime.ds_models.click(self.runtime.get_model_info, 390 | inputs=[self.runtime.ds_models], 391 | outputs=[ 392 | self.runtime.ds_cover_gallery, 393 | model_version, 394 | model_dropdown, 395 | model_info, 396 | open_url_in_browser_newtab_button, 397 | model_des_folder 398 | ]) 399 | 400 | model_version.change(self.runtime.select_version, inputs=[self.runtime.ds_models, model_version], outputs=[model_dropdown, self.runtime.ds_cover_gallery, open_url_in_browser_newtab_button]) 401 | dwn_button.click(self.runtime.download_model, inputs=[model_dropdown, model_des_folder], outputs=[download_summary]) 402 | downloading_status.click(self.runtime.get_downloading_status, inputs=[], outputs=[download_summary]) 403 | 404 | model_source_dropdown.change(self.switch_model_source, 405 | inputs=[model_source_dropdown, search_text, nsfw_checker, ckg_base_model, model_type, rad_model_tags, rad_sort], 406 | outputs=[self.runtime.ds_models, dwn_button, open_url_in_browser_newtab_button]) 407 | 408 | def tab_downloads_select(): 409 | self.runtime.active_model_set = 'model_set' 410 | 411 | tab_downloads.select(tab_downloads_select, inputs=[], outputs=[]) 412 | 413 | def create_subtab_update(self) -> None: 414 | with gr.TabItem('Setting & Update', elem_id="about_update") as tab_update: 415 | with gr.Row(): 416 | md_api_res = gr.Markdown(visible=False) 417 | with gr.Row(): 418 | if self.prelude.boot_settings['openai_api'] == '': 419 | display_text = 'Enter you OpenAI API Key here, you can get it from https://platform.openai.com/account/api-keys' 420 | else: 421 | display_text = self.prelude.boot_settings['openai_api'] 422 | txt_gptapi = gr.Textbox(label='OpenAI API Key', value=display_text) 423 | with gr.Row(): 424 | btn_update_gptapi = gr.Button(value="Update API Key") 425 | with gr.Row(): 426 | if self.prelude.boot_settings['civitai_api'] == '': 427 | display_text = 'Enter you Civitai API Key here, you can get it from https://civitai.com/user/account' 428 | else: 429 | display_text = self.prelude.boot_settings['civitai_api'] 430 | txt_civitai_api = gr.Textbox(label='Civitai API Key', value=display_text) 431 | with gr.Row(): 432 | btn_civitai_api= gr.Button(value="Save Civitai API Key") 433 | with gr.Row(): 434 | txt_update_result = gr.Markdown(visible=False) 435 | with gr.Row(): 436 | btn_check_update = gr.Button(value="Check for Update") 437 | with gr.Row(): 438 | chk_dont_update_ms = gr.Checkbox(visible=False, label="Do not update model source", value=False) 439 | btn_update = gr.Button(visible=False, value="Update Miaoshouai Assistant") 440 | with gr.Row(): 441 | gr.Markdown(value="About") 442 | with gr.Row(): 443 | gr.HTML( 444 | f""" 445 |

446 | This extension is created to improve some of the use experience for automatic1111 webui.
447 | It is free of charge, use it as you wish, please DO NOT sell this extension.
448 | Follow us on github, discord and give us suggestions, report bugs. support us with love or coffee~

449 | Cheers~

450 |

451 | MiaoshouAI GitHub 452 | Discord server 453 | 【QQ群:256734228】 454 |

455 | 456 | """ 457 | ) 458 | 459 | btn_check_update.click(self.runtime.check_update, inputs=[], outputs=[txt_update_result, chk_dont_update_ms, btn_update]) 460 | btn_update_gptapi.click(self.runtime.update_gptapi, inputs=[txt_gptapi], outputs=[md_api_res, self.txt_main_prompt]) 461 | btn_civitai_api.click(self.runtime.update_civitai_api, inputs=[txt_civitai_api], 462 | outputs=[md_api_res, txt_civitai_api]) 463 | btn_update.click(self.runtime.update_program, inputs=[chk_dont_update_ms], outputs=[txt_update_result]) 464 | 465 | def save_cmdline_args(self, drp_gpu, drp_theme, txt_listen_port, chk_group_args, additional_args): 466 | #print(drp_gpu, drp_theme, txt_listen_port, chk_group_args, additional_args) 467 | self.runtime.get_final_args(drp_gpu, drp_theme, txt_listen_port, chk_group_args, additional_args) 468 | #print('request_restart: cmd_arg = ', self.runtime.cmdline_args) 469 | #print('request_restart: sys.argv = ', sys.argv) 470 | 471 | # reset args 472 | sys.argv = [sys.argv[0]] 473 | os.environ['COMMANDLINE_ARGS'] = "" 474 | #print('remove', sys.argv) 475 | 476 | for arg in list(dict.fromkeys(self.runtime.cmdline_args)): 477 | sys.argv.append(arg) 478 | 479 | print('saved args', sys.argv) 480 | #launch.start() 481 | return gr.Markdown.update(value="Settings Saved", visible=True) 482 | 483 | def switch_model_source(self, new_model_source: str, search, chk_nsfw, base_model, model_type, model_tag, sort_by): 484 | def sort_key(item, key): 485 | if key in item['stats']: 486 | return item['stats'][key] 487 | 488 | self.runtime.model_source = new_model_source 489 | show_download_button = self.runtime.model_source != "miaoshouai.com" 490 | 491 | if sort_by != 'Default': 492 | self.runtime.sorted_model_set = sorted(self.runtime.model_set, key=lambda item: sort_key(item, sort_by), reverse=True) 493 | else: 494 | self.runtime.sorted_model_set = self.runtime.model_set 495 | 496 | if self.runtime.ds_models: 497 | self.runtime.ds_models.samples = self.runtime.sorted_model_set 498 | self.runtime.ds_models.update(samples=self.runtime.sorted_model_set) 499 | else: 500 | self.logger.error(f"ds models is null") 501 | 502 | images = self.runtime.get_images_html(search, chk_nsfw, base_model, model_type, model_tag) 503 | #images = self.runtime.sort_dataset(search, chk_nsfw, base_model, model_type, model_tag) 504 | 505 | self.runtime.ds_models.samples = images 506 | self.runtime.ds_models.update(samples=self.runtime.sorted_model_set) 507 | 508 | if self.runtime.model_source not in ['official_models', 'hugging_face', 'controlnet']: 509 | self.runtime.update_boot_setting('model_source', self.runtime.model_source) 510 | 511 | return ( 512 | gr.Dataset.update(samples=images), 513 | gr.Button.update(visible=show_download_button), 514 | gr.HTML.update(visible=not show_download_button) 515 | ) 516 | 517 | def switch_my_model_source(self, new_model_source: str, model_type): 518 | self.runtime.my_model_source = new_model_source 519 | my_models = self.runtime.get_local_models('', model_type) 520 | self.runtime.ds_my_models.samples = my_models 521 | 522 | if self.runtime.my_model_source not in ['official_models', 'hugging_face', 'controlnet']: 523 | self.runtime.update_boot_setting('my_model_source', self.runtime.my_model_source) 524 | 525 | return gr.Dataset.update(samples=my_models) 526 | 527 | def release_mem(self) -> None: 528 | self.runtime.mem_release() 529 | 530 | def introception(self) -> None: 531 | self.runtime.introception() 532 | 533 | 534 | -------------------------------------------------------------------------------- /configs/official_models.json: -------------------------------------------------------------------------------- 1 | [ 2 | { 3 | "id": 1, 4 | "name": "stable-diffusion-v1-5", 5 | "description": "

Stable Diffusion is a latent text-to-image diffusion model capable of generating photo-realistic images given any text input. For more information about how Stable Diffusion functions, please have a look at \uD83E\uDD17's Stable Diffusion blog.\n\nThe Stable-Diffusion-v1-5 checkpoint was initialized with the weights of the Stable-Diffusion-v1-2 checkpoint and subsequently fine-tuned on 595k steps at resolution 512x512 on \"laion-aesthetics v2 5+\" and 10% dropping of the text-conditioning to improve classifier-free guidance sampling.\n\nYou can use this both with the \uD83E\uDDE8Diffusers library and the RunwayML GitHub repository.

", 6 | "type": "Checkpoint", 7 | "poi": false, 8 | "nsfw": false, 9 | "allowNoCredit": true, 10 | "allowCommercialUse": "Rent", 11 | "allowDerivatives": true, 12 | "allowDifferentLicense": true, 13 | "stats": { 14 | "downloadCount": 865, 15 | "favoriteCount": 190, 16 | "commentCount": 7, 17 | "ratingCount": 2, 18 | "rating": 5 19 | }, 20 | "creator": { 21 | "username": "creativeml-openrail-m", 22 | "image": "https://huggingface.co/runwayml/stable-diffusion-v1-5" 23 | }, 24 | "tags": [ 25 | "horror", 26 | "dzislaw beksinskidzi", 27 | "kappa_neuro", 28 | "paintings" 29 | ], 30 | "modelVersions": [ 31 | { 32 | "id": 1, 33 | "modelId": 7019, 34 | "name": "v1-5-pruned-emaonly", 35 | "createdAt": "2023-02-06T13:52:34.605Z", 36 | "updatedAt": "2023-02-06T13:52:34.605Z", 37 | "trainedWords": [], 38 | "baseModel": "SD 1.5", 39 | "earlyAccessTimeFrame": 0, 40 | "description": "

", 41 | "files": [ 42 | { 43 | "name": "v1-5-pruned-emaonly.ckpt", 44 | "id": 1, 45 | "sizeKB": 4471261.130859375, 46 | "type": "Model", 47 | "format": "CKPT", 48 | "pickleScanResult": "Success", 49 | "pickleScanMessage": "No Pickle imports", 50 | "virusScanResult": "Success", 51 | "scannedAt": "2023-02-06T13:55:58.281Z", 52 | "hashes": { 53 | "AutoV2": "833E816807", 54 | "SHA256": "833E816807E8D3658EBC65436908F690603A8E0E8D26143A90050F32958C9E4E", 55 | "CRC32": "87F68C12", 56 | "BLAKE3": "7A28D3D22520D61B58338791522A14B7B33A6A9CE552FF7D68D7E2688CAB3266" 57 | }, 58 | "downloadUrl": "https://huggingface.co/runwayml/stable-diffusion-v1-5/resolve/main/v1-5-pruned-emaonly.ckpt", 59 | "primary": false 60 | }, 61 | { 62 | "name": "v1-5-pruned-emaonly.safetensors", 63 | "id": 2, 64 | "sizeKB": 4471261.130859375, 65 | "type": "Model", 66 | "format": "Safetensors", 67 | "pickleScanResult": "Success", 68 | "pickleScanMessage": "No Pickle imports", 69 | "virusScanResult": "Success", 70 | "scannedAt": "2023-02-06T13:55:58.281Z", 71 | "hashes": { 72 | "AutoV2": "833E816807", 73 | "SHA256": "833E816807E8D3658EBC65436908F690603A8E0E8D26143A90050F32958C9E4E", 74 | "CRC32": "87F68C12", 75 | "BLAKE3": "7A28D3D22520D61B58338791522A14B7B33A6A9CE552FF7D68D7E2688CAB3266" 76 | }, 77 | "downloadUrl": "https://huggingface.co/runwayml/stable-diffusion-v1-5/resolve/main/v1-5-pruned-emaonly.safetensors", 78 | "primary": true 79 | }, 80 | { 81 | "name": "v1-5-pruned.ckpt", 82 | "id": 3, 83 | "sizeKB": 7971261.130859375, 84 | "type": "Model", 85 | "format": "Safetensors", 86 | "pickleScanResult": "Success", 87 | "pickleScanMessage": "No Pickle imports", 88 | "virusScanResult": "Success", 89 | "scannedAt": "2023-02-06T13:55:58.281Z", 90 | "hashes": { 91 | "AutoV2": "833E816807", 92 | "SHA256": "833E816807E8D3658EBC65436908F690603A8E0E8D26143A90050F32958C9E4E", 93 | "CRC32": "87F68C12", 94 | "BLAKE3": "7A28D3D22520D61B58338791522A14B7B33A6A9CE552FF7D68D7E2688CAB3266" 95 | }, 96 | "downloadUrl": "https://huggingface.co/runwayml/stable-diffusion-v1-5/resolve/main/v1-5-pruned.ckpt", 97 | "primary": false 98 | }, 99 | { 100 | "name": "v1-5-pruned.safetensors", 101 | "id": 4, 102 | "sizeKB": 7971261.130859375, 103 | "type": "Model", 104 | "format": "Safetensors", 105 | "pickleScanResult": "Success", 106 | "pickleScanMessage": "No Pickle imports", 107 | "virusScanResult": "Success", 108 | "scannedAt": "2023-02-06T13:55:58.281Z", 109 | "hashes": { 110 | "AutoV2": "833E816807", 111 | "SHA256": "833E816807E8D3658EBC65436908F690603A8E0E8D26143A90050F32958C9E4E", 112 | "CRC32": "87F68C12", 113 | "BLAKE3": "7A28D3D22520D61B58338791522A14B7B33A6A9CE552FF7D68D7E2688CAB3266" 114 | }, 115 | "downloadUrl": "https://huggingface.co/runwayml/stable-diffusion-v1-5/resolve/main/v1-5-pruned.safetensors", 116 | "primary": false 117 | }, 118 | { 119 | "name": "sd-v1-5-inpainting.ckpt", 120 | "id": 5, 121 | "sizeKB": 4471261.130859375, 122 | "type": "Model", 123 | "format": "Checkpoint", 124 | "pickleScanResult": "Success", 125 | "pickleScanMessage": "No Pickle imports", 126 | "virusScanResult": "Success", 127 | "scannedAt": "2023-02-06T13:55:58.281Z", 128 | "hashes": { 129 | "AutoV2": "833E816807", 130 | "SHA256": "833E816807E8D3658EBC65436908F690603A8E0E8D26143A90050F32958C9E4E", 131 | "CRC32": "87F68C12", 132 | "BLAKE3": "7A28D3D22520D61B58338791522A14B7B33A6A9CE552FF7D68D7E2688CAB3266" 133 | }, 134 | "downloadUrl": "https://huggingface.co/runwayml/stable-diffusion-inpainting/resolve/main/sd-v1-5-inpainting.ckpt", 135 | "primary": false 136 | } 137 | ], 138 | "images": [ 139 | { 140 | "url": "https://msdn.miaoshouai.com/msai/kt/ez/9900922.png" 141 | } 142 | ] 143 | } 144 | ] 145 | }, 146 | { 147 | "id": 2, 148 | "name": "stable-diffusion-2-1", 149 | "description": "

Stable Diffusion v2-1 Model Card\nThis model card focuses on the model associated with the Stable Diffusion v2-1 model, codebase available here.\n\nThis stable-diffusion-2-1 model is fine-tuned from stable-diffusion-2 (768-v-ema.ckpt) with an additional 55k steps on the same dataset (with punsafe=0.1), and then fine-tuned for another 155k extra steps with punsafe=0.98.\n\nUse it with the stablediffusion repository: download the v2-1_768-ema-pruned.ckpt here.\nUse it with \uD83E\uDDE8 diffusers\nModel Details\nDeveloped by: Robin Rombach, Patrick Esser\n\nModel type: Diffusion-based text-to-image generation model\n\nLanguage(s): English\n\nLicense: CreativeML Open RAIL++-M License\n\nModel Description: This is a model that can be used to generate and modify images based on text prompts. It is a Latent Diffusion Model that uses a fixed, pretrained text encoder (OpenCLIP-ViT/H).\n\nResources for more information: GitHub Repository.

", 150 | "type": "Checkpoint", 151 | "poi": false, 152 | "nsfw": false, 153 | "allowNoCredit": true, 154 | "allowCommercialUse": "Rent", 155 | "allowDerivatives": true, 156 | "allowDifferentLicense": true, 157 | "stats": { 158 | "downloadCount": 865, 159 | "favoriteCount": 190, 160 | "commentCount": 7, 161 | "ratingCount": 2, 162 | "rating": 5 163 | }, 164 | "creator": { 165 | "username": "stabilityai", 166 | "image": "https://huggingface.co/stabilityai/stable-diffusion-2-1" 167 | }, 168 | "tags": [], 169 | "modelVersions": [ 170 | { 171 | "id": 2, 172 | "modelId": 2, 173 | "name": "stable-diffusion-2-1", 174 | "createdAt": "2023-02-06T13:52:34.605Z", 175 | "updatedAt": "2023-02-06T13:52:34.605Z", 176 | "trainedWords": [], 177 | "baseModel": "SD 1.5", 178 | "earlyAccessTimeFrame": 0, 179 | "description": "

", 180 | "files": [ 181 | { 182 | "name": "v2-1_768-ema-pruned.ckpt", 183 | "id": 6, 184 | "sizeKB": 5421261.130859375, 185 | "type": "Model", 186 | "format": "CKPT", 187 | "pickleScanResult": "Success", 188 | "pickleScanMessage": "No Pickle imports", 189 | "virusScanResult": "Success", 190 | "scannedAt": "2023-02-06T13:55:58.281Z", 191 | "hashes": { 192 | "AutoV2": "833E816807", 193 | "SHA256": "833E816807E8D3658EBC65436908F690603A8E0E8D26143A90050F32958C9E4E", 194 | "CRC32": "87F68C12", 195 | "BLAKE3": "7A28D3D22520D61B58338791522A14B7B33A6A9CE552FF7D68D7E2688CAB3266" 196 | }, 197 | "downloadUrl": "https://huggingface.co/runwayml/stable-diffusion-v1-5/resolve/main/v1-5-pruned-emaonly.ckpt", 198 | "primary": false 199 | }, 200 | { 201 | "name": "v2-1_768-ema-pruned.safetensors", 202 | "id": 7, 203 | "sizeKB": 5421261.130859375, 204 | "type": "Model", 205 | "format": "Safetensors", 206 | "pickleScanResult": "Success", 207 | "pickleScanMessage": "No Pickle imports", 208 | "virusScanResult": "Success", 209 | "scannedAt": "2023-02-06T13:55:58.281Z", 210 | "hashes": { 211 | "AutoV2": "833E816807", 212 | "SHA256": "833E816807E8D3658EBC65436908F690603A8E0E8D26143A90050F32958C9E4E", 213 | "CRC32": "87F68C12", 214 | "BLAKE3": "7A28D3D22520D61B58338791522A14B7B33A6A9CE552FF7D68D7E2688CAB3266" 215 | }, 216 | "downloadUrl": "https://huggingface.co/runwayml/stable-diffusion-v1-5/resolve/main/v1-5-pruned-emaonly.safetensors", 217 | "primary": true 218 | }, 219 | { 220 | "name": "v2-1_768-nonema-pruned.ckpt", 221 | "id": 8, 222 | "sizeKB": 5421261.130859375, 223 | "type": "Model", 224 | "format": "CKPT", 225 | "pickleScanResult": "Success", 226 | "pickleScanMessage": "No Pickle imports", 227 | "virusScanResult": "Success", 228 | "scannedAt": "2023-02-06T13:55:58.281Z", 229 | "hashes": { 230 | "AutoV2": "833E816807", 231 | "SHA256": "833E816807E8D3658EBC65436908F690603A8E0E8D26143A90050F32958C9E4E", 232 | "CRC32": "87F68C12", 233 | "BLAKE3": "7A28D3D22520D61B58338791522A14B7B33A6A9CE552FF7D68D7E2688CAB3266" 234 | }, 235 | "downloadUrl": "https://huggingface.co/runwayml/stable-diffusion-v1-5/resolve/main/v1-5-pruned.ckpt", 236 | "primary": false 237 | }, 238 | { 239 | "name": "v2-1_768-nonema-pruned.safetensors", 240 | "id": 9, 241 | "sizeKB": 5421261.130859375, 242 | "type": "Model", 243 | "format": "Safetensors", 244 | "pickleScanResult": "Success", 245 | "pickleScanMessage": "No Pickle imports", 246 | "virusScanResult": "Success", 247 | "scannedAt": "2023-02-06T13:55:58.281Z", 248 | "hashes": { 249 | "AutoV2": "833E816807", 250 | "SHA256": "833E816807E8D3658EBC65436908F690603A8E0E8D26143A90050F32958C9E4E", 251 | "CRC32": "87F68C12", 252 | "BLAKE3": "7A28D3D22520D61B58338791522A14B7B33A6A9CE552FF7D68D7E2688CAB3266" 253 | }, 254 | "downloadUrl": "https://huggingface.co/runwayml/stable-diffusion-v1-5/resolve/main/v1-5-pruned.safetensors", 255 | "primary": false 256 | }, 257 | { 258 | "name": "512-inpainting-ema.ckpt", 259 | "id": 10, 260 | "sizeKB": 5421261.130859375, 261 | "type": "Model", 262 | "format": "Safetensors", 263 | "pickleScanResult": "Success", 264 | "pickleScanMessage": "No Pickle imports", 265 | "virusScanResult": "Success", 266 | "scannedAt": "2023-02-06T13:55:58.281Z", 267 | "hashes": { 268 | "AutoV2": "833E816807", 269 | "SHA256": "833E816807E8D3658EBC65436908F690603A8E0E8D26143A90050F32958C9E4E", 270 | "CRC32": "87F68C12", 271 | "BLAKE3": "7A28D3D22520D61B58338791522A14B7B33A6A9CE552FF7D68D7E2688CAB3266" 272 | }, 273 | "downloadUrl": "https://huggingface.co/stabilityai/stable-diffusion-2-inpainting/resolve/main/512-inpainting-ema.ckpt", 274 | "primary": false 275 | }, 276 | { 277 | "name": "512-inpainting-ema.safetensors", 278 | "id": 11, 279 | "sizeKB": 5421261.130859375, 280 | "type": "Model", 281 | "format": "Safetensors", 282 | "pickleScanResult": "Success", 283 | "pickleScanMessage": "No Pickle imports", 284 | "virusScanResult": "Success", 285 | "scannedAt": "2023-02-06T13:55:58.281Z", 286 | "hashes": { 287 | "AutoV2": "833E816807", 288 | "SHA256": "833E816807E8D3658EBC65436908F690603A8E0E8D26143A90050F32958C9E4E", 289 | "CRC32": "87F68C12", 290 | "BLAKE3": "7A28D3D22520D61B58338791522A14B7B33A6A9CE552FF7D68D7E2688CAB3266" 291 | }, 292 | "downloadUrl": "https://huggingface.co/stabilityai/stable-diffusion-2-inpainting/resolve/main/512-inpainting-ema.safetensors", 293 | "primary": false 294 | }, 295 | { 296 | "name": "v2-1_768-ema-pruned.yaml", 297 | "id": 12, 298 | "sizeKB": 2261.130859375, 299 | "type": "Model", 300 | "format": "YAML", 301 | "pickleScanResult": "Success", 302 | "pickleScanMessage": "No Pickle imports", 303 | "virusScanResult": "Success", 304 | "scannedAt": "2023-02-06T13:55:58.281Z", 305 | "hashes": { 306 | "AutoV2": "833E816807", 307 | "SHA256": "833E816807E8D3658EBC65436908F690603A8E0E8D26143A90050F32958C9E4E", 308 | "CRC32": "87F68C12", 309 | "BLAKE3": "7A28D3D22520D61B58338791522A14B7B33A6A9CE552FF7D68D7E2688CAB3266" 310 | }, 311 | "downloadUrl": "https://raw.githubusercontent.com/Stability-AI/stablediffusion/main/configs/stable-diffusion/v2-inference-v.yaml", 312 | "primary": false 313 | } 314 | ], 315 | "images": [ 316 | { 317 | "url": "https://msdn.miaoshouai.com/msai/kt/ez/9900922.png" 318 | } 319 | ] 320 | } 321 | ] 322 | }, 323 | { 324 | "id": 4, 325 | "name": "stable-diffusion-XL 1.0", 326 | "description": "SDXL consists of a two-step pipeline for latent diffusion: First, we use a base model to generate latents of the desired output size. In the second step, we use a specialized high-resolution model and apply a technique called SDEdit (https://arxiv.org/abs/2108.01073, also known as \"img2img\") to the latents generated in the first step, using the same prompt.", 327 | "type": "Checkpoint", 328 | "poi": false, 329 | "nsfw": false, 330 | "allowNoCredit": true, 331 | "allowCommercialUse": "Rent", 332 | "allowDerivatives": true, 333 | "allowDifferentLicense": true, 334 | "stats": { 335 | "downloadCount": 865, 336 | "favoriteCount": 190, 337 | "commentCount": 7, 338 | "ratingCount": 2, 339 | "rating": 5 340 | }, 341 | "creator": { 342 | "username": "stabilityai", 343 | "image": "https://huggingface.co/stabilityai/stable-diffusion-xl-base-0.9/resolve/main/01.png" 344 | }, 345 | "tags": [], 346 | "modelVersions": [ 347 | { 348 | "id": 2, 349 | "modelId": 2, 350 | "name": "sd_xl_base_1.0", 351 | "createdAt": "2023-02-06T13:52:34.605Z", 352 | "updatedAt": "2023-02-06T13:52:34.605Z", 353 | "trainedWords": [], 354 | "baseModel": "SDXL", 355 | "earlyAccessTimeFrame": 0, 356 | "description": "

", 357 | "files": [ 358 | { 359 | "name": "sd_xl_base_1.0.safetensors", 360 | "id": 6, 361 | "sizeKB": 7242126.130859375, 362 | "type": "Model", 363 | "format": "CKPT", 364 | "pickleScanResult": "Success", 365 | "pickleScanMessage": "No Pickle imports", 366 | "virusScanResult": "Success", 367 | "scannedAt": "2023-02-06T13:55:58.281Z", 368 | "hashes": { 369 | "AutoV2": "31E35C80FC", 370 | "SHA256": "31E35C80FC4829D14F90153F4C74CD59C90B779F6AFE05A74CD6120B893F7E5B", 371 | "CRC32": "31E35C80FC", 372 | "BLAKE3": "31E35C80FC4829D14F90153F4C74CD59C90B779F6AFE05A74CD6120B893F7E5B" 373 | }, 374 | "downloadUrl": "https://huggingface.co/stabilityai/stable-diffusion-xl-base-1.0/resolve/main/sd_xl_base_1.0.safetensors", 375 | "primary": true 376 | }, 377 | { 378 | "name": "sd_xl_refiner_1.0.safetensors", 379 | "id": 7, 380 | "sizeKB": 6221261.130859375, 381 | "type": "Model", 382 | "format": "Safetensors", 383 | "pickleScanResult": "Success", 384 | "pickleScanMessage": "No Pickle imports", 385 | "virusScanResult": "Success", 386 | "scannedAt": "2023-02-06T13:55:58.281Z", 387 | "hashes": { 388 | "AutoV2": "7440042BBD", 389 | "SHA256": "7440042BBDC8A24813002C09B6B69B64DC90FDED4472613437B7F55F9B7D9C5F", 390 | "CRC32": "7440042BBD", 391 | "BLAKE3": "7440042BBDC8A24813002C09B6B69B64DC90FDED4472613437B7F55F9B7D9C5F" 392 | }, 393 | "downloadUrl": "https://huggingface.co/stabilityai/stable-diffusion-xl-refiner-1.0/resolve/main/sd_xl_refiner_1.0.safetensors", 394 | "primary": true 395 | }, 396 | { 397 | "name": "sdxl_vae.safetensors", 398 | "id": 7, 399 | "sizeKB": 360126.130859375, 400 | "type": "Model", 401 | "format": "Safetensors", 402 | "pickleScanResult": "Success", 403 | "pickleScanMessage": "No Pickle imports", 404 | "virusScanResult": "Success", 405 | "scannedAt": "2023-02-06T13:55:58.281Z", 406 | "hashes": { 407 | "AutoV2": "551EAC7037", 408 | "SHA256": "551EAC7037CE58DE1EF4447F16D48664C1E67F0E27AF50A06B1A6D458B571E0C", 409 | "CRC32": "551EAC7037", 410 | "BLAKE3": "551EAC7037CE58DE1EF4447F16D48664C1E67F0E27AF50A06B1A6D458B571E0C" 411 | }, 412 | "downloadUrl": "https://huggingface.co/stabilityai/sdxl-vae/resolve/main/sdxl_vae.safetensors", 413 | "primary": true 414 | } 415 | ], 416 | "images": [ 417 | { 418 | "url": "https://msdn.miaoshouai.com/msai/kt/ez/9900922.png" 419 | } 420 | ] 421 | } 422 | ] 423 | }, 424 | { 425 | "id": 3, 426 | "name": "VAE", 427 | "description": "

Stable Diffusion is a latent text-to-image diffusion model capable of generating photo-realistic images given any text input. For more information about how Stable Diffusion functions, please have a look at \uD83E\uDD17's Stable Diffusion blog.\n\nThe Stable-Diffusion-v1-5 checkpoint was initialized with the weights of the Stable-Diffusion-v1-2 checkpoint and subsequently fine-tuned on 595k steps at resolution 512x512 on \"laion-aesthetics v2 5+\" and 10% dropping of the text-conditioning to improve classifier-free guidance sampling.\n\nYou can use this both with the \uD83E\uDDE8Diffusers library and the RunwayML GitHub repository.

", 428 | "type": "VAE", 429 | "poi": false, 430 | "nsfw": false, 431 | "allowNoCredit": true, 432 | "allowCommercialUse": "Rent", 433 | "allowDerivatives": true, 434 | "allowDifferentLicense": true, 435 | "stats": { 436 | "downloadCount": 865, 437 | "favoriteCount": 190, 438 | "commentCount": 7, 439 | "ratingCount": 2, 440 | "rating": 5 441 | }, 442 | "creator": { 443 | "username": "creativeml-openrail-m", 444 | "image": "https://huggingface.co/runwayml/stable-diffusion-v1-5" 445 | }, 446 | "tags": [], 447 | "modelVersions": [ 448 | { 449 | "id": 3, 450 | "modelId": 3, 451 | "name": "VAE", 452 | "createdAt": "2023-02-06T13:52:34.605Z", 453 | "updatedAt": "2023-02-06T13:52:34.605Z", 454 | "trainedWords": [], 455 | "baseModel": "SD 1.5", 456 | "earlyAccessTimeFrame": 0, 457 | "description": "

", 458 | "files": [ 459 | { 460 | "name": "vae-ft-ema-560000-ema-pruned.ckpt", 461 | "id": 15, 462 | "sizeKB": 447126.130859375, 463 | "type": "Model", 464 | "format": "CKPT", 465 | "pickleScanResult": "Success", 466 | "pickleScanMessage": "No Pickle imports", 467 | "virusScanResult": "Success", 468 | "scannedAt": "2023-02-06T13:55:58.281Z", 469 | "hashes": { 470 | "AutoV2": "833E816807", 471 | "SHA256": "833E816807E8D3658EBC65436908F690603A8E0E8D26143A90050F32958C9E4E", 472 | "CRC32": "87F68C12", 473 | "BLAKE3": "7A28D3D22520D61B58338791522A14B7B33A6A9CE552FF7D68D7E2688CAB3266" 474 | }, 475 | "downloadUrl": "https://huggingface.co/stabilityai/sd-vae-ft-ema-original/resolve/main/vae-ft-ema-560000-ema-pruned.ckpt", 476 | "primary": false 477 | }, 478 | { 479 | "name": "vae-ft-mse-840000-ema-pruned.ckpt", 480 | "id": 16, 481 | "sizeKB": 447126.130859375, 482 | "type": "Model", 483 | "format": "CKPT", 484 | "pickleScanResult": "Success", 485 | "pickleScanMessage": "No Pickle imports", 486 | "virusScanResult": "Success", 487 | "scannedAt": "2023-02-06T13:55:58.281Z", 488 | "hashes": { 489 | "AutoV2": "833E816807", 490 | "SHA256": "833E816807E8D3658EBC65436908F690603A8E0E8D26143A90050F32958C9E4E", 491 | "CRC32": "87F68C12", 492 | "BLAKE3": "7A28D3D22520D61B58338791522A14B7B33A6A9CE552FF7D68D7E2688CAB3266" 493 | }, 494 | "downloadUrl": "https://huggingface.co/stabilityai/sd-vae-ft-mse-original/resolve/main/vae-ft-mse-840000-ema-pruned.ckpt", 495 | "primary": true 496 | }, 497 | { 498 | "name": "Waifu-diffusion-v1-4 VAE", 499 | "id": 17, 500 | "sizeKB": 497126.130859375, 501 | "type": "Model", 502 | "format": "CKPT", 503 | "pickleScanResult": "Success", 504 | "pickleScanMessage": "No Pickle imports", 505 | "virusScanResult": "Success", 506 | "scannedAt": "2023-02-06T13:55:58.281Z", 507 | "hashes": { 508 | "SHA256": "DF3C506E51B7EE1D7B5A6A2BB7142D47D488743C96AA778AFB0F53A2CDC2D38D" 509 | }, 510 | "downloadUrl": "https://huggingface.co/hakurei/waifu-diffusion-v1-4/resolve/main/vae/kl-f8-anime2.ckpt", 511 | "primary": false 512 | }, 513 | { 514 | "name": "autoencoder_fix_kl-f8-trinart_chara", 515 | "id": 18, 516 | "sizeKB": 447126.130859375, 517 | "type": "Model", 518 | "format": "CKPT", 519 | "pickleScanResult": "Success", 520 | "pickleScanMessage": "No Pickle imports", 521 | "virusScanResult": "Success", 522 | "scannedAt": "2023-02-06T13:55:58.281Z", 523 | "hashes": { 524 | "AutoV2": "833E816807", 525 | "SHA256": "833E816807E8D3658EBC65436908F690603A8E0E8D26143A90050F32958C9E4E", 526 | "CRC32": "87F68C12", 527 | "BLAKE3": "7A28D3D22520D61B58338791522A14B7B33A6A9CE552FF7D68D7E2688CAB3266" 528 | }, 529 | "downloadUrl": "https://huggingface.co/naclbit/trinart_characters_19.2m_stable_diffusion_v1/resolve/main/autoencoder_fix_kl-f8-trinart_characters.ckpt", 530 | "primary": false 531 | }, 532 | { 533 | "name": "Anything-V3.0.vae.pt", 534 | "id": 19, 535 | "sizeKB": 847126.130859375, 536 | "type": "Model", 537 | "format": "PT", 538 | "pickleScanResult": "Success", 539 | "pickleScanMessage": "No Pickle imports", 540 | "virusScanResult": "Success", 541 | "scannedAt": "2023-02-06T13:55:58.281Z", 542 | "hashes": { 543 | "AutoV2": "F921FB3F29", 544 | "SHA256": "F921FB3F29891D2A77A6571E56B8B5052420D2884129517A333C60B1B4816CDF" 545 | }, 546 | "downloadUrl": "https://huggingface.co/Linaqruf/anything-v3.0/resolve/refs%2Fpr%2F11/Anything-V3.0.vae.pt", 547 | "primary": false 548 | }, 549 | { 550 | "name": "Berrymix VAE", 551 | "id": 20, 552 | "sizeKB": 447126.130859375, 553 | "type": "Model", 554 | "format": "Checkpoint", 555 | "pickleScanResult": "Success", 556 | "pickleScanMessage": "No Pickle imports", 557 | "virusScanResult": "Success", 558 | "scannedAt": "2023-02-06T13:55:58.281Z", 559 | "hashes": { 560 | "AutoV2": "F921FB3F29", 561 | "SHA256": "F921FB3F29891D2A77A6571E56B8B5052420D2884129517A333C60B1B4816CDF" 562 | }, 563 | "downloadUrl": "https://huggingface.co/hakurei/waifu-diffusion-v1-4/resolve/main/vae/kl-f8-anime2.ckpt", 564 | "primary": false 565 | }, 566 | { 567 | "name": "sdxl_vae.safetensors", 568 | "id": 7, 569 | "sizeKB": 360126.130859375, 570 | "type": "Model", 571 | "format": "Safetensors", 572 | "pickleScanResult": "Success", 573 | "pickleScanMessage": "No Pickle imports", 574 | "virusScanResult": "Success", 575 | "scannedAt": "2023-02-06T13:55:58.281Z", 576 | "hashes": { 577 | "AutoV2": "551EAC7037", 578 | "SHA256": "551EAC7037CE58DE1EF4447F16D48664C1E67F0E27AF50A06B1A6D458B571E0C", 579 | "CRC32": "551EAC7037", 580 | "BLAKE3": "551EAC7037CE58DE1EF4447F16D48664C1E67F0E27AF50A06B1A6D458B571E0C" 581 | }, 582 | "downloadUrl": "https://huggingface.co/stabilityai/sdxl-vae/resolve/main/sdxl_vae.safetensors", 583 | "primary": true 584 | } 585 | ], 586 | "images": [ 587 | { 588 | "url": "https://msdn.miaoshouai.com/msai/kt/ez/9900922.png" 589 | } 590 | ] 591 | } 592 | ] 593 | }, 594 | { 595 | "id": 4, 596 | "name": "Stable Video Diffusion", 597 | "description": "

Stable Video Diffusion (SVD) 1.1 Image-to-Video is a diffusion model that takes in a still image as a conditioning frame, and generates a video from it.", 598 | "type": "Model", 599 | "poi": false, 600 | "nsfw": false, 601 | "allowNoCredit": true, 602 | "allowCommercialUse": "Rent", 603 | "allowDerivatives": true, 604 | "allowDifferentLicense": true, 605 | "stats": { 606 | "downloadCount": 865, 607 | "favoriteCount": 190, 608 | "commentCount": 7, 609 | "ratingCount": 2, 610 | "rating": 5 611 | }, 612 | "creator": { 613 | "username": "stabilityai", 614 | "image": "https://huggingface.co/runwayml/stable-diffusion-v1-5" 615 | }, 616 | "tags": [], 617 | "modelVersions": [ 618 | { 619 | "id": 401, 620 | "modelId": 401, 621 | "name": "Model", 622 | "createdAt": "2023-02-06T13:52:34.605Z", 623 | "updatedAt": "2023-02-06T13:52:34.605Z", 624 | "trainedWords": [], 625 | "baseModel": "SVD", 626 | "earlyAccessTimeFrame": 0, 627 | "description": "

", 628 | "files": [ 629 | { 630 | "name": "svd_xt_1_1.safetensors", 631 | "id": 40101, 632 | "sizeKB": 40447126.130859375, 633 | "type": "Model", 634 | "format": "CKPT", 635 | "pickleScanResult": "Success", 636 | "pickleScanMessage": "No Pickle imports", 637 | "virusScanResult": "Success", 638 | "scannedAt": "2023-02-06T13:55:58.281Z", 639 | "hashes": { 640 | "AutoV2": "69CCFEA1BB", 641 | "SHA256": "69CCFEA1BB45DD63B3BA8B6CFE8B0D45D780995DFDDE590AEAA97CC567018D33", 642 | "CRC32": "69CCFEA1BB", 643 | "BLAKE3": "69CCFEA1BB45DD63B3BA8B6CFE8B0D45D780995DFDDE590AEAA97CC567018D33" 644 | }, 645 | "downloadUrl": "https://huggingface.co/stabilityai/stable-video-diffusion-img2vid-xt-1-1/commit/e2fe0c40fbc1f3dda1c262b4c7d5487cda6414c9", 646 | "primary": false 647 | } 648 | ], 649 | "images": [ 650 | { 651 | "url": "https://msdn.miaoshouai.com/msai/kt/ez/9900922.png" 652 | } 653 | ] 654 | } 655 | ] 656 | } 657 | ] -------------------------------------------------------------------------------- /configs/model_hash.json: -------------------------------------------------------------------------------- 1 | { 2 | "elldrethsVividMix_v20VividEr.safetensors [0f7f264114]": "0f7f264114", 3 | "fkingScifiV2_r41958.safetensors [d6a44b9b90]": "d6a44b9b90", 4 | "furtasticv11_furtasticv11.safetensors [8708576421]": "8708576421", 5 | "futagen_2.safetensors [08946cce7d]": "08946cce7d", 6 | "galaxytimemachinesGTM_v1.safetensors [e406a20c1b]": "e406a20c1b", 7 | "Grapefruit.safetensors [4fc8d3739f]": "4fc8d3739f", 8 | "grapeGrapefruitHenta_grapefruitV11.safetensors [4a6e5cd1c8]": "4a6e5cd1c8", 9 | "GrapeLikeDreamFruit.ckpt [c9278e23a7]": "c9278e23a7", 10 | "gta5ArtworkDiffusion_v1.ckpt [607aa02fb8]": "607aa02fb8", 11 | "hAS3Dkx10B_3Dkx10B.safetensors [1d45c7c094]": "1d45c7c094", 12 | "HAs_3DKX 1.1.ckpt [998f6b580e]": "998f6b580e", 13 | "hasdx_hasedsdx.safetensors [fafc72c6fd]": "fafc72c6fd", 14 | "hassanblend1512And_hassanblend1512.safetensors [f05dd9e62f]": "f05dd9e62f", 15 | "hassanBlendAllVersio_hassanBlend14.safetensors [b08fdba169]": "b08fdba169", 16 | "Healys_Anime_Blend.ckpt [8416edf88c]": "8416edf88c", 17 | "healySAnimeBlend_17.ckpt [8416edf88c]": "8416edf88c", 18 | "homoerotic_v2.safetensors [b656369cf7]": "b656369cf7", 19 | "Inkpunk-Diffusion-v2.ckpt [2182245415]": "2182245415", 20 | "instruct-pix2pix-00-22000.safetensors [fbc31a67aa]": "fbc31a67aa", 21 | "jaksCreepyCritter_sd21768px.ckpt [67d399388b]": "67d399388b", 22 | "jhSSamdoesarts_v5.ckpt [dfba164825]": "dfba164825", 23 | "kenshi_00.safetensors [8c19d5c981]": "8c19d5c981", 24 | "knollingcase_v1.ckpt [cf836e65a7]": "cf836e65a7", 25 | "kotosAbyssproto_v10.safetensors [35d51ba12c]": "35d51ba12c", 26 | "ligneClaireAnime_v1.safetensors [672977e447]": "672977e447", 27 | "majorXs2DPOVModel_2dpov11.ckpt [83f9dcde52]": "83f9dcde52", 28 | "mandarine_3.ckpt [7a134798ee]": "7a134798ee", 29 | "mixProV3_v3.safetensors [b6928134bb]": "b6928134bb", 30 | "modernDisney_v1.ckpt [8067368533]": "8067368533", 31 | "moistmix_v2.safetensors [6514f58b5e]": "6514f58b5e", 32 | "openjourney-v2.ckpt [2fbe5ba6e2]": "2fbe5ba6e2", 33 | "openjourneyAka_v1.ckpt [5d5ad06cc2]": "5d5ad06cc2", 34 | "owlerartStyle_v2.safetensors [a31fe6f791]": "a31fe6f791", 35 | "pastelMixStylizedAnime_pastelMixPrunedFP16.safetensors [d01a68ae76]": "d01a68ae76", 36 | "pfg_111Safetensors.safetensors [ca42a7a009]": "ca42a7a009", 37 | "princessZeldaLora_v1.safetensors [53d6abf3cb]": "53d6abf3cb", 38 | "protogenV22Anime_22.safetensors [1254103966]": "1254103966", 39 | "protogenX34Photoreal_1.safetensors [44f90a0972]": "44f90a0972", 40 | "protogenX34Photorealism_1.safetensors [44f90a0972]": "44f90a0972", 41 | "protogenX58RebuiltSc_10.safetensors [6a21b428a3]": "6a21b428a3", 42 | "protogenX58RebuiltScifi_10.safetensors [6a21b428a3]": "6a21b428a3", 43 | "purepornplusMerge_purepornplus10.ckpt [40c6475ecb]": "40c6475ecb", 44 | "qgo10a_qgo10a.safetensors [7dd744682a]": "7dd744682a", 45 | "ratnikamix_2.safetensors [b6a8298a89]": "b6a8298a89", 46 | "realeldenapocalypse_Analogsexknoll.safetensors [7c7dfbd636]": "7c7dfbd636", 47 | "realisticVisionV13_v12.safetensors [8194f84cdc]": "8194f84cdc", 48 | "redshiftDiffusion_v1.ckpt [ed8c2ee432]": "ed8c2ee432", 49 | "roboeticsMix_rmix01Ckpt.ckpt [a7bd5ab091]": "a7bd5ab091", 50 | "RPG.ckpt [234bfa6e72]": "234bfa6e72", 51 | "s1dlxbrew_02.safetensors [1bf13ffc5d]": "1bf13ffc5d", 52 | "schoolAnime_schoolAnime.safetensors [36b0e74c02]": "36b0e74c02", 53 | "schoolmax25d_11.ckpt [0ce764ebd5]": "0ce764ebd5", 54 | "sd-v1-4.ckpt [fe4efff1e1]": "fe4efff1e1", 55 | "sd-v1-5-inpainting.ckpt [c6bbc15e32]": "c6bbc15e32", 56 | "shadyArtOFFICIAL_shadyArt1.safetensors [8f0cb2925d]": "8f0cb2925d", 57 | "spybgsToolkitFor_v40YoutubeChannel.ckpt [f277c5bba1]": "f277c5bba1", 58 | "StablyDiffuseds_Aesthetic_Mix.ckpt [03df69045a]": "03df69045a", 59 | "stablydiffusedsWild_3.safetensors [11a67baf56]": "11a67baf56", 60 | "superheroDiffusion_v1.ckpt [cac0a972cf]": "cac0a972cf", 61 | "surugaModel_suruga12K.ckpt [7846746c94]": "7846746c94", 62 | "synthwavepunk_v2.ckpt [dc4c67171e]": "dc4c67171e", 63 | "theAllysMix_v10Safetensors.safetensors [a18773a6bc]": "a18773a6bc", 64 | "theallysMixIIChurned_v10.safetensors [b000c45ea5]": "b000c45ea5", 65 | "uberRealisticPornMerge_urpmv12.safetensors [fcfaf106f2]": "fcfaf106f2", 66 | "unstableinkdream_v6.safetensors [d855c1d2ba]": "d855c1d2ba", 67 | "v1-5-pruned.ckpt [e1441589a6]": "e1441589a6", 68 | "v2-1_768-nonema-pruned.ckpt [4711ff4dd2]": "4711ff4dd2", 69 | "wd-v1-3-full.ckpt [23ba8d0411]": "23ba8d0411", 70 | "wlop_1.ckpt [b8cff3e33f]": "b8cff3e33f", 71 | "yiffymix_.safetensors [d6deb44e68]": "d6deb44e68", 72 | "\u5565\u73a9\u610f\u5b8c\u728a\u5b50F16.safetensors [dda725ba6e]": "dda725ba6e", 73 | "v1-5-pruned-emaonly.ckpt [cc6cb27103]": "cc6cb27103", 74 | "deliberate_v2.safetensors [9aba26abdf]": "9aba26abdf", 75 | "deliberate_v2.safetensors [38108d96f8]": "38108d96f8", 76 | "realisticVisionV20_v20.ckpt [eaf3051d80]": "eaf3051d80", 77 | "deliberate_v2.safetensors [d75347f3f0]": "d75347f3f0", 78 | "deliberate_v2.safetensors [b500405cde]": "b500405cde", 79 | "deliberate_v2.safetensors [493484f455]": "493484f455", 80 | "deliberate_v2.safetensors [ade8822b56]": "ade8822b56", 81 | "realisticVisionV20_v20.ckpt [d11a449e0f]": "d11a449e0f", 82 | "2dn_1.safetensors [83569a04f4]": "83569a04f4", 83 | "21SDModernBuildings_midjourneyBuildings.ckpt [14e1e8d692]": "14e1e8d692", 84 | "AbyssOrangeMix2_hard.safetensors [0fc198c490]": "0fc198c490", 85 | "adobisRealFlexibleMix_v2.safetensors [9e8a2c7a5d]": "9e8a2c7a5d", 86 | "allInOnePixelModel_v1.ckpt [d7fb6396ab]": "d7fb6396ab", 87 | "aloeverasSimpmaker3K_simpmaker3K1.ckpt [2cae9bc4e0]": "2cae9bc4e0", 88 | "analogDiffusion_10Safetensors.safetensors [51f6fff508]": "51f6fff508", 89 | "analogDream3D_10.ckpt [4575363662]": "4575363662", 90 | "anovel_speed.ckpt [89d59c3dde]": "89d59c3dde", 91 | "anygenV37_anygenv37.ckpt [815c974757]": "815c974757", 92 | "Anything-V3.0-pruned.ckpt [543bcbc212]": "543bcbc212", 93 | "anytwam11Mixedmodel_anytwam11.safetensors [e9cb790ad3]": "e9cb790ad3", 94 | "aoaokoPVCStyleModel_pvcAOAOKO.safetensors [cf64507cef]": "cf64507cef", 95 | "Arcane_Diffusion.ckpt [7dd0e6760f]": "7dd0e6760f", 96 | "arcaneDiffusion_v3.ckpt [7dd0e6760f]": "7dd0e6760f", 97 | "artErosAerosATribute_aerosNovae.safetensors [70346f7a1e]": "70346f7a1e", 98 | "aToZovyaRPGArtistsTools15_sd15V1.safetensors [e28b2e61fb]": "e28b2e61fb", 99 | "ayonimix_V2.safetensors [7076f76b9d]": "7076f76b9d", 100 | "babes_11.safetensors [79886b6484]": "79886b6484", 101 | "Basil_mix_fixed.safetensors [0ff127093f]": "0ff127093f", 102 | "biggerGirlsModel_biggergirlsV2.ckpt [f3c16c83de]": "f3c16c83de", 103 | "cheeseDaddys_30.safetensors [4176564bea]": "4176564bea", 104 | "chillout_west_mix.safetensors [b93a715b47]": "b93a715b47", 105 | "chilloutmix_inpainting.inpainting.safetensors [ec749031ba]": "ec749031ba", 106 | "chromaticcreamv1_chromaticcreamV1.ckpt [c979d60b4a]": "c979d60b4a", 107 | "ChromaV5 (2.0).ckpt [e8004ba771]": "e8004ba771", 108 | "clarity_14.safetensors [dc027dbbf9]": "dc027dbbf9", 109 | "classicNegative1521_classicNegative768px.ckpt [2106fd3b8c]": "2106fd3b8c", 110 | "Colorwater_v4.safetensors [1b175706ff]": "1b175706ff", 111 | "comicBabes_v1.safetensors [9211801e30]": "9211801e30", 112 | "comicDiffusion_v2.ckpt [d3c225cbc2]": "d3c225cbc2", 113 | "corneos7thHeavenMix_100.safetensors [d289dfa4ed]": "d289dfa4ed", 114 | "corneos7thHeavenMix_v1.safetensors [d289dfa4ed]": "d289dfa4ed", 115 | "Counterfeit-V2.5_pruned.safetensors [a074b8864e]": "a074b8864e", 116 | "CounterfeitV20_20.ckpt [8838e0d1fb]": "8838e0d1fb", 117 | "cuteRichstyle15_cuteRichstyle.ckpt [24bc802fc5]": "24bc802fc5", 118 | "cyberrealistic_v13.safetensors [23e4391b10]": "23e4391b10", 119 | "cynthiaModela_v10.safetensors [c83fe90aa3]": "c83fe90aa3", 120 | "deliberate_v11-inpainting.inpainting.safetensors [0d0792451f]": "0d0792451f", 121 | "deliberate_v11.safetensors [d8691b4d16]": "d8691b4d16", 122 | "dgspitzerArt_dgspitzerArtDiffusion.safetensors [8141c5f18e]": "8141c5f18e", 123 | "diGiMDSToriyamaModel_toriyamaV1.ckpt [33c84ed0b3]": "33c84ed0b3", 124 | "dreamlikeDiffusion10_10.ckpt [0aecbcfa2c]": "0aecbcfa2c", 125 | "dreamlikePhotoreal20_dreamlikePhotoreal20.safetensors [92970aa785]": "92970aa785", 126 | "dreamshaper_332BakedVaeClipFix.safetensors [13dfc9921f]": "13dfc9921f", 127 | "DucHaitenAIart.safetensors [55fed17365]": "55fed17365", 128 | "duchaitenaiart_V20.safetensors [55fed17365]": "55fed17365", 129 | "dvarchMultiPrompt_dvarchExterior.ckpt [1ecb6b4e9c]": "1ecb6b4e9c", 130 | "Elldreths_OG_4060_mix.ckpt [707ee16b5b]": "707ee16b5b", 131 | "Elldreths_Retro_Mix.ckpt [57285e7bd5]": "57285e7bd5", 132 | "ElldrethsImaginationMix.ckpt [64224f0599]": "64224f0599", 133 | "elldrethsLucidMix_v10.safetensors [67abd65708]": "67abd65708", 134 | "elldrethSOg4060Mix_v10.ckpt [707ee16b5b]": "707ee16b5b", 135 | "elldrethsRetroMix_v10.safetensors [57285e7bd5]": "57285e7bd5", 136 | "icomix_V02Pruned.safetensors [76b00ee812]": "76b00ee812", 137 | "inkpunkDiffusion_v2-inpainting-fp16-no-ema.safetensors [0c666f32e8]": "0c666f32e8", 138 | "inkpunkDiffusion_v2-inpainting.safetensors [1bd4ce2c12]": "1bd4ce2c12", 139 | "inkpunkDiffusion_v2.ckpt [2182245415]": "2182245415", 140 | "meinamix_meinaV8.safetensors [30953ab0de]": "30953ab0de", 141 | "mimi_V3.safetensors [88f31afc3d]": "88f31afc3d", 142 | "mini_town_v1.safetensors [ed94110348]": "ed94110348", 143 | "pixhell_v20.safetensors [333825e530]": "333825e530", 144 | "projectUnrealEngine5_projectUnrealEngine5B.ckpt [748ff6eab2]": "748ff6eab2", 145 | "pyraMythraPneuma_50Epochs.safetensors [fc9d093614]": "fc9d093614", 146 | "realisticVisionV20_v20.safetensors [c0d1994c73]": "c0d1994c73", 147 | "realLifeTest_realLifeTest.ckpt [d6347268cc]": "d6347268cc", 148 | "revAnimated_v11.safetensors [d725be5d18]": "d725be5d18", 149 | "samdoesartsUltmerge_v1.ckpt [0df9497424]": "0df9497424", 150 | "shanshui_v0-000002.safetensors [18cbf1953b]": "18cbf1953b", 151 | "tmndMix_tmndMixPlus.safetensors [7d19f9efad]": "7d19f9efad", 152 | "unstableinkdream_v73.safetensors [f036d7b40b]": "f036d7b40b", 153 | "unstablephotorealv5_05.ckpt [6ef4ed10a6]": "6ef4ed10a6", 154 | "yinmu.safetensors [c1b28e2883]": "c1b28e2883", 155 | "protogenX58RebuiltScifi_10.ckpt [e0de8aae3e]": "e0de8aae3e", 156 | "marvelWhatIf_v2.ckpt [2e051600d4]": "2e051600d4", 157 | "meinamix_meinaV9.safetensors [eac6c08a19]": "eac6c08a19", 158 | "mixProV4_v4.safetensors [61e23e57ea]": "61e23e57ea", 159 | "revAnimated_v122.safetensors [4199bcdd14]": "4199bcdd14", 160 | "wood_tile-000001.safetensors [7fd29f7f80]": "7fd29f7f80", 161 | "wood_tile-000002.safetensors [058be7927f]": "058be7927f", 162 | "wood_tile-000003.safetensors [c379ec75dd]": "c379ec75dd", 163 | "wood_tile-000004.safetensors [4256b2614b]": "4256b2614b", 164 | "wood_tile-000005.safetensors [e466a6d0d1]": "e466a6d0d1", 165 | "wood_tile-000006.safetensors [a78cb62c5a]": "a78cb62c5a", 166 | "wood_tile-000007.safetensors [046910b320]": "046910b320", 167 | "wood_tile-000008.safetensors [828af323cb]": "828af323cb", 168 | "wood_tile-000009.safetensors [4b2844ebad]": "4b2844ebad", 169 | "wood_tile.safetensors [95e89ae856]": "95e89ae856", 170 | "CounterfeitV25_25.safetensors [a074b8864e]": "a074b8864e", 171 | "corneo_bound_missionary.pt": null, 172 | "corneo_mercy.pt": null, 173 | "emmsto.pt": null, 174 | "incaseStyle_incaseAnythingV3.pt": null, 175 | "pureerosface_v1.pt": null, 176 | "RSC.pt": null, 177 | "Toru8pWavenChibi_wavenchibiV10b.pt": null, 178 | "mini_town_v1-state\\scaler.pt": null, 179 | "shanshui_v0-000002-state\\scaler.pt": null, 180 | "wood_tile-000001-state\\scaler.pt": null, 181 | "wood_tile-000002-state\\scaler.pt": null, 182 | "wood_tile-000003-state\\scaler.pt": null, 183 | "wood_tile-000004-state\\scaler.pt": null, 184 | "wood_tile-000005-state\\scaler.pt": null, 185 | "wood_tile-000006-state\\scaler.pt": null, 186 | "wood_tile-000007-state\\scaler.pt": null, 187 | "wood_tile-000008-state\\scaler.pt": null, 188 | "wood_tile-000009-state\\scaler.pt": null, 189 | "wood_tile-state\\scaler.pt": null, 190 | "2BLoRA YorHA edition.ckpt": null, 191 | "Addams-000001.safetensors": null, 192 | "Addams-000002.safetensors": null, 193 | "Addams-000003.safetensors": null, 194 | "Addams-000004.safetensors": null, 195 | "Addams.safetensors": null, 196 | "aliceNikke_v30.safetensors": null, 197 | "android18DragonBall_one.safetensors": null, 198 | "animeLineartMangaLike_v30MangaLike (1).safetensors": null, 199 | "arknightsTexasThe_v10.safetensors": null, 200 | "atomicHeartRobotMaid_001.safetensors": null, 201 | "bigHeadDoll_v01.safetensors": null, 202 | "blindbox_V1Mix.safetensors": null, 203 | "bruceLee_bruceLeeV10.safetensors": null, 204 | "childrensDrawingLora_v10.safetensors": null, 205 | "ChineseInkPainting_v10.safetensors": null, 206 | "chunLiStreetFighter_v10.safetensors": null, 207 | "emery_rose-000001.safetensors": null, 208 | "emery_rose-000002.safetensors": null, 209 | "emery_rose.safetensors": null, 210 | "gachaSplashLORA_gachaSplashFarShot.safetensors": null, 211 | "gta5ArtworkDiffusion_v1.safetensors": null, 212 | "gundamRX782OutfitStyle_v10.safetensors": null, 213 | "gundamRX78_v2.safetensors": null, 214 | "handpaintedRPGIcons_v1.safetensors": null, 215 | "hanfu_v28.safetensors": null, 216 | "harunoSakuraNaruto_lykonV1.safetensors": null, 217 | "HuluwaGourdMan_v11.safetensors": null, 218 | "hyperbreasts.ckpt": null, 219 | "ink_spark-000002.safetensors": null, 220 | "ink_spark-000004.safetensors": null, 221 | "ink_spark-000006.safetensors": null, 222 | "ink_spark-000008.safetensors": null, 223 | "ink_spark.safetensors": null, 224 | "japaneseDollLikeness_v10.safetensors": null, 225 | "jimLeeDCComicsMarvel_offset.safetensors": null, 226 | "koreanDollLikeness_v15.safetensors": null, 227 | "Leslie_Cheung.safetensors": null, 228 | "Lisa - LoRA Collection of Trauters.ckpt": null, 229 | "liuyifei_10.safetensors": null, 230 | "LORAFlatColor_flatColor.pt": null, 231 | "makimaChainsawMan_offset.safetensors": null, 232 | "mini town-000002.safetensors": null, 233 | "mini town-000004.safetensors": null, 234 | "mini town-000006.safetensors": null, 235 | "mini town-000008.safetensors": null, 236 | "mini town-000010.safetensors": null, 237 | "mini town-000012.safetensors": null, 238 | "mini town-000014.safetensors": null, 239 | "mini town-000016.safetensors": null, 240 | "mini town-000018.safetensors": null, 241 | "mini town.safetensors": null, 242 | "mini_town-000001.safetensors": null, 243 | "mini_town-000002.safetensors": null, 244 | "mini_town-000003.safetensors": null, 245 | "mini_town-000004.safetensors": null, 246 | "mini_town.safetensors": null, 247 | "Moxin_10.safetensors": null, 248 | "Moxin_1010.safetensors": null, 249 | "murataYusukeOnePunchMan_1.safetensors": null, 250 | "myHeroAcademiaHorikoshi_v1.safetensors": null, 251 | "onePieceWanoSagaStyle_20.safetensors": null, 252 | "oyamaMahiro_oyamaMahiro2.safetensors": null, 253 | "realisticAerith_v1.safetensors": null, 254 | "samdoesartsSamYang_offset.safetensors": null, 255 | "samdoesartsSamYang_offsetRightFilesize.safetensors": null, 256 | "shirtTugPoseLORA_shirtTug.safetensors": null, 257 | "slumdunk-000002.safetensors": null, 258 | "slumdunk-000004.safetensors": null, 259 | "slumdunk-000006.safetensors": null, 260 | "slumdunk-000008.safetensors": null, 261 | "slumdunk.safetensors": null, 262 | "studioGhibliStyle_offset.safetensors": null, 263 | "taiwanDollLikeness_v10.safetensors": null, 264 | "tifaMeenow_tifaV2.safetensors": null, 265 | "urbanSamuraiClothing_urbansamuraiV03.safetensors": null, 266 | "wanniya-000003.safetensors": null, 267 | "xiaofu-000004.safetensors": null, 268 | "yaeMikoRealistic_yaemikoMixed.safetensors": null, 269 | "yojiShinkawaStyle_offset.safetensors": null, 270 | "Zhang_Songwen.safetensors": null, 271 | "\u753b\u98ce \u9ed1\u767d \u6d82\u9e26 \u4f5coskarsson.safetensors": null, 272 | "\u771f\u4eba \u6768\u8d85\u8d8a \u4f5cmpmp.safetensors": null, 273 | "\u78a7\u84dd\u5e7b\u60f3\u5154\u795e\u5c06makura.safetensors": null, 274 | "\u7acb\u7ed8\u62c6\u5206lion\u4f18\u5316\u5668 tachie separation.safetensors": null, 275 | "scaler.pt": null, 276 | "AnimeScreenCap.pt": null, 277 | "CGI_Animation-185.pt": null, 278 | "corneo_anal.pt": null, 279 | "CounterfeitV25_25.safetensors": null, 280 | "lyriel_v15.safetensors": null, 281 | "azl_v1-000002.safetensors": null, 282 | "azl_v1-000004.safetensors": null, 283 | "azl_v1-000006.safetensors": null, 284 | "azl_v1-000008.safetensors": null, 285 | "azl_v1-000010.safetensors": null, 286 | "azl_v1-000012.safetensors": null, 287 | "azl_v1-000014.safetensors": null, 288 | "azl_v1-000016.safetensors": null, 289 | "azl_v1-000018.safetensors": null, 290 | "azl_v1.safetensors": null, 291 | "Asuka.safetensors": null, 292 | "wood_tile-long.safetensors": null, 293 | "wood_tile-Square.safetensors": null, 294 | "anthro.pt": null, 295 | "bad-artist.pt": null, 296 | "bad-hands-5.pt": null, 297 | "bad_prompt.pt": null, 298 | "bad_prompt_version2.pt": null, 299 | "bad_quality.pt": null, 300 | "bukkakAI.pt": null, 301 | "CandyPunk.pt": null, 302 | "CharTurner.pt": null, 303 | "CutAway-420.pt": null, 304 | "CutAway-460.pt": null, 305 | "CutAway-500.pt": null, 306 | "ely_neg_prompt.pt": null, 307 | "evil_neg_prompt3.pt": null, 308 | "InkPunk768.pt": null, 309 | "kc32-v4-5000.pt": null, 310 | "midjourney.pt": null, 311 | "Remix.pt": null, 312 | "schizo_neg_prompt.pt": null, 313 | "SDA768.pt": null, 314 | "Style-Empire.pt": null, 315 | "VikingPunk.pt": null, 316 | "webtoon.pt": null, 317 | "ycy_zzj-1000-1050.pt": null, 318 | "ycy_zzj-1000-1100.pt": null, 319 | "ycy_zzj-1000-1150.pt": null, 320 | "ycy_zzj-1000-1200.pt": null, 321 | "ycy_zzj-1000-1250.pt": null, 322 | "ycy_zzj-1000-1300.pt": null, 323 | "ycy_zzj-1000-1350.pt": null, 324 | "ycy_zzj-1000-1400.pt": null, 325 | "ycy_zzj-1000-1450.pt": null, 326 | "ycy_zzj-1000-1500.pt": null, 327 | "ycy_zzj-1000-1550.pt": null, 328 | "ycy_zzj-1000-1600.pt": null, 329 | "ycy_zzj-1000-1650.pt": null, 330 | "ycy_zzj-1000-1700.pt": null, 331 | "ycy_zzj-1000-1750.pt": null, 332 | "ycy_zzj-1000-1800.pt": null, 333 | "ycy_zzj-1000-1850.pt": null, 334 | "ycy_zzj-1000-1900.pt": null, 335 | "ycy_zzj-1000-1950.pt": null, 336 | "ycy_zzj-1000.pt": null, 337 | "ycy_zzj-2000.pt": null, 338 | "ycy_zzj.pt": null, 339 | "facebombmix_v1Bakedvae.safetensors": null, 340 | "mistoonSapphire_v10.safetensors": null, 341 | "LowRA.safetensors": null, 342 | "21SDModernBuildings_midjourneyBuildings.ckpt": null, 343 | "2dn_1.safetensors": null, 344 | "AbyssOrangeMix2_hard.safetensors": null, 345 | "adobisRealFlexibleMix_v2.safetensors": null, 346 | "allInOnePixelModel_v1.ckpt": null, 347 | "aloeverasSimpmaker3K_simpmaker3K1.ckpt": null, 348 | "analogDiffusion_10Safetensors.safetensors": null, 349 | "analogDream3D_10.ckpt": null, 350 | "anovel_speed.ckpt": null, 351 | "anygenV37_anygenv37.ckpt": null, 352 | "Anything-V3.0-pruned.ckpt": null, 353 | "anytwam11Mixedmodel_anytwam11.safetensors": null, 354 | "aoaokoPVCStyleModel_pvcAOAOKO.safetensors": null, 355 | "arcaneDiffusion_v3.ckpt": null, 356 | "Arcane_Diffusion.ckpt": null, 357 | "artErosAerosATribute_aerosNovae.safetensors": null, 358 | "aToZovyaRPGArtistsTools15_sd15V1.safetensors": null, 359 | "ayonimix_V2.safetensors": null, 360 | "babes_11.safetensors": null, 361 | "Basil_mix_fixed.safetensors": null, 362 | "biggerGirlsModel_biggergirlsV2.ckpt": null, 363 | "cheeseDaddys_30.safetensors": null, 364 | "chilloutmix_inpainting.inpainting.safetensors": null, 365 | "chilloutmix_NiPrunedFp32Fix.safetensors": null, 366 | "chillout_west_mix.safetensors": null, 367 | "chromaticcreamv1_chromaticcreamV1.ckpt": null, 368 | "ChromaV5 (2.0).ckpt": null, 369 | "clarity_14.safetensors": null, 370 | "classicNegative1521_classicNegative768px.ckpt": null, 371 | "Colorwater_v4.safetensors": null, 372 | "comicBabes_v1.safetensors": null, 373 | "comicDiffusion_v2.ckpt": null, 374 | "corneos7thHeavenMix_100.safetensors": null, 375 | "corneos7thHeavenMix_v1.safetensors": null, 376 | "Counterfeit-V2.5_pruned.safetensors": null, 377 | "CounterfeitV20_20.ckpt": null, 378 | "cuteRichstyle15_cuteRichstyle.ckpt": null, 379 | "cyberrealistic_v13.safetensors": null, 380 | "cynthiaModela_v10.safetensors": null, 381 | "deliberate_v11-inpainting.inpainting.safetensors": null, 382 | "deliberate_v11.safetensors": null, 383 | "dgspitzerArt_dgspitzerArtDiffusion.safetensors": null, 384 | "diGiMDSToriyamaModel_toriyamaV1.ckpt": null, 385 | "dreamlikeDiffusion10_10.ckpt": null, 386 | "dreamlikePhotoreal20_dreamlikePhotoreal20.safetensors": null, 387 | "dreamshaper_332BakedVaeClipFix.safetensors": null, 388 | "DucHaitenAIart.safetensors": null, 389 | "duchaitenaiart_V20.safetensors": null, 390 | "dvarchMultiPrompt_dvarchExterior.ckpt": null, 391 | "edgeOfRealism_eorV20Fp16BakedVAE.safetensors": null, 392 | "ElldrethsImaginationMix.ckpt": null, 393 | "elldrethsLucidMix_v10.safetensors": null, 394 | "elldrethSOg4060Mix_v10.ckpt": null, 395 | "elldrethsRetroMix_v10.safetensors": null, 396 | "elldrethsVividMix_v20VividEr.safetensors": null, 397 | "Elldreths_OG_4060_mix.ckpt": null, 398 | "Elldreths_Retro_Mix.ckpt": null, 399 | "fkingScifiV2_r41958.safetensors": null, 400 | "furtasticv11_furtasticv11.safetensors": null, 401 | "futagen_2.safetensors": null, 402 | "galaxytimemachinesGTM_v1.safetensors": null, 403 | "Grapefruit.safetensors": null, 404 | "grapeGrapefruitHenta_grapefruitV11.safetensors": null, 405 | "GrapeLikeDreamFruit.ckpt": null, 406 | "gta5ArtworkDiffusion_v1.ckpt": null, 407 | "hAS3Dkx10B_3Dkx10B.safetensors": null, 408 | "hasdx_hasedsdx.safetensors": null, 409 | "hassanblend1512And_hassanblend1512.safetensors": null, 410 | "hassanBlendAllVersio_hassanBlend14.safetensors": null, 411 | "HAs_3DKX 1.1.ckpt": null, 412 | "healySAnimeBlend_17.ckpt": null, 413 | "Healys_Anime_Blend.ckpt": null, 414 | "homoerotic_v2.safetensors": null, 415 | "icomix_V02Pruned.safetensors": null, 416 | "Inkpunk-Diffusion-v2.ckpt": null, 417 | "inkpunkDiffusion_v2-inpainting-fp16-no-ema.safetensors": null, 418 | "inkpunkDiffusion_v2-inpainting.safetensors": null, 419 | "inkpunkDiffusion_v2.ckpt": null, 420 | "instruct-pix2pix-00-22000.safetensors": null, 421 | "jaksCreepyCritter_sd21768px.ckpt": null, 422 | "jhSSamdoesarts_v5.ckpt": null, 423 | "kenshi_00.safetensors": null, 424 | "knollingcase_v1.ckpt": null, 425 | "kotosAbyssproto_v10.safetensors": null, 426 | "ligneClaireAnime_v1.safetensors": null, 427 | "majorXs2DPOVModel_2dpov11.ckpt": null, 428 | "mandarine_3.ckpt": null, 429 | "marvelWhatIf_v2.ckpt": null, 430 | "meinamix_meinaV8.safetensors": null, 431 | "meinamix_meinaV9.safetensors": null, 432 | "mimi_V3.safetensors": null, 433 | "mini_town_v1.safetensors": null, 434 | "mixProV3_v3.safetensors": null, 435 | "mixProV4_v4.safetensors": null, 436 | "modernDisney_v1.ckpt": null, 437 | "moistmix_v2.safetensors": null, 438 | "openjourney-v2.ckpt": null, 439 | "openjourneyAka_v1.ckpt": null, 440 | "owlerartStyle_v2.safetensors": null, 441 | "pastelMixStylizedAnime_pastelMixPrunedFP16.safetensors": null, 442 | "pfg_111Safetensors.safetensors": null, 443 | "pixhell_v20.safetensors": null, 444 | "princessZeldaLora_v1.safetensors": null, 445 | "projectUnrealEngine5_projectUnrealEngine5B.ckpt": null, 446 | "protogenV22Anime_22.safetensors": null, 447 | "protogenX34Photorealism_1.safetensors": null, 448 | "protogenX34Photoreal_1.safetensors": null, 449 | "protogenX58RebuiltScifi_10.ckpt": null, 450 | "protogenX58RebuiltScifi_10.safetensors": null, 451 | "protogenX58RebuiltSc_10.safetensors": null, 452 | "purepornplusMerge_purepornplus10.ckpt": null, 453 | "pyraMythraPneuma_50Epochs.safetensors": null, 454 | "qgo10a_qgo10a.safetensors": null, 455 | "ratnikamix_2.safetensors": null, 456 | "realeldenapocalypse_Analogsexknoll.safetensors": null, 457 | "realisticVisionV13_v12.safetensors": null, 458 | "realisticVisionV20_v20.safetensors": null, 459 | "realLifeTest_realLifeTest.ckpt": null, 460 | "redshiftDiffusion_v1.ckpt": null, 461 | "revAnimated_v11.safetensors": null, 462 | "revAnimated_v122.safetensors": null, 463 | "roboeticsMix_rmix01Ckpt.ckpt": null, 464 | "RPG.ckpt": null, 465 | "s1dlxbrew_02.safetensors": null, 466 | "samdoesartsUltmerge_v1.ckpt": null, 467 | "schoolAnime_schoolAnime.safetensors": null, 468 | "schoolmax25d_11.ckpt": null, 469 | "sd-v1-4.ckpt": null, 470 | "sd-v1-5-inpainting.ckpt": null, 471 | "shadyArtOFFICIAL_shadyArt1.safetensors": null, 472 | "shanshui_v0-000002.safetensors": null, 473 | "spybgsToolkitFor_v40YoutubeChannel.ckpt": null, 474 | "stablydiffusedsWild_3.safetensors": null, 475 | "StablyDiffuseds_Aesthetic_Mix.ckpt": null, 476 | "superheroDiffusion_v1.ckpt": null, 477 | "surugaModel_suruga12K.ckpt": null, 478 | "synthwavepunk_v2.ckpt": null, 479 | "theallysMixIIChurned_v10.safetensors": null, 480 | "theAllysMix_v10Safetensors.safetensors": null, 481 | "tmndMix_tmndMixPlus.safetensors": null, 482 | "toonyou_alpha3.safetensors": null, 483 | "uberRealisticPornMerge_urpmv12.safetensors": null, 484 | "unstableinkdream_v6.safetensors": null, 485 | "unstableinkdream_v73.safetensors": null, 486 | "unstablephotorealv5_05.ckpt": null, 487 | "v1-5-pruned.ckpt": null, 488 | "v2-1_768-nonema-pruned.ckpt": null, 489 | "wd-v1-3-full.ckpt": null, 490 | "wlop_1.ckpt": null, 491 | "yiffymix_.safetensors": null, 492 | "yinmu.safetensors": null, 493 | "\u5565\u73a9\u610f\u5b8c\u728a\u5b50F16.safetensors": null, 494 | "AnimeKiss.safetensors": null, 495 | "gakkou-00008.safetensors": null, 496 | "miniatureWorldStyle_v10.safetensors": null, 497 | "WuMo2.safetensors": null, 498 | "[LoCon] Octans\u516b\u5206\u5100 Style.safetensors": null, 499 | "CounterfeitV30_v30.safetensors": null, 500 | "flat2DAnimerge_v10.safetensors": null, 501 | "miniature_V1.safetensors": null, 502 | "rcnzsDumbMonkey_v10.safetensors": null, 503 | "saucitySauce_ssumdPlus.safetensors": null, 504 | "shanshui_v0.1.safetensors": null, 505 | "vividWatercolors_10.safetensors": null, 506 | "test\\3Guofeng3_v33.safetensors": null, 507 | "test\\schoolAnime_schoolAnime.safetensors": null, 508 | "beautifulRealistic_brav5.safetensors": null, 509 | "80year03.safetensors": null, 510 | "9khp2znuogB.safetensors": null, 511 | "battle_uniform-v1.1-000001.safetensors": null, 512 | "battle_uniform-v1.1-000002.safetensors": null, 513 | "battle_uniform-v1.1-000003.safetensors": null, 514 | "battle_uniform-v1.1-000004.safetensors": null, 515 | "battle_uniform-v1.1-000005.safetensors": null, 516 | "battle_uniform-v1.1-000006.safetensors": null, 517 | "battle_uniform-v1.1-000007.safetensors": null, 518 | "battle_uniform-v1.1-000008.safetensors": null, 519 | "battle_uniform-v1.1-000009.safetensors": null, 520 | "battle_uniform-v1.1.safetensors": null, 521 | "battle_uniform-v1.2-000001.safetensors": null, 522 | "battle_uniform-v1.2-000002.safetensors": null, 523 | "battle_uniform-v1.2-000003.safetensors": null, 524 | "battle_uniform-v1.2-000004.safetensors": null, 525 | "battle_uniform-v1.2-000005.safetensors": null, 526 | "battle_uniform-v1.2-000006.safetensors": null, 527 | "battle_uniform-v1.2-000007.safetensors": null, 528 | "battle_uniform-v1.2-000008.safetensors": null, 529 | "battle_uniform-v1.2-000009.safetensors": null, 530 | "battle_uniform-v1.2-000010.safetensors": null, 531 | "battle_uniform-v1.2-000011.safetensors": null, 532 | "battle_uniform-v1.2-000012.safetensors": null, 533 | "battle_uniform-v1.2-000013.safetensors": null, 534 | "battle_uniform-v1.2-000014.safetensors": null, 535 | "battle_uniform-v1.2-000015.safetensors": null, 536 | "battle_uniform-v1.2-000016.safetensors": null, 537 | "battle_uniform-v1.2-000017.safetensors": null, 538 | "battle_uniform-v1.2-000018.safetensors": null, 539 | "battle_uniform-v1.2-000019.safetensors": null, 540 | "battle_uniform-v1.2-000020.safetensors": null, 541 | "battle_uniform-v1.2-000021.safetensors": null, 542 | "battle_uniform-v1.2-000022.safetensors": null, 543 | "battle_uniform-v1.2-000023.safetensors": null, 544 | "battle_uniform-v1.2-000024.safetensors": null, 545 | "battle_uniform-v1.2-000025.safetensors": null, 546 | "battle_uniform-v1.2-000026.safetensors": null, 547 | "battle_uniform-v1.2-000027.safetensors": null, 548 | "battle_uniform-v1.2-000028.safetensors": null, 549 | "battle_uniform-v1.2-000029.safetensors": null, 550 | "battle_uniform-v1.2-000030.safetensors": null, 551 | "battle_uniform-v1.2-000031.safetensors": null, 552 | "battle_uniform-v1.2-000032.safetensors": null, 553 | "battle_uniform-v1.2-000033.safetensors": null, 554 | "battle_uniform-v1.2-000034.safetensors": null, 555 | "battle_uniform-v1.2-000035.safetensors": null, 556 | "battle_uniform-v1.2-000036.safetensors": null, 557 | "battle_uniform-v1.2-000037.safetensors": null, 558 | "battle_uniform-v1.2-000038.safetensors": null, 559 | "battle_uniform-v1.2-000039.safetensors": null, 560 | "battle_uniform-v1.2-000040.safetensors": null, 561 | "battle_uniform-v1.2-000041.safetensors": null, 562 | "battle_uniform-v1.2-000042.safetensors": null, 563 | "battle_uniform-v1.2-000043.safetensors": null, 564 | "battle_uniform-v1.2-000044.safetensors": null, 565 | "battle_uniform-v1.2-000045.safetensors": null, 566 | "battle_uniform-v1.2-000046.safetensors": null, 567 | "battle_uniform-v1.2-000047.safetensors": null, 568 | "battle_uniform-v1.2-000048.safetensors": null, 569 | "battle_uniform-v1.2-000049.safetensors": null, 570 | "battle_uniform-v1.2.safetensors": null, 571 | "battle_uniform_v1-000002.safetensors": null, 572 | "battle_uniform_v1-000004.safetensors": null, 573 | "battle_uniform_v1-000006.safetensors": null, 574 | "battle_uniform_v1-000008.safetensors": null, 575 | "battle_uniform_v1-000010.safetensors": null, 576 | "battle_uniform_v1-000012.safetensors": null, 577 | "battle_uniform_v1-000014.safetensors": null, 578 | "battle_uniform_v1-000016.safetensors": null, 579 | "battle_uniform_v1-000018.safetensors": null, 580 | "battle_uniform_v1-000020.safetensors": null, 581 | "battle_uniform_v1-000022.safetensors": null, 582 | "battle_uniform_v1-000024.safetensors": null, 583 | "battle_uniform_v1-000026.safetensors": null, 584 | "battle_uniform_v1-000028.safetensors": null, 585 | "battle_uniform_v1-000030.safetensors": null, 586 | "bookcover_V2_loha-000033.safetensors": null, 587 | "Boxcomple-15.safetensors": null, 588 | "childbookfinv2.safetensors": null, 589 | "ChineseKungFu.safetensors": null, 590 | "ClearVAE_V2.2.safetensors": null, 591 | "Cthulhu_monster.safetensors": null, 592 | "dunhuang_v20.safetensors": null, 593 | "Elegant hanfu ruqun style.safetensors": null, 594 | "Girls in Glass Jars v3.safetensors": null, 595 | "Girls' Frontline-OTs-14[lightning]-V3.safetensors": null, 596 | "hanfu_v30.safetensors": null, 597 | "history_scroll_0.5.safetensors": null, 598 | "howlbgsv3.safetensors": null, 599 | "LAS.safetensors": null, 600 | "Light and Shadow.safetensors": null, 601 | "Lora-Custom-ModelLiXian.safetensors": null, 602 | "lora_CelestialHarmony.safetensors": null, 603 | "mafuyulightmakeup.safetensors": null, 604 | "mafuyuLoraOfFace_origin.safetensors": null, 605 | "mario.safetensors": null, 606 | "miaoLan_165.safetensors": null, 607 | "mini2dtest_V2_loha.safetensors": null, 608 | "MultipleGirlsGroup.safetensors": null, 609 | "nami_final_offset.safetensors": null, 610 | "neowrsk.safetensors": null, 611 | "niba_style_v1.safetensors": null, 612 | "nico_robin_post_timeskip_offset.safetensors": null, 613 | "phoenixMarie.safetensors": null, 614 | "pixel_V1_loha-000024.safetensors": null, 615 | "piying_v0.1-side_view.safetensors": null, 616 | "Pmini_v3.5.18.safetensors": null, 617 | "qy_bookcover_v1.safetensors": null, 618 | "rageMode_v1.safetensors": null, 619 | "shinkai_makoto_offset.safetensors": null, 620 | "SurrealHarmony.safetensors": null, 621 | "toonyou_lora.safetensors": null, 622 | "toonyou_lycoris.safetensors": null, 623 | "WaterMargin_v1.safetensors": null, 624 | "zgf_v2_loha-000030.safetensors": null, 625 | "2dposter_v1_loha-000015.safetensors": null, 626 | "OF_Coconut_Kitty.safetensors": null, 627 | "aZovyaPhotoreal_v2.safetensors": null, 628 | "meinahentai_v4.safetensors": null, 629 | "3DMM_V11.safetensors": null, 630 | "anythingqingmix25D_v10.safetensors": null, 631 | "anythingV3Inpainting_1-inpainting.ckpt": null, 632 | "AnythingV5Ink_v32Ink.safetensors": null, 633 | "couterfeitv30_v30.inpainting.safetensors": null, 634 | "disneyPixarCartoon_v10.safetensors": null, 635 | "dis_V1-000020.safetensors": null, 636 | "ghostmix_v20Bakedvae.safetensors": null, 637 | "guofengrealmix_v10.safetensors": null, 638 | "majicMIX fantasy_v1.0.safetensors": null, 639 | "majicmixRealistic_v4.safetensors": null, 640 | "majicmixRealistic_v6.safetensors": null, 641 | "miaoshouai-anything-v4-pruned.safetensors": null, 642 | "niantu_v1.safetensors": null, 643 | "oukaGufeng_s1.safetensors": null, 644 | "pixarStyleModel_v10.ckpt": null, 645 | "rpg_V4.inpainting.safetensors": null, 646 | "rpg_V4.safetensors": null, 647 | "rpg_v4_2.inpainting.safetensors": null, 648 | "sdxl_base_pruned_no-ema.safetensors": null, 649 | "sdxl_refiner_pruned_no-ema.safetensors": null, 650 | "model_contest_1\\1-DangerAngelSavour10.safetensors-ckpt.safetensors": null, 651 | "model_contest_1\\10-huacai1.0-ckpt.safetensors": null, 652 | "model_contest_1\\11-CmixG-ckpt.safetensors": null, 653 | "model_contest_1\\16-NewGufengV1.0-ckpt.safetensors": null, 654 | "model_contest_1\\29-xxmix9realistic v4.0-ckpt.safetensors": null, 655 | "model_contest_1\\32-Rely on Defenc-ckpt.safetensors": null, 656 | "model_contest_1\\33-super_gufeng-ckpt.safetensors": null, 657 | "model_contest_1\\35-Dream CNrealistic_MIXv11-ckpt.safetensors": null, 658 | "model_contest_1\\38-version V1-ckpt.safetensors": null, 659 | "model_contest_1\\40-Alpha Lyrae-ckpt.safetensors": null, 660 | "model_contest_1\\41-tkf-ckpt.safetensors": null, 661 | "model_contest_1\\5-Dream CNrealistic_MIXv21-ckpt.safetensors": null, 662 | "model_contest_1\\54-guofeng-checkpoint.safetensors": null, 663 | "model_contest_1\\68-Colorful_girl-checkpoint.ckpt": null, 664 | "model_contest_1\\71-GCM-Game Concept Map-checkpoint.safetensors": null, 665 | "model_contest_1\\76-SJ_real109-checkpoint.safetensors": null, 666 | "model_contest_1\\95-chunzi-checkpoiint.ckpt": null, 667 | "model_contest_1\\99-Dream CNrealistic_MIXv12-checkpoint.safetensors": null, 668 | "model_contest_1\\CMixG-1-0.33.safetensors": null, 669 | "leokan.safetensors": null, 670 | "Moses_ten_commandments-BibleGilgalHK-V1.safetensors": null 671 | } --------------------------------------------------------------------------------