diff --git a/ui/easydiffusion/server.py b/ui/easydiffusion/server.py index 1ecbbbd3..e3f80f42 100644 --- a/ui/easydiffusion/server.py +++ b/ui/easydiffusion/server.py @@ -139,6 +139,10 @@ def init(): def modify_package(package_name: str, req: dict): return modify_package_internal(package_name, req) + @server_api.get("/sha256/{obj_path:path}") + def get_sha256(obj_path: str): + return get_sha256_internal(obj_path) + @server_api.get("/") def read_root(): return FileResponse(os.path.join(app.SD_UI_DIR, "index.html"), headers=NOCACHE_HEADERS) @@ -451,3 +455,26 @@ def modify_package_internal(package_name: str, req: dict): log.error(str(e)) log.error(traceback.format_exc()) return HTTPException(status_code=500, detail=str(e)) + +def get_sha256_internal(obj_path): + import hashlib + from easydiffusion.utils import sha256sum + + path = obj_path.split("/") + type = path.pop(0) + + try: + model_path = model_manager.resolve_model_to_use("/".join(path), type) + except Exception as e: + log.error(str(e)) + log.error(traceback.format_exc()) + + return HTTPException(status_code=404) + try: + digest = sha256sum(model_path) + return {"digest": digest} + except Exception as e: + log.error(str(e)) + log.error(traceback.format_exc()) + return HTTPException(status_code=500, detail=str(e)) + diff --git a/ui/easydiffusion/utils/__init__.py b/ui/easydiffusion/utils/__init__.py index b9c5e21a..f6758809 100644 --- a/ui/easydiffusion/utils/__init__.py +++ b/ui/easydiffusion/utils/__init__.py @@ -6,3 +6,15 @@ from .save_utils import ( save_images_to_disk, get_printable_request, ) + +def sha256sum(filename): + sha256 = hashlib.sha256() + with open(filename, "rb") as f: + while True: + data = f.read(8192) # Read in chunks of 8192 bytes + if not data: + break + sha256.update(data) + + return sha256.hexdigest() + diff --git a/ui/index.html b/ui/index.html index fe848321..32fdfbf0 100644 --- a/ui/index.html +++ b/ui/index.html @@ -143,7 +143,12 @@
Image Settings - + + +
+ + +
@@ -680,6 +685,8 @@
+ +
diff --git a/ui/media/css/main.css b/ui/media/css/main.css index ea338653..25602e8c 100644 --- a/ui/media/css/main.css +++ b/ui/media/css/main.css @@ -1706,6 +1706,12 @@ body.wait-pause { overflow-y: scroll; } +@media screen and (max-width: 1400px) { + #embeddings-list { + width: 80vW; + } +} + #embeddings-list button { margin: 2px; color: var(--button-color); diff --git a/ui/media/js/main.js b/ui/media/js/main.js index 306a8d25..b7ec4dd1 100644 --- a/ui/media/js/main.js +++ b/ui/media/js/main.js @@ -143,6 +143,8 @@ let embeddingsSearchBox = document.querySelector("#embeddings-search-box") let embeddingsList = document.querySelector("#embeddings-list") let embeddingsModeField = document.querySelector("#embeddings-mode") let embeddingsCardSizeSelector = document.querySelector("#embedding-card-size-selector") +let addEmbeddingsThumb = document.querySelector("#add-embeddings-thumb") +let addEmbeddingsThumbInput = document.querySelector("#add-embeddings-thumb-input") let positiveEmbeddingText = document.querySelector("#positive-embedding-text") let negativeEmbeddingText = document.querySelector("#negative-embedding-text") @@ -507,7 +509,7 @@ function showImages(reqBody, res, outputContainer, livePreview) { { text: "Upscale", on_click: onUpscaleClick }, { text: "Fix Faces", on_click: onFixFacesClick }, ], - { text: "Use as Thumbnail", on_click: onUseAsThumbnailClick }, + { text: "Use as Thumbnail", on_click: onUseAsThumbnailClick, filter: (req, img) => "use_embeddings_model" in req }, ] // include the plugins @@ -718,9 +720,7 @@ function onUseAsThumbnailClick(req, img) { onUseAsThumbnailClick.croppr.setImage(img.src) } - let embeddings = getAllModelNames("embeddings").filter( - (e) => req.prompt.includes(e) || req.negative_prompt.includes(e) - ) + let embeddings = req.use_embeddings_model.map(e => e.split("/").pop()) let LORA = [] if ("use_lora_model" in req) { @@ -2289,6 +2289,34 @@ document.getElementById("toggle-tensorrt-install").addEventListener("click", fun /* Embeddings */ +addEmbeddingsThumb.addEventListener("click", e => addEmbeddingsThumbInput.click()) +addEmbeddingsThumbInput.addEventListener("change", loadThumbnailImageFromFile) + +function loadThumbnailImageFromFile() { + if (addEmbeddingsThumbInput.files.length === 0) { + return + } + + let reader = new FileReader() + let file = addEmbeddingsThumbInput.files[0] + + reader.addEventListener("load", function(event) { + let img = document.createElement("img") + img.src = reader.result + onUseAsThumbnailClick( + { + use_embeddings_model: getAllModelNames("embeddings").sort((a, b) => a.localeCompare(b, undefined, { sensitivity: 'base' })) + }, + img + ) + }) + + if (file) { + reader.readAsDataURL(file) + } +} + + function updateEmbeddingsList(filter = "") { function html(model, iconlist = [], prefix = "", filter = "") { filter = filter.toLowerCase()