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 @@
+ | + + + | +
@@ -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()
|